4 * GForge Localization Facility
6 * Uses the GNU gettext system
8 * Copyright 2007 Roland Mas <lolando@debian.org>
10 * Rewritten from previous works
11 * Portions Copyright 1999-2000 (c) VA Linux Systems
12 * The rest Copyright 2003-2004 (c) Guillaume Smet
20 * choose_language_from_context - find the most appropriate language
22 * @return string the language class name.
24 function choose_language_from_context () {
26 Determine which language to use
28 It depends on whether the user has set a cookie or not using
29 the account page or the left-hand nav or how their browser is
30 set or whether they are logged in or not
32 if logged in, use language from users table
33 else check for cookie and use that value if valid
34 if no cookie check browser preference and use that language if valid
35 else just use default language as configured for the installation
38 // Logged in -> use preferences
39 if (session_loggedin()) {
40 $user = session_get_user () ;
41 return lang_id_to_language_name ($user->getLanguage()) ;
44 // Cookie present -> use that
45 $cookie_language_id = getIntFromCookie ('cookie_language_id') ;
46 if ($cookie_language_id) {
47 return lang_id_to_language_name ($cookie_language_id) ;
50 // Try with the browser's preferred language
52 preg_match_all('/([a-z]{2}(?:-[a-z]{2})?)(?:;q=([0-9\.]{1,4}))?/',
53 getStringFromServer ('HTTP_ACCEPT_LANGUAGE'),
57 $languagesCount = count($matches);
58 if($languagesCount > 0) {
59 $delta = 0.009/$languagesCount;
61 for($i = 0, $max = count($matches); $i < $max; $i++) {
62 $languageCode = $matches[$i][1];
63 $quality = (!isset($matches[$i][2]) || empty($matches[$i][2])) ? '1' : $matches[$i][2];
64 $languages[$languageCode] = $quality + $delta * ($languagesCount - $i);
67 arsort($languages, SORT_NUMERIC);
68 $languages = array_keys($languages);
70 for( $i=0, $max = sizeof($languages); $i < $max; $i++){
71 $languageCode = $languages[$i];
72 $res = db_query("select classname from supported_languages where language_code = '".addslashes($languageCode)."'");
73 if (db_numrows($res) > 0) {
74 return db_result($res,0,'classname');
76 // If that didn't work, check if we have sublanguage specifier
77 // If so, try to strip it and look for for main language only
78 if (strstr($languageCode, '-')) {
79 $languageCode = substr($languageCode, 0, 2);
80 $res = db_query("select classname from supported_languages where language_code = '".addslashes($languageCode)."'");
81 if (db_numrows($res) > 0) {
82 return db_result($res,0,'classname');
88 // Okay, let's use the site-wide default language
89 if ($GLOBALS['sys_lang']) {
90 return $GLOBALS['sys_lang'] ;
93 // Still no match? Really?
97 function language_name_to_locale_code ($lang) {
100 'Bulgarian' => 'bg_BG',
101 'Catalan' => 'ca_ES',
102 'Chinese' => 'zh_TW',
104 'English' => 'en_US',
110 'Indonesian' => 'id_ID',
111 'Italian' => 'it_IT',
112 'Japanese' => 'ja_JP',
114 'Norwegian' => 'nb_NO',
116 'PortugueseBrazilian' => 'pt_BR',
117 'Portuguese' => 'pt_PT',
118 'Russian' => 'ru_RU',
119 'SimplifiedChinese' => 'zh_CN',
120 'Spanish' => 'es_ES',
121 'Swedish' => 'sv_SE',
124 return $langmap[$lang] ;
127 function locale_code_to_language_name ($loc) {
130 'bg_BG' => 'Bulgarian',
131 'ca_ES' => 'Catalan',
132 'zh_TW' => 'Chinese',
134 'en_US' => 'English',
140 'id_ID' => 'Indonesian',
141 'it_IT' => 'Italian',
142 'ja_JP' => 'Japanese',
144 'nb_NO' => 'Norwegian',
146 'pt_BR' => 'PortugueseBrazilian',
147 'pt_PT' => 'Portuguese',
148 'ru_RU' => 'Russian',
149 'zh_CN' => 'SimplifiedChinese',
150 'es_ES' => 'Spanish',
151 'sv_SE' => 'Swedish',
154 return $localemap[$loc] ;
157 function lang_id_to_language_name ($id) {
158 $res = db_query('SELECT classname FROM supported_languages WHERE language_id=\''.$lang_id.'\'');
159 return db_result($res, 0, 'classname');
162 function language_name_to_lang_id ($language) {
163 $res = db_query('SELECT language_id FROM supported_languages WHERE classname=\''.$language.'\'');
164 return db_result($res, 0, 'classname');
167 function setup_gettext_from_browser() {
168 setup_gettext_from_langname (choose_language_from_context ());
171 function setup_gettext_for_user ($user) {
172 setup_gettext_from_lang_id ($user->getLanguage());
175 function setup_gettext_from_lang_id ($lang_id) {
176 $lang = lang_id_to_language_name ($lang_id) ;
177 setup_gettext_from_langname() ;
180 function setup_gettext_from_langname ($lang) {
181 $locale = locale_code_from_name($lang).'.utf8';
182 setup_gettext_from_locale ($locale) ;
185 function setup_gettext_from_locale ($locale) {
186 setlocale(LC_ALL, $locale);
187 setlocale (LC_TIME, _('en_US'));
188 bindtextdomain('gforge', '/usr/share/locale/');
189 textdomain('gforge');
194 // c-file-style: "bsd"