/** * Traduire une chaine internationalisée * * Lorsque la langue demandée n'a pas de traduction pour la clé de langue * transmise, la fonction cherche alors la traduction dans la langue * principale du site (défini par la meta `langue_site`), puis, à défaut * dans la langue française. * * Les traductions sont cherchées dans les modules de langue indiqués. * Par exemple le module `mots` dans la clé `mots:titre_mot`, pour une * traduction `es` (espagnol) provoquera une recherche dans tous les fichiers * `lang\mots_es.php`. * * Des surcharges locales peuvent être présentes également * dans les fichiers `lang/local_es.php` ou `lang/local.php` * * @note * Les couples clé/traductions déjà connus sont sauvés en interne * dans les globales `i18n_${module}_${lang}` tel que `i18n_mots_es` * et sont également sauvés dans la variable statique `deja_vu` * de cette fonction. * * @uses charger_langue() * @uses chercher_module_lang() * @uses surcharger_langue() * * @param string $ori * Clé de traduction, tel que `bouton_enregistrer` ou `mots:titre_mot` * @param string $lang * Code de langue, la traduction doit se faire si possible dans cette langue * @return string * Traduction demandée. Chaîne vide si aucune traduction trouvée. **/ function inc_traduire_dist($ori, $lang) { static $deja_vu = array(); static $local = array(); if (isset($deja_vu[$lang][$ori]) and _request('var_mode') != 'traduction') { return $deja_vu[$lang][$ori]; } // modules demandes explicitement <xxx|yyy|zzz:code> cf MODULES_IDIOMES if (strpos($ori, ':')) { list($modules, $code) = explode(':', $ori, 2); $modules = explode('|', $modules); $ori_complet = $ori; } else { $modules = array('spip', 'ecrire'); $code = $ori; $ori_complet = implode('|', $modules) . ':' . $ori; } $text = ''; $module_retenu = ''; // parcourir tous les modules jusqu'a ce qu'on trouve foreach ($modules as $module) { $var = "i18n_" . $module . "_" . $lang; if (empty($GLOBALS[$var])) { charger_langue($lang, $module); // surcharges persos -- on cherche // (lang/)local_xx.php et/ou (lang/)local.php ... if (!isset($local['local_' . $lang])) { // redéfinir la langue en cours pour les surcharges (chercher_langue a pu le changer) $GLOBALS['idx_lang'] = $var; // ... (lang/)local_xx.php $local['local_' . $lang] = chercher_module_lang('local', $lang); } if ($local['local_' . $lang]) { surcharger_langue($local['local_' . $lang]); } // ... puis (lang/)local.php if (!isset($local['local'])) { $local['local'] = chercher_module_lang('local'); } if ($local['local']) { surcharger_langue($local['local']); } } if (isset($GLOBALS[$var][$code])) { $module_retenu = $module; $text = $GLOBALS[$var][$code]; break; } } // Retour aux sources si la chaine est absente dans la langue cible ; // on essaie d'abord la langue du site, puis a defaut la langue fr $langue_retenue = $lang; if (!strlen($text) and $lang !== _LANGUE_PAR_DEFAUT) { if ($lang !== $GLOBALS['meta']['langue_site']) { $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']); $langue_retenue = !strlen($text) ? $GLOBALS['meta']['langue_site'] : ''; } else { $text = inc_traduire_dist($ori, _LANGUE_PAR_DEFAUT); $langue_retenue = !strlen($text) ? _LANGUE_PAR_DEFAUT : ''; } } // Supprimer la mention <NEW> ou <MODIF> if (substr($text, 0, 1) === '<') { $text = str_replace(array('<NEW>', '<MODIF>'), array(), $text); } // Si on n'est pas en utf-8, la chaine peut l'etre... // le cas echeant on la convertit en entites html &#xxx; if ((!isset($GLOBALS['meta']['charset']) or $GLOBALS['meta']['charset'] !== 'utf-8') and preg_match(',[\\x7f-\\xff],S', $text)) { include_spip('inc/charsets'); $text = charset2unicode($text, 'utf-8'); } if (_request('var_mode') == 'traduction') { if ($text) { $classe = 'debug-traduction' . ($module_retenu == 'ecrire' ? '-prive' : ''); $text = '<span lang=' . $langue_retenue . ' class=' . $classe . ' title=' . $ori_complet . '(' . $langue_retenue . ')>' . $text . '</span>'; $text = str_replace(array("{$module_retenu}:", "{$module_retenu}|"), array("*{$module_retenu}*:", "*{$module_retenu}*|"), $text); } } else { $deja_vu[$lang][$ori] = $text; } return $text; }
function inc_traduire_dist($ori, $lang) { static $deja_vu = array(); if (isset($deja_vu[$lang][$ori])) return $deja_vu[$lang][$ori]; // modules demandes explicitement <xxx/yyy/zzz:code> if (strpos($ori,':')) { list($modules,$code) = explode(':',$ori,2); $modules = explode('/', $modules); } else { $modules = array('spip', 'ecrire'); $code = $ori; } $text = ''; // parcourir tous les modules jusqu'a ce qu'on trouve foreach ($modules as $module) { $var = "i18n_".$module."_".$lang; if (empty($GLOBALS[$var])) { charger_langue($lang, $module); // surcharge perso -- on cherche (lang/)local_xx.php ... if ($f = chercher_module_lang('local', $lang)) surcharger_langue($f); // ... puis (lang/)local.php if ($f = chercher_module_lang('local')) surcharger_langue($f); } if (isset($GLOBALS[$var][$code])) { $text = $GLOBALS[$var][$code]; break; } } // Retour aux sources si la chaine est absente dans la langue cible ; // on essaie d'abord la langue du site, puis a defaut la langue fr if (!strlen($text) AND $lang !== 'fr') { if ($lang !== $GLOBALS['meta']['langue_site']) $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']); else $text = inc_traduire_dist($ori, 'fr'); } // Supprimer la mention <NEW> ou <MODIF> if (substr($text,0,1) === '<') $text = str_replace(array('<NEW>', '<MODIF>'), array(), $text); // Si on n'est pas en utf-8, la chaine peut l'etre... // le cas echeant on la convertit en entites html &#xxx; if ($GLOBALS['meta']['charset'] !== 'utf-8' AND preg_match(',[\x7f-\xff],S', $text)) { include_spip('inc/charsets'); $text = charset2unicode($text,'utf-8'); } $deja_vu[$lang][$ori] = $text; return $text; }