]> source.dussan.org Git - nextcloud-server.git/commitdiff
l10n added
authorJakob Sack <kde@jakobsack.de>
Sun, 19 Jun 2011 12:27:52 +0000 (14:27 +0200)
committerJakob Sack <kde@jakobsack.de>
Sun, 19 Jun 2011 12:27:52 +0000 (14:27 +0200)
lib/l10n.php [new file with mode: 0644]
lib/template.php

diff --git a/lib/l10n.php b/lib/l10n.php
new file mode 100644 (file)
index 0000000..47d331b
--- /dev/null
@@ -0,0 +1,247 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Jakob Sack
+ * @copyright 2010 Frank Karlitschek karlitschek@kde.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * 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
index 93adc35eca7fd0701f45e0df7537a2744a437641..6b9a1c38e11cccec969fd9ae0fd0532ab4b3b6a2 100644 (file)
@@ -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();