diff --git a/lib/l10n.php b/lib/l10n.php new file mode 100644 index 0000000000..47d331b3fc --- /dev/null +++ b/lib/l10n.php @@ -0,0 +1,247 @@ +. + * + */ + +/** + * This class is for i18n and l10n + */ +class OC_L10N{ + /** + * cache + */ + protected static $cache = array(); + + /** + * The best language + */ + protected static $language = ''; + + /** + * Translations + */ + private $translations = array(); + + /** + * Localization + */ + private $localizations = array( + 'date' => 'd.m.Y', + 'datetime' => 'd.m.Y H:i:s', + 'time' => 'H:i:s' ); + + /** + * @brief The constructor + * @param $app the app requesting l10n + * @param $lang default: null Language + * @returns OC_L10N-Object + * + * If language is not set, the constructor tries to find the right + * language. + */ + public function __construct( $app, $lang = null ){ + // Find the right language + if( is_null( $lang )){ + self::findLanguage( $app ); + } + + // Use cache if possible + if(array_key_exists($app.'::'.$lang, self::$cache )){ + $this->translations = self::$cache[$app.'::'.$lang]['t']; + $this->localizations = self::$cache[$app.'::'.$lang]['l']; + } + else{ + $i18ndir = self::findI18nDir( $app ); + + // Localization is in /l10n, Texts are in $i18ndir + // (Just no need to define date/time format etc. twice) + if( file_exists( $i18ndir.$lang.'php' )){ + // Include the file, save the data from $CONFIG + include( $i18ndir.$lang.'php' ); + if( isset( $TRANSLATIONS ) && is_array( $TRANSLATIONS )){ + $this->translations = $TRANSLATIONS; + } + } + + if( file_exists( '/l10n/l10n-'.$lang.'php' )){ + // Include the file, save the data from $CONFIG + include( $SERVERROOT.'/l10n/l10n-'.$lang.'php' ); + if( isset( $LOCALIZATIONS ) && is_array( $LOCALIZATIONS )){ + $this->localizations = array_merge( $this->localizations, $LOCALIZATIONS ); + } + } + + self::$cache[$app.'::'.$lang]['t'] = $this->translations; + self::$cache[$app.'::'.$lang]['l'] = $this->localizations; + } + } + + /** + * @brief Translating + * @param $text The text we need a translation for + * @returns Translation or the same text + * + * Returns the translation. If no translation is found, $text will be + * returned. + */ + public function t($text){ + if(array_key_exists($text, $this->translations)){ + return $this->translations[$text]; + } + return $text; + } + + /** + * @brief Localization + * @param $type Type of localization + * @param $params parameters for this localization + * @returns String or false + * + * Returns the localized data. + * + * Implemented types: + * - date + * - Creates a date + * - l10n-field: date + * - params: timestamp (int) + * - datetime + * - Creates date and time + * - l10n-field: datetime + * - params: timestamp (int) + * - time + * - Creates a time + * - l10n-field: time + * - params: timestamp (int) + */ + public function l($type, $data){ + switch($type){ + case 'date': + return date( $this->localizations['date'], $data ); + break; + case 'datetime': + return date( $this->localizations['datetime'], $data ); + break; + case 'time': + return date( $this->localizations['time'], $data ); + break; + default: + return false; + } + } + + /** + * @brief Choose a language + * @param $texts Associative Array with possible strings + * @returns String + * + * $text is an array 'de' => 'hallo welt', 'en' => 'hello world', ... + * + * This function is useful to avoid loading thousands of files if only one + * simple string is needed, for example in appinfo.php + */ + public static function selectLanguage( $text ){ + $lang = self::findLanguage( array_keys( $text )); + return $text[$lang]; + } + + /** + * @brief find the best language + * @param $app Array or string, details below + * @returns language + * + * If $app is an array, ownCloud assumes that these are the available + * languages. Otherwise ownCloud tries to find the files in the l10n + * folder. + * + * If nothing works it returns 'en' + */ + public static function findLanguage( $app = null ){ + if( !is_array( $app) && self::$language != '' ){ + return self::$language; + } + + $available = array(); + if( is_array( $app )){ + $available = $app; + } + else{ + $dir = self::findI18nDir( $app ); + if( file_exists($dir)){ + $dh = opendir($dir); + while(( $file = readdir( $dh )) !== false ){ + if( substr( $file, -4, 4 ) == '.php' ){ + $i = substr( $file, 0, -4 ); + if( $i != '' ){ + $available[] = $i; + } + } + } + closedir($dh); + } + } + + if( isset($_SESSION['user_id']) && OC_PREFERENCES::getValue( $_SESSION['user_id'], 'core', 'lang' )){ + $lang = OC_PREFERENCES::getValue( $_SESSION['user_id'], 'core', 'lang' ); + self::$language = $lang; + if( array_search( $lang, $available )){ + return $lang; + } + } + + if( isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] )){ + $accepted_languages = preg_split( '/,\s*/', $_SERVER['HTTP_ACCEPT_LANGUAGE'] ); + foreach( $accepted_languages as $i ){ + $temp = explode( ';', $i ); + $temp = explode( '-', $temp[0] ); + if( array_key_exists( $temp[0], $available )){ + return $temp[0]; + } + } + } + + // Last try: English + return 'en'; + } + + /** + * @brief find the best language + * @param $app App that needs to be translated + * @returns language + * + * Finds the best language. Depends on user settings and browser + * information + */ + protected static function findI18nDir( $app ){ + global $SERVERROOT; + + // find the i18n dir + $i18ndir = $SERVERROOT.'/l10n/'; + if( $app != 'core' && $app != '' ){ + // Check if the app is in the app folder + if( file_exists( $SERVERROOT.'/apps/'.$app.'/l10n/' )){ + $i18ndir = $SERVERROOT.'/apps/'.$app.'/l10n/'; + } + else{ + $i18ndir = $SERVERROOT.'/'.$app.'/l10n/'; + } + } + return $i18ndir; + } +} \ No newline at end of file diff --git a/lib/template.php b/lib/template.php index 93adc35eca..6b9a1c38e1 100644 --- a/lib/template.php +++ b/lib/template.php @@ -73,8 +73,9 @@ function human_file_size( $bytes ){ class OC_TEMPLATE{ private $renderas; // Create a full page? private $application; // template Application - private $vars; // The smarty object - private $template; // The smarty object + private $vars; // Vars + private $template; // The path to the template + private $l10n; // The l10n-Object /** * @brief Constructor @@ -113,6 +114,7 @@ class OC_TEMPLATE{ $this->application = $app; $this->template = $template; $this->vars = array(); + $this->l10n = new OC_L10N($app); } /** @@ -251,6 +253,7 @@ class OC_TEMPLATE{ private function _fetch(){ // Register the variables $_ = $this->vars; + $l = $this->l10n; // Execute the template ob_start();