Agenda

Avril
2024

L M M J V S D
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Jour avec événement(s)
Jour férié
MER
MER
Carte des utilisateurs
Login
 Connexion
Glossaire
icon_npds_glossaire

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | Autres

En ligne

Il y a actuellement 70 visiteur(s) et 0 membre(s) en ligne.

Devenez membre privilégié en cliquant ici

Chat anonyme -1
sondage 2
Test sondage
Résultats  Anciens sondages
  • Votes : 1321
  • Commentaire(s) : 5
Galeries Photo
Activité du Site

Pages vues depuis 20/04/2015 : 23 826 419

  • Nb. de membres 44
  • Nb. d'articles 4
  • Nb. de forums 50
  • Nb. de sujets 9
  • Nb. de critiques 2

Top 10  Statistiques

Github jpb
Bloc 2 affichant une galerie

Index du forum »»  Road map développement »» traduction

traduction#1480

2Contributeur(s)
Nicolas2jpb
2 Modérateur(s)
phrjpb
Nicolas2 Nicolas2icon_post


function translate($phrase, $args=null) {

$params = (func_num_args() === 2) ? (array)$args : array_slice(func_get_args(), 1);

$tmp = translate_pass1($phrase, $params);

!!!!!include!!!!!("language/lang-mods.php");
return (htmlentities($tmp,ENT_QUOTES|ENT_SUBSTITUTE|ENT_HTML401,cur_charset));
}

function translate_pass1($phrase, $params=null) {
settype($englishname,'string');
switch($phrase) {
case "je suis un phrase avec {0} argements {1}": $tmp="je suis une phrase avec {0} arguments {1}"; break;
case "$englishname": $tmp="$englishname"; break;
default: $tmp=$phrase; break;
}

if (is_array($params))
$locale = language_iso(1,0,0);
return \MessageFormatter::formatMessage($locale, $tmp, $params);
else
return $tmp;


ce qui permet d'éviter d'avoir des tonnes de translate juste pour un mot et ce qui évite ce genre de truc



translate("Désolé, votre mot de passe doit faire au moins").' '.$minpass.' '.translate("caractères")


l'apel a translate si tu a des arguments ce fait



translate("je suis une phrase avec {0} arguments {1}", 5, "!!!");
translate("Désolé, votre mot de passe doit faire au moins {0} caractères", 12);


te donne

je suis une phrase avec 5 arguments !!!
Désolé, votre mot de passe doit faire au moins 12 caractères

et si pas d'argument



translate("je suis une phrase sans argument");


une function plus courte moins long a écrire lol


function __($phrase, $args = null)
{
if (! $phrase) return '';

return translate($phrase, $args);
}

echo __('test pour voir c\'est {0}', 'cool');


test pour voir c'est cool
 Message édité par : Nicolas2 / 05-03-2021 16:47
jpb jpbicon_post
oh oui que je testerai ! dès que j'ai un peu de temps !!

mais nous on a pas ça ...😩
return \MessageFormatter::formatMessage(


lol

L'eau goutte à  goutte finit toujours par percer la pierre...
Nicolas2 Nicolas2icon_post
c'est une lib natif de php tu na pas d'!include! a faire ou autre juste mètre un anti slash devant la méthode c'est tout.

\MessageFormatter::formatMessage(
jpb jpbicon_post
ah oui vu comme en js ...
L'eau goutte à  goutte finit toujours par percer la pierre...
Nicolas2 Nicolas2icon_post
function d'appel des translation plus courte pour le front l'admin et module



// return les translations du front
function __($phrase, $args = null)
{
if (! $phrase) return '';

return translate($phrase, $args);
}

// return les translations admin
function __a($phrase, $args = null)
{
if (! $phrase) return '';

return adm_translate($phrase, $args);
}

// return les translation d'un module
function __m($module, $phrase, $args = null)
{
if (! $phrase) return '';

$func = $module.'_translate';

return call_user_func_array($func, [$phrase, $args]);
}


exemple pour le module geoloc :

le fichier geoloc lang


function geoloc_translate($phrase, $args) {
//
$params = (func_num_args() === 2) ? (array)$args : array_slice(func_get_args(), 1);

if (is_array($params)) {
$locale = language_iso(1,0,0);
$phrase = \MessageFormatter::formatMessage($locale, $phrase, $params);
}

return (htmlentities($phrase,ENT_QUOTES|ENT_SUBSTITUTE|ENT_HTML401,cur_charset));
}


l'utilisation :



echo __m('geoloc', 'test du module geoloc pour voir, {0}', 'good');


le rendue :

test du module geoloc pour voir, good
Nicolas2 Nicolas2icon_post
Citation : jpb
ah oui vu comme en js ...
mon monde n'est que la matrice ou je code...


yes
Nicolas2 Nicolas2icon_post
pas de limitation sur le nombre d'argument il faut juste partir de {0} et {+1} pour chaque argument supplémentaire.

ce qui te donne si tu a 3 arguments :

// le front
__('je suis {0} phrase {1} provient {2} fichiers de traduction', 'une', 'qui', 'des');

// admin
__a('je suis {0} phrase {1} provient {2} fichiers de traduction', 'une', 'qui', 'des');

// module geoloc
__m('geoloc', 'je suis {0} phrase {1} provient {2} fichiers de traduction', 'une', 'qui', 'des');
 Message édité par : Nicolas2 / 05-03-2021 19:23
Nicolas2 Nicolas2icon_post
Example 2 pour module geoloc.



function geoloc_translate($phrase, $args) {
// le tableau des traduction
$messages = array(
'un' => 'juste un',
'deux' => 'pourquoi deux',
'trois' => 'je suis le 3 et je gagne',
'module {0}' => 'ce module {0} est vraiment génial',
);

// ont compte le nombre d'argument et on créer un tableau de paramètre key=>value
$params = (func_num_args() === 2) ? (array)$args : array_slice(func_get_args(), 1);

// ont regarde si la phrase existe dans le tableau messages
// si elle existe alors on la recupere
// sinon ont affiche la phrase original
if (array_key_exists($phrase, $messages)) {
$message = $messages[$phrase];
} else {
$message = $phrase;
}

// si params est un tableau
if (is_array($params)) {
// ont recupère la locale
$locale = language_iso(1,0,0);
// ont formate la phrase avec les arguments
$message = \MessageFormatter::formatMessage($locale, $message, $params);
}

// ont retourne la pharse
return (htmlentities($message,ENT_QUOTES|ENT_SUBSTITUTE|ENT_HTML401,cur_charset));
}


appel :

__m('geoloc', 'test du module geoloc pour voir, {0}', 'good');
__m('geoloc', 'un');
__m('geoloc', 'deux');
__m('geoloc', 'trois');
__m('geoloc', 'module {0}', 'geoloc');

résultat :

test du module geoloc pour voir, good
juste un
pourquoi deux
je suis le 3 et je gagne
ce module geoloc est vraiment génial

le tableau message regroupes l'intégralité des translation du module et permet d'éviter le switch, une multitude de case et breack, beaucoup plus rapide a écrire.
 Message édité par : Nicolas2 / 05-03-2021 20:58
 Message édité par : Nicolas2 / 05-03-2021 21:00
Nicolas2 Nicolas2icon_post
jais adapter le module ipban avec ce system de traduction pour celui qui veut tester.

lien pour télécharger le module ipban : https://airteck.fr/ipban.rar

tu a maintenant la possibilité de générer automatiquement tout les fichiers de langue a l'aide d’une commande que tu tape en console.

procédure pour tester ajouter cette function dans le mainfile.php et remplacer le module ipban par celui de l'archive en téléchargement voir lien au dessus.

a ajouter au mainfile.php


// return les translation d'un module
function __m($module, $phrase, $args = null)
{
if (! $phrase) return '';

$func = $module.'_translate';

return call_user_func_array($func, [$phrase, $args]);
}


c'est tout vous pouvez tester !!!

procédure pour la génération des fichiers de traduction via console cmd :

ouvrir une console a la racine de ce chemin : /modules/ipban/script une foi la console ouverte taper la commande suivante



php makelang


ajouter une ligne de traductions au fichier setban.php comme suite :

sans argument :
__m("ipban", "votre texte");

avec arguments :
__m("ipban", "votre texte avec {0} argument", 1);

relancer la commande dans votre console :

php makelang

et admirer le travail, il ne vous reste plus que les traduction a écrire dans chaque fichier de langue....

😜
 Message édité par : Nicolas2 / 06-03-2021 02:58
icon_pieces jointes Pièces jointes 1
jpb jpbicon_post
Yo Nico je vois que y'a encore eu des insomnies lol !
tout cela est bien séduisant ! faudra que j'essai tout ça !
je suis d'accord avec toi sur beaucoup d'argument et le fait que notre système de trad doit encore évoluer même si je trouve qu'il est très stable (peut être un peu lent et mal optimisé) ... justement entre autre à cause de la difficulté à le maintenir

je te met ici en vrac mes premières remarques

- j'ai et on a passé énormément de temps pour passer (en mode bricolage++ semi automatisé lol) le core en français maintenant c'est fait et oui un outil qui nous servirait à la maintenance et à la création de nouveau fichier pour les modules par exemple serait vraiment TOP

- oui la gestion des langue est vraiment un bouffe temps !!!
- oui on pourrait faire mieux !
- est on sûr que les recherche dans les tableaux sont plus rapide que les switch sur les variables ?
- les système d'argument serait bien entendu un GROS plus
- le fait de passer par la console n'est pas à la portée de tous nos "developpeurs" un script php serait plus abordable et pourrait être embarqué dans une nouvelle catégorisation (développement) des fonctions de l'admin
- pense qu'on a aussi l'os des traductions qui sont embarqué dans les meta_mot dans la base ....

Voili en tout cas chapeau pour le boulot
L'eau goutte à  goutte finit toujours par percer la pierre...