Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Localización de recursos de cadena agregados a través de build.gradle usando "resValue"

Esto es en la continuación de una respuesta que me ayudó en este post

Podemos agregar el recurso de cadena como sigue de build.gradle :

 productFlavors { main{ resValue "string", "app_name", "InTouch Messenger" } googlePlay{ resValue "string", "app_name", "InTouch Messenger: GPE Edition" } } 

Funciona como un encanto y sirve el propósito de tener diferentes nombres de aplicación por sabor. (Con el app_name cadena app_name original eliminado del archivo strings.xml .

Pero, ¿cómo podemos agregar cadenas localizadas para este recurso de cadena agregado de build.gradle ?

¿Hay un parámetro adicional que podemos pasar especificando la configuración regional? O ¿ Posible hacerlo utilizando una tarea gradle ?

Nota: No puedo hacer esto usando strings.xml (no es factible debido a varias maneras en las que mi proyecto está estructurado)

  • Android Volley: ImageRequest obsoleta
  • Deshabilitar multi-touch en mi aplicación
  • Android Studio "no puede resolver el símbolo Cadena"
  • ¿Cómo pasar los datos en ambos sentidos entre diferentes aplicaciones de Android?
  • Repetir AnimatorSet
  • Simulación de apertura / cierre del teclado hardware en el emulador
  • Cómo cambiar la imagen de fondo del botón cuando se hace clic / se centró?
  • Usando cámaras frontales y traseras simultáneamente android
  • 3 Solutions collect form web for “Localización de recursos de cadena agregados a través de build.gradle usando "resValue"”

    Mi otra respuesta sobre los recursos generados puede ser un exceso para usted caso de uso sin embargo. Base lo que actualmente conozco acerca de su proyecto Creo que este es un mejor ajuste: (no es que todavía puede combinar esto con los recursos generados)

    Src / flavor1 / res / values ​​/ strings.xml

     <string name="app_name_base">InTouch Messenger"</string> <string name="app_name_gpe">InTouch Messenger: GPE Edition"</string> 

    Src / flavor1 / res / valores-hu / strings.xml

     <string name="app_name_base">InTouch Üzenetküldő"</string> <string name="app_name_gpe">InTouch Üzenetküldő: GPE Változat"</string> 

    Src / flavor2 / res / values ​​/ strings.xml

     <string name="app_name_base">Whatever Messenger"</string> <string name="app_name_gpe">Whatever Messenger: GPE Edition"</string> 

    Src / flavor2 / res / valores-hu / strings.xml`

     <string name="app_name_base">Whatever Üzenetküldő"</string> <string name="app_name_gpe">Whatever Üzenetküldő: GPE Változat"</string> 

    Construir un gradiente

     android { sourceSets { [flavor1, flavor3].each { it.res.srcDirs = ['src/flavor1/res'] } [flavor2, flavor4].each { it.res.srcDirs = ['src/flavor2/res'] } } productFlavors { // notice the different numbers than sourceSets [flavor1, flavor2].each { it.resValue "string", "app_name", "@string/app_name_base" } [flavor3, flavor4].each { it.resValue "string", "app_name", "@string/app_name_gpe" } } } 

    Esto significa que flavor1/2 tendrá un recurso de cadena extra no utilizado app_name_gpe , pero que será atendida por aapt:

     android { buildTypes { release { shrinkResources true // http://tools.android.com/tech-docs/new-build-system/resource-shrinking } 

    Si no tiene que operar en esas cadenas, la mejor opción es moverse a strings.xml , pero eso le haría compartir toda la carpeta res entre los sabores. Si build.gradle estas cadenas basadas en alguna propiedad en build.gradle , entonces creo que no tienes suerte, por desgracia.

    EDIT: aclarar lo que quiero decir por operar arriba y añadir algunas opciones:

    Operando en esas cadenas me refiero a algún tipo de concatenación con un parámetro build, una lectura desde la línea de comandos o variable de entorno durante el proceso de compilación (por ejemplo, obtener el commit SHA1 para que sea más fácil rastrear errores más adelante). Si no es necesaria ninguna operación, strings.xml puede ser una opción. Pero cuando se sobrescribe una carpeta res para el sabor, todo se sobrescribe y que podría plantear un problema si varios sabores comparten la misma res excepto un número limitado de cadenas.

    Si cada APK tiene su propia configuración regional, entonces es sólo un resValue o buildConfigField en un sabor. Puede definir variables para facilitar la reutilización de valores. Algo como

     def myVar = "var" ... flavor1 { resValue "string", "my_res_string", "${myVar}" } flavor2 { resValue "string", "my_res_string", "${myVar}" } 

    Pero si se necesitan varios locales en el mismo APK y que será elegido en tiempo de ejecución por Android, la cadena debe estar en la carpeta correctos de values-<locale> .

    Usted está operando en diferentes niveles aquí, BuildConfig es un código, y como tal no está localizado, por eso tenemos advertencias de Lint para cadenas codificadas. La localización en Android se hace a través de <string recursos de <string , no hay manera de evitar que el sistema elija el idioma en tiempo de ejecución dependiendo de la configuración del usuario. Hay muchas maneras de tener recursos: carpeta values , resValue en build.gradle y recursos generados.

    Usted debe buscar en el proyecto buildSrc en Gradle , por ejemplo, lo uso para generar inserciones de SQL de src/main/values/stuff.xml . Aquí hay un código para empezar.

    BuildSrc / build.gradle

     // To enable developing buildSrc in IDEA import buildSrc/build.gradle as a separate project // Create a settings.gradle in buildSrc as well to prevent importing as subproject apply plugin: 'groovy' repositories { jcenter() } dependencies { compile localGroovy() compile gradleApi() testCompile 'junit:junit:4.12' } 

    BuildSrc / src / main / groovy / Plugin.groovy

     import org.gradle.api.* /** * Use it as * <code> * apply plugin: MyPlugin * myEntities { * categories { * input = file(path to Android res xml with Strings) * output = file(path to asset SQL file) * conversion = "structure|SQL" * } * } * </code> */ class MyPlugin implements Plugin<Project> { void apply(Project project) { def entities = project.container(MyEntity) // this gives the name for the block in build.gradle project.extensions.myEntities = entities def allTasks = project.task('generateYourStuff') def allTasksClean = project.task('cleanGenerateYourStuff') project.afterEvaluate { entities.all { entity -> //println "Creating task for ${entity.name} (${entity.input} --${entity.conversion}--> ${entity.output})" def task = project.task(type: GenerateTask, "generateYourStuff${entity.name.capitalize()}") { input = entity.input output = entity.output conversion = entity.conversion } allTasks.dependsOn task // clean task is automagically generated for every task that has output allTasksClean.dependsOn "clean${task.name.capitalize()}" } } } } class MyEntity { def input def output String conversion final String name MyEntity(String name) { this.name = name } } 

    BuildSrc / src / main / groovy / GenerateTask.groovy

     import net.twisterrob.inventory.database.* import org.gradle.api.DefaultTask import org.gradle.api.tasks.* class GenerateTask extends DefaultTask { @InputFile File input @OutputFile File output @Optional @Input String conversion @TaskAction void generate() { input.withReader { reader -> // you may need to treat output as a folder output.parentFile.mkdirs() output.withWriter { writer -> // custom transformation here read from reader, write to writer } } } } 

    Esto es sólo el esqueleto que puede ir salvaje y hacer cualquier cosa desde aquí: por ejemplo, recuperar un CSV a través de la red y difundir el contenido en la variant*/res/values-*/gen.xml archivos variant*/res/values-*/gen.xml .

    Puede ejecutarlo manualmente cuando lo necesite o ejecutarlo en el punto correcto del ciclo de vida de la compilación (en build.gradle :

     android.applicationVariants.all { com.android.build.gradle.api.ApplicationVariant variant -> variant.mergeAssets.dependsOn tasks.generateYourStuff } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.