XLIFF(XML Localization Interchange File Format)とは、ソフトウェアや文書の国際化、翻訳のために定められた標準規格です。
Xcode 6で、strings
ファイルのXLIFF形式へのExport, その逆にXLIFF形式をstrings
ファイルとしてImportの機能がサポートされました。
このサポート前までは、strings
ファイルを直接編集するか、あるいは独自翻訳フローを構築する必要がありました。
今までXLIFFサポート自体は知りつつも特にその機能を活用していませんでしたが、今開発中のPlayer!への導入を検討しながら情報をまとめてみました。
Appleのリファレンス: Localizing Your App
strings
ファイルをXLIFFファイルとしてExportするとどうなる?
こんなstrings
ファイルがあり、
# ja/Card.strings
"Comment" = "コメント";
こう呼び出している場合、
let localized = LocalizedProfile("Comment", tableName: "Card", comment: "ノートです( ´・‿・`)")
XLIFFとしてExportすると、こうなります。
(親要素など省略)
<file original="Player/UI/Localization/Strings/en.lproj/Card.strings" source-language="en" datatype="plaintext" target-language="ja">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="6.3.2" build-num="6D2105"/>
</header>
<body>
<trans-unit id="CommentsCountFormat_One">
<source>Comment</source>
<target>コメント</target>
<note>ノートです( ´・‿・`)</note>
</trans-unit>
</body>
</file>
また、嬉しいこととして、大量のstrings
ファイルが言語ごとに1つのXLIFFファイルとして束ねられるため、翻訳時のファイルの扱いが簡単になります。
生のXLIFFファイルは読みにくいので、後述の「XLIFFクライアントアプリ」などで閲覧・編集します。
XLIFFを用いた翻訳フロー
XcodeあるいはコマンドラインでExport
Xcodeで 左のツリーでプロジェクトを選択した状態で、
ツールメニューのEditor
-> Export for localization
でExportできます。
あるいはコマンドラインで、以下のような感じで同じことが出来ます。
xcodebuild -exportLocalizations -localizationPath ./xliff -project Player.xcodeproj -exportLanguage ja
Xcodeだとエラーが出た時に、その詳細が分からないので、困ったらコマンドラインで実行すると良いです。
個人的には、Xcode上じゃ無くてコマンドライン経由で、プロジェクト設定のBuild Phasesに入れるか、あるいはCIフローに組み込むかなどが良いかなと思います。
翻訳作業
XLIFFエディタを使って、翻訳していきます。
XcodeあるはコマンドラインでImport
翻訳後のXLIFFファイルをExport時とは逆に、
ツールメニューのEditor
-> Import localizations
でExportできます。
同様にコマンドラインでも可能です。
xcodebuild -importLocalizations -localizationPath ./xliff -project Player.xcodeproj [-forceImport]
XLIFFエクスポート機能の問題
NSLocalizedString
の引数に文字列リテラルを渡す必要がある
「strings
ファイルをXLIFFとしてExportするとどうなる?」に貼ったXLIFFファイルに<note>ノートです( ´・‿・`)</note>
という要素があり、エディタ上にも右のカラムに出ていますが、これは、NSLocalizedString
のcomment
引数に相当します。
今まで、comment
引数はコード上でしか意味をなして無くてほとんど活用していなかったですが、翻訳のヒントとなるためちゃんと記載するとかなり分かりやすくなると思います。
これ自体はとても良い機能だと思うのですが、これらなどを実現するためか、XLIFFヘのExport時にNSLocalizedString
利用箇所を解析して渡された文字列リテラルを解釈する、というような挙動となっているようです。
そのため、組み立てた文字列だったり、変数としてNSLocalizedString
に渡している箇所があると以下のエラーが出てしまいます。
Bad entry in file /Users/mono/Documents/Git/ookami/ookami-ios/PlayerLib/Localization.swift (line = 29): Argument is not a literal string.
一応StackOverflowで質問もしてみましたが多分これは現状の制約だと思います:
xcode - NSLocalizedString should be used directly for exporting XLIFF? - Stack Overflow
stringsdict
非対応
stringsdict
についてはこちらご覧ください:
国際化 - Xcode 6で導入されたstringsdictファイルを使って、イケてる複数形多言語対応 - Qiita
stringsdict
XLIFFフォーマットのエクスポート・インポート非対応のため、XLIFFを使った場合でもstringsdict
ファイルはこれまでのstrings
ファイルと同様に、直接ファイル編集する必要が出てきます。
XLIFF形式にすると、strings
ファイルが1つのファイルにまとめられて便利な反面、stringsdict
は別管理となると、ちょっと中途半端な気がします。
【追記】Xcode 9で対応されました🎉
Localizing with Xcode 9 - WWDC 2017 - Videos - Apple Developer
strings
ファイルにコメントがあるとエラー
これは、XLIFF Exportの欠点では無いですが、ハマりどころです。
以下のようなstrings
ファイルが存在すると、
# ja/Card.strings
"Comment" = "コメント"; // ノートです( ´・‿・`)
こんなエラーが発生します。
分かりにくいエラーなので、注意です。
この用途だと、NSLocalizedString
のcomment
引数に書いた方が良いですね。
** INTERNAL ERROR: Uncaught exception **
Exception: -[__NSCFString substringWithRange:]: Range {771, 21} out of bounds; string length 791
Stack:
0 0x00007fff93a5ca3d __exceptionPreprocess (in CoreFoundation)
1 0x00007fff99f1e13a objc_exception_throw (in libobjc.A.dylib)
2 0x00007fff93a5c905 +[NSException raise:format:] (in CoreFoundation)
3 0x00007fff9395ee00 -[__NSCFString substringWithRange:] (in CoreFoundation)
4 0x000000010a635d55 -[IDELocalizationUtilities_parser _currentOffsetContext] (in IDEFoundation)
どのようなユースケースで使える?
と、色々利点やイケてない点などありましたが、個人的には「NSLocalizedString
の引数に文字列リテラルを引数に渡す必要がある」という制約がメリットの恩恵に対してやや薄いと感じたため、導入は見送ろうかなと思いました。
XLIFFは翻訳者にとっての標準フォーマットなので、XLIFF: Localize Your Xcode Application With XLIFFにも書いてある通り、外注による国際化フローを回したい需要など出てきたら良いと感じました。
そこで紹介されているPhraseApp: Software Translation Managementは、XLIFFおよびstringsdict
ファイルをアップロードすれば翻訳してくれるようです。
XLIFFクライアントアプリ
XMLなので、もちろん手でも弄れますが、使いやすいGUIを利用した方がずっと良いと思います。
直にファイル編集するなら、stringsファイルがむしろ扱いやすいと思いますし。
開発者がXLIFFファイルを見たい場合・チーム内の文言担当の人がXLIFFファイルを扱う場合など、以下から気にいったものを使えば良いと思います。
外注する場合は、専門家なのでXLIFFファイル渡せば適当にお気に入りのツールで処理してくれるでしょう。
Mac App Store - Xliffie
- 120円
- Macアプリとしては一番の定番だと思う
- ここにアプリ説明が詳しく載ってる: Xliffie - A localization assistance for your iOS / Mac app
Mac App Store - iXLIFF
- 120円
- 悪く無いけど、Xliffieの方が作り込んである印象
XLIFF localization tools for Xcode 6 - Stack Overflow
StackOverflowで、アプリについてたくさん紹介されています。
上記2つがけっこう良かったため、特に他のアプリはチェックしていません。