/**
 * 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;
}
Beispiel #2
0
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;
}