-
Notifications
You must be signed in to change notification settings - Fork 132
po4a
yuichiro umezawa edited this page Aug 2, 2017
·
18 revisions
po4a で翻訳作業を機械化する。以下、virtualbox 上の trusty における作業メモ。
# garbagetown @ garbagetown in ~/Desktop/trusty [5:45:54]
$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "ubuntu/trusty64"
(snip)
# garbagetown @ garbagetown in ~/Desktop/trusty [5:45:58]
$ vagrant up
(snip)
# garbagetown @ garbagetown in ~/Desktop/trusty [5:51:44]
$ vagrant ssh
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-125-generic x86_64)
(snip)
git がないのでインストールする。
~$ which git
~$ sudo apt-get install git
(snip)
~$ which git
/usr/bin/git
po4a も apt-get でインストールできる。
~$ apt-cache search po4a
po4a - tools for helping translation of documentation
dl10n - Debian infrastructure and tools for localization
sisu - documents - structuring, publishing in multiple formats and search
~$ sudo apt-get install po4a
(snip)
~$ which po4a
/usr/bin/po4a
play のドキュメントだけ clone する。
~$ cd /vagrant/
/vagrant$ git clone https://github.com/playframework/playframework.git
(snip)
/vagrant$ cd playframework/
/vagrant/playframework$ git config core.sparsecheckout true
/vagrant/playframework$ touch .git/info/sparse-checkout
/vagrant/playframework$ echo documentation/manual/ > .git/info/sparse-checkout
/vagrant/playframework$ git read-tree -m -u HEAD
以下のようなディレクトリ構成とする。
./playframework
./playframework/documentation
./playframework/documentation/manual
./translation-project
./translation-project/documentation
./translation-project/documentation/manual
./translation-project/po
./translation-project/po/manual
翻訳用ディレクトリを作成する。
- ここでは translation-project ディレクトリを mkdir しているが、本来は playframework-ja から clone する。
-
TODO translation-project には
documentation
ディレクトリは不要だった...
/vagrant/playframework$ cd ..
/vagrant$ mkdir translation-project
/vagrant$ find playframework/documentation/manual/ -type d | \
> sed "s/playframework\///g" | \
> xargs -i \
> mkdir -p translation-project/{}
/vagrant$ find playframework/documentation/manual/ -type d | \
> sed "s/playframework\/documentation\///g" | \
> xargs -i \
> mkdir -p translation-project/po/{}
.po ファイルを作る。
/vagrant$ find playframework/documentation/ -name "*.md" | \
> sed "s/playframework\/documentation\///g" | \
> xargs -i \
> po4a-updatepo -f text -o markdown -M UTF-8 \
> -m playframework/documentation/{} \
> -p translation-project/po/{}_ja.po
本来はここで翻訳作業を行う。
.po ファイルから翻訳文を作成する。デフォルトで 80% 以上翻訳していないとエラーになるので -k 0
で強制的に出力。
/vagrant$ find playframework/documentation/ -name "*.md" | \
> sed "s/playframework\/documentation\///g" | \
> xargs -i \
> po4a-translate -f text -o markdown -M UTF-8 -k 0 \
> -m playframework/documentation/{} \
> -p translation-project/po/{}_ja.po \
> -l translation-project/documentation/{}
- TODO index.toc もコピーする必要がある
- 旧バージョンの翻訳から .po をリバースして新バージョンの .po にマージしたい
- 原文のコメントアウトが残っているため po4a-gettextize でリバースできない
- このため、翻訳ファイルからコメントアウト部分を除去する必要がある。
以下、翻訳ファイルの例。
$ cat manual/Home.md
<!--- Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com> -->
<!--
# Play %PLAY_VERSION% documentation
-->
# Play %PLAY_VERSION% ドキュメント
<!--
> Play is a high-productivity Java and Scala web application framework that integrates the components and APIs you need for modern web application development.
>
> Play is based on a lightweight, stateless, web-friendly architecture and features predictable and minimal resource consumption (CPU, memory, threads) for highly-scalable applications thanks to its reactive model, based on Iteratee IO.
-->
>Play は、現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。
>
> Play の特徴は、ライトウェイト、ステートレス、web フレンドリーなアーキテクチャであること、機能予測のしやすさです。また、Iteratee IO をベースにしたリアクティブモデルのおかげで、スケーラブルなアプリケーションでも CPU、メモリ、スレッドなどのリソース消費が最小限になっています。
<!--
- [[What's new in Play 2.4?|Highlights24]] / [[Play 2.4 Migration Guide|Migration24]]
- [[What's new in Play 2.3?|Highlights23]] / [[Play 2.3 Migration Guide|Migration23]]
- [[What's new in Play 2.2?|Highlights22]] / [[Play 2.2 Migration Guide|Migration22]]
- [[What's new in Play 2.1?|Highlights21]] / [[Play 2.1 Migration Guide|Migration21]]
-->
- [[Play 2.4 の変更点|Highlights24]] / [[Play 2.4 移行ガイド|Migration24]]
- [[Play 2.3 の変更点|Highlights23]] / [[Play 2.3 移行ガイド|Migration23]]
- [[Play 2.2 の変更点|Highlights22]] / [[Play 2.2 移行ガイド|Migration22]]
- [[Play 2.1 の変更点|Highlights21]] / [[Play 2.1 移行ガイド|Migration21]]
@toc@
## モジュールとプラグイン
<!--
[[Temporary modules directory|ModuleDirectory]]
-->
[[一時的なモジュールディレクトリ | ModuleDirectory]]
<!---
(ハイフンが三つ) で始まる著作権コメントまで消さないよう一旦置換してからその他のコメント部分を削除し、最後に著作権コメントの置換部分を戻す。
$ cat manual/Home.md | \
> sed 's/<!---/!!---/' | \
> sed '/<!--/,/-->/d' | \
> sed 's/!!---/<!---/'
<!--- Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com> -->
# Play %PLAY_VERSION% ドキュメント
>Play は、現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。
>
> Play の特徴は、ライトウェイト、ステートレス、web フレンドリーなアーキテクチャであること、機能予測のしやすさです。また、Iteratee IO をベースにしたリアクティブモデルのおかげで、スケーラブルなアプリケーションでも CPU、メモリ、スレッドなどのリソース消費が最小限になっています。
- [[Play 2.4 の変更点|Highlights24]] / [[Play 2.4 移行ガイド|Migration24]]
- [[Play 2.3 の変更点|Highlights23]] / [[Play 2.3 移行ガイド|Migration23]]
- [[Play 2.2 の変更点|Highlights22]] / [[Play 2.2 移行ガイド|Migration22]]
- [[Play 2.1 の変更点|Highlights21]] / [[Play 2.1 移行ガイド|Migration21]]
@toc@
## モジュールとプラグイン
[[一時的なモジュールディレクトリ | ModuleDirectory]]
上記は cat した内容を置換しているが、ファイルそのものを置換したい場合は
$ sed -i ... <ファイル名>
とすればよい。
コメントアウト部分を除去したら、
-
-m
原文ファイル -
-l
翻訳ファイル -
-p
po ファイル
を指定して po4a-gettextize
する。
$ po4a-gettextize -f text -o markdown -M UTF-8 \
-m playframework/documentation/manual/working/scalaGuide/main/forms/ScalaForms.md \
-l translation-project/manual/working/scalaGuide/main/forms/ScalaForms.md \
-p translation-project/po/working/scalaGuide/main/forms/ScalaForms.md_ja.po
$ head -30 translation-project/po/working/scalaGuide/main/forms/ScalaForms.md_ja.po
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR Free Software Foundation, Inc.
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2017-08-01 20:26+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. type: Plain text
#: playframework/documentation/manual/working/scalaGuide/main/forms/ScalaForms.md:2
#, fuzzy, no-wrap
msgid "<!--- Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com> -->\n"
msgstr "<!--- Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com> -->\n"
#. type: Title #
#: playframework/documentation/manual/working/scalaGuide/main/forms/ScalaForms.md:2
#, fuzzy, no-wrap
msgid "Handling form submission"
msgstr "フォームの送信"
まず翻訳対象ファイルの po ファイルを作る。
vagrant@vagrant-ubuntu-trusty-64:/vagrant$ po4a-updatepo -f text -o markdown -M UTF-8 \
> -m playframework/documentation/manual/scalaGuide/main/forms/ScalaForms.md \
> -p translation-project/manual/working/scalaGuide/main/forms/ScalaForms.md_ja.po
次に、既存の翻訳ファイルから生成した po の内容をマージする。
POEdit を使って手動で実施するか、
msgmerge
コマンドで実施する。
$ msgmerge \
> ScalaForms.md_ja.po \
> translation-project/manual/scalaGuide/main/forms/ScalaForms.md_ja.po \
> -o translation-project/manual/scalaGuide/main/forms/ScalaForms.md_ja.po.new
...................................................................... done.
$ grep -A 7 fuzzy translation-project/manual/working/scalaGuide/main/forms/ScalaForms.md_ja.po | tail -15
"Or you can define a default mapping on the number using [`Forms.default`]"
"(api/scala/play/api/data/Forms$.html):"
msgstr ""
"あるいは、[`Forms.default`](api/scala/play/api/data/Forms$.html) を使って番号"
"にデフォルトのマッピングを定義することもできます。"
--
#, fuzzy
msgid ""
"If you want a form to have a static value for a field, use [`Forms.ignored`]"
"(api/scala/play/api/data/Forms$.html):"
msgstr ""
"フォームにフィールドの静的な値を持たせたい場合は、[`Forms.ignored`](api/"
"scala/play/api/data/Forms$.html) を使います。"
msgattrib
で fuzzy マークを取り除く。
$ msgattrib --clear-fuzzy -o ScalaForms.md_ja.po.new ScalaForms.md_ja.po.new
最後に、既存の翻訳から生成した po ファイルの内容で翻訳ファルを生成する。
$ po4a-translate -f text -o markdown -M UTF-8 -k 0 \
> -m playframework/documentation/manual/scalaGuide/main/forms/ScalaForms.md \
> -p translation-project/manual/scalaGuide/main/forms/ScalaForms.md_ja.po \
> -l translation-project/manual/scalaGuide/main/forms/ScalaForms.md
できた。
$ head -10 translation-project/manual/scalaGuide/main/forms/ScalaForms.md
<!--- Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com> -->
# フォームの送信
## 概要
フォームの処理と送信は、Web アプリケーションの重要な構成要素のひとつです。 Play
には、シンプルなフォーム処理を扱いやすく、そして複雑なフォーム処理を扱うことのできる機能が搭載されています。
Play のフォーム処理アプローチは、データをバインドするという概念に基づいています。POST リクエストからデータを受け取ると、Play
はフォーマットされた値を探し、それらを [`Form`](api/scala/play/api/data/Form.html)
が、原文では一行の文章が複数行に改行される点は解消したい。
$ head -10 playframework/documentation/manual/scalaGuide/main/forms/ScalaForms.md
<!--- Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com> -->
# Handling form submission
## Overview
Form handling and submission is an important part of any web application. Play comes with features that make handling simple forms easy and complex forms possible.
Play's form handling approach is based around the concept of binding data. When data comes in from a POST request, Play will look for formatted values and bind them to a [`Form`](api/scala/index.html#play.api.data.Form) object. From there, Play can use the bound form to value a case class with data, call custom validations, and so on.
Typically forms are used directly from a `Controller` instance. However, [`Form`](api/scala/index.html#play.api.data.Form) definitions do not have to match up exactly with case classes or models: they are purely for handling input and it is reasonable to use a distinct `Form` for a distinct POST.