20 projets, 20 langues, date limite hier. 2e partie

Poursuite d'une série d'articles sur la mise en place de localisations continues. Vous pouvez trouver le premier ici . Dans cet article, je vais vous expliquer comment intégrer le bundle Serge-Smartcat-GitLab et configurer les fichiers de configuration Serge à l'aide d'un exemple de projet de test. Instructions pour Ubuntu.


Installation via vagrantfile


Si vous n'avez pas de serveur avec Ubuntu à portée de main, vous pouvez utiliser Vagrant. Comment ça marche:


  1. Installez Vagrant et VirtualBox en suivant les instructions .
  2. Téléchargez le script vagrantfile et bash.
  3. Lancez vagrantfile en suivant les instructions .

Le résultat de la construction de Vagrant sera une machine virtuelle Ubuntu sur laquelle Serge est installé avec le plugin Smartcat. Tous les fichiers nécessaires seront copiés, la clé ssh est créée. Vous pouvez immédiatement procéder à la configuration du projet et au lancement de l'application.


Installation manuelle


Création d'utilisateurs


Créez un groupe d'utilisateurs de serge:


sudo groupadd serge 

Créez l'utilisateur serge avec le répertoire personnel / usr / local / serge:


 sudo useradd -g serge serge -m -d /usr/local/serge 

Installer Serge


La documentation complĂšte de Serge est ici .
Mettez à jour les métadonnées de la base de données de packages locale:


 sudo apt-get -qq update 

Installez les outils d'assemblage, ainsi que les packages nécessaires. Avant de commencer l'installation, assurez-vous que Perl 5.10 ou supérieur est installé.


 sudo apt-get -qq -y install build-essential libssl-dev libexpat-dev unzip wget 

Accédez au répertoire personnel de l'utilisateur de serge et installez Serge avec toutes les dépendances nécessaires.


 cd /usr/local/serge sudo -u serge wget https://github.com/evernote/serge/archive/master.zip -O serge-master.zip sudo -u serge unzip serge-master.zip sudo -u serge unlink serge-master.zip cd serge-master sudo cpan App::cpanminus sudo cpanm --installdeps . sudo -u serge sudo ln -s /usr/local/serge/serge-master/bin/serge /usr/local/bin/serge 

Installation du plugin Smartcat


 sudo cpanm HTTP::Daemon@6.01 sudo cpanm Serge::Sync::Plugin::TranslationService::Smartcat sudo cpan install LWP::Protocol::https 

Création de clé


Créez un utilisateur de serge avec la clé ssh que l'utilisateur de serge utilisera dans GitLab:


 sudo -u serge ssh-keygen -t rsa -N "" -f .id_rsa_serge 

Intégration avec GitLab


Créez un utilisateur de serge dans GitLab et ajoutez-le à tous les référentiels de développeurs.
Copiez la clé ssh du fichier id_rsa_serge.pub dans les paramÚtres du profil utilisateur de serge dans GitLab. Cela est nécessaire pour que Serge puisse recevoir et envoyer des chaßnes dans GitLab.


L'installation est terminée!


Intégration Smartcat


Pour commencer, vous devez:


  1. Inscrivez-vous Ă  Smartcat .
  2. Créez un projet en indiquant les langues dans lesquelles vous souhaitez traduire. Lors de la configuration du plugin, vous aurez besoin des codes de langue utilisés par Smartcat.
  3. Obtenez project_id , token et token_id .
  4. Écrivez à support@smartcat.ai et demandez d'activer la prise en charge de l'algorithme d'analyse de fichiers Serge

Configurer Serge-Smartcat


Avant de procéder à l'installation, je décrirai le principe général de fonctionnement. Le cycle de localisation standard comprend 5 étapes:
image


  • pull - rĂ©cupĂšre de nouvelles lignes depuis le dĂ©pĂŽt.
  • pull-ts - rĂ©cupĂšre les chaĂźnes localisĂ©es de Smartcat (le plugin Smartcat est activĂ©).
  • localiser - tous les formats source du rĂ©fĂ©rentiel sont analysĂ©s et convertis en fichiers .po, les traductions reçues sont Ă©crites dans des fichiers .po. Toutes les lignes sont Ă©crites dans la base de donnĂ©es de la mĂ©moire de traduction Serge.
  • push-ts - les nouvelles lignes reçues Ă  la premiĂšre Ă©tape sont envoyĂ©es Ă  Smartcat (Ă  l'aide du plug-in Smartcat).
  • push - les chaĂźnes localisĂ©es sont validĂ©es dans GitLab.
    Vous pouvez utiliser l'intégration avec un autre systÚme CAT, par exemple, il existe un plugin pour Pootle .

DépÎts Serge et Git


Comment Serge sait-il quelles lignes envoyer pour traduction? Pour déterminer de nouvelles lignes, des outils git standard sont utilisés: la différence entre la branche principale et la branche actuelle est prise. Diff est envoyé pour traduction.


image


Important : En rĂšgle gĂ©nĂ©rale, la branche principale est protĂ©gĂ©e, donc une branche de traduction supplĂ©mentaire est utilisĂ©e pour dĂ©finir les diffĂ©rences, nous l'appelons base-translate. Autrement dit, aprĂšs la fusion de la version dans master, master doit en outre ĂȘtre conservĂ© dans base-translate.


Il y a un point important ici. Il est nĂ©cessaire de construire les processus de telle maniĂšre que, d'une part, les dĂ©veloppeurs comprennent quoi et Ă  quel moment il ira Ă  la traduction, et d'autre part, afin que le techpec ne tourne pas en rond, tenant sa tĂȘte, car son diff est de 1000 lignes. Et il semble que seul le titre ait Ă©tĂ© corrigĂ©.


Principe de fonctionnement


Serge entre dans le référentiel, prend toutes les branches et commence à les comparer avec la branche maßtre. Pour chaque branche dans laquelle diff est détecté, il crée un ensemble de documents de traduction dans le projet Smartcat. Afin de ne pas s'enliser dans le chaos des branches non pertinentes et de ne pas se tenir prÚs de chaque développeur avec la question: «avez-vous pensé à supprimer la branche?», Il est pratique d'utiliser des préfixes. Par exemple, Serge ne fonctionne qu'avec les branches qui ont le préfixe translate .


Il est Ă©galement important que les textes dĂ©jĂ  lus et approuvĂ©s prĂȘts pour la traduction tombent dans la branche avec le prĂ©fixe translate. AprĂšs tout, personne ne veut analyser l'histoire des commits en vain pour comprendre de quel type de texte il s'agit et pourquoi diff ressemble Ă  ça?


Préparation du contenu


Notre processus de préparation de contenu est le suivant:


image


ÉnoncĂ© du problĂšme. Lorsque la tĂąche est au stade de la formulation, il arrive parfois que des textes y apparaissent et doivent ĂȘtre inchangĂ©s dans l'application. S'ils le sont, un rĂ©dacteur et un rĂ©dacteur technique aident Ă  les finaliser.


Développement de mises en page. Lorsque le concepteur a préparé les mises en page, le rédacteur technique et le rédacteur ont lu tous les textes. Ainsi, les dispositions déduites en anglais entrent dans le développement. Le développeur n'a pas à penser aux textes, il prend simplement des lignes toutes faites à partir de mises en page.


DĂ©veloppement. Malheureusement, les Ă©tapes prĂ©cĂ©dentes ne peuvent pas couvrir tous les types de texte possibles. Par exemple, les mises en page n'incluent pas les valideurs, les erreurs API, certaines fenĂȘtres modales. Si vous avez besoin d'ajouter des lignes au cours du processus de dĂ©veloppement, le rĂ©dacteur technique et le rĂ©dacteur fournissent au dĂ©veloppeur tous les textes nĂ©cessaires.


Ainsi, Ă  un moment donnĂ©, nous avons un Ă©tat oĂč la branche contient tous les nouveaux textes qui sont nĂ©cessaires pour la partie du code qui y est dĂ©veloppĂ©e. À ce stade, une nouvelle branche est créée Ă  partir d'elle avec le prĂ©fixe translate- et Serge peut commencer le processus de traduction. Lorsque les traductions sont prĂȘtes, le dĂ©veloppeur les prend dans la branche de traduction, puis agit sur le flux git acceptĂ© dans l'Ă©quipe.


Ce processus minimise l'implication du développeur dans le processus de localisation, et minimise également la quantité de travail manuel: il vous suffit de créer une branche.


Une autre description du processus de réglage repose fortement sur le fait que l'équipe a des dispositions et des processus similaires.


Configuration du projet


Connectez-vous en tant que serge:


 sudo -Hu serge -i 

Créez le répertoire des groupes:


 mkdir groups 

Ce répertoire hébergera les projets correspondant aux référentiels dans GitLab. Il est logique de répéter la structure des groupes de référentiels et leurs emplacements pour faciliter la navigation.


Créez un répertoire pour le premier projet:


 cd groups mkdir myproject cd myproject 

Copiez les fichiers de configuration de Serge. Vous pouvez installer midnight commander et gérer des fichiers à l'aide du gestionnaire de fichiers. Avant d'installer MC, vous devez vous déconnecter de votre compte serge.


 exit sudo apt install mc sudo -Hu serge -i 

Fichiers Ă  copier depuis / usr / local / serge / serge-master / bin / tools / feature-branch-config-generator:


  • Fichier de configuration Serge: myproject.cfg
  • fichier de modĂšle de travail: myproject.inc
  • modĂšle .serge: myproject.serge.tmpl
  • fichier pour ajouter des branches manuellement: myproject_branches.txt
  • script pour travailler avec GitLab: fbcgen.pl

 cp /usr/local/serge/serge-master/bin/tools/feature-branch-config-generator/{myproject.cfg,myproject.inc,myproject.serge.tmpl,myproject_branches.txt} /usr/local/serge/serge-master/groups/myproject cp /usr/local/serge/serge-master/bin/tools/feature-branch-config-generator/fbcgen.pl /usr/local/serge/serge-master/ 

Créez un fichier pour enregistrer les journaux des plugins:


 mkdir log cd log touch smartcat.log 

Configurer myproject.inc


  • Dans le champ du nom, spĂ©cifiez le format de fichier de ressources utilisĂ© dans le projet.
  • Remplissez l'identifiant avec le masque% yourproject%.% Yourformat%.% Yourmasterbranchname%.
  • Dans le champ destination_languages, spĂ©cifiez les langues dans lesquelles vous souhaitez traduire.
  • Remplissez la source avec le masque ./%yourproject%/%yourmasterbranch%/res/en.
  • Remplissez output_file_path avec le masque ./%yourproject%/%yourmasterbranch%/res/% LANG% /% FILE%.
  • Remplissez source_match avec le masque.% Yourformat%.
  • Selon le format des fichiers de ressources, spĂ©cifiez le plug-in requis pour l'analyse. Les plugins sont rĂ©pertoriĂ©s dans la documentation de Serge . Remplissez ts_file_path avec le masque ./po/%yourproject%/% LOCALE% /% FILE% .po.
  • Remplissez master_job avec le masque% yourproject%.% Yourformat%.% Yourmasterbranch%.
    Les paramÚtres restants restent inchangés.

Configurer myproject.serge.tmpl


  • project_id - id du projet dans Smartcat
  • token_id, token - donnĂ©es de Smartcat
  • remotepath - ici, vous devez spĂ©cifier correctement le nom du paramĂštre et sa valeur {% yourmasterbranch %% ssh_path_to_your_repo% #% yourmasterbranch%}
  • $ FBCGEN_DIR_PADDED -% ssh_path_to_your_repo% # FBCGEN_BRANCH
  • id - job.yourmasterbranch
  • nom - votreprojet
  • source_language - en
  • destination_languages ​​- langues dans lesquelles il sera nĂ©cessaire de traduire
  • source_dir - ./branches/yourmasterbranch/%path_to_resource_files%
  • source_match - en.% votreformat%
  • db_source - DBI: SQLite: dbname -./% yourproject% .db3
  • db_namespace -% votreprojet%
  • ts_file_path - ./po/PROJECT_ID_IN_SMARTCAT/% LANG% /% FILE% .po
  • chemin_fichier_sortie - ./branches/%yourmasterbranch%/%path_to_resource_files%/% LOCALE%. % votreformat%
  • output_lang_rewrite {
    zh-hans zh-cn '' zh-hant-tw zh-tw
    } - Ce paramÚtre vous permet de redéfinir les désignations de langue. Si les désignations de langue dans le projet ne correspondent pas aux désignations utilisées dans Smartcat, vous pouvez les redéfinir.
  • master_job - job.% yourmasterbranch%
  • @inherit -. # jobs /:% yourmasterbranch%
  • source_dir (dans FBCGEN_BRANCH_JOBS) - ./branches/$FBCGEN_DIR/%path_to_resource_files%/
  • chemin_fichier_sortie (dans FBCGEN_BRANCH_JOBS) - ./branches/$FBCGEN_DIR/%path_to_resource_files%/% LOCALE%. % votreformat%

Important! Dans source_path_prefix, la fin doit ĂȘtre le point% FBCGEN_BRANCH.


Un appel au plugin Smartcat doit ĂȘtre ajoutĂ© Ă  la section appropriĂ©e myproject.serge.tmpl


 sync { ts { plugin Smartcat data { project_id 12345678-1234-1234-1234-1234567890123 token_id 12345678-1234-1234-1234-1234567890123 token 1_qwertyuiopasdfghjklzxcvbn push { disassemble_algorithm_name Serge.io PO } pull { complete_projects NO complete_documents YES } log_file ./log/smartcat.log } } 

Description de certains paramĂštres:


  • disassemble_algorithm_name Serge.io PO - utilisez les hachages de clĂ©s passĂ©s Ă  Serge. Ce paramĂštre est nĂ©cessaire pour optimiser le temps d'exĂ©cution des commandes pull-ts et push-ts.
  • complete_projects NO - sĂ©lectionnez les lignes de Smartcat uniquement si tous les documents du projet sont terminĂ©s. Pour notre intĂ©gration, le projet dans Smartcat est synonyme du rĂ©fĂ©rentiel dans GitLab, et comprend un ensemble de documents. Un document est un produit cartĂ©sien du nombre de branches dans le rĂ©fĂ©rentiel et des langues dans lesquelles la traduction est effectuĂ©e. Autrement dit, si dans votre rĂ©fĂ©rentiel il y a 2 branches qui doivent ĂȘtre traduites en 6 langues, 12 documents seront créés dans le projet.
  • complete_documents YES - choisissez des lignes dans Smartcat si le document est en Ă©tat terminĂ©. Cette opĂ©ration est effectuĂ©e pour minimiser le nombre de validations dans le rĂ©fĂ©rentiel.

Exemple de projet personnalisé


Vous trouverez ci-dessous les fichiers de configuration d'un projet en 6 langues. Le projet stocke les lignes source au format js. Un format de dénomination de fichier à 5 caractÚres est utilisé. Chemin d'accÚs aux fichiers de ressources: ./branches/base-translate/client/src/translations.


myproject.cfg


 # This is a configuration file for fbcgen.pl # Usage: fbcgen.pl myproject.cfg # Root directory where the master branch checkout is located. # (path is relative to the location of the configuration file itself). # The local checkout should be initialized *before* fbcgen.pl is run. # You can run `serge --initialize onboarding-frontend.serge.tmpl` # to do an initial checkout of the project data. $data_dir = './branches/base-translate'; $branch_list_file = 'myproject_branches.txt'; # Where to load Serge config template from. # (path is relative to the location of the configuration file itself). $template_file = "myproject.serge.tmpl"; # Where to save the localized Serge config file. # (path is relative to the location of the configuration file itself). $output_file = "myproject.local.serge"; our $skip_branch_mask = '^(master)$'; # skip these branches unconditionally our $unmerged_branch_mask = '^(translate-)'; # process unmerged branches matching this mask our $any_branch_mask = '^(translate-)'; # additionally, process these branches even if they were merged # Filter out commits that match this mask when determining if branch is inactive. $skip_commit_mask = '^l10n@example.com'; # This sub returns a hash map of additional parameters # that can be referenced in template as `$FBCGEN_<VARIABLE_NAME>`. # For example, `EXTRA_INCLUDE` parameter generated in the function below # is referenced in `myproject.serge.tmpl` file as `$FBCGEN_EXTRA_INCLUDE`. $calculate_params = sub { my ($branch) = @_; return { # for branch names starting with `release/`, return an empty string; # otherwise, return a string that will be used in the `@include` directive EXTRA_INCLUDE => $branch =~ m!^release/! ? '' : "myproject.inc#skip-saving-localized-files\n" } } 

myproject.inc


 # Here we define a job template (common parameters) that will be reused # across all jobs in the generated configuration file. # Certain job parameters (like job ID and paths) will be overridden # in each feature branch job. job-template { name JS file processing ('master' branch) id myproject.js.base-translate # master job id db_namespace myproject destination_languages ru ko de ja zh-Hans source_dir ./myproject/base-translate/res/en output_file_path ./myproject/base-translate/res/%LANG%/%FILE% source_match \.js$ parser { plugin parse_js } ts_file_path ./po/myproject/%LOCALE%/%FILE%.po callback_plugins { :feature_branch { plugin feature_branch data { master_job myproject.js.base-translate # this must match your master job id } } } } # This block will be included conditionally # for all branches except the `release/` ones (see myproject.cfg). # This allows one to skip saving localized files in non-release branches # (but still gather from them strings for translation). skip-saving-localized-files { callback_plugins { :skip-saving-localized-files { plugin process_if phase can_generate_localized_file data { if { lang_matches . then { return NO } } } } } } 

myproject.serge.tmpl


 sync { ts { plugin Smartcat data { project_id %project_id% token_id %token_id% token %token% push { disassemble_algorithm_name Serge.io PO } pull { complete_projects NO complete_documents YES } } } vcs { plugin git data { local_path ./branches add_unversioned YES name L10N Robot email l10n-robot@example.com remote_path { base-translate git@gitlab.loc:common/myproject.git#base-translate /* FBCGEN_BRANCH_REMOTES $FBCGEN_DIR_PADDED git@gitlab.loc:common/myproject.git#$FBCGEN_BRANCH */ } } } } jobs { :develop { id job.base-translate name myproject source_language en destination_languages ru zh-Hans ko de ja optimizations NO source_dir ./branches/base-translate/client/src/translations source_match `en-US.js` debug NO parser { plugin parse_js } leave_untranslated_blank YES db_source DBI:SQLite:dbname=./myproject.db3 db_namespace myproject ts_file_path ./po/1bd80338-a0b5-48b3-822c-e90affd2cdcc/%LANG%/%FILE%.po output_file_path ./branches/base-translate/client/src/translations/%CULTURE%.%EXT% output_bom NO output_lang_rewrite { zh-Hans zh } callback_plugins { :feature_branch { plugin feature_branch data { master_job job.base-translate } } } } /* FBCGEN_BRANCH_JOBS :$FBCGEN_DIR { @inherit .#jobs/:develop id job.$FBCGEN_DIR $FBCGEN_EXTRA_INCLUDE source_path_prefix $FBCGEN_BRANCH. source_dir ./branches/$FBCGEN_DIR/client/src/translations/ output_file_path ./branches/$FBCGEN_DIR/client/src/translations/%CULTURE%.%EXT% } */ } 

Lancement de l'application


Clonez le référentiel


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" git clone -b base-translate git@gitlab.loc:groups/myproject.git branches/base-translate/ 

Cycle de localisation


Le fichier .serge est formé:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" /usr/local/serge/serge-master/fbcgen.pl myproject.cfg 

Récupération des modifications dans toutes les branches du référentiel:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge pull --initialize myproject.local.serge 

Collection des changements de traduction pour toutes les branches de Smartcat:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge pull-ts myproject.local.serge 

Formation de la base de données et du .po:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge localize myproject.local.serge 

Envoi de nouvelles données du référentiel à Smartcat:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge push-ts myproject.local.serge 

Envoi des transferts reçus au référentiel dans les branches appropriées:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge push myproject.local.serge 

Les articles suivants seront consacrés au dépannage et à la description des cas particuliers d'intégration.
Article final: 20 projets, 20 langues, date limite hier. 3e partie

Source: https://habr.com/ru/post/fr446640/


All Articles