2010-03-03 8 views
1

Je suis débutant en Python. Mon problème est assez simple. J'ai une chaîne à être localisée dans une application python contenant des paramètres:Arguments au milieu d'une chaîne à localiser

print _('Hello dear user, your name is ') + params['first_name'] + ' ' + params['last_name'] + _(' and blah blah blah') 

Cela ne fait le travail, mais pas vraiment ce que je qualifierais une belle façon de le faire. Sans oublier que certaines langues exigeront, par exemple, que le nom de famille soit affiché avant le prénom.

Y a-t-il une meilleure façon de le faire? J'ai pensé à placer des balises personnalisées comme {{fn}} ou {{ln}} dans la chaîne de traduction et à les remplacer par les valeurs réelles avant d'afficher la chaîne. Mais il semble que ce ne soit pas vraiment plus agréable.

Merci,

Pierre

+0

"" "nécessite que le nom de famille soit affiché avant que le prénom" "" présente un degré de confusion terminologique assez important. Peut-être que «prénom (s)» et «nom de famille» pourraient être meilleurs. Que faites-vous avec des gens avec un seul mot dans leur nom? Oh et d'ailleurs, pensez à paramétrer la salutation; "Bonjour cher utilisateur" serait accueilli avec des hurlements de rires moqueurs dans mon locale :-) –

+0

Désolé. Je ne suis pas vraiment entré dans la classe avancée de l'anglais :) L'exemple n'était en effet probablement pas le meilleur, mais était assez simple. Le problème est le même avec des liens au milieu d'un texte HTML, par exemple. Mais quand je regarde ... hum ... disons Facebook, leur formulaire d'inscription me demande mon prénom et mon nom de famille. Je pensais que leur niveau d'anglais était probablement meilleur que le mien. :) – Pierre

Répondre

3

Je vous suggère

print 'Hello dear user, your name is %(first_name)s %(last_name)s' % params 
+0

Est-ce que le travail, comme prévu. Et il me semble plus "pythonique" que ma solution. Je suis content de ne pas devoir pourrir la prochaine fois que je vais devoir montrer mon code à un autre développeur. :) – Pierre

0

Je pensais à placer des balises personnalisées comme {{fn}} ou {{En}} dans la chaîne de traduction et de les remplacer par les valeurs réelles avant de les afficher.

C'est ce que je ferais. Les espaces réservés aux bons endroits pour chaque version linguistique devraient faire le travail. Une chose à mentionner est que, dans certaines langues, les noms de personnes doivent être modifiés en fonction de l'endroit où ils se trouvent dans une phrase et de la manière dont ils sont utilisés. Vous devez connaître chaque langue spécifique pour pouvoir le faire correctement.

Une solution possible: garder les cas «au milieu d'une phrase» à un minimum. Gardez une ressource localisable séparée.

Au lieu de Hello dear user, your name is {{UserName}}

utilisation User name: {{UserName}}

+0

Merci pour votre précision. Je vais prendre soin de vos conseils. Mais parfois, quand les clients ont besoin de choses comme ça, je suis un bon garçon et je le fais :) Et d'autres fois, vous n'avez pas vraiment le choix. Lors de la génération de HTML avec des liens vers des URI dynamiques au milieu du texte, par exemple. – Pierre

1

Quelque chose comme ça devrait faire l'affaire:

print _('Hello dear user, your name is %s %s and blah blah blah') % (params['first_name'], params['last_name']) 
+0

Cela échouera lamentablement si l'ordre des arguments doit être changé. –

+0

Juste essayé la solution. En effet, je ne peux pas changer l'ordre des chaînes. Mais merci pour la solution. Je vais l'utiliser dans d'autres parties de l'application. – Pierre

1

Je voudrais aller avec des modèles si je étiez-vous. Cela vous permettrait d'avoir un modèle distinct pour chaque langue. Par exemple:

from string import Template 
s_en = Template('Hello dear user, your name is $first_name $last_name and blah blah blah') 
s_sco = Template('Hello, $first_name of the clan Mac$last_name...') 

user = {'last_name': 'Duncan', 'first_name': 'Leod'} 

print(s_en.substitute(user)) 
print(s_sco.substitute(user)) 
+0

Oui, merci. Je n'ai jamais entendu parler de cette solution, et cela sera également utile. Mais dans mon cas, puisque les 'templates' sont déjà fournis par le module i18n et la fonction gettext et font l'affaire, je ne comprends pas vraiment le gain. – Pierre

Questions connexes