Esempio n. 1
0
/**
 * This method will translate or create an enter in the module xliff locale file
 * 
 * @param array $params         An array of parameters to give to i18n::translate()
 * @param string $content       The string to translate {t}...content...{/t}
 * @param Smarty $smarty        The current Smarty instance
 * @param boolean $repeat       Are we in the end of {t} tag
 * @return string               The translated string, else the original string
 */
function smarty_block_t($params, $content, &$smarty, &$repeat)
{
    if ($repeat == false) {
        // we get the template locale if setted by {setLocale} tag
        $srcLocale = isset($smarty->tpl_vars['TPL_LOCALE']) ? $smarty->tpl_vars['TPL_LOCALE']->value : i18n::getDefaultLocale();
        // if template locale is equal to current locale we don't need to translate
        if ($srcLocale === i18n::getLocale()) {
            return i18n::replaceArgs($content, $params);
        }
        // we get the template path
        $path = explode(DS, str_replace(APP_DIR . DS, '', $smarty->template_resource));
        // module var has been setted in smarty
        if (isset($smarty->smarty->module)) {
            $isModule = true;
            $module = $smarty->smarty->module;
        } else {
            $isModule = array_search('module', $path);
            if ($isModule !== false) {
                $module = $path[$isModule + 1];
            }
        }
        // we are in a module, we can translate
        if ($isModule !== false) {
            // Get locale file with full locale code (ex : fr_CA) for overloading
            if ($file = get_module_file($module, '/i18n/templates.' . $srcLocale . '.xml')) {
                $str = I18n::t($file, $content, $params, $srcLang, end($path));
                if ($str !== $string) {
                    return $str;
                }
                // There is a specific translation for full locale code, return
            }
            // get the lang code
            preg_match('/^([a-z]{2,3})[_-]([A-Z]{2})$/', $srcLocale, $m);
            $srcLang = $m[0];
            // If default lang is equal to the current lang : return
            if ($srcLang == i18n::getLang()) {
                return i18n::replaceArgs($content, $params);
            }
            // Get locale file with only lang code (ex : fr) or create it
            $file = get_module_file($module, '/i18n/templates.' . I18n::getLang() . '.xml', false);
            return I18n::t($file, $content, $params, $srcLang, end($path));
        }
        return i18n::replaceArgs($content, $params);
    }
}
Esempio n. 2
0
function url($action = null, $lang = null)
{
    // If an absolute URL is provided, simply return it
    if (preg_match('/^https?:\\/\\//', $action)) {
        return $action;
    }
    // Trim slashes
    $action = trim($action, '/');
    // i18n language prefix
    if (!$lang && Kennel::getSetting('i18n', 'enabled')) {
        $prefix = '/' . i18n::getLang();
    } elseif ($lang) {
        $prefix = "/{$lang}";
    } else {
        $prefix = '';
    }
    // Action string
    if ($action) {
        if (Kennel::getSetting('application', 'use_mod_rewrite')) {
            $url = Kennel::$ROOT_URL . "{$prefix}/{$action}/";
        } else {
            $url = Kennel::$ROOT_URL . "/index.php/{$prefix}/{$action}/";
        }
    } else {
        if (Kennel::getSetting('application', 'use_mod_rewrite')) {
            $url = Kennel::$ROOT_URL . ($prefix ? "{$prefix}/" : '/');
        } else {
            $url = Kennel::$ROOT_URL . ($prefix ? "/index.php/{$prefix}/" : '/');
        }
    }
    // Trim slash for query or hash strings
    if (strpos($url, '?') !== false || strpos($url, '#') !== false) {
        $url = trim($url, '/');
    }
    return $url;
}
Esempio n. 3
0
 private function _getOutput()
 {
     // Make $template and $title accessible in the descendant views
     $this->__set('template', $this);
     $this->__set('title', $this->title);
     // Template View (must run first since ancestor views might call functions from $template)
     $templateView = XML::text($this->_template->__toString());
     // <html>
     $this->_html = XML::element('html');
     $this->_html->dir = $this->dir;
     if (Kennel::getSetting('i18n', 'enabled')) {
         $this->_html->lang = i18n::getLang();
     }
     // <head>
     $this->_head = XML::element('head', $this->_html);
     // <title>
     $title = XML::element('title', $this->_head);
     $title->setValue($this->getTitle());
     // favicon
     if ($this->favicon) {
         $this->_head->adopt(html::favicon($this->favicon));
     }
     // Content Type
     $this->_head->adopt(html::meta(array('charset' => 'utf-8')));
     // <meta>
     foreach ($this->_meta as $meta) {
         $this->_head->adopt(html::meta($meta));
     }
     // <link>
     foreach ($this->_links as $link) {
         $this->_head->adopt(html::link($link['rel'], $link['href'], $link['type'], $link['title']));
     }
     // <style>
     $this->_head->adopt(html::css($this->_stylesheets));
     // <script>
     $this->_head->adopt(html::js($this->_scripts));
     // <body>
     $this->_body = XML::element('body', $this->_html);
     $this->_body->class = browser::css();
     if (Kennel::getSetting('i18n', 'enabled')) {
         $this->_body->class .= ' ' . i18n::getLang();
     }
     if ($this->bodyClass) {
         $this->_body->class .= ' ' . $this->bodyClass;
     }
     // Inject the Template View
     $this->_body->adopt($templateView);
     // Return the whole shebang
     return self::$DOCTYPE_DECLARATIONS[$this->doctype] . $this->_html->output(true);
 }
Esempio n. 4
0
 function i18n($lang = null)
 {
     // If i18n is not enabled, return itself
     if (!Kennel::getSetting('i18n', 'enabled')) {
         return $this;
     }
     if (!$lang) {
         $lang = i18n::getLang();
     }
     $primaryKey = $this->schema->getPrimaryKey()->name;
     $this->_fetchI18n();
     foreach ($this->_i18n as $i18n) {
         if ($i18n->lang == $lang) {
             return $i18n;
         }
     }
     // If no localized version was found, create one now
     $primaryKey = $this->schema->getPrimaryKey()->name;
     $i18n = new Model("{$this->model_name}_i18n");
     $i18n->__set("{$this->model_name}_{$primaryKey}", $this->{$primaryKey});
     $i18n->lang = $lang;
     // … and populate it with default values, if any.
     // Useful as base data for internationalization of existing, populated models
     foreach ($i18n->_data as $key => $value) {
         if ($key != 'id' && isset($this->_data[$key])) {
             $i18n->{$key} = $this->{$key};
         }
     }
     return $this->_i18n[] = $i18n;
 }
Esempio n. 5
0
 static function process()
 {
     // Set the method
     self::$METHOD = $_SERVER['REQUEST_METHOD'];
     // Get the request parts
     $request_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     if (Kennel::getSetting('application', 'use_mod_rewrite')) {
         $action_string = substr(trim($request_url, '/'), strlen(Kennel::$ROOT_URL));
     } else {
         $action_string = substr(trim($request_url, '/'), strlen(Kennel::$ROOT_URL . '/index.php'));
     }
     $action_string = str_replace(strstr($action_string, '?'), '', $action_string);
     $action_array = array_filter(explode('/', $action_string));
     // Reasign action keys (to avoid empty entries due to double slashes) and convert to lowercase
     foreach ($action_array as $key => $part) {
         if ($part) {
             if (strpos($part, ':') === false) {
                 self::$PARTS[] = input::clean($part);
             } else {
                 $named_arg = explode(':', $part);
                 self::$NAMED_ARGS[$named_arg[0]] = $named_arg[1];
             }
         }
     }
     // Process any hooks if present
     if (is_array(self::$HOOKS) && count(self::$HOOKS > 0)) {
         foreach (self::$HOOKS as $hook) {
             self::$PARTS = call_user_func($hook, self::$PARTS);
         }
     }
     // Make the Resource String available to the API
     self::$RESOURCE = implode('/', self::$PARTS);
     // i18n URL redirection
     if (Kennel::getSetting('i18n', 'enabled') && Kennel::getSetting('i18n', 'redirect') && !router::$PREFIX) {
         header('location: ' . url(Request::$RESOURCE, i18n::getLang()));
     }
     // 0. Render the Home Page if no Request::PARTS are present
     if (count(self::$PARTS) == 0) {
         self::$CONTROLLER = 'Main';
         self::$ACTION = 'index';
     }
     // 1. First check: method in the main controller
     if (isset(self::$PARTS[0]) && method_exists('Main_controller', str_replace('-', '_', self::$PARTS[0]))) {
         self::$CONTROLLER = 'main';
         self::$ACTION = str_replace('-', '_', self::$PARTS[0]);
         self::$ARGS = array_slice(self::$PARTS, 1);
     }
     // 2. Second check: user defined controller...
     if (isset(self::$PARTS[0]) && is_file(Kennel::$ROOT_PATH . '/application/controllers/' . str_replace('-', '_', self::$PARTS[0]) . '.php')) {
         self::$CONTROLLER = ucfirst(str_replace('-', '_', self::$PARTS[0]));
         if (isset(self::$PARTS[1]) && method_exists(self::$CONTROLLER . '_controller', str_replace('-', '_', self::$PARTS[1]))) {
             self::$ACTION = str_replace('-', '_', self::$PARTS[1]);
             self::$ARGS = array_slice(self::$PARTS, 2);
         } else {
             self::$ACTION = 'index';
             self::$ARGS = array_slice(self::$PARTS, 1);
         }
     }
     // 3. Third check: module controller
     if (isset(self::$PARTS[0])) {
         if (!Kennel::$MODULES) {
             Kennel::fetchModules();
         }
         foreach (Kennel::$MODULES as $module => $info) {
             if (is_file(Kennel::$ROOT_PATH . "/modules/{$module}/controllers/" . str_replace('-', '_', self::$PARTS[0]) . '.php')) {
                 self::$CONTROLLER = ucfirst(str_replace('-', '_', self::$PARTS[0]));
                 if (isset(self::$PARTS[1]) && method_exists(self::$CONTROLLER . '_controller', str_replace('-', '_', self::$PARTS[1]))) {
                     self::$ACTION = str_replace('-', '_', self::$PARTS[1]);
                     self::$ARGS = array_slice(self::$PARTS, 2);
                 } else {
                     self::$ACTION = 'index';
                     self::$ARGS = array_slice(self::$PARTS, 1);
                 }
             }
         }
     }
     // 4. Forth check: system controller
     if (isset(self::$PARTS[0]) && is_file(Kennel::$ROOT_PATH . '/system/controllers/' . str_replace('-', '_', self::$PARTS[0]) . '.php')) {
         self::$CONTROLLER = ucfirst(str_replace('-', '_', self::$PARTS[0]));
         if (isset(self::$PARTS[1])) {
             if (method_exists(self::$CONTROLLER . '_controller', str_replace('-', '_', self::$PARTS[1]))) {
                 self::$ACTION = str_replace('-', '_', self::$PARTS[1]);
                 self::$ARGS = array_slice(self::$PARTS, 2);
             }
         } else {
             self::$ACTION = 'index';
             self::$ARGS = array_slice(self::$PARTS, 1);
         }
     }
     // 5. Fifth check: nothing found
     if (!self::$CONTROLLER) {
         self::$CONTROLLER = 'Main';
     }
     if (!self::$ACTION) {
         self::$ACTION = 'notfound';
     }
     if (self::$CONTROLLER == 'Main' && self::$ACTION == 'notfound') {
         self::$ARGS = self::$PARTS;
     }
     return Kennel::controllerAction(self::$CONTROLLER, self::$ACTION, self::$ARGS);
 }