Avoid Lint жалуется на непереведенную строку

119

Можно ли указать, что строки в файле в value-* каталогах намеренно не переводятся на другие языки? У меня есть несколько строк, которые являются общими для всех языков и не нуждаются в переводе, поэтому я создал unlocalized-strings.xmlфайл в valuesкаталоге .. Запуск Android Lint для проверки наличия проблем, он постоянно сообщает, что некоторые переводы отсутствуют .. Я не хочу чтобы отключить эту проверку для всего проекта, я бы хотел отключить ее только в некоторых файлах XML .. возможно ли это?

"title_widget_updater_service" is not translated in de, en, en-rUS, it

Issue: Checks for incomplete translations where not all strings are translated
Id: MissingTranslation

If an application has more than one locale, then all the strings declared in one language     
should also be translated in all other languages.

By default this detector allows regions of a language to just provide a subset of the 
strings and fall back to the standard language strings. You can require all regions to 
provide a full translation by setting the environment variable 
ANDROID_LINT_COMPLETE_REGIONS.

Как можно определить эту область из нелокализованных строк?

Джанни Костанци
источник

Ответы:

159

Я не знаю, как игнорировать весь файл, но вы можете сделать это строка за строкой, используя:

<string name="hello" translatable="false">hello</string>
Луис
источник
1
это дает «непереводимые ресурсы должны быть определены только в папке base values ​​/.
anon58192932 05
2
И это правильно. Если вы не хотите, чтобы строка переводилась, вы должны определить ее только в «базовых значениях / папке», что означает, что не вводите строку в переведенные значения / папку.
Луис
1
Ответ @CyrilLeroux является более полным и должен быть отмечен как правильный, потому что он показывает возможность размещения всех непереводимых строк в одном файле.
Йоэль Глушнайдер
Это работает, но я не думаю, что это лучший способ решить проблему, пометив действительно переводимую строку как «не переводимую» просто для подавления сообщения об ошибке. Мы просто решили пока не переводить некоторые строки. Но это не значит, что их нельзя перевести.
Zili FENG
Я хочу поместить строку только на одном языке, и это немецкий (de) язык (а не английский по умолчанию). Я положил его туда, и когда я пытался выпустить сборку, у меня возникла ошибка. Что делать в этом случае?
Aanal Mehta
228

Это ignoreатрибут toolsпространства имен в вашем файле строк, как показано ниже:

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

  <!-- your strings here; no need now for the translatable attribute -->

</resources>
Адиль Хуссейн
источник
<resources tools: ignore = "MissingTranslation"> выдает ошибку при синтаксическом
анализе
5
Это работает хорошо, но мне пришлось пойти, чтобы Project->Cleanокончательно удалить ошибки.
xonya 02
По крайней мере, eclipse не заставлял нас переводить все, включая папки с нечетными строками, такие как ids.xml и analytics.xml.
Androidcoder
2
Это должен быть принятый ответ для решения всех проблем всего в 2 строчки кода.
nhoxbypass 06
153

Добавить в build.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}
Жираф Лев
источник
7
Единственное работоспособное решение для работы с автоматически сгенерированными строковыми ресурсами. Спасибо.
SqueezyMo
6
нет, не должен, основываясь на вопросе: «Я не хочу отключать эту проверку для всего проекта»
Йоэль Глушнайдер
@Giraffe Lion, вы должны опубликовать это как другой вопрос и ответить на него сами. Спасибо за решение, раньше мне приходилось отключать его вручную.
Дилджит
1
Это отключило всю проверку, чего по возможности следует избегать. Я не могу понять, почему у него столько голосов.
tasomaniac
23

Я знаю 3 способа:

Чтобы применить значение модификации по значению: Установите атрибут translatable="false"в <string>определении:

<string name="account_setup_imap" translatable="false">IMAP</string>

Если у вас много ресурсов, которые не следует переводить, вы можете поместить их в файл с именем, donottranslate.xmlи lint будет рассматривать все из них как непереводимые ресурсы.

Еще один способ, который я обнаружил при просмотре источников проекта Hackers Keyboard :
вы можете добавить префикс donottranslate-в свой файл ресурсов. Как и в предыдущем примере, lint будет рассматривать все их непереводимые ресурсы.
В вашем случае вы можете заменить unlocalized-strings.xmlна donottranslate-strings.xml. Кажется, это работает, но я не нашел документации по этому совету.

См .: Сайт проекта Android Tools: Непереводимые строки

Сирил Леру
источник
Верно ли, что если мы поместим нашу строку в файл donottranlate.xml, нам больше не нужно будет добавлять translatable="false"тег?
Yuchen Zhong
Ага. Я использую файлы donottranslate-strings.xml во всех своих проектах. Работает отлично. Попробуйте, очень полезно!
Cyril Leroux
12

А вот решение Android Studio для отключения этой фатальной ошибки Lint:

введите описание изображения здесь

Dzhuneyt
источник
2
Это может быть досадной ошибкой, но она может спасти вас, если вы случайно забудете перевести новую строку на один из языков приложения.
Элад Нава
2

Я думаю, что вам нужно вместо отключения линта пометить их атрибутом

translatable="false"
Диего Торрес Милано
источник
2

Создайте файл ресурсов с именем, начинающимся с « donottranslate » (например, donottranslate.xml , donottranslate_urls.xml и т. Д.), И lint будет полностью игнорировать его строки при проверке отсутствующих переводов.

Кай
источник
1

Если вы хотите отключить проверку текстур при отсутствии перевода, вы можете перейти

«Свойства проекта -> Настройки Android Lint -> Выберите MissingTranslation -> Swtich игнорировать по степени серьезности»,

надеюсь, что это поможет другим, потому что я просто столкнулся с этой проблемой :)

hctang
источник
2
Есть ли способ сделать это в Android Studio? Я не смог найти настройки, относящиеся к lint
Адриан Л.
1

Другой способ сделать это - добавить строку в файл gradle с помощью resValueили buildConfigField. Что-то такое:

buildTypes {
    debug {
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
}

Обычаи:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)
heloisasim
источник
0

Чтобы избежать предупреждений в Android Studio, откройте «Настройки» ==> «Инспекции», снимите флажок «Неполные переводы». Но это не повлияет на сборку Gradle.

Коф
источник