Créer un message correspondant à la localisation avec la chaîne de traduction python

Créer un message correspondant à la localisation avec la chaîne de traduction python

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.

code côté python

«É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")))

Générer un fichier .mo

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.

installation de lingua

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

Générer un fichier .po

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"

Créer un fichier .mo

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

À propos de l'emplacement de ja / LC_MESSAGES / sample.mo

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 /.

À propos de la traduction de chaînes de caractères prenant des arguments

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

Créer un message correspondant à la localisation avec la chaîne de traduction python
Envoyer un message à LINE avec Python (LINE Notify)
Étapes pour créer un bot Twitter avec Python
Créer un répertoire avec python
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Comment installer NPI + envoyer un message à la ligne avec python
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créez un environnement virtuel avec Python!
Publier un message sur Google Hangouts Chat avec un fil de discussion (Python)
5 façons de créer un chatbot Python
Créer une chaîne aléatoire en Python
Convertir en chaîne lors de la sortie de la sortie standard avec le sous-processus Python
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Essayez de créer un environnement python avec Visual Studio Code et WSL
Essayez d'extraire une chaîne de caractères d'une image avec Python3
J'ai essayé de créer une liste de nombres premiers avec python
Python vba pour créer une chaîne de date pour créer un nom de fichier
Créer un décorateur de fonction Python avec Class
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
[Python] Comment inverser une chaîne de caractères
Créer un compteur de fréquence de mots avec Python 3.4
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
Notez que le serveur d'exécution de Django est moss en Python 2.7.11 fourni avec Homebrew
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
3. Traitement du langage naturel avec Python 1-2. Comment créer un corpus: Aozora Bunko
Envoyer un message de Slack à un serveur Python
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Comment lire un fichier CSV avec Python 2/3
Comment envoyer un message à LINE avec curl
Comment incorporer des variables dans des chaînes python
Comment créer un objet fonction à partir d'une chaîne
Essayez de dessiner une courbe de vie avec python
Créer un environnement virtuel avec conda avec Python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Essayez de créer un code de "décryptage" en Python
Créer une barre de couleurs avec Python + Qt (PySide)
Décidez d'une mission de laboratoire avec Python (fiction)
Remarque Python: lors de l'attribution d'une valeur à une chaîne
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Créer un widget avec une couleur spécifiée avec Python + Qt (PySide)
Essayez de créer un groupe de dièdre avec Python
Procédure de création d'application multi-plateforme avec kivy
Créer un fichier au format Photoshop (.psd) avec python
Facile à créer une application console Python avec Click
Décrypter une chaîne chiffrée sur iOS avec Python
Je veux écrire dans un fichier avec Python