Evite que o Android Lint se queixe de string não traduzida

119

é possível especificar que as seqüências de caracteres em um arquivo nos value-* diretórios não sejam intencionalmente traduzidas para outros idiomas? Eu tenho um monte de strings que são comuns para todos os idiomas e não precisam de tradução, por isso criei um unlocalized-strings.xmlarquivo no valuesdiretório para desabilitar essa verificação em todo o projeto, gostaria de desabilitá-la apenas em alguns arquivos XML .. é possível?

"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.

Como pode definiu esta região de unlocalized cordas?

Gianni Costanzi
fonte

Respostas:

159

Eu não sei como ignorar todo o arquivo, mas você pode fazê-lo string por string usando:

<string name="hello" translatable="false">hello</string>
Luis
fonte
1
isso fornece 'recursos não traduzíveis somente devem ser definidos na pasta / valores base.
precisa saber é o seguinte
2
E isso está correto. Se você não deseja que uma string seja traduzida, defina-a apenas na "pasta / valores base", o que significa que não insira a string na pasta / valores traduzidos.
Luis
1
A resposta do @CyrilLeroux é mais abrangente e deve ser marcada como correta, porque mostra a opção de colocar todas as strings não traduzíveis em um arquivo.
Yoel Gluschnaider
Isso funciona, mas acho que não é a melhor maneira de resolver o problema, marcando uma string realmente traduzível "não traduzível" apenas para suprimir a mensagem de erro. Optamos por não traduzir algumas strings por enquanto. Mas isso não significa que eles não sejam traduzíveis.
Zili FENG 02/09
Eu quero colocar a string em apenas um idioma e esse é o idioma (de) alemão (não o inglês padrão). Coloquei lá e quando tento liberar a compilação, ocorreu um erro. O que fazer neste caso?
Aanal Mehta 14/11/2018
227

É o ignoreatributo do toolsespaço para nome no seu arquivo de strings, da seguinte maneira:

<?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>
Adil Hussain
fonte
<resources tools: ignore = "MissingTranslation"> está me fornecendo Erro ao analisar XML: prefixo não acoplado
anon58192932
5
Isso funciona bem, mas eu tive que ir Project->Cleanpara remover os erros definitivamente.
xonya
Pelo menos o eclipse não nos obrigou a traduzir tudo, incluindo pastas de strings ímpares como ids.xml e analytics.xml.
Androidcoder
2
Essa resposta deve ser aceita para resolver todos os problemas em apenas 2 linhas de código.
Nhoxbypass 6/17
153

Adicionar a build.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}
Leão girafa
fonte
7
A única solução viável para lidar com os recursos de sequência gerados automaticamente.
SqueezyMo
6
não, não deveria, com base na pergunta: "Eu não quero desativar essa verificação em todo o projeto"
Yoel Gluschnaider
@Giraffe Lion, você deve postar isso como uma pergunta diferente e responder você mesmo, obrigado pela solução, antes eu precisava desativá-lo manualmente.
Diljeet
1
Isso desativou toda a verificação, que deve ser evitada, se possível. Não consigo entender por que tem tantos votos.
tasomaniac
23

Existem três maneiras que eu conheço:

Para aplicar o valor da modificação por valor: Defina o atributo translatable="false"na <string>definição:

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

Se você tiver muitos recursos que não devem ser traduzidos, poderá colocá-los em um arquivo nomeado donottranslate.xmle o lint considerará todos eles recursos não traduzíveis.

Outra maneira que descobri enquanto navegava nas fontes do projeto Hackers Keyboard :
Você pode adicionar o prefixo donottranslate-ao seu arquivo de recurso. Como no exemplo anterior, o lint considerará todos eles recursos não traduzíveis.
No seu caso, você pode substituir unlocalized-strings.xmlpor donottranslate-strings.xml. Parece funcionar, mas não encontrei nenhuma documentação para esta dica.

Consulte: Site do projeto Ferramentas Android: Strings não traduzíveis

Cyril Leroux
fonte
É verdade que se colocarmos nossa string no arquivo donottranlate.xml, não precisaremos mais adicionar a translatable="false"tag?
Yuchen Zhong
Sim. Eu uso arquivos donottranslate-strings.xml em todo o meu projeto. Funciona bem. Experimente, é muito útil!
Cyril Leroux
12

E aqui está uma solução do Android Studio para desativar esse erro fatal do Lint:

insira a descrição da imagem aqui

Dzhuneyt
fonte
2
Pode ser um erro irritante, mas pode salvá-lo quando você acidentalmente se esquece de traduzir uma nova string para um dos idiomas do seu aplicativo.
Elad Nava
2

Eu acho que o que você precisa, em vez de desativar o fiapo, é marcá-los com atributo

translatable="false"
Diego Torres Milano
fonte
2

Criar um arquivo de recurso com um nome de arquivo que começa com " donottranslate " (por exemplo donottranslate.xml , donottranslate_urls.xml , etc), e fiapos irá ignorar suas cordas por completo durante a verificação de traduções ausentes.

Kai
fonte
1

Se desejar desativar a verificação de fiapos na tradução ausente, você pode ir

"Propriedades do projeto -> Preferências do Android Lint -> Selecione Tradução ausente -> Alternar para ignorar em gravidade",

espera que isso ajude outras pessoas, pois acabei de encontrar esse problema :)

hctang
fonte
2
Existe uma maneira de fazer isso no Android Studio? Eu não poderia encontrar definições relacionadas com fiapos
adrian_88
1

Outra maneira de fazer isso é adicionar sua string ao arquivo gradle, usando resValueou buildConfigField. Algo parecido:

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"
    }
}

Usos:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)
heloisasim
fonte
0

Para evitar avisos no Android Studio, abra Preferências ==> Inspeções, desmarque "Traduções incompletas". Mas isso não afetará a construção do Gradle.

Kof
fonte