12
votes

Comment GetText gère-t-il le contenu dynamique?

en PHP (ou peut-être gettext en général), qu'est-ce que GetText FAIT lorsqu'il voit une variable de contenu dynamique?

J'ai 2 cas à l'esprit.

1) Disons que j'ai Poked John . Peut-être dans une langue l'ordre des mots est différent. Comment GetText gère-t-il cela? (Non, je ne construis pas Facebook, c'était juste un exemple)

2) Disons que je stocke certaines catégories dans une base de données. Ils rarement, mais ils stockent dans une base de données. Que se passerait-il si je fais ? J'aimerais aussi que les traducteurs traduisent également ces noms de catégorie, mais cela doit-il être fait dans la base de données elle-même?

merci


1 commentaires

Les lecteurs de cette question peuvent également être intéressés par "Comment spécifier des variables commandées dans les fichiers de getText .po?": Stackoverflow.com/Questtions/13979962/...


3 Réponses :


21
votes

Votre meilleure option consiste à utiliser sprintf () code> fonction. Ensuite, vous utiliseriez la notation printf code> pour gérer le contenu dynamique de vos chaînes. Voici une fonction que j'ai trouvée ici il y a quelque temps pour vous gérer facilement pour vous:

<?php

_('Cars');
_('Trains');
_('Airplanes');


3 commentaires

Le cas 1 peut être traité plus facilement: . Vous n'avez pas besoin d'une fonction supplémentaire et POEDIT analysera toujours la corde, comme tout autre.


Si vous traduisez "% s poked% S" Comment pouvez-vous échanger les noms des deux utilisateurs quand ils sont tous deux marqués avec le même espace réservé? Dans certaines langues, le sujet passe avant l'objet.


% s ne doit être utilisé qu'une seule fois, à plusieurs reprises, utiliser: % 1 $ s , % 2 $ s ...



5
votes

Pour construire un peu sur quelle marque a dit ... Le seul problème de la solution ci-dessus est que la liste statique doit être toujours maintenue à la main et si vous ajoutez une nouvelle chaîne avant tous les autres ou que vous modifiez complètement une version existante. , le doux que vous utilisez pour la traduction peut confondre les nouvelles chaînes et vous pourriez perdre des traductions.

J'écris en fait un article à ce sujet (trop peu de temps pour le terminer à tout moment!) Mais ma réponse proposée va quelque chose comme ceci:

GetText vous permet de stocker le numéro de ligne que la chaîne apparaît dans le code dans le fichier .po. Si vous modifiez entièrement la chaîne, l'éditeur .Po saura savoir que la chaîne n'est pas nouvelle, mais elle est ancienne (grâce au numéro de ligne).

Ma solution à ce sujet consiste à écrire un script qui lit la base de données et crée un fichier statique avec toutes les chaînes GetText. La grande différence pour la solution de Mark est d'avoir la clé principale (appelons ID ID) sur la base de données correspondant au numéro de ligne dans le nouveau fichier. Dans ce cas, si vous modifiez complètement une traduction originale, les lignes sont toujours identiques et que votre traducteur doux reconnaîtra les chaînes.

Bien sûr, il pourrait y avoir des rédacteurs de pulsion plus récents et plus intelligents, mais au moins si le vôtre vous donne des problèmes avec de nouvelles chaînes, alors cela les résoudra.

Mes 2 cents.


0 commentaires

4
votes

Si vous avez quelque part dans votre code: Et l'une de vos langues doit échanger les arguments qu'il est très simple. Traduisez simplement votre code comme celui-ci: msgstr "% s pipé% s" msgstr "% 2 $ s traduction_of_poked% 1 $ s"


0 commentaires