2014/10/05

AndroidStudio でビルドしたら MissingTranslation エラーが出た時の対処方法

Android Studio で Build → Generate Signed APK... とすると、以下のようなエラーが出てビルドできませんでした。

Error:(4) Error: "app_name" is not translated in "ja" (Japanese) [MissingTranslation]

「app_name を日本語に翻訳していないよ」というエラーなので、意味はわかります。
しかし、これはあえてなんです。全部の文言を日本語に翻訳するのは現実的ではありません。
せめて Warning にしておいてくれればいいのに。
きっと、これを Error にしたのは実際には Translation をあまり使わない英語圏の人たちなんでしょうねぇ。

というわけで、回避する方法を調べました。

個別に回避する方法1

以下のように string タグへ個別に translatable="false" をつけていきます。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name"
        translatable="false">Test App</string>



</resources >

ある意味、正攻法と言える方法です。
しかし、多言語展開すると「日本語には翻訳するけどフランス語には翻訳しない」等、単純にいかないことも多そうです。
その場合、フランス語(翻訳しない言語)にも同じ文言を書くのが正しい方法なのだと思いますが、数が増えてくると無駄が多くなり、修正も大変になってきます。

なお、この方法は「本来翻訳しないはずのものを翻訳しちゃった」場合に Warning を出してくれます。

個別に回避する方法2

以下のように string タグへ個別に ignore 属性をつけていきます。

res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources 
    xmlns:tools="http://schemas.android.com/tools">

    <string name="app_name" 
        tools:ignore="MissingTranslation">Test App</string>



</resources >

この方法は translatable を使った方法と同じように見えますが、「本来翻訳しないはずのものを翻訳しちゃった」場合に何の警告も出してくれないので、translatable を使った方が良いでしょう。

まとめて回避する方法1

以下のように ignore 属性をつける場所を親の resources タグにします。

res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources 
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingTranslation">

    <string name="app_name">Test App</string>



</resources >

これで、各ファイル毎にまとめて回避できるようになります。
string_no_translate.xml とか別ファイルにしてグループ分けすると便利かもしれません。
それでも多言語展開した時の問題は残るわけですが。

まとめて回避する方法2

どうせ個々やグループ化で回避しても意味が無いのであれば、本当に全体を回避してしまうのも手かもしれませんとはいえ、lint を完全に切ってしまうのはお勧めは出来ません
以下のように、build.gradle に追記します。

app/build.gradle
android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'

    lintOptions {
        disable 'MissingTranslation'
    }

    // 省略
}

まとめて回避する方法3

以下のように lint.xml をモジュール直下に配置する方法でも回避可能です。

app/lint.xml
<?xml version="1.0" encoding="UTF-8"?>

<lint>

    <issue id="MissingTranslation" severity="ignore" />

</lint>

この方法、本来ならば severity を warning 等に変えることで、警告レベルを変更できるはずですが、現在のところAndroid Studio (Beta) 0.8.6
Android SDK Tools 23.0.2
どう指定しても ignore になってしまうようです。