Bon je pense avoir fais le tour de la question,et ma curiosité à été satisfaite.
A+
cljosse a écrit:
Un dernier point à éclaicir à propos du rechargement des langues.
Dans switch_lang_to tu utilises :
common.lang.php
admin.lang.php
et
local.lang.php
Je suppose que cela devait servir à charger une langue locale.
Oui, c'est ca...
J'ai repris le même modèle que le chargement d'une langue lors de l'initialisation de la page.
cljosse a écrit:
Je ne trouve pas trace d'un fichier nommé "local.lang" ?
C'est normal, comme tous les fichiers "local*" sur Piwigo. (conf, css, ...)
On les utilise que s'ils sont présents...
cljosse a écrit:
Pourrait-on pas utiliser
load_language('local.lang', $Plug_in_Path, array('language'=>$language, 'no_fallback'=>true));
pour rechargé la langue? En ajoutant un argument dans la fonction switch_lang_to ($language,$Plug_in_Path="")
En imposant 'local.lang.php' comme nom de fichier langue aux créateurs de plugins.
Ca, c'est une discussion plus avancée qui déborderdu cadre des 2 fonctions abordées ;-)
Je t'invite à ouvrir un nouveau topic (sur le forum anglais normalement) pour en discuter.
Mais, effectivement, ca pourrait être pratique comme méthode; mais bon, c'est possible de le faire avec le trigger.
cljosse a écrit:
Ce n'est qu'une remarque, après tout.
et je ne connais pas tout les tenants et aboutissements de la fonctions.
Cf mon commentaire au dessus, c'est un principe à généraliser, les fonctions swicths doivent simplement se calquer sur le même modèle que celui de l'init de la page.
Par contre, autre remarque, les fonctions swicth_lang sont dans un include destiné au mail (car besoin initial).
Il serait peut-être bon de le mettre dans un autre include:
o soit le functions.inc.php avec le l10n
o soit un nouveau fichier functions.lang.php
Il va y avoir du changement au niveau des traductions donc ca sera le moment de mettre en place de nouvelles choses!
Bonjour.
@rub
Un dernier point à éclaicir à propos du rechargement des langues.
Dans switch_lang_to tu utilises :
common.lang.php
admin.lang.php
et
local.lang.php
Je suppose que cela devait servir à charger une langue locale.
Je ne trouve pas trace d'un fichier nommé "local.lang" ?
Pourrait-on pas utiliser
load_language('local.lang', $Plug_in_Path, array('language'=>$language, 'no_fallback'=>true));
pour rechargé la langue? En ajoutant un argument dans la fonction switch_lang_to ($language,$Plug_in_Path="")
En imposant 'local.lang.php' comme nom de fichier langue aux créateurs de plugins.
Ce n'est qu'une remarque, après tout.
et je ne connais pas tout les tenants et aboutissements de la fonctions.
A+
Voila, c'est fait!
[Bugtracker] ticket 1142
[Subversion] r4907
[Subversion] r4908
Eric a écrit:
rub a écrit:
rub a écrit:
Ok.
Par contre, tu avais aussi un soucis sur le changement de la langue de ton plugin?
Tu as fait le test en utilisant le trigger?Vu ton exemple, ca va fonctionner mais tu vas recharger la langue à chaque fois. A mon avis, ca vaut le coup de tester le trigger.
Désolé, je ne comprends pas. Utiliser l'appel au trigger trigger_action('loading_lang') au lieu de faire un switch_lang_back ?
Non!
En fait plutot que de faire le " load_language('plugin.lang', NBC_UserAdvManager_PATH);" entre le switch_lang_back et switch_lang_to.
Il faudrait utiliser le trigger 'loading_lang' pour charger les traductions de ton plugins. En cas de nombreux switch, ton fichier ne sera chargée qu'une fois par langue!
cljosse a écrit:
rub a écrit:
Pour la version optimisée, j'ai vu que tu as fait plus de switch_lang_back que switch_lang_to.
J'avais pensé qu'une erreur se serait lévée... mais non...
Ton test -//:---\spam que c'est bonC'était volontaire, pour faire le test complet.
Je sais bien ;-)
cljosse a écrit:
rub a écrit:
mais en fait non... les $lang, $lang_info sont corrects mais $user aura une langue à null.
J'ai donc rajouté un test sur la valeur du array_pop. J'ai fait aussi une version en testant le count. (laquelle prendre?)Je préfère que la deuxième solution, vérifier le count avant d'extraire une donnée me parait plus correcte.
Vendu, je commite ca asap.
cljosse a écrit:
Sinon Bravo!
Plus qu'a attendre une mise à jour.
Bonne soirée.
Bravo à toi pour tous les tests et pour m'avoir aiguiller vers mes erreurs.
La vérification croisée du code, c'est ce qu'il a de mieux ;-)
rub a écrit:
rub a écrit:
Ok.
Par contre, tu avais aussi un soucis sur le changement de la langue de ton plugin?
Tu as fait le test en utilisant le trigger?Vu ton exemple, ca va fonctionner mais tu vas recharger la langue à chaque fois. A mon avis, ca vaut le coup de tester le trigger.
Désolé, je ne comprends pas. Utiliser l'appel au trigger trigger_action('loading_lang') au lieu de faire un switch_lang_back ?
rub a écrit:
Pour la version optimisée, j'ai vu que tu as fait plus de switch_lang_back que switch_lang_to.
J'avais pensé qu'une erreur se serait lévée... mais non...
Ton test -//:---\spam que c'est bon
C'était volontaire, pour faire le test complet.
rub a écrit:
mais en fait non... les $lang, $lang_info sont corrects mais $user aura une langue à null.
J'ai donc rajouté un test sur la valeur du array_pop. J'ai fait aussi une version en testant le count. (laquelle prendre?)
Je préfère que la deuxième solution, vérifier le count avant d'extraire une donnée me parait plus correcte.
Sinon Bravo!
Plus qu'a attendre une mise à jour.
Bonne soirée.
rub a écrit:
Eric a écrit:
Eric a écrit:
(...)
Le sujet du mail est bien en EN mais pas le contenu. Pourtant la langue du user est bien détectée.
[edit] A l'issue, l'interface de la galerie revient bien dans la langue d'origine FR [/edit]Erratum! C'est OK pour moi également sur la version optimisée. J'avais oublié de passer le switch_lang_back() tout à la fin de la fonction :-/
Ok.
Par contre, tu avais aussi un soucis sur le changement de la langue de ton plugin?
Tu as fait le test en utilisant le trigger?
Vu ton exemple, ca va fonctionner mais tu vas recharger la langue à chaque fois. A mon avis, ca vaut le coup de tester le trigger.
Eric a écrit:
Eric a écrit:
(...)
Le sujet du mail est bien en EN mais pas le contenu. Pourtant la langue du user est bien détectée.
[edit] A l'issue, l'interface de la galerie revient bien dans la langue d'origine FR [/edit]Erratum! C'est OK pour moi également sur la version optimisée. J'avais oublié de passer le switch_lang_back() tout à la fin de la fonction :-/
Ok.
Par contre, tu avais aussi un soucis sur le changement de la langue de ton plugin?
Tu as fait le test en utilisant le trigger?
cljosse a écrit:
Resultats ça vient.
Optimisé OK
Enfin... mais il y avait quand même bcp de coquilles dans ce que j'avais fait...
On part sur la version optimisée mais j'ai quand même essayer de corrige le trunk.
Lors de back, la comparaison de la langue dépilée doit se faire la langue en cours...
/* * Switch language to param language * All entries are push on language stack * * @param string language */ function switch_lang_to($language) { global $switch_lang, $user, $lang, $lang_info; // explanation of switch_lang // $switch_lang['language'] contains data of language // $switch_lang['stack'] contains stack LIFO if (count($switch_lang['stack']) == 0) { $prev_language = $user['language']; if (!isset($switch_lang['language'][$prev_language])) { $switch_lang['language'][$prev_language]['lang_info'] = $lang_info; $switch_lang['language'][$prev_language]['lang'] = $lang; } } else { $prev_language = end($switch_lang['stack']); } $switch_lang['stack'][] = $user['language']; if ($prev_language != $language) { if (!isset($switch_lang['language'][$language])) { // Re-Init language arrays $lang_info = array(); $lang = array(); // language files load_language('common.lang', '', array('language'=>$language) ); // No test admin because script is checked admin (user selected no) // Translations are in admin file too load_language('admin.lang', '', array('language'=>$language) ); trigger_action('loading_lang'); load_language('local.lang', '', array('language'=>$language, 'no_fallback'=>true)); $switch_lang['language'][$language]['lang_info'] = $lang_info; $switch_lang['language'][$language]['lang'] = $lang; } else { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } $user['language'] = $language; } } /* * Switch back language pushed with switch_lang_to function * * @param: none */ function switch_lang_back() { global $switch_lang, $user, $lang, $lang_info; $last_language = array_pop($switch_lang['stack']); $language = $user['language']; if ($last_language != $language) { if (isset($switch_lang['language'][$last_language])) { $lang_info = $switch_lang['language'][$last_language]['lang_info']; $lang = $switch_lang['language'][$last_language]['lang']; } $user['language'] = $last_language; } }
Pour la version optimisée, j'ai vu que tu as fait plus de switch_lang_back que switch_lang_to.
J'avais pensé qu'une erreur se serait lévée... mais non...
Ton test -//:---\spam que c'est bon mais en fait non... les $lang, $lang_info sont corrects mais $user aura une langue à null.
J'ai donc rajouté un test sur la valeur du array_pop. J'ai fait aussi une version en testant le count. (laquelle prendre?)
Ca donne:
/* * Switch language to param language * All entries are push on language stack * * @param string language */ function switch_lang_to($language) { global $switch_lang, $user, $lang, $lang_info; // explanation of switch_lang // $switch_lang['language'] contains data of language // $switch_lang['stack'] contains stack LIFO // $switch_lang['initialisation'] allow to know if it's first call // Treatment with current user // Language of current user is saved (it's considered OK on firt call) if (!isset($switch_lang['initialisation']) and !isset($switch_lang['language'][$user['language']])) { $switch_lang['initialisation'] = true; $switch_lang['language'][$user['language']]['lang_info'] = $lang_info; $switch_lang['language'][$user['language']]['lang'] = $lang; } // Change current infos $switch_lang['stack'][] = $user['language']; $user['language'] = $language; // Load new data if necessary if (!isset($switch_lang['language'][$language])) { // Re-Init language arrays $lang_info = array(); $lang = array(); // language files load_language('common.lang', '', array('language'=>$language) ); // No test admin because script is checked admin (user selected no) // Translations are in admin file too load_language('admin.lang', '', array('language'=>$language) ); trigger_action('loading_lang'); load_language('local.lang', '', array('language'=>$language, 'no_fallback'=>true)); $switch_lang['language'][$language]['lang_info'] = $lang_info; $switch_lang['language'][$language]['lang'] = $lang; } else { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } } /* * Switch back language pushed with switch_lang_to function * * @param: none */ function switch_lang_back() { global $switch_lang, $user, $lang, $lang_info; // Get last value $language = array_pop($switch_lang['stack']); if (!is_null($language)) { // Change current infos if (isset($switch_lang['language'][$language])) { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } $user['language'] = $language; } } ou bien /* * Switch back language pushed with switch_lang_to function * * @param: none */ function switch_lang_back() { global $switch_lang, $user, $lang, $lang_info; if (count($switch_lang['stack']) > 0) { // Get last value $language = array_pop($switch_lang['stack']); // Change current infos if (isset($switch_lang['language'][$language])) { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } $user['language'] = $language; } }
Eric a écrit:
(...)
Le sujet du mail est bien en EN mais pas le contenu. Pourtant la langue du user est bien détectée.
[edit] A l'issue, l'interface de la galerie revient bien dans la langue d'origine FR [/edit]
Erratum! C'est OK pour moi également sur la version optimisée. J'avais oublié de passer le switch_lang_back() tout à la fin de la fonction :-/
Resultats ça vient.
Optimisé OK
Trunk dépilement :
switch_lang_back() --> Fin 4:Hello
switch_lang_back() --> Fin 3:Hello
-(
test sur "Envoyer un mail d'informations aux membres d'un groupe" ok en trunk
Langue initiale : fr_FR
Init :Bonjour
--------------------------
switch_lang_to--> it_IT
1 Ciao
--------------------------
switch_lang_to--> it_IT
1 Ciao
switch_lang_back() --> Fin 3:Ciao
switch_lang_back() --> Fin 2:Bonjour
--------------------------
switch_lang_to--> it_IT
1 Ciao
--------------------------
switch_lang_to --> es_ES
2 Hola
--------------------------
switch_lang_to --> it_IT
3 Hola
--------------------------
switch_lang_to --> en_UK
4 Hello
--------------------------
switch_lang_to --> nl_NL
5 Hallo
========================================================================
switch_lang_back() --> Fin 4:Hello
switch_lang_back() --> Fin 3:Hello
switch_lang_back() --> Fin 2:Hola
switch_lang_back() --> Fin 1:Ciao
switch_lang_back() --> Fin 0:Bonjour
----- FIN DU TEST TRUNK ---------------
Langue initiale : fr_FR
Init :Bonjour
--------------------------
switch_lang_to--> it_IT
1 Ciao
--------------------------
switch_lang_to--> it_IT
1 Ciao
switch_lang_back() --> Fin 3:Ciao
switch_lang_back() --> Fin 2:Bonjour
--------------------------
switch_lang_to--> it_IT
1 Ciao
--------------------------
switch_lang_to --> es_ES
2 Hola
--------------------------
switch_lang_to --> it_IT
3 Ciao
--------------------------
switch_lang_to --> en_UK
4 Hello
--------------------------
switch_lang_to --> nl_NL
5 Hallo
========================================================================
switch_lang_back() --> Fin 4:Hello
switch_lang_back() --> Fin 3:Ciao
switch_lang_back() --> Fin 2:Hola
switch_lang_back() --> Fin 1:Ciao
switch_lang_back() --> Fin 0:Bonjour
switch_lang_back() --> Fin 0:Bonjour
switch_lang_back() --> Fin 0:Bonjour
----- FIN DU TEST OPTIMISEE ---------------
rub a écrit:
Pour la version optimisée, bien vu la remarque sur le "$switch_lang['stack'][] = $user['language']" mais ce n'est pas dans l'init qu'il faut le mettre , il faut remplacer la ligne "change info".
Car, le stack et languague sont dissociés.
Ok pour parenthèse, j'avais prévenu pas de test ;-)
Pour le trunk, ta modif n'est pas bonne, donc résultat ko.
Il faut faire aussi un "$switch_lang['stack'][] = $user['language'];"
Avec ta version, le back avec doucle empilement ne fonctionne pas...
En espérant que ca soit la bonne...
Je viens de tester la dernière version optimisée avec la fonction GhostTracker de mon plugin. J'ai l'impression qu'il y a encore une coquille.
Voici le code que j'utilise pour mes test (possible que la faute soit aussi là !) :
function ghostreminder($user_id, $username, $email) { global $conf; $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array(); include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php'); $infos1_perso = ""; /* We have to get the user's language in database */ $query =' SELECT user_id, language FROM '.USER_INFOS_TABLE.' WHERE user_id = '.$user_id.' ;'; $data = mysql_fetch_assoc(pwg_query($query)); $language = $data['language']; /* And switch gallery to this language before using personalized and multilangual contents */ switch_lang_to($data['language']); load_language('plugin.lang', NBC_UserAdvManager_PATH); $subject = '['.$conf['gallery_title'].'] '.l10n_args(get_l10n_args('Ghost_reminder_of_%s', $username)); if (isset($conf_nbc_UserAdvManager[19]) and $conf_nbc_UserAdvManager[19] <> '' and isset($conf_nbc_UserAdvManager[17]) and $conf_nbc_UserAdvManager[17] == 'true') { if (function_exists('get_user_language_desc')) { $infos1 = get_user_language_desc($conf_nbc_UserAdvManager[19])."\n\n"; } else { load_language('plugin.lang', NBC_UserAdvManager_PATH); $infos1 = l10n($conf_nbc_UserAdvManager[19])."\n\n"; } resetlastvisit($user_id); } // pwg_mail($email, array( // 'subject' => $subject, // 'content' => $infos1.get_absolute_root_url(), // )); /* Switching back to default language */ switch_lang_back(); /* ********************** */ /* Email sending debugger */ /* This is only to trace */ /* the send of emails for */ /* debugging */ /* ********************** */ $content = get_user_language_desc($conf_nbc_UserAdvManager[19])."\n\n"; MailLog($subject,$content,$language); /* ********************** */ }
La langue de l'admin de la galerie est en FR et le user notifié est en EN. Voici le fichier résultant :
[Lucifer's Lair web site] test3, this is a reminder email
Bonjour.
Ceci est un message de rappel car cela fait 20 jours que vous n'êtes pas revenu sur notre galerie. Si vous ne souhaitez plus utiliser votre compte d'accès, merci de bien vouloir nous en informer en répondant à ce message. Votre compte sera alors supprimé.
A réception du présent message et sans nouvelle visite de votre part dans les 1 jours, nous serions dans l'obligation de supprimer automatiquement votre compte.
Cordialement,
L'administrateur de la galerie.
Langue :
en_UK
Le sujet du mail est bien en EN mais pas le contenu. Pourtant la langue du user est bien détectée.
[edit] A l'issue, l'interface de la galerie revient bien dans la langue d'origine FR [/edit]
Pour la version optimisée, bien vu la remarque sur le "$switch_lang['stack'][] = $user['language']" mais ce n'est pas dans l'init qu'il faut le mettre , il faut remplacer la ligne "change info".
Car, le stack et languague sont dissociés.
Ok pour parenthèse, j'avais prévenu pas de test ;-)
Pour le trunk, ta modif n'est pas bonne, donc résultat ko.
Il faut faire aussi un "$switch_lang['stack'][] = $user['language'];"
Avec ta version, le back avec doucle empilement ne fonctionne pas...
En espérant que ca soit la bonne...
Version trunk:
/* * Switch language to param language * All entries are push on language stack * * @param string language */ function switch_lang_to($language) { global $switch_lang, $user, $lang, $lang_info; // explanation of switch_lang // $switch_lang['language'] contains data of language // $switch_lang['stack'] contains stack LIFO if (count($switch_lang['stack']) == 0) { $prev_language = $user['language']; if (!isset($switch_lang['language'][$prev_language])) { $switch_lang['language'][$prev_language]['lang_info'] = $lang_info; $switch_lang['language'][$prev_language]['lang'] = $lang; } } else { $prev_language = end($switch_lang['stack']); } $switch_lang['stack'][] = $user['language']; if ($prev_language != $language) { if (!isset($switch_lang['language'][$language])) { // Re-Init language arrays $lang_info = array(); $lang = array(); // language files load_language('common.lang', '', array('language'=>$language) ); // No test admin because script is checked admin (user selected no) // Translations are in admin file too load_language('admin.lang', '', array('language'=>$language) ); trigger_action('loading_lang'); load_language('local.lang', '', array('language'=>$language, 'no_fallback'=>true)); $switch_lang['language'][$language]['lang_info'] = $lang_info; $switch_lang['language'][$language]['lang'] = $lang; } else { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } $user['language'] = $language; } } /* * Switch back language pushed with switch_lang_to function * * @param: none */ function switch_lang_back() { global $switch_lang, $user, $lang, $lang_info; $last_language = array_pop($switch_lang['stack']); if (count($switch_lang['stack']) > 0) { $language = end($switch_lang['stack']); } else { $language = $user['language']; } if ($last_language != $language) { if (isset($switch_lang['language'][$last_language])) { $lang_info = $switch_lang['language'][$last_language]['lang_info']; $lang = $switch_lang['language'][$last_language]['lang']; } $user['language'] = $last_language; } }
Version optimisée:
/* * Switch language to param language * All entries are push on language stack * * @param string language */ function switch_lang_to($language) { global $switch_lang, $user, $lang, $lang_info; // explanation of switch_lang // $switch_lang['language'] contains data of language // $switch_lang['stack'] contains stack LIFO // $switch_lang['initialisation'] allow to know if it's first call // Treatment with current user // Language of current user is saved (it's considered OK on firt call) if (!isset($switch_lang['initialisation']) and !isset($switch_lang['language'][$user['language']])) { $switch_lang['initialisation'] = true; $switch_lang['language'][$user['language']]['lang_info'] = $lang_info; $switch_lang['language'][$user['language']]['lang'] = $lang; } // Change current infos $switch_lang['stack'][] = $user['language']; $user['language'] = $language; // Load new data if necessary if (!isset($switch_lang['language'][$language])) { // Re-Init language arrays $lang_info = array(); $lang = array(); // language files load_language('common.lang', '', array('language'=>$language) ); // No test admin because script is checked admin (user selected no) // Translations are in admin file too load_language('admin.lang', '', array('language'=>$language) ); trigger_action('loading_lang'); load_language('local.lang', '', array('language'=>$language, 'no_fallback'=>true)); $switch_lang['language'][$language]['lang_info'] = $lang_info; $switch_lang['language'][$language]['lang'] = $lang; } else { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } } /* * Switch back language pushed with switch_lang_to function * * @param: none */ function switch_lang_back() { global $switch_lang, $user, $lang, $lang_info; // Get last value $language = array_pop($switch_lang['stack']); // Change current infos if (isset($switch_lang['language'][$language])) { $lang_info = $switch_lang['language'][$language]['lang_info']; $lang = $switch_lang['language'][$language]['lang']; } $user['language'] = $language; }