Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み

18,495 views

Published on

Sphinxには、多言語化サポート機能があります。 この機能を使用せずにSphinxで書かれたドキュメントを翻訳するには、ドキュメントのソースを書き換えることになります。 しかし、この方法には3つの問題があります。

Sphinxの文章フォーマットを壊さないように気をつけなければならない
多数のボランティアによる翻訳の分担がしづらい、ボランティア参加しづらい
オリジナルドキュメントが更新されたとき、翻訳ドキュメントを追従させるのが難しい
そこで、Sphixnの多言語化サポート機能を利用します。 Sphinxはgettext形式の翻訳カタログの入出力に対応しているので、翻訳支援機能を備えたさまざまなツールやサービスを簡単に利用できます。 翻訳支援サービスを使うことで、Sphinxのドキュメント翻訳は以下のように実施出来ます。

パラグラフ単位で翻訳できる(Sphinxがパラグラフ単位で翻訳カタログに出力します)
多人数で同時編集できる
翻訳メモリや自動翻訳などの機能を使える
このようなサービスを利用すると、ボランティアが翻訳に参加しやすくなります。 Sphinx-users.jpチームは、Sphinxとtransifexというサービスを組み合わせて、ドキュメント翻訳の仕組みを作りました。 さらに、drone.ioを使ってプロセス全体を自動化しています。 これによって、(A)元のドキュメントが更新されたときに、transifexの翻訳元文章が更新されます。(B)transifexで翻訳が行われると、その翻訳を取り込んだドキュメントが自動ビルドされてホスティングサーバーにデプロイされます。

このセッションでは、プロセスの全体像と、自動化の仕組みについて紹介し、Sphinxで書かれたドキュメントを翻訳するうえでのヒント、コツ、そして注意点についてお話しします。

Published in: Technology
0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
18,495
On SlideShare
0
From Embeds
0
Number of Embeds
14,442
Actions
Shares
0
Downloads
10
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide
  • (ここの文字サイズ大きくする、マウスをレーザーポインタにする)
    こんにちは、今日は私のセッションに来ていただいてありがとうございます。
    このセッションでは「~」を紹介したいと思います。

  • 伝統の「おまえ誰よ」から。

    清水川です。
    オープンソースで3つの活動をしています。

    1. Sphinx co-maintainer since the end of 2011.
    2. organize Sphinx-users.jp users group in Japan.
    3. member of PyCon JP Committee.

    BePROUDで働いています。
    弊社では、主にDjangoやPyramidなどを使ってWebアプリケーション開発を行っています。
    最近、Pythonトレーニング事業、Python技術サポート事業も始めました。
    自宅勤務が週5日までOK、スタンディングデスクあり、ラジオ体操ありの会社です。
  • 本題に入る前に。質問があります。
  • どのくらいの人がオープンソースソフトウエアを使っていますか?
    -> 10, 20, ... ありがとうございます。
    A-> 明らかにほとんどの人がOSS使ってるようですね。 B-> あれ、意外と少ないですね。半分くらいでしょうか。
  • 次の質問です。
    自分はOSSに貢献している、という人はどのくらいいますか?
    -> 1, 2, ... ありがとうございます。
    A-> かなり少なくなりましたね。N人くらいでしょうか。 B-> おー、けっこう多くの人が手を挙げてくれました。N人くらいですね。

    私としては、OSSを使う事、それを人に勧めることが最初の貢献なのかなと思っています。
    ですので、最初に手を挙げてもらった、OSS使ってる方はもう1歩目の貢献をしているのかなと思います。
  • 次の質問です。
    多くのOSSドキュメントが英語で提供されています。
    これらを日本語など普段使っている言語に翻訳することは他の開発者の助けになると思いますか?

    10, 20,... ありがとうございます。
    A-> ほとんどの人がそう思う、ということですね。私もそう思います。
    B-> あれ、みんな手を挙げるかなと思ったんですが・・、みんな英語読めってことですかね。厳しめですねー

    私が聞いた話では、日本の技術者はググって開いたページが英語だとすぐ閉じちゃうらしいですけど。
    そうでなくても英語よりも日本語のほうが読みやすいのは確かですね。
    そんなこともあって、私もよくOSSのドキュメントを翻訳しています。
  • 誰かがOSSドキュメントを翻訳すれば、より多くの人がそのOSSを使えるようになります。
    (クリック)
    もし、より多くの翻訳者が翻訳作業に参加できれば、より速く正確な翻訳ドキュメントを提供できます。
    このセッションでは、翻訳に簡単に参加しやすい仕組みをどうやって作るのかを紹介します。
  • そのメカニズムを作るために、このセッションでは以下に紹介するツールを使います。
    Tools; sphinx, docutils, sphinx-intl, transifex-client
    Services; Transifex, Drone.io.
  • それでは、始めましょう。
    まずはSphinxの紹介と、Sphinxの多言語対応向けセットアップからです。
  • Sphinx is 何?
    Sphinxはドキュメンテーションジェネレータです。
    SphinxはreStructuredTextというテキストマークアップから、複数の出力フォーマットに変換します。
    (ポインタでinputとoutputを指す)
  • Sphinxの歴史をちょっとだけ紹介します。
    この人がSphinxの父、Georg Brandlさんです。
    PyCon JP 2013のキーノートスピーカーでした。
    (クリック)
    2007年まで、Pythonの公式ドキュメントはLaTeXで書かれていました。
    しかし、これはメンテナンスが難しくて、ほぼ不可能。
    Georgはこの状況を変えようとしました。
    (クリック)
    そして、2007年にSphinxを作りました。
    Sphinxは書きやすくてメンテナンスしやすいことを目標に作られました。
  • Sphinx以前、以降
    以前
    Python界にはドキュメントを書く標準的な作法が確立していなかった。Python公式ドキュメントもそのうちのひとつで、ドキュメントはLaTeXでかかれていて、LaTeXに変換したりLaTeXから変換する多くのスクリプトジャングルがありました。その頃は、出力フォーマット別に、それらのジャングルスクリプトでマークアップを変換して、さらに別のツールで出力していました。

    Sphinxがこの地に降りたって以降、 * Python界の住人は、1つのソースコードから複数のフォーマットに出力できるようになりました。
    * また、同梱されたHTMLテーマによって、ドキュメントは読みやすくなりました。
    * APIリファレンスはライブラリの説明的ドキュメントと1つに統合して出力できるようになりました
    * ReadTheDocsという自動ドキュメントビルド&ホスティングサービスが登場し、便利になりました
  • 今では、Sphinxは多くのPythonライブラリで使われるドキュメンテーションツールになりました。
    Python libraries/tools: Python, Sphinx, Flask, Jinja2, Django, Pyramid, SQLAlchemy, Numpy, SciPy, scikit-learn, pandas, fabric, ansible, awscli, …

    そしてPython以外のlibrary/toolsでもSphinxは使われています: Chef, CakePHP(2.x), MathJax, Selenium, Varnish
  • 今では、Sphinxは多くのPythonライブラリで使われるドキュメンテーションツールになりました。
    Python libraries/tools: Python, Sphinx, Flask, Jinja2, Django, Pyramid, SQLAlchemy, Numpy, SciPy, scikit-learn, pandas, fabric, ansible, awscli, …

    そしてPython以外のlibrary/toolsでもSphinxは使われています: Chef, CakePHP(2.x), MathJax, Selenium, Varnish
  • Sphinxはdocutilsというライブラリをベースに作られています。
    Sphinxはdocutilsにはない、多言語化の機能を提供しています。
    のちほど、この多言語化機能を詳しく紹介します。
  • Sphinxと i18nツールのインストール
    まず、Sphinxは当然インストールする必要がありますね。 そして、 sphinx-intl と transifex-client を翻訳サポートのためにインストールします。

    ところで、最新のtransifex-clientはちょっと安定してないため、私は0.8を使用しています。
  • まず、翻訳の対象となるソースコードを手に入れるところからです。
    今回の例では、そのソースコードはSphinxで書かれたドキュメントをもう持っていることにします。

    ですので、取ってきたソースコードのdocディレクトリで "make html"を実行すればHTMLが生成されるはずです。
    出力は _build/html にあります。
  • ここで、ディレクトリ構成をみてみましょう。このようになっています。
    (ポインタ)
    * まず対象のソースコードはどこか既存のリポジトリからcloneしてきたものです
    * ドキュメントのビルド出力 _build は "make html" で生成されたものです
    * Sphinxで書かれたドキュメントソースの雛形は一般的に"sphinx-quickstart"コマンドで作られます
    (クリック)
    docディレクトリの中に、 conf.py ファイルがあります。
    このファイルに2行追加してください。
    * 3行目: 出力するドキュメントの言語コードです。
    * 4行目: localeディレクトリへの相対パスです。このlocaleディレクトリには翻訳カタログファイルを置くことになります。
    セットアップはこれでおわりです。
  • ここから主題に入っていきます。
    Sphinxを使った貢献しやすいドキュメント翻訳プロセス、ってなんだろう、というのを見ていきます。
  • 多言語化、ってなんでしょう。よく省略してI18Nと呼ばれます。
    多言語化プロセスは、よく翻訳とか、ローカライズとかよばれますが、技術的には、こういった翻訳などを元のソースコードを書き直さずに行う事を多言語化といいます。

    元のソースコードを書き直さずに行う、というのが重要なところです。
  • 貢献しやすいってなに?
    ソフトウエアの利用者やドキュメント読者は、たまに翻訳で協力したいと思うことがあります。
    でも、翻訳に参加するのに準備が大変だったり、環境構築スキルが要求されたりすると、うわーっ!ってなってあきらめます。
    「貢献しやすい」というのは、翻訳などで簡単に協力できる「状況」のことです。
  • 3つのケース
    HTMLだけで提供、翻訳できるけど、たいへん、元がちょくちょく更新される場合、どうやって追従する?


    So, for the comparison, I'll introduce the three cases of difficult to contribute.

    First one.
    The manual are provided only in the HTML files.
    Of course, you can translate it.
    But, usually the html files are frequently updated.
    How do you follow the original changes to update your translations?

    This is the first case. I have no idea how to follow the original changes.
  • 2つめ。ソースを書き換える。
    reSTを壊さないように
    多人数に作業を分割できない
    元が更新されたらどうする?

    2nd example.
    When the manual are generated from reST files and docstrings in the source files,
    You can rewrite original files to translate it.

    But this approach has three problems: No1. You must be careful to maintain reStructuredText structure. No2. It's hard to divide translation tasks for a number of volunteer translators. No3. It's hard to pursue the upstream document source that is frequently updated.
  • last example.
    OK, we are engineers. We can use git!
    (上を読む)
    Additionally, in this case, the repository owner should allow write access permission for each translators.

    This is also not a easy way.
  • Well then, what is a easy way?
    My opinion is this. Left side is Not a easy way.
    Right side is A easy way.
    We need a easy way.
    The combination of the Sphinx i18n feature and some of the services can realize such a mechanism.
    Sphinxのi18n機能と、いくつかのサービスを組み合わせてこの仕組みを実現します。

    That's what is the goal of this session
    これがゴール
    I'll explain what how to create the mechanism in this session.
    どうやって作るか説明します。
    OK, let's move forward.
  • 3rd Subject. Sphinx i18n feature.
    I'll explain the detail of the feature.
  • Sphinx i18n は2つの機能で構成されてます。

    1つめ。Potを生成
    First one is the generation pot files from reST files.
    pot file is a famous translation catalog format for gettext that is used for i18n, you know.
    Potはi18n界では有名なgettext形式のカタログです

    2つめ。reSTと、翻訳したPoから、翻訳HTMLを生成します
    Second one is the generation translated html files with using po files that is translated version of catalogs.
    It's the human work to prepare the translated po files from the pot files.
    このpoを用意するのは人間の仕事です。
  • Like this, Converting the POT files into PO files is the job of humans.

    (クリック)作者がpotを生成して、翻訳者に依頼します
    (クリック)翻訳者はpotを受け取って、翻訳します。翻訳済みのファイルは拡張子をpoにします。
    (クリック)おわったら、翻訳者は作者にpoを送ります

    最初の部分をもうちょっと見ましょう
  • 著者は "make gettext" でpotを生成します

    "make gettext" はreSTのtextから文章を取りだしてpotに書き出します。もしSphinxのautodoc機能を使っていれば、Pythonソースからもドキュメントを読み込みます
    このpotを翻訳すれば良いので、元のreSTやPythonコードを書き換える必要はありません。

    "msgid" line have a original sentence.
    "msgstr" line will have translated one.
    このように翻訳カタログは1つの言語から別の言語に翻訳するのに便利です。
  • Translated PO files should have as a right side structure.
    "locale" directory has "ja" and it has "LC_MESSAGES" directory, and it has translated PO files.
    PO files are copies of POT files with changed file's extension.
    If you want to translate it into other languages, like 'zh_cn', you can create other directories under "locale" directory.

    When original POT files are updated by changing of original document, you should update PO files too.
    If you had done it manually, it is very hard.
    You can automated it by sphinx-intl.
  • At first, sphinx-intl copy pot files and rename them.
    When the document is changed, translators can use sphinx-intl to update PO differences.
    By same command.

    As you see, translators can finish the boring tasks by one command.
    sphinx-intl copy pot files and rename them on behalf of you.
    sphinx-intl also update differences for each po files when the document is changed.

    It's easy to use.
    As a consequence of introducing the sphinx-intl tool, translators can concentrate for translation.
  • This is a translation work.

    Translators can use their favorite editors or helpful tools/services easily that provide translation support features like a translation memory, recommending similar translation, glossary and auto-translation.
    Once the translation is complete, finally let's run the "make html" command.
  • Finally author and translators can run "make html" and can get translated output w/o editing reST and python code.
    This is a translated HTML sample.
    Internally, Sphinx parse reST file and replace them into translated one by using po file.
  • Entire process to translate sphinx docs is this.
    If you translate some sphinx document without using the i18n feature, you need to rewrite original document source files.
    The Sphinx i18n feature provides a easy way to translate a document as you seen.
  • So far, we've found the mechanism of i18n of Sphinx.
    In 4th Subject, Automated translation process with several services, we will continue to automate this mechanism.
  • Right now, we have seen an overall picture of the process.
    Actually, I have a thing that was not pictured here.
    (クリック)
    Yes, these commands such as "make blah blah" require your hands to invoke.
    In other words, the translator must learn such steps, yet.
    Additionally, it would be difficult to translate in parallel.

    It's not a easy way, you know.
  • OK, Let's make it to be automation and parallelization.

    And then, the translator doesn't need to know the mechanism.
    And, make the translation work possible to parallelize.

    Let's take a look at from the parallelization of the translation work.
  • Once you get po files, you can use helpful tools/services easily that provide translation support features like a translation memory, recommending similar translation, glossary and auto-translation.

    In particular, the use of the online translation service is important for parallelization.
    I'd like to introduce the Transifex as a online translation service.
  • Transifex provides the following functions: Upload pot and download po files by API, glossary feature, translation memory, recommending translations, automatic translation by using Google / Microsoft API.
    Because you can do translation on the Web screen, you can translate them with other translators in parallel.
  • Translation on Transifex web console.
    1. You can select one untranslated message
    2. And Translate it by your self, or by machine translation
    3. If the message contains long module or method name, you can click the icon to copy original to translation box w/o typing.
    4. Sometimes, you are suggested translation messages from other translator, or Translation Memory. Translation Memory (called TM) pick up suggestions from similar translation in the project or its historical changes. For example, When Doc Author fix a typo, translation will be discarded. However, TM suggests previous translation that matches 99% with current original message.
    5. Once you finish the translation, you can save it.
    6. Optionally, reviewer can review it.
  • We have made translation parallelization.
    Next.
    Let's automate the central part.
  • The procedure you want to automate is made up of 6 steps.
    At first, we will review the 6 steps.
  • First step is, Clone repository to be translated.
    Step 2. make gettext to generate translation catalog.
    Step 3. Upload pot translation catalog source.
    Step 4. Download translated po files.
    Step 5. "make html" command to generate translated doc.
    Step 6. Upload html to publish it

    That's all.
    Next, we will replace these all steps on the command line.
  • This is the command line that include the steps.

    Line1: install sphinx and relates tools
    Line2: clone repository
    Line4: create a transifex account file by using sphinx-intl that reference environment variables (USERNAME and PASSWORD).
    Line5: create a transifex config file by using sphinx-intl that also reference a environment variable (PROJECT_NAME)
    Line6: generate pot files by make gettext
    Line7: update resources information in transifex config file that also reference a environment variable (POT_DIR)
    Line8: push pot files to transifex
    Line9: pull translated po files from transifex
    Line10: make html to generate translated html with using translated catalogs.

    Now we replaced 5 steps on the command line, except HTML uploading part.
    I'll explain the part later.

    As you seen above, You can automate the process by this script.

    Rest of work is preparing a environment to run the script automatically.
    As one of the environment, I'll introduce the drone.io service.
  • The drone.io is a continuous integration service.
    Drone integrates seamlessly with Github, Bitbucket and Google Code to make setup fast and simple.
    Drone also integrates with Amazon, Heroku, Google AppEngine and more. For custom deployments you can use SSH and shell scripts.
    You can use the service for public project without charge.
  • In my case, I usually use Github and S3 integrations.
    Process of that is,
    (クリック)
    1. Push notification from GitHub
    2. That invoke the script you've seen
    3. Then, deploy html files onto S3 storage. (You need a publish html setting of S3)

    If you set WebHook notification URL to transifex hook setting, updating translations also invoke the drone.io script.
  • By using drone.io service, automation can be achieved.
    Upper-Left process is replaced with Right-Down one.
  • 1 WebHook invoke the script.
    The script execute commands 2, 3, 4, 5.
    Finally drone.io deployment feature will deploy HTML to AWS S3 storage.

    As this, we got the automated mechanism by using drone.io environment.
  • In summary, let's look at the results of the automation at each point of view as author and translators.

    At first, a point of view from the doc author.

    When author push to the repository, translation source of Transifex will be updated, and author can check the translated html in the site.
    Doc Author doesn't require annoying procedure.
  • The second is, a point of view from doc translators.
    They can translate the document in parallel with;
    No git, No file, No conflict.
    Translation source are updated Automatically
    They can get a translated HTML output w/o hand-build.

    It means that the translation contributors can focus on the translation.
  • By the mechanism of automation, both of doc author and translators will provide the maximum effect with a minimum of effort.
  • In order to make the mechanism, we'll use such tools and services in this session.
    Tools; sphinx, docutils, sphinx-intl, transifex-client
    Services; Transifex, Drone.io.

  • I'd like to introduce some of the tips.
  • Drone.io limits 15mins for a build.
    If your process takes more than 15 minutes, you may be able to reduce the installation time with using wheel.
    Wheel package is a installation format.
    Installation speed is much faster than install from source distribution.

    If you interested in it, please refer to https://bitbucket.org/sphinxjp/docutils-translation/
  • Version of transifex-client.

    Looks like transifex-client 0.11b3 is not stable, for me.
    Especially for Windows users.

    If you have encountered trouble with using newer version, please try:
    $ pip install "transifex-client=0.8"
  • This is a New project page of Drone.io.
    Drone.io only list-up repositories which you have admin permission.
    Because drone.io setup webhook, admin permission is required.

    However, if you prepare a empty repository for drone.io usage, you can create a drone.io project.
    It means you can prepare the i18n automation environment, except webhook push from github.
    I think, project owner might be setup the webhook url for translation work, if you ask it.

    It's bit a hacky way. But works.
  • These 3 examples are using earlier techniques.
  • Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み

    1. 1. 1 Takayuki Shimizukawa Sphinx co-maintainer Sphinx-users.jp
    2. 2. Ahoj, 안녕하세요, Hola, Hello, こんにちは 2
    3. 3. おまえ誰よ @shimizukawa 1. Sphinx メンテナ 2. Sphinx-users.jp 3. 一般社団法人PyCon JP 理事  BePROUD co, ltd. 3
    4. 4. 今年はスタッフじゃ無いのに間違えられる 4
    5. 5. 今日の予定 1. Sphinx紹介 & i18nセットアップ 2. 貢献しやすいドキュメント翻訳 3. Sphinxのi18n機能 4. 翻訳プロセスの自動化と便利なサービス 5. Tips, tricks, traps 5
    6. 6. 6
    7. 7. 質問1 オープンソースソフトウエア を使っている方 7
    8. 8. 質問2 OSSにコントリビュートし たことがある方 8
    9. 9. 質問3 ドキュメントを 日本語に翻訳することは 他の開発者の助けになる と思いますか? 9
    10. 10. ドキュメント翻訳の価値 10 翻訳者 プロダクト 作者 翻訳Docs 読者 英語Docs
    11. 11. ツール & サービス ツール 1. sphinx - ドキュメントジェネレータ 2. sphinx-intl - Sphinx i18n機能の補助ツール 3. transifex-client - Transifexサービスのファイルを送 受信するツール サービス 1. Transifex - 翻訳サポートサービス 2. Drone.io - 継続的インテグレーションサービス 11
    12. 12. 12
    13. 13. Sphinx is 何? Sphinx はドキュメンテーションジェネレー タです SphinxはreSTマークアップから複数の フォーマットのドキュメントを生成します 13 1. Sphinx紹介 & i18nセットアップ Sphinx reSTreSTreStructuredText (reST) reST Parser HTML Builder ePub Builder LaTeX Builder texlive HTML theme Favorite Editor
    14. 14. Sphinxの歴史 (ショートver.) 14 1. Sphinx紹介 & i18nセットアップ Sphinxの 父 メンテナンス が大変 ~2007 書きやすく メンテナンスしやす い2007~
    15. 15. Sphinx 以前、Sphinx以降 Sphinx以前  ドキュメントを書く標準的な方法がなかった  出力フォーマットに合わせて、一度書いたドキュメント を変換する必要があった Sphinx以降  1つのソースから複数フォーマットのドキュメントを生 成  同梱のHTMLテーマ機能で読みやすいドキュメントを提 供  APIリファレンスと説明的ドキュメントが同居できる  自動ビルドとホスティングを提供するReadTheDocsの登 15 1. Sphinx紹介 & i18nセットアップ
    16. 16. Sphinxで書かれたドキュメントの例  Python ライブラリ/ツール: Python, Sphinx, Flask, Jinja2, Django, Pyramid, SQLAlchemy, Numpy, SciPy, scikit-learn, pandas, fabric, ansible, awscli, …  Python以外のライブラリ/ツール: Chef, CakePHP(2.x), MathJax, Selenium, Varnish 16 1. Sphinx紹介 & i18nセットアップ
    17. 17. Sphinxで書かれたドキュメントの例  Python ライブラリ/ツール: Python, Sphinx, Flask, Jinja2, Django, Pyramid, SQLAlchemy, Numpy, SciPy, scikit-learn, pandas, fabric, ansible, awscli, …  Python以外のライブラリ/ツール: Chef, CakePHP(2.x), MathJax, Selenium, Varnish 17 1. Sphinx紹介 & i18nセットアップ
    18. 18. SPHINX docutils HTML Builder HTML theme (Jinja2) gettext Builder *.pot *.po I18N *.mo OmegaT Pootle Transifex Translation Tools, Services Favorite Editor Sphinxのi18n機能 (ビルトイン) 18 1. Sphinx紹介 & i18nセットアップ reST Parser (directive / role) doctree (Intermediate) reSTreST reStructuredText (reST)
    19. 19. $ pip install sphinx 翻訳サポートツールをインストール Sphinxと i18nツールのインストール Sphinx本体をインストール $ pip install sphinx-intl $ pip install transifex-client=0.8 19 1. Sphinx紹介 & i18nセットアップ
    20. 20. $ git clone https://github.com/shimizukawa/deepthought.git $ cd deepthought/doc $ make html ... Build finished. The HTML pages are in _build/html. "make html" コマンドで _build/html ディレクト リ以下にhtmlファイル が生成されます 最初のmake html 20 1. Sphinx紹介 & i18nセットアップ
    21. 21. ファイルの一覧と & conf.pyの設定 $ tree /path/to/deepthought +- deep_thought | +- __init__.py | +- api.py | +- calc.py | +- utils.py +- doc | +- _build/ | | +- html/ | +- _static/ | +- _template/ | +- conf.py | +- index.py | +- make.bat | +- Makefile +- setup.py 21 1. Sphinx紹介 & i18nセットアップ ドキュメントソース Document build output Target library for doc1. ... 2. 3. language = 'ja' 4. locale_dirs = ['locale'] 5. doc/conf.py
    22. 22. 22
    23. 23. 多言語化 internationalization 23 2.貢献しやすいドキュメント翻訳 I18N
    24. 24. 貢献しやすいって どういう状況? 24 2.貢献しやすいドキュメント翻訳
    25. 25. 翻訳しにくい例 (1/3) マニュアルがHTMLファイルでのみ 提供されている HTMLファイルを書き換える? 25 2.貢献しやすいドキュメント翻訳
    26. 26. 翻訳しにくい例 (2/3) マニュアルがreSTファイルやソース コード内のdocstringから生成されてい る  reSTファイルを書き換える?  ソース内のdocstrinsを書き換える? 26 2.貢献しやすいドキュメント翻訳
    27. 27. 翻訳しにくい例 (3/3) 翻訳対象がgitで管理されている  gitを学ぶ  GitHubを学ぶ  "git clone" してソースコードを取得する  翻訳 (これ!これやりたかった!)  "git commit"  "git pull"  時々競合が発生して解決しないといけない  "git push" 27 2.貢献しやすいドキュメント翻訳
    28. 28. めんどう vs かんたん めんどう かんたん 1. gitを学ぶ 2. GitHubを学ぶ 3. "git clone" 4. 翻訳 5. "git commit" / "git push" 6. "git pull" 7. 時々競合解決 8. HTMLを自分でビルド 1. git 使わない 2. Github 使わない 3. file 触らない 4. 翻訳 5. 翻訳は自動更新 6. 競合しない 7. 自分でビルドしなくて もHTMLをゲット 28 2.貢献しやすいドキュメント翻訳
    29. 29. 29
    30. 30. 2つのi18n機能  pot ファイルの生成: reSTから  po ファイルの読み込み: 翻訳済みHTMLを生成するため 30 3. Sphinxのi18n機能 reST pot reST html po
    31. 31. 翻訳の流れ  potを生成  potをpoに翻訳  翻訳済みHTMLを生成 31 3. Sphinxのi18n機能 reST pot reST html po pot po Translator 翻訳して~ 翻訳した! 協力ありがとう!
    32. 32. #: ../../../deep_thought/utils.py:docstring of deep_thought.utils.dumps:1 msgid "Serialize ``obj`` to a JSON formatted :class:`str`." msgstr "" msgid "For example:" msgstr "" 32 pot ファイル生成 3. Sphinxのi18n機能 $ make gettext ... Build finished. The message catalogs are in _build/gettext. $ ls _build/gettext api.pot examples.pot generated.pot index.pot generated.pot reST pot
    33. 33. 翻訳前にpoファイルを準備 doc +- _build/ | +- gettext/ | +- api.pot | +- examples.pot | +- generated.pot | +- index.pot +- locale/ doc +- _build/ +- locale/ +- ja/ | +- LC_MESSAGES/ | +- api.po | +- examples.po | +- generated.po | +- index.po +- zh_cn/ これらを翻訳 翻訳者 pot po 33 3. Sphinxのi18n機能
    34. 34. 34 翻訳前にpoファイルを準備 $ sphinx-intl update -p _build/gettext -l zh_cn Create: locale/zh_cn/LC_MESSAGES/api.po Create: locale/zh_cn/LC_MESSAGES/examples.po Create: locale/zh_cn/LC_MESSAGES/generated.po Create: locale/zh_cn/LC_MESSAGES/index.po sphinx-intl コマンドで「名前を変えてコピー」 pot po sphinx-intl $ make gettext $ sphinx-intl update -p _build/gettext -l zh_cn Not Changed: locale/zh_cn/LC_MESSAGES/api.po Updated: locale/zh_cn/LC_MESSAGES/examples.po +3, -1 ドキュメントが更新されたら、同じコマンドでpoを更新 3. Sphinxのi18n機能
    35. 35. po ファイルを翻訳 #: ../../../deep_thought/utils.py:docstring of deep_thought.utils.dumps:1 msgid "Serialize ``obj`` to a JSON formatted :class:`str`." msgstr "" generated.po pot po sphinx-intl 翻訳者 #: ../../../deep_thought/utils.py:docstring of deep_thought.utils.dumps:1 msgid "Serialize ``obj`` to a JSON formatted :class:`str`." msgstr "``obj`` をJSONフォーマットした :class:`str` にシリアライズ。 " generated.po Vim, Emacs, OmegaT, ... 等を使って翻訳 35 3. Sphinxのi18n機能
    36. 36. po ファイルを読み込み 36 3. Sphinxのi18n機能 reST html po 翻訳済み $ make html ... Build finished. The HTML pages are in _build/html.
    37. 37. 全体の流れ 37 3. Sphinxのi18n機能 reST pot html po make gettext sphinx-intl 翻訳者 make html ドキュメント作者 翻訳カタログ 翻訳済み カタログ
    38. 38. 38
    39. 39. Sphinxドキュメント翻訳プロセス全体像 39 4.翻訳プロセスの自動化と便利なサービス reST pot html po make gettext sphinx-intl make html ドキュメント作者 翻訳カタログ 翻訳済カタログ 翻訳者 翻訳者 翻訳者 作者 / 翻訳者 アップロード 翻訳者 clone 翻訳者
    40. 40. 自動化したい2つの部分 40 4.翻訳プロセスの自動化と便利なサービス reST pot html po make gettext sphinx-intl make html ドキュメント作者 翻訳カタログ 翻訳済カタログ アップロード 翻訳者 自動化したい 並列化 したい clone
    41. 41. 翻訳ツールの種類  Vim / Emacs (エディタ)  ローカルファイルの編集  いくつかの翻訳サポートプラグイン  OmegaT (翻訳ツール)  ローカルファイルの編集  いくつかの翻訳サポート機能  Transifex (サービス)  オンライン編集  いくつかの翻訳サポート 機能 41 4.翻訳プロセスの自動化と便利なサービス po 翻訳者 並列化 したい
    42. 42. Transifexを用いた並列化 Transifexが提供する機能 APIとして: アップロード pot ダウンロード po Webコンソールとして: 用語集 翻訳メモリ レコメンド 機械翻訳 42 4.翻訳プロセスの自動化と便利なサービス po 翻訳者 並列化 pot アップロード pot 自動反映 sphinx-intl transifex-client po transifex-client ダウンロード
    43. 43. Transifex Webコンソールで翻訳 43 4.翻訳プロセスの自動化と便利なサービス 原文 翻訳文(reST文法を 壊さないように!) 翻訳メモリ (TM) からの レコメンド 原文 (pot) 翻訳 (po) 原文を翻訳文にコピー 機械翻訳 保存 レビュー (必要なら) 翻訳者 並列化 1 2 4 3 5 6
    44. 44. 自動化したい2つの部分 44 4.翻訳プロセスの自動化と便利なサービス po 翻訳者 並列化 pot アップロード pot 自動更新 sphinx-intl transifex-client po transifex-client ダウンロード reST html make gettext make html ドキュメント作者 アップロード 自動化したい clone
    45. 45. 全体の処理を自動化したい 45 4.翻訳プロセスの自動化と便利なサービス pot アップロード sphinx-intl transifex-client po transifex-client ダウンロード reST html make gettext make htmlアップロード clone 1 2 3 45 6 自動化したい
    46. 46. 自動化の手順 1. リポジトリをclone 2. "make gettext" 3. アップロード pot 4. ダウンロード po 5. "make html" 6. アップロード html 46 4.翻訳プロセスの自動化と便利なサービス pot アップロード sphinx-intl transifex-client po transifex-client ダウンロード reST html make gettext make html アップロード clone 1 2 3 45 6 自動化した い
    47. 47. 1. pip install sphinx sphinx-intl transifex-client==0.8 2. git clone https://github.com/shimizukawa/deepthought.git 3. cd deepthought/doc 4. sphinx-intl create-transifexrc # create ~/.transifexrc 5. sphinx-intl create-txconfig # create .tx/config 6. make gettext 7. sphinx-intl -p _build/gettext update-txconfig-resources # update .tx/config 8. tx push -s # push pot files to transifex 9. tx pull -l ja # pull po files from transifex 10. make html SPHINXOPTS="-D language=ja" 自動化のためのシェルコマンド run.sh $ export SPHINXINTL_TRANSIFEX_USERNAME=mice $ export SPHINXINTL_TRANSIFEX_PASSWORD=42 $ export SPHINXINTL_TRANSIFEX_PROJECT_NAME=deepthought-0_7 $ export SPHINXINTL_POT_DIR=_build/gettext $ run.sh 47 4.翻訳プロセスの自動化と便利なサービス
    48. 48. drone.ioによる自動化 48 WebHook デプロイ リポジトリClone シェルスクリプト実行 drone.io は継続的インテグレーションサービス 4.翻訳プロセスの自動化と便利なサービス
    49. 49. GitHub + drone.io + S3 49 GitHub Amazon S3 Transifex 1. リポジトリClone 2. make gettext 3. アップロード pot 4. ダウンロード po 5. make html 6. アップロード html 4.翻訳プロセスの自動化と便利なサービス 2 1 3 1
    50. 50. Drone.ioによる自動化 50 pot アップロード sphinx-intl transifex-client po transifex-client Download reST html make gettext make html アップロード clone 1 2 3 45 6 To Be Automated アップロード pot ダウンロード po アップロード html WebHook clone 1 5 6 make html make gettext2 3 4 1 WebHook 自動化 4.翻訳プロセスの自動化と便利なサービス
    51. 51. Drone.ioによる自動化 51 アップロード pot ダウンロード po アップロード html WebHook clone 1 5 6 make html make gettext2 3 4 1 WebHook 自動化 4.翻訳プロセスの自動化と便利なサービス
    52. 52. ドキュメント作者の視点  ドキュメント作者は、面倒な手間をかけずに、翻訳原文 の更新やサイトの閲覧ができる 翻訳原文の更新 ドキュメント作者 通知 閲覧 Commit 52 4.翻訳プロセスの自動化と便利なサービス
    53. 53. 翻訳者の視点  No git  No file  No conflict  自動的に更新  手動ビルドせずに翻訳されたHTMLを閲覧できる 翻訳者 並列化 閲覧 翻訳 翻訳されたHTML 53 4.翻訳プロセスの自動化と便利なサービス
    54. 54. 自動化された全プロセス 54 アップデート 翻訳カタログ ドキュメント作者 翻訳者 並列化 通知 閲覧 閲覧 更新 翻訳 Commit ダウンロード Translations 通知 Automated 4.翻訳プロセスの自動化と便利なサービス
    55. 55. まとめ ツール 1. sphinx - ドキュメントジェネレータ 2. sphinx-intl - Sphinx i18n機能の補助ツール 3. transifex-client - Transifexサービスのファイルを送 受信するツール サービス 1. Transifex - 翻訳サポートサービス 2. Drone.io - 継続的インテグレーションサービス 55 4.翻訳プロセスの自動化と便利なサービス
    56. 56. 56
    57. 57. TIP: Drone.io の15分制限  Drone.io はビルド1回の時間を15分に制限している  パッケージのインストールをwheelで行い時間短縮 57 5. Tips, tricks, traps 1. curl -L -s https://example.com/wheelhouse.tgz | tar vzxf - 2. export PIP_FIND_LINKS=./wheelhouse 3. pip install sphinx sphinx-intl transifex-client==0.8 run.sh ex. https://bitbucket.org/sphinxjp/docutils-translation/
    58. 58. TRAP: transifex-clientのバージョン  transifex-client 0.11b3は安定してない(と思 う)  特にWindowsユーザーにとって  もし最新版でうまくいかない場合は、以下 のようにバージョン指定してみてください: 58 5. Tips, tricks, traps $ pip install "transifex-client=0.8"
    59. 59.  Drone.io はGithubか Bitbucketの管理権限の あるリポジトリ用のプ ロジェクトしか作れな い  Github等に空リポジト リを用意してDrone.ioプ ロジェクトを作成し、 そのWebHook URLを対 象リポジトリの管理者 に設定してもらおう 59 TRICK: Drone.io プロジェクトの用意 5. Tips, tricks, traps
    60. 60. 利用事例  Sphinx-1.3 doc for "ja" translation https://drone.io/bitbucket.org/shimizukawa/sphinx-doc13/admin  Sphinx-1.4 doc for "ja" translation https://drone.io/bitbucket.org/shimizukawa/sphinx-doc14/admin  Docutils doc for "ja" translation https://drone.io/bitbucket.org/sphinxjp/docutils-translation/admin 60 5. Tips, tricks, traps
    61. 61. Questions? @shimizukawa いつでもつかまえてね :) OpenSpace, Party, Poster, Sprint 61
    62. 62. Thanks :) 62

    ×