Skip to content
Extraits de code Groupes Projets
inc_lang.php3 12,4 ko
Newer Older
Fil's avatar
Fil a validé
/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
Fil's avatar
Fil a validé
 *  Copyright (c) 2001-2006                                                *
Fil's avatar
Fil a validé
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

if (!defined("_ECRIRE_INC_VERSION")) return;
//
// Charger un fichier langue
//

function charger_langue($lang, $module = 'spip') {
	if ($fichier_lang = find_in_path($module.'_'.$lang._EXTENSION_PHP,
	'AUTO', _DIR_LANG)) {
		$GLOBALS['idx_lang']='i18n_'.$module.'_'.$lang;
		include_local($fichier_lang);
Fil's avatar
Fil a validé
	} else {
		// si le fichier de langue du module n'existe pas, on se rabat sur
		// la langue par defaut du site -- et au pire sur le francais, qui
		// *par definition* doit exister, et on copie le tableau dans la
		// var liee a la langue
esj's avatar
 
esj a validé
		$l = $GLOBALS['meta']['langue_site'];
Fil's avatar
Fil a validé
		if (!$fichier_lang = find_in_path($module.'_'.$l._EXTENSION_PHP,
		'AUTO', _DIR_LANG)) {
			$l = 'fr';
Fil's avatar
Fil a validé
			$fichier_lang = find_in_path($module.'_'.$l._EXTENSION_PHP,
			'AUTO', _DIR_LANG);
		}
		if ($fichier_lang) {
			$GLOBALS['idx_lang']='i18n_'.$module.'_' .$l;
			include_local($fichier_lang);
			$GLOBALS['i18n_'.$module.'_'.$lang]
				= &$GLOBALS['i18n_'.$module.'_'.$l];
			#spip_log("module de langue : ${module}_$l.php");
Fil's avatar
Fil a validé
	}
}

//
// Surcharger le fichier de langue courant avec un autre (tordu, hein...)
//
function surcharger_langue($f) {
	$idx_lang_normal = $GLOBALS['idx_lang'];
	$GLOBALS['idx_lang'] .= '_temporaire';
	include($f);
	if (is_array($GLOBALS[$GLOBALS['idx_lang']]))
		foreach ($GLOBALS[$GLOBALS['idx_lang']] as $var => $val)
			$GLOBALS[$idx_lang_normal][$var] = $val;
	unset ($GLOBALS[$GLOBALS['idx_lang']]);
	$GLOBALS['idx_lang'] = $idx_lang_normal;
//
// Changer la langue courante
//
function changer_langue($lang) {
	global $all_langs, $spip_lang_rtl, $spip_lang_right, $spip_lang_left, $spip_lang_dir, $spip_dir_lang;
esj's avatar
 
esj a validé
	$liste_langues = $all_langs.','.$GLOBALS['meta']['langues_multilingue'];
Fil's avatar
Fil a validé
	if ($lang && ereg(",$lang,", ",$liste_langues,")) {
		$GLOBALS['spip_lang'] = $lang;

		$spip_lang_rtl =   lang_dir($lang, '', '_rtl');
		$spip_lang_left =  lang_dir($lang, 'left', 'right');
		$spip_lang_right = lang_dir($lang, 'right', 'left');
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$spip_lang_dir =   lang_dir($lang);
		$spip_dir_lang = " dir='$spip_lang_dir'";
		return true;
	}
Antoine Pitrou's avatar
Antoine Pitrou a validé
//
// Regler la langue courante selon les infos envoyees par le brouteur
//
function regler_langue_navigateur() {
Fil's avatar
Fil a validé
	global $_SERVER, $_COOKIE;
Antoine Pitrou's avatar
Antoine Pitrou a validé

Fil's avatar
Fil a validé
	$accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (is_array($accept_langs)) {
		while(list(, $s) = each($accept_langs)) {
			if (eregi('^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$', trim($s), $r)) {
				$lang = strtolower($r[1]);
Antoine Pitrou's avatar
Antoine Pitrou a validé
				if (changer_langue($lang)) return $lang;
//
// Traduire une chaine internationalisee
//
function traduire_chaine($code, $args) {
	global $spip_lang;
Fil's avatar
Fil a validé

	// modules par defaut
	if (_DIR_RESTREINT)
		$modules = array('spip');
	else
		$modules = array('spip', 'ecrire');

	// modules demandes explicitement
	$code_ori = $code; # le garder pour le fallback plus tard
	if (strpos($code, ':')) {
		if (ereg("^([a-z/]+):(.*)$", $code, $regs)) {
			$modules = explode("/",$regs[1]);
			$code = $regs[2];
Antoine Pitrou's avatar
Antoine Pitrou a validé
		}
	// parcourir tous les modules jusqu'a ce qu'on trouve
	while (list(,$module) = each ($modules)) {
		$var = "i18n_".$module."_".$spip_lang;
		if (empty($GLOBALS[$var])) {
			charger_langue($spip_lang, $module);
			// surcharge perso -- on cherche local(_xx).php dans le chemin
			if ($f = find_in_path('local' ._EXTENSION_PHP))
			if ($f = find_in_path('local_'.$spip_lang._EXTENSION_PHP))
				surcharger_langue($f);
			// compatibilite ascendante : chercher aussi dans ecrire/lang/
			else if (@is_readable($f = _DIR_LANG . 'local_'.$spip_lang._EXTENSION_PHP))
		if (isset($GLOBALS[$var][$code])) break;
	}

	$text = $GLOBALS[$var][$code];
	// fallback langues pas finies ou en retard (eh oui, c'est moche...)
		$text = ereg_replace("^<(NEW|MODIF)>","",$text);
		if (!$text) {
			$spip_lang_temp = $spip_lang;
			$spip_lang = 'fr';
			$text = traduire_chaine($code_ori, $args);
			$spip_lang = $spip_lang_temp;
	// inserer les variables
	if (!$args) return $text;
Antoine Pitrou's avatar
Antoine Pitrou a validé
	while (list($name, $value) = each($args))
		$text = str_replace ("@$name@", $value, $text);
function traduire_nom_langue($lang) {
	include_ecrire('inc_lang_liste');
	$r = $GLOBALS['codes_langues'][$lang];
		include_ecrire("inc_charsets");
//
// Filtres de langue
//

// afficher 'gaucher' si la langue est arabe, hebreu, persan, 'droitier' sinon
// utilise par #LANG_DIR, #LANG_LEFT, #LANG_RIGHT
function lang_dir($lang, $droitier='ltr', $gaucher='rtl') {
	if ($lang=='fa' OR $lang=='ar' OR $lang == 'he')
		return $gaucher;
	else
		return $droitier;
}

Antoine Pitrou's avatar
Antoine Pitrou a validé
	if ($lang == 'eo' OR $lang == 'fr' OR substr($lang, 0, 3) == 'fr_' OR $lang == 'cpf')
		return 'fr';
	else if ($lang)
		return 'en';
	else
		return false;
}

// service pour que l'espace prive reflete la typo et la direction des objets affiches
function changer_typo($lang = '', $source = '') {
Fil's avatar
Fil a validé
	global $lang_typo, $lang_dir, $dir_lang;
	if (ereg("^(article|rubrique|breve|auteur)([0-9]+)", $source, $regs)) {
		$r = spip_fetch_array(spip_query("SELECT lang FROM spip_".$regs[1]."s WHERE id_".$regs[1]."=".$regs[2]));
		$lang = $r['lang'];
	}

esj's avatar
 
esj a validé
		$lang = $GLOBALS['meta']['langue_site'];
Fil's avatar
Fil a validé
	$lang_dir = lang_dir($lang);
	$dir_lang = " dir='$lang_dir'";

// selectionner une langue
function lang_select ($lang='') {
	global $pile_langues, $spip_lang;
Fil's avatar
Fil a validé
	array_push($pile_langues, $spip_lang);
	changer_langue($lang);
}

// revenir a la langue precedente
function lang_dselect ($rien='') {
	global $pile_langues;
Fil's avatar
Fil a validé
	changer_langue(array_pop($pile_langues));
// Afficher un menu de selection de langue
// - 'var_lang_ecrire' = langue interface privee,
// - 'var_lang' = langue de l'article, espace public
// - 'changer_lang' = langue de l'article, espace prive
// 
esj's avatar
esj a validé
function menu_langues($nom_select = 'var_lang', $default = '', $texte = '', $herit = '', $lien='') {
	global $couleur_foncee, $connect_id_auteur;
esj's avatar
esj a validé
	$ret = liste_options_langues($nom_select, $default, $herit);
Fil's avatar
Fil a validé

esj's avatar
esj a validé
	if (!$ret) return '';
	if (!$couleur_foncee) $couleur_foncee = '#044476';
esj's avatar
esj a validé
	if (!$lien) $lien = $GLOBALS['clean_link'];

	if ($nom_select == 'changer_lang') {
		$cible = '';
		if (is_object($lien)) {
			$lien->delvar('changer_lang');
			$lien->delvar('url');
			$lien = $lien->getUrl();
		    }
		if (!_DIR_RESTREINT) {
			$cible = _DIR_RESTREINT_ABS . 
			  (is_object($lien) ? $lien->getUrl() : $lien);
			  $args = "id_auteur=$connect_id_auteur&valeur=".calculer_action_auteur('var_lang_ecrire', $connect_id_auteur);
		$lien = generer_url_public("spip_cookie", $args);
	return "<form action='$lien' method='post' style='margin:0px; padding:0px;'>"
	  . (!$cible ? '' : "<input type='hidden' name='url' value='".quote_amp($cible)."' />")
	  . $texte
	  . "<select name='$nom_select' "
	  . (_DIR_RESTREINT ?
	     ("class='forml' style='vertical-align: top; max-height: 24px; margin-bottom: 5px; width: 120px;'") :
	     (($nom_select == 'var_lang_ecrire')  ?
	      ("class='verdana1' style='background-color: " . $couleur_foncee
	       . "; max-height: 24px; border: 1px solid white; color: white; width: 100px;'") :
	      "class='fondl'"))
	  . "\nonchange=\"document.location.href='"
	  . $lien . (!$cible ? "" : ((strpos($lien,'?') ? '&amp;' : '?') . 'url=' . urlencode($cible)))
	  ."&amp;$nom_select='+this.options[this.selectedIndex].value\">\n"
	  . $ret
	  . "</select>\n"
	  . "<noscript><div style='display:inline;'><input type='submit' name='Valider' value='&gt;&gt;' class='spip_bouton' /></div></noscript>\n"
	  . "</form>\n";
esj's avatar
esj a validé
function liste_options_langues($nom_select, $default='', $herit='') {
esj's avatar
esj a validé
	if ($default == '') $default = $GLOBALS['spip_lang'];
	if ($nom_select == 'var_lang_ecrire')
		$langues = explode(',', $GLOBALS['all_langs']);
	else
esj's avatar
 
esj a validé
		$langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
esj's avatar
esj a validé

	if (count($langues) <= 1) return '';
	$ret = '';
	sort($langues);
	while (list(, $l) = each ($langues)) {
		$selected = ($l == $default) ? ' selected=\'selected\'' : '';
		if ($l == $herit) {
			$ret .= "<option class='maj-debut' style='font-weight: bold;' value='herit'$selected>"
				.traduire_nom_langue($herit)." ("._T('info_multi_herit').")</option>\n";
		}
		else $ret .= "<option class='maj-debut' value='$l'$selected>".traduire_nom_langue($l)."</option>\n";
	}
	return $ret;
}

//
// Cette fonction est appelee depuis inc-public-global si on a installe
// la variable de personnalisation $forcer_lang ; elle renvoie le brouteur
// si necessaire vers l'URL xxxx?lang=ll
//
function verifier_lang_url() {
	global $_GET, $_COOKIE, $spip_lang;

	// quelle langue est demandee ?
esj's avatar
 
esj a validé
	$lang_demandee = $GLOBALS['meta']['langue_site'];
Fil's avatar
Fil a validé
	if ($_COOKIE['spip_lang_ecrire'])
		$lang_demandee = $_COOKIE['spip_lang_ecrire'];
	if ($_COOKIE['spip_lang'])
		$lang_demandee = $_COOKIE['spip_lang'];
	if ($_GET['lang'])
		$lang_demandee = $_GET['lang'];

	// Verifier que la langue demandee existe
	lang_select($lang_demandee);
	$lang_demandee = $spip_lang;

	// Renvoyer si besoin
Fil's avatar
Fil a validé
	if (!($_GET['lang']<>'' AND $lang_demandee == $_GET['lang'])
esj's avatar
 
esj a validé
	AND !($_GET['lang']=='' AND $lang_demandee == $GLOBALS['meta']['langue_site']))
		$destination->addvar('lang', $lang_demandee);
esj's avatar
esj a validé
		if ($d = $GLOBALS['var_mode'])
			$destination->addvar('var_mode', $d);
esj's avatar
esj a validé
		redirige_par_entete($destination->getUrl());

	// Subtilite : si la langue demandee par cookie est la bonne
	// alors on fait comme si $lang etait passee dans l'URL
	// (pour criteres {lang}).
Fil's avatar
Fil a validé
	$GLOBALS['lang'] = $_GET['lang'] = $spip_lang;
Antoine Pitrou's avatar
Antoine Pitrou a validé
// Selection de langue haut niveau
Fil's avatar
Fil a validé
function utiliser_langue_site() {
	changer_langue($GLOBALS['langue_site']);
}

Antoine Pitrou's avatar
Antoine Pitrou a validé
function utiliser_langue_visiteur() {
Fil's avatar
Fil a validé
	global $_COOKIE;
Fil's avatar
Fil a validé

Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (!regler_langue_navigateur())
Fil's avatar
Fil a validé
		utiliser_langue_site();
Fil's avatar
Fil a validé

	if (!empty($GLOBALS['auteur_session']['lang']))
		changer_langue($GLOBALS['auteur_session']['lang']);
Fil's avatar
Fil a validé

	$cookie_lang = (_DIR_RESTREINT  ? 'spip_lang' : 'spip_lang_ecrire');
Fil's avatar
Fil a validé
	if (!empty($_COOKIE[$cookie_lang]))
Fil's avatar
Fil a validé

Fil's avatar
Fil a validé
		changer_langue($_COOKIE[$cookie_lang]);
Antoine Pitrou's avatar
Antoine Pitrou a validé
}
Antoine Pitrou's avatar
Antoine Pitrou a validé
//
// Initialisation
//
function init_langues() {
	global $all_langs, $langue_site;
	global $pile_langues, $lang_typo, $lang_dir;
esj's avatar
 
esj a validé
	$all_langs = $GLOBALS['meta']['langues_proposees']
		.$GLOBALS['meta']['langues_proposees2'];
#	$langue_site = $GLOBALS['meta']['langue_site'];
Antoine Pitrou's avatar
Antoine Pitrou a validé
	$pile_langues = array();
	$lang_typo = '';
	$lang_dir = '';
	$toutes_langs = Array();
	if (!$all_langs || !$langue_site || !_DIR_RESTREINT) {
		if (!$d = @opendir(_DIR_LANG)) return;
Fil's avatar
 
Fil a validé
		while (($f = readdir($d)) !== false) {
			if (ereg('^spip_([a-z_]+)\.php[3]?$', $f, $regs))
				$toutes_langs[] = $regs[1];
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$all_langs2 = join(',', $toutes_langs);

		// Si les langues n'ont pas change, ne rien faire
		if ($all_langs2 != $all_langs) {
			$all_langs = $all_langs2;
			if (!$langue_site) {
				// Initialisation : le francais par defaut, sinon la premiere langue trouvee
				if (ereg(',fr,', ",$all_langs,")) $langue_site = 'fr';
				else list(, $langue_site) = each($toutes_langs);
				if (function_exists('ecrire_meta'))
Antoine Pitrou's avatar
Antoine Pitrou a validé
					ecrire_meta('langue_site', $langue_site);
			}
				if (function_exists('ecrire_meta')) {
				# sur spip.net le nombre de langues proposees fait exploser
				# ce champ limite a 255 caracteres ; a revoir...
				if (strlen($all_langs) <= 255) {
					ecrire_meta('langues_proposees', $all_langs);
					effacer_meta('langues_proposees2');
				} else {
					ecrire_meta('langues_proposees', substr($all_langs,0,255));
					ecrire_meta('langues_proposees2', substr($all_langs,255));
				}
Antoine Pitrou's avatar
Antoine Pitrou a validé
				ecrire_metas();
			}
Antoine Pitrou's avatar
Antoine Pitrou a validé
}
Antoine Pitrou's avatar
Antoine Pitrou a validé
init_langues();
utiliser_langue_site();