Evite las quejas de Android Lint sobre cadenas no traducidas

119

¿Es posible especificar que las cadenas de un archivo dentro de los value-* directorios no se traducen intencionalmente a otros idiomas? Tengo un montón de cadenas que son comunes para todos los idiomas y no necesitan traducción, así que he creado un unlocalized-strings.xmlarchivo dentro del valuesdirectorio. Ejecutando Android Lint para buscar problemas, sigue diciendo que faltan algunas traducciones ... No quiero para deshabilitar esta verificación en todo el proyecto, me gustaría deshabilitarla solo en algunos archivos XML ... ¿es posible?

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

¿Cómo se puede definir esta región de cadenas no localizadas ?

Gianni Costanzi
fuente

Respuestas:

159

No sé cómo ignorar todo el archivo, pero puede hacerlo cadena por cadena usando:

<string name="hello" translatable="false">hello</string>
Luis
fuente
1
esto da 'los recursos no traducibles solo deben definirse en la carpeta / valores base.
anon58192932
2
Y eso es correcto. Si no desea que se traduzca una cadena, solo debe definirla en la "carpeta / valores base", lo que significa que no ingrese la cadena en la carpeta / valores traducidos.
Luis
1
La respuesta de @CyrilLeroux es más completa y debe marcarse como la correcta porque muestra la opción de poner todas las cadenas no traducibles en un archivo.
Yoel Gluschnaider
Esto funciona, pero no creo que sea la mejor manera de resolver el problema marcando una cadena realmente traducible como "no traducible" solo para suprimir el mensaje de error. Simplemente elegimos no traducir algunas cadenas por el momento. Pero eso no significa que no sean traducibles.
Zili FENG
Quiero poner una cadena en un solo idioma y ese es el idioma alemán (de) (no el inglés predeterminado). Lo puse allí y cuando intento liberarlo, me dio un error. ¿Qué hacer en este caso?
Aanal Mehta
228

Es el ignoreatributo del toolsespacio de nombres en su archivo de cadenas, de la siguiente manera:

<?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
fuente
<resources tools: ignore = "MissingTranslation"> me está dando un error al analizar XML: prefijo no
vinculado
5
Esto funciona bien, pero tuve que ir Project->Cleana eliminar los errores definitivamente.
xonya
Al menos eclipse no nos obligó a traducir todo, incluidas carpetas de cadenas extrañas como ids.xml y analytics.xml.
Androidcoder
2
Esta debería ser una respuesta aceptada para resolver todos los problemas en solo 2 líneas de código.
nhoxbypass
153

Agregar a build.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}
León jirafa
fuente
7
La única solución viable para lidiar con los recursos de cadenas generados automáticamente. Gracias.
SqueezyMo
6
no, no debería, basado en la pregunta: "No quiero deshabilitar esta verificación en todo el proyecto"
Yoel Gluschnaider
@Giraffe Lion, debe publicar esto como una pregunta diferente y responderla usted mismo. Gracias por la solución, anteriormente tuve que deshabilitarla manualmente.
Diljeet
1
Esto deshabilitó todo el control que debería evitarse si es posible. No puedo entender por qué tiene tantos votos.
tasomaniac
23

Hay 3 formas que conozco:

Para aplicar el valor de modificación por valor: Establezca el atributo translatable="false"en la <string>definición:

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

Si tiene muchos recursos que no deben traducirse, puede colocarlos en un archivo con nombre donottranslate.xmly lint los considerará todos recursos no traducibles.

Otra forma que descubrí mientras navegaba por las fuentes del proyecto de Hackers Keyboard :
puede agregar el prefijo donottranslate-a su archivo de recursos. Como en el ejemplo anterior, lint los considerará todos recursos no traducibles.
En su caso, puede reemplazarlo unlocalized-strings.xmlpor donottranslate-strings.xml. Parece funcionar, pero no he encontrado ninguna documentación para este consejo.

Consulte: Sitio del proyecto de herramientas de Android: cadenas no traducibles

Cyril Leroux
fuente
¿Es cierto que si ponemos nuestra cadena en el archivo donottranlate.xml, ya no necesitamos agregar la translatable="false"etiqueta?
Yuchen Zhong
Sí. Utilizo archivos donottranslate-strings.xml en todo mi proyecto. Funciona bien. Pruébalo, ¡es muy útil!
Cyril Leroux
12

Y aquí hay una solución de Android Studio para deshabilitar este error fatal de Lint:

ingrese la descripción de la imagen aquí

Dzhuneyt
fuente
2
Puede ser un error molesto, pero podría salvarlo cuando accidentalmente se olvide de traducir una nueva cadena a uno de los idiomas de su aplicación.
Elad Nava
2

Creo que lo que necesitas en lugar de deshabilitar lint es marcarlos con atributo

translatable="false"
Diego Torres Milano
fuente
2

Crear un archivo de recursos con un nombre que empieza con " donottranslate " (por ejemplo donottranslate.xml , donottranslate_urls.xml , etc), y la pelusa ignorará sus cadenas por completo en la comprobación de traducciones que faltan.

Kai
fuente
1

Si desea desactivar la verificación de pelusa en la traducción que falta, puede ir

"Propiedades del proyecto -> Preferencias de Android Lint -> Seleccione MissingTranslation -> Swtich para ignorar en gravedad",

Espero que esto ayude a otros porque acabo de encontrar este problema :)

hctang
fuente
2
¿Hay alguna forma de hacerlo en Android Studio? No pude encontrar configuraciones relacionadas con lint
adrian_88
1

Otra forma de hacerlo es agregar su cadena al archivo gradle, usando resValueo buildConfigField. Algo como eso:

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
fuente
0

Para evitar advertencias en Android Studio, abra Preferencias ==> Inspecciones, desmarque "Traducciones incompletas". Pero no afectará la construcción de Gradle.

Kof
fuente