Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Sack <kde@jakobsack.de>2011-06-19 16:27:52 +0400
committerJakob Sack <kde@jakobsack.de>2011-06-19 16:27:52 +0400
commitbaa00a589f7d4cdf920e5fb8185082e19bc179d1 (patch)
tree1bb24f2340c17d2982504d58e17efa3ec697cd83 /lib/l10n.php
parent6a19a7d22639f056ccb39d94f2358882ed875faf (diff)
l10n added
Diffstat (limited to 'lib/l10n.php')
-rw-r--r--lib/l10n.php247
1 files changed, 247 insertions, 0 deletions
diff --git a/lib/l10n.php b/lib/l10n.php
new file mode 100644
index 00000000000..47d331b3fc6
--- /dev/null
+++ b/lib/l10n.php
@@ -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