Xcode
I18n
国際化
Swift
XLIFF

Xcode 6で導入されたXLIFFによる国際化フローの使いドコロ

More than 1 year has passed since last update.

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クライアントアプリ」などで閲覧・編集します。

Screen Shot 2015-06-28 at 8.59.04 AM.png


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>という要素があり、エディタ上にも右のカラムに出ていますが、これは、NSLocalizedStringcomment引数に相当します。

今まで、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

stringsdictXLIFFフォーマットのエクスポート・インポート非対応のため、XLIFFを使った場合でもstringsdictファイルはこれまでのstringsファイルと同様に、直接ファイル編集する必要が出てきます。

XLIFF形式にすると、stringsファイルが1つのファイルにまとめられて便利な反面、stringsdictは別管理となると、ちょっと中途半端な気がします。


【追記】Xcode 9で対応されました🎉

Localizing with Xcode 9 - WWDC 2017 - Videos - Apple Developer

Screen Shot 2017-06-11 at 15.51.48.png


stringsファイルにコメントがあるとエラー

これは、XLIFF Exportの欠点では無いですが、ハマりどころです。

以下のようなstringsファイルが存在すると、

# ja/Card.strings

"Comment" = "コメント"; // ノートです( ´・‿・`)

こんなエラーが発生します。

分かりにくいエラーなので、注意です。

この用途だと、NSLocalizedStringcomment引数に書いた方が良いですね。

** 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


Mac App Store - iXLIFF


  • 120円

  • 悪く無いけど、Xliffieの方が作り込んである印象


XLIFF localization tools for Xcode 6 - Stack Overflow

StackOverflowで、アプリについてたくさん紹介されています。

上記2つがけっこう良かったため、特に他のアプリはチェックしていません。


参考