[PYTHON] Créez un outil de traduction avec Translate Toolkit

Translate Toolkit La boîte à outils Translate (http://toolkit.translatehouse.org/) est un ensemble de bibliothèques et d'outils de ligne de commande pour vous aider dans votre travail de traduction. Il est distribué sous licence GPLv2 et peut être utilisé librement par n'importe qui. Le développeur est Translate House, qui est implémenté en Python. Il prend en charge deux systèmes Python, et ne sera pas pris en charge avant Python 2.5 à partir de la prochaine 1.11.0. Translate House développe également la plateforme de traduction Pootle, qui utilise également cette boîte à outils Translate (Doc-ja Advent Calendar 2013 Day 1. / naruoga / 20131201/1385838237), Jour 3 La traduction de LibreOffice introduite dans se fait également sur Pocket).

Dans cet article, j'utiliserai la bibliothèque Translate Toolkit pour créer un outil de traduction simple. En particulier, nous traitons des outils qui automatisent l'édition des fichiers PO. Ceci est utile lorsque le processus d'édition est simple mais que la zone cible est immense. En parlant d'édition mécanique, les outils Unix existants tels que sed sont à l'origine bons dans ce domaine, mais PO n'est pas orienté ligne, il n'est donc pas compatible avec les outils Unix et ne peut pas être simple. Utilisons maintenant la boîte à outils Translate.

Dans cet article, PO by GNU gettext est considéré comme le format du catalogue de messages, mais Translate Toolkit n'est pas limité à PO. Il prend en charge divers formats tels que XLIFF. Le PO lui-même est expliqué dans l'article Jour 2 et ne sera pas mentionné ici.

Comment installer

$ pip install translate-toolkit

Sinon, si votre système d'exploitation fournit un package translate-toolkit, vous souhaiterez peut-être l'utiliser. Le code source est conservé sur github.

Étude de cas

Par exemple, considérons l'exemple de travail suivant. "Trois points ajoutés comme suffixes au message d'origine (communs dans les parties de l'interface graphique, etc.) ont été remplacés par un lecteur à trois points, ce qui a provoqué une grande quantité de flou. La correction elle-même du côté de la traduction est simple, mais la zone cible est énorme. Je veux le traiter mécaniquement. "

Exemple de PO

Ce qui suit est un extrait du bon de commande à modifier. Imaginez qu'il y ait tellement d'exemples comme celui-ci que vous ne voulez pas les éditer à la main. Certaines descriptions artificielles sont également incluses pour rendre l'effet plus facile à comprendre.

#Mettre à jour la cible
#, fuzzy
#| msgid "Open..."
msgid "Open…"
msgstr "ouvert..."

#Mettre à jour la cible
#Il y a un saut de ligne au milieu de la période latérale de traduction...
#, fuzzy
#| msgid "Save As..."
msgid "Save As…"
msgstr "enregistrer sous."
".."

#Pour une raison quelconque, il est un leader depuis un certain temps. Aucune mise à jour requise
msgid "Print…"
msgstr "impression…"

#Pour une raison quelconque, je souhaite laisser la traduction sans suffixe. Drop seulement flou
#, fuzzy
#| msgid "Print Preview..."
msgid "Print Preview…"
msgstr "Aperçu avant impression"

#Pour une raison quelconque, le texte original reste une période(Pour le moment, la traduction la suit)
msgid "Preference..."
msgstr "Réglage..."

Chose que tu veux faire

Le traducteur remplace également les trois points par un lecteur à trois points selon le texte original mis à jour. Les conditions du message cible sont les suivantes.

Exemple de script

Ce script lit PO à partir de l'entrée standard et écrit le résultat édité dans la sortie standard.

# -*- coding: utf-8 -*-
import sys
from translate.storage.po import pofile

PREV_SUFFIX = '...'
NEW_SUFFIX = u'…'

for unit in pofile.parsefile(sys.stdin).units:
    prev_source = unit.prev_source
    new_source = unit.source
    if unit.isfuzzy() and \
       prev_source.endswith(PREV_SUFFIX) and \
       new_source.endswith(NEW_SUFFIX) and \
       prev_source.rstrip(PREV_SUFFIX) == new_source.rstrip(NEW_SUFFIX):
        if unit.target.endswith(PREV_SUFFIX):
            updated_target = unit.target.replace(PREV_SUFFIX, NEW_SUFFIX)
            unit.settarget(updated_target)
        unit.markfuzzy(False)
        unit.prev_source = None
    print unit

Résultat du traitement

Le résultat du traitement du bon de commande ci-dessus est le suivant. Pouvez-vous voir que le traitement flou se fait sans excès ni défaut, et que le retour à la ligne au milieu du texte peut être géré de manière appropriée?

#Mettre à jour la cible
msgid "Open…"
msgstr "ouvert…"

#Mettre à jour la cible
#Il y a un saut de ligne au milieu de la période latérale de traduction...
msgid "Save As…"
msgstr "enregistrer sous…"

#Pour une raison quelconque, il est un leader depuis un certain temps. Aucune mise à jour requise
msgid "Print…"
msgstr "impression…"

#Pour une raison quelconque, je souhaite laisser la traduction sans suffixe. Drop seulement flou
msgid "Print Preview…"
msgstr "Aperçu avant impression"

#Pour une raison quelconque, le texte original reste une période(Pour le moment, la traduction la suit)
msgid "Preference..."
msgstr "Réglage..."

Description du script

Dans l'ensemble, les mots source et cible apparaissent souvent, mais ce sont des termes souvent utilisés dans la communauté des traducteurs. Le texte source et le texte cible désignent respectivement le texte original et le texte traduit. Correspond à msgid et msgstr dans PO.

Les API liées aux PO seront disponibles en important le module translate.storage.po. Pour plus d'informations sur l'API, consultez la référence API (http://docs.translatehouse.org/projects/translate-toolkit/en/1.11.0-rc1/api/index.html).

Si vous analysez le bon de commande avec la méthode parsefile de la classe pofile, une série de messages sera dans la liste appelée unités. Chaque message qui est un élément de la liste peut être utilisé comme un objet de la classe pounit. pounit fournit une API pour la manipulation des messages, y compris msgid et msgid, ainsi que les précédents msgids, divers commentaires et formes plurielles attributs définis par gettext. Vous pouvez accéder à (/manual/gettext.html#PO-Files). Grâce à l'API de pounit, vous pouvez manipuler les messages sans être lié par une description physique ennuyeuse des fichiers PO.

Les 4 lignes de la première si correspondent aux 4 conditions ci-dessus. J'édite un message qui correspond aux conditions.

À la fin de la boucle for, print imprime chaque pounit sur la sortie standard. pounit définit la méthode str, et vous pouvez le sortir en tant que message PO dans un format raisonnable simplement en l'imprimant tel quel.

Autre

En tant que travail similaire, il peut être appliqué à diverses fins telles que la vérification mécanique de la faute de frappe et la correction des lots en raison du changement de style de traduction. Dans d'autres cas courants, vous pouvez facilement créer des outils tels que prendre la différence de mise à jour entre deux bons de commande et fusionner les différences en un seul.

En fait, j'ai aidé avec la Traduction japonaise du projet GNOME pour changer le style des longues notes (comme changer «utilisateur» en «utilisateur»). Même quand je l'ai fait, j'ai créé un outil d'édition avec Translate Toolkit et je l'ai tout traité en même temps. Le nombre de messages PO dans le projet GNOME est estimé à plus de 100 000 en termes de msgid. Ce n'était pas quelque chose qui pouvait être modifié manuellement, et la boîte à outils Traduire a vraiment aidé.

Résumé

Cette fois, je n'ai présenté qu'une petite partie de la bibliothèque Translate Toolkit. Il existe de nombreuses autres fonctionnalités utiles. En plus de la bibliothèque, il existe également des outils de ligne de commande prêts à l'emploi. Pour plus de détails, reportez-vous à Divers documents comme la référence API. Essayez d'utiliser la boîte à outils Translate pour votre vie de traduction quotidienne. Bonne traduction!

Demain, c'est knok.

Recommended Posts

Créez un outil de traduction avec Translate Toolkit
Comment créer un sous-menu avec le plug-in [Blender]
Essayez de créer une application Todo avec le framework Django REST
Créez une carte thermique de tweet avec l'API Google Maps
Créer une page d'accueil avec django
Créer un répertoire avec python
Créer un nouveau csv avec des pandas basé sur le csv local
Mesurer l'importance des entités avec un outil de forêt aléatoire
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Créer un message correspondant à la localisation avec la chaîne de traduction python
Créez un environnement virtuel avec Python!
Créez un stepper de poisson avec numpy.random
Créer un téléchargeur de fichiers avec Django
Créez un sélecteur de couleurs pour la roue chromatique avec Python + Qt (PySide)
Préparez un environnement de test de charge distribué avec l'outil de test de charge Python Locust
Traduire les sous-titres au format WebVTT de Coursera avec l'API GCP Cloud Translation
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
Tweet la météo avec bot
Créez une image factice avec Python + PIL.
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
Créer un graphique à l'aide du module Sympy
Créer une application graphique avec Tkinter de Python
Rechercher le labyrinthe avec l'algorithme python A *
Créer un gros fichier texte avec shellscript
Créez un système stellaire avec le script Blender 2.80
Premiers pas avec l'outil de documentation Sphinx
Créer une machine virtuelle avec un fichier YAML (KVM)
Créez une application Web simple avec Flask
Créer un compteur de fréquence de mots avec Python 3.4
Créer un voisin le plus proche de connexion avec NetworkX
Créer un enregistrement avec des pièces jointes dans KINTONE à l'aide du module de requêtes Python
Créer un service Web avec Docker + Flask
Créer un référentiel privé avec AWS CodeArtifact
Créez un compteur de voiture avec Raspberry Pi
Créez une image diabolique avec le script de Blender
Créer une matrice avec PythonGUI (zone de texte)
Créer un graphique avec des bordures supprimées avec matplotlib
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
Utilisez la commande [shell] pour compresser par zip n'importe quel fichier pour créer un fichier et supprimer le fichier d'origine.
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Créez une base de données propre pour les tests avec FastAPI et effectuez le test Unittest de l'API avec pytest
Un modèle qui identifie la guitare avec fast.ai
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
[Python] Récupérez les fichiers dans le dossier avec Python
Tweet les prévisions météo avec le bot Partie 2
Créer un fichier exécutable GUI créé avec tkinter
Trouvez la position au-dessus du seuil avec NumPy
Créer un LINE BOT avec Minette pour Python
Créez une interface utilisateur de jeu à partir de zéro avec pygame2!
Créer un fichier PDF avec une taille de page aléatoire
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment 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
Suivez le marqueur AR avec un servo à 2 axes
Créer un babillard avec Heroku, Flask, SQL Alchemy
Créez un tableau de bord pour les appareils réseau avec Django!