Vous souhaiterez peut-être séparer les messages d'erreur en fonction des paramètres régionaux. Je ne savais pas quoi faire dans un tel cas, alors j'ai cherché.
translationstring
Utilisez translationstring. Cela semble être utilisé pour la localisation dans les packages liés au projet pyrons. Il semble qu'il utilise le mécanisme gettext qui est souvent utilisé pour la traduction générale.
«Échec» dans les paramètres régionaux japonais. Autre que cela, considérez une chaîne de caractères qui affiche «échec».
Il semble que la fonction générée par translationstring.TranslationStringFactory devrait être utilisée pour la notation. Enveloppez-le dans un objet Translator pour convertir la valeur.
En plus du code ci-dessous, vous avez besoin d'un fichier .mo en place.
translationstring_example.py
# -*- coding:utf-8 -*-
import gettext
import translationstring
# .Pour bien fonctionner avec l'outil de génération de fichier po_Il vaut mieux le nommer
_ = translationstring.TranslationStringFactory('sample')
lang = gettext.translation("sample", "./locale", languages=["ja"], codeset="utf8")
translator = translationstring.Translator(lang)
print(translator(_("failure")))
Le fichier .mo est le format utilisé par gettext. Généré à partir d'un fichier .po à l'aide d'une commande utilisant msgfmt. Générez un fichier .po avant le fichier .mo. Utilisez le pot-create pour cela.
Un paquet appelé lingua générera un fichier .po pour vous. ligua lui-même n'a pas besoin de babel, mais babel a été demandé lors de la tentative d'exécution de pot-create.
pip install lingua babel
Après avoir installé lingua, vous pouvez utiliser pot-create. Générer un fichier .po sur place
mkdir -p locale/ja/LC_MESSAGES/
pot-create translation_example.py -o locale/ja/LC_MESSAGES/sample.po
Le nom de fichier pour réécrire le sample.po généré doit être le même que le nom de domaine transmis à TranslationStringFactory.
Réécrivez comme suit. À l'origine, il est préférable de réécrire des parties telles que le nom du traducteur. Cette fois, je viens de réécrire la dernière partie
#
# SOME DESCRIPTIVE TITLE
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2014-06-12 15:37+09:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: ./translation_example.py:11
#, c-format
msgid "failure"
msgstr "Valeur d'échec"
La différence est la suivante
diff --git a/locale/ja/LC_MESSAGES/sample.po b/locale/ja/LC_MESSAGES/sample.po
index 2559ffb..db040c4 100644
--- a/locale/ja/LC_MESSAGES/sample.po
+++ b/locale/ja/LC_MESSAGES/sample.po
@@ -18,4 +18,4 @@ msgstr ""
#: ./translation_example.py:11
#, c-format
msgid "failure"
-msgstr ""
+msgstr "Valeur d'échec"
Utilisez msgfmt pour créer un fichier .mo.
msgfmt locale/ja/LC_MESSAGES/sample.po -o locale/ja/LC_MESSAGES/sample.mo
$ tree
.
├── locale
│ └── ja
│ └── LC_MESSAGES
│ ├── sample.mo
│ └── sample.po
├── requirements.txt
└── translation_example.py
3 directories, 4 files
Maintenant, «échec» est traduit en «valeur d'échec» et affiché.
$ python translation_example.py
Valeur d'échec
gettext examine les informations locales et demande le mappage à utiliser lors de la traduction.
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=
Il semble bon d'utiliser gettext.find pour vérifier si le fichier .mo peut être lu avec succès.
# -*- coding:utf-8 -*-
import gettext
print(gettext.find("sample", "./locale",["ja"]))
# ./locale/ja/LC_MESSAGES/sample.mo
Vous pouvez savoir où créer le fichier .po en consultant le code gettext.find.
gettext.py
# Locate a .mo file using the gettext strategy
def find(domain, localedir=None, languages=None, all=False):
# Get some reasonable defaults for arguments that were not supplied
if localedir is None:
localedir = _default_localedir
if languages is None:
languages = []
for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
val = os.environ.get(envar)
if val:
languages = val.split(':')
break
if 'C' not in languages:
languages.append('C')
# now normalize and expand the languages
nelangs = []
for lang in languages:
for nelang in _expand_lang(lang):
if nelang not in nelangs:
nelangs.append(nelang)
# select a language
if all:
result = []
else:
result = None
for lang in nelangs:
if lang == 'C':
break
mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain)
if os.path.exists(mofile):
if all:
result.append(mofile)
else:
return mofile
return result
En gros, récupérez des langues telles que "ja" à partir de ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'), Vous pouvez voir qu'il essaie de récupérer la valeur du fichier .mo sous localedir / ja / LC_MESSAGS /.
translation string peut également traduire des phrases qui acceptent des arguments.
msg2 = _("add-number", default="Add ${number}", mapping={"number": 1})
lang = gettext.translation("sample", "./locale", languages=["ja"], codeset="utf8")
translator = translationstring.Translator()
print(translator(_("add-number", mapping={"number": 10})))
#Ajouter 10
À ce stade, écrivez le .placeholder dans $ {} dans le fichier .po comme indiqué ci-dessous.
msgid "add-number"
msgstr "${number}S'il-vous-plait ajoutez"
Recommended Posts