20个项目,20种语言,截止日期为昨天。 第二部分

关于建立连续本地化的一系列文章。 您可以在这里找到第一个。 在本文中,我将告诉您如何使用示例测试项目集成Serge-Smartcat-GitLab捆绑包和配置Serge配置文件。 有关Ubuntu的说明。


通过vagrantfile安装


如果您没有随身携带Ubuntu的服务器,则可以使用Vagrant。 运作方式:


  1. 按照说明安装Vagrant和VirtualBox。
  2. 下载 vagrantfile和bash脚本。
  3. 按照说明启动vagrantfile。

Vagrant构建的结果是使用Ubuntu的虚拟机,在该虚拟机上通过Smartcat插件安装了Serge。 将复制所有必需的文件,并创建ssh密钥。 您可以立即继续设置项目并启动应用程序。


手动安装


用户创建


创建一个serge用户组:


sudo groupadd serge 

使用主目录/ usr / local / serge创建serge用户:


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

安装Serge


完整的Serge文档在这里
更新本地软件包数据库的元数据:


 sudo apt-get -qq update 

安装组装工具以及必要的软件包。 在开始安装之前,请确保已安装Perl 5.10或更高版本。


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

转到serge用户的主目录,然后安装具有所有必需依赖项的Serge。


 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 

安装Smartcat插件


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

密钥创建


使用ssh密钥创建一个serge用户,该ssh用户将在GitLab中使用它:


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

与GitLab集成


在GitLab中创建一个serge用户,并将其添加到所有开发人员存储库中。
将ssh密钥从id_rsa_serge.pub文件复制到GitLab中的serge用户配置文件设置。 这是必需的,以便Serge可以在GitLab中接收和发送字符串。


安装完成!


Smartcat整合


要开始使用,您必须:


  1. 注册Smartcat
  2. 通过指定您要翻译的语言来创建项目。 设置插件时,您将需要Smartcat使用的语言代码
  3. 获取project_idtoken和token_id
  4. 写信到support@smartcat.ai并要求启用对Serge文件解析算法的支持

配置Serge-Smartcat


在进行设置之前,我将介绍操作的一般原理。 标准本地化周期包括5个步骤:
图片


  • -从存储库中获取新行。
  • pull- ts-从Smartcat获取本地化的字符串(已启用Smartcat插件)。
  • 本地化 -解析存储库中的所有源格式,并将其转换为.po文件,将接收到的翻译写入.po文件。 所有行均被写入Serge翻译记忆库。
  • push- ts-第一步中收到的新行将发送到Smartcat(使用Smartcat插件)。
  • push-本地化字符串在GitLab中提交。
    您可以与其他CAT系统集成使用,例如,有一个Pootle插件。

Serge和git存储库


Serge如何知道要发送哪些行进行翻译? 为了确定新行,使用标准git工具:掌握master分支和当前分支之间的区别。 发送差异进行翻译。


图片


重要提示 :通常,master分支是受保护的,因此使用了另一个转换分支来定义diff,我们称其为base-translate。 即,在主版本中合并发行版之后,必须另外将母版本保留在base-translate中。


这里有一个重点。 有必要以这样一种方式构建流程,一方面,开发人员了解翻译的内容和时间,另一方面,这样,使技术专家不会盘旋而抬头,因为他的差异为1000行。 似乎只有标题已更正。


工作原理


Serge进入存储库,获取所有分支,然后开始将它们与master分支进行比较。 对于每个检测到差异的分支,它将在Smartcat项目中创建一组翻译文档。 为了避免陷入无关分支的混乱之中,也不要站在每个开发人员的身边,并提出以下问题:“您还记得删除分支吗?”,使用前缀很方便。 例如,Serge仅适用于具有翻译前缀的分支。


同样重要的是,已准备好翻译的已阅读和批准的文本将以带有前缀前缀的翻译进入分支。 毕竟,没有人愿意解析提交的历史而徒劳地尝试理解它们是哪种文本,以及为什么diff看起来像这样?


内容准备


我们的内容准备过程如下:


图片


问题陈述。 当任务处于制定阶段时,有时文本已经出现在其中,应原样输入应用程序。 如果是这样,则由撰稿人和技术撰稿人协助定稿。


布局的发展。 当设计师准备布局时,技术作家和文案作家会读出所有文本。 因此,以英语推论的布局属于发展趋势。 开发人员不必考虑文本;他只是从布局中提取现成的行。


发展。 不幸的是,前面的步骤不能涵盖所有可能的文本类型。 例如,布局不包括验证器,API错误,某些模式窗口。 如果在开发过程中有必要添加行,则技术作家和文案作家会为开发人员提供所有必要的文本。


因此,在某个时间点,我们处于一种状态,其中分支包含其中正在开发的部分代码所必需的所有新文本。 此时,将使用前缀translate-从该分支创建一个新分支,Serge可以开始翻译过程。 当翻译准备就绪时,开发人员将从翻译分支获取它们,然后对团队中接受的git流进行操作。


此过程最大程度地减少了开发人员在本地化过程中的参与,还最大程度地减少了手工劳动:您只需要创建一个分支。


调优过程的进一步描述在很大程度上取决于团队具有相似的安排和过程的事实。


项目设置


以serge身份登录:


 sudo -Hu serge -i 

创建groups目录:


 mkdir groups 

该目录将托管与GitLab中的存储库相对应的项目。 重复存储库组的结构及其位置以方便导航很有意义。


为第一个项目创建目录:


 cd groups mkdir myproject cd myproject 

复制Serge配置文件。 您可以安装午夜指挥官并使用文件管理器管理文件。 在安装MC之前,必须注销serge帐户。


 exit sudo apt install mc sudo -Hu serge -i 

要从/ usr / local / serge / serge-master / bin / tools / feature-branch-config-generator复制的文件:


  • 同步配置文件: myproject.cfg
  • 作业模板文件: myproject.inc
  • .serge模板: myproject.serge.tmpl
  • 用于手动添加分支的文件: myproject_branches.txt
  • 用于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/ 

创建一个文件来记录插件日志:


 mkdir log cd log touch smartcat.log 

配置myproject.inc


  • 在名称字段中,指定项目中使用的资源文件格式。
  • 用掩码%yourproject%。%Yourformat%。%Yourmasterbranchname%填写ID。
  • 在destination_languages字段中,指定要翻译的语言。
  • 用掩码./%yourproject%/%yourmasterbranch%/res/en填充源。
  • 用掩码./%yourproject%/%yourmasterbranch%/res/% LANG%/%FILE%填充output_file_path。
  • 用mask。%Yourformat%填充source_match。
  • 根据资源文件的格式,指定解析所需的插件。 插件在serge文档中列出。 用掩码./po/%yourproject%/% LOCALE%/%FILE%.po填写ts_file_path。
  • 用mask%yourproject%。%Yourformat%。%Yourmasterbranch%填写master_job。
    其余参数保持不变。

配置myproject.serge.tmpl


  • project_id-Smartcat中的项目ID
  • token_id,令牌-来自Smartcat的数据
  • remotepath-在这里您必须正确指定参数名称及其值{%yourmasterbranch %% ssh_path_to_your_repo%#%yourmasterbranch%}
  • $ FBCGEN_DIR_PADDED-%ssh_path_to_your_repo%#FBCGEN_BRANCH
  • id-job.yourmasterbranch
  • 名称-yourproject
  • source_language-zh
  • destination_languages-有必要将其翻译成的语言
  • source_dir-./branches/yourmasterbranch/%path_to_resource_files%
  • source_match-zh。%yourformat%
  • db_source-DBI:SQLite:dbname -./% yourproject%.db3
  • db_namespace-%yourproject%
  • ts_file_path-./po/PROJECT_ID_IN_SMARTCAT/% LANG%/%FILE%.po
  • output_file_path-./branches/%yourmasterbranch%/%path_to_resource_files%/% LOCALE%。 %yourformat%
  • output_lang_rewrite {
    zh-hans zh-cn''zh-hant-tw zh-tw
    }-此参数使您可以重新定义语言名称。 如果项目中的语言名称与Smartcat中使用的名称不匹配,则可以重新定义它们。
  • master_job-工作。%yourmasterbranch%
  • @inherit-。#职位/:%yourmasterbranch%
  • source_dir(在FBCGEN_BRANCH_JOBS中)-./branches/$FBCGEN_DIR/%path_to_resource_files%/
  • output_file_path(在FBCGEN_BRANCH_JOBS中)-./branches/$FBCGEN_DIR/%path_to_resource_files%/% LOCALE%。 %yourformat%

重要! 在source_path_prefix中,结尾必须是点%FBCGEN_BRANCH。


对Smartcat插件的调用必须添加到适当的部分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 } } 

一些参数的说明:


  • disassemble_algorithm_name Serge.io PO-使用传递给Serge的密钥哈希。 该参数对于优化pull-ts和push-ts命令的执行时间是必需的。
  • complete_projects NO-仅在项目中的所有文档均已完成时才从Smartcat中选择行。 对于我们的集成,Smartcat中的项目与GitLab中的存储库同义,并包含一组文档。 文档是存储库中分支数量和翻译所用语言的笛卡尔乘积。 也就是说,如果您的存储库中有2个分支需要翻译成6种语言,则将在项目中创建12个文档。
  • complete_documents是 -如果文档处于完成状态,请从Smartcat中选择行。 这样做是为了最大程度地减少对存储库的提交次数。

定制项目示例


以下是使用6种语言的项目的配置文件。 该项目以js格式存储源代码行。 使用5个字符的文件命名格式。 资源文件的路径:./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% } */ } 

应用启动


克隆存储库


 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/ 

本地化周期


.serge文件形成:


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

从所有存储库分支中获取更改:


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

Smartcat所有分支的翻译更改集合:


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

数据库和.po的组成:


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

从存储库向Smartcat发送新数据:


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

将收到的转移发送到相应分支中的存储库:


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

以下文章将专门针对集成的特殊情况进行故障排除和描述。
最后一篇文章: 20个项目,20种语言,昨天截止。 第三部分

Source: https://habr.com/ru/post/zh-CN446640/


All Articles