9
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

Android LintのMissingTranslationに対応する

TL;DR

  • ちゃんと翻訳しよう
  • 翻訳しないstringなら、<string name="foo" translatable="false">の様に1つずつtranslatable属性を付け、「翻訳不要」であることを明示する
    • 誤って翻訳してしまっていないかもチェックしてくれる
  • Lintチェック自体を無視するのはやめよう
    • ただし、ケースバイケースで特定のファイルだけ無視したりするのはアリだと思う。

Android Lint

単にコンパイルしただけでは気付かないプログラムの誤りをチェックしてくれるツールがLintです。
Androidアプリの開発環境(Android StudioやらAndroidのgradleプラグインやら)では、リリースビルド時にLintチェックも行い、Errorレベルの項目に引っかかったらビルドに失敗するようになっています。

つまり、Androidアプリ開発におけるお節介焼きお姉さんがAndroid Lintです。1
Android LintについてはDroidKaigi 2016の@Nkzn氏のセッションで詳しく触れています。
https://droidkaigi.github.io/2016/timetable.html#session-2016-02-18-13-00-13-50-b

MissingTranslation

Android Lintのチェック項目のうち、stringリソースが翻訳済みかどうかをチェックする項目がMissingTranslationです。
逆に翻訳後のものしかない(values-ja/にはあるけどvalues/に無い)といった場合もチェックしてくれます。

MissingTranslationはErrorレベルですので、これに引っかかるとリリースビルド出来ません。

リリースビルド時のエラーメッセージで、「ビルドスクリプトでcheckReleaseBuilds falseabortOnError falseを付けると無視できるよ」と表示されますが、やっちゃいけません。2
一時的ならかまわないでしょうが、MissingTranslation以外のチェック項目も全部無視されてしまいます。

translatable="false"で翻訳不要であることを明示する

翻訳しなくていいものはtranslatable属性でfalseを指定しましょう。

values/strings.xml
<resources>
    <string name="foo" translatable="false">bar</string>
</resources>

誤って翻訳してしまっている場合もエラーにしてくれます。
例えば、デフォルトロケールのstringがtranslatable="false"になってるのにvalues-ja/で翻訳したstringを書いてしまっていると検知してくれます。

values-ja/strings.xml
<resources>
    <string name="foo">ほげ</string><!-- 不要なstring -->
</resources>

ファイルまるごと無視する

translatable属性を1つずつ指定するほうがちゃんとLintチェックしてくれるので便利なのですが、翻訳しないものが多い場合はちと面倒です。
翻訳不要なstringを1つのファイルにまとめてあったりしていれば、ファイルまるごとLintチェックで無視してしまうのも手です。
tools:ignore属性で無視するLintルールを指定できます。
ただし、誤って翻訳してしまっている場合の検知が出来なくなってしまうデメリットがあります。

values/string_no_trans.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
           tools:ignore="MissingTranslation">
    <string name="api_url">http://foo.bar/api/</string>
</resources>

その他

tools:ignore属性はstringの1つずつにも指定できますが、translatable属性の方が便利です。

プロトタイプ作るだけだったりで厳密なチェックが邪魔なようなら、lint.xmlやbuild.gradleのlintOptionsでMissingTranslationをまるごと無視したり、checkReleaseBuilds falseabortOnError falseでlintチェック自体しないようにする事もできます。
MissingTranslationの検知レベルをWarningsなどに下げてしまうというのもあります。(※この辺は未検証)

参考


  1. 擬人化はまだか。 

  2. そのメッセージの前の部分に「ちゃんとlint引っかかった箇所を直すか〜」と書いてあるんですが、わかりやすくビルドスクリプトのサンプル記述がある後半に目が行ってしまう。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
9
Help us understand the problem. What are the problem?