es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo controlar la navegación por medio del recurso de string predeterminado en RecyclerView?

He completado con éxito una navegación en RecyclerViewAdapter para navegar por muchos destinos mediante recursos de string. Debido a que tengo muchas listas y cada TextView está en un fragmento separado.

Es maravilloso hacerlo. Pero tengo un pequeño problema. Es que tengo 2 recursos de string, “en” en inglés como predeterminado y “ar” como segundo idioma.

Mi aplicación funciona bien cuando la uso en localización en inglés. Pero se bloquea cuando la uso en localización en árabe.

Lo que quiero es:

Controlar o forzar a que la aplicación, al convertirse en árabe, siga utilizando el recurso predeterminado en inglés.


Aquí está el bloque de código RecyclerViewAdapter:

override fun onBindViewHolder(holder: SubSectionListHolder, position: Int) {
    val item = dataset[position]
    holder.subSectionView.text = context.resources.getString(item.subSectionSrcID)
    holder.subSectionView.setOnClickListener {
        val stringConvertToId = it.resources.getIdentifier(
            context.resources.getString(item.subSectionSrcID).replace("\\s".toRegex(), ""),
            "id",
            context.packageName)
        it.findNavController().navigate(stringConvertToId)
    }
}

Aquí hay un ejemplo de la etiqueta navGraph:

<fragment
    android:id="@+id/CreateOrder"
    android:name=".PoCreateOrderFragment"
    android:label="@string/btnStr_crtOrder"
    tools:layout="@layout/fragment_po_create_order">
</fragment>

<fragment
    android:id="@+id/ReceivedPreOrders"
    android:name=".PoRcOrdersFragment"
    android:label="@string/str_whPo_rcvdPrm"
    tools:layout="@layout/fragment_po_rc_orders">
</fragment>

<fragment
    android:id="@+id/DeferredPreOrders"
    android:name=".PoDfOrdersFragment"
    android:label="@string/str_whPo_dfrdPrm"
    tools:layout="@layout/fragment_po_df_orders">
</fragment>

Aquí hay un ejemplo de la etiqueta de recurso de string predeterminada:

<string name="btnStr_crtOrder">Crear pedido</string>
<string name="str_whPo_rcvdPrm">Pedidos recibidos</string>
<string name="str_whPo_dfrdPrm">Pedidos diferidos</string>

Aquí hay un ejemplo de la etiqueta de recurso de string en árabe:

<string name="btnStr_crtOrder">إنشاء طلب</string>
<string name="str_whPo_rcvdPrm">الطلبيات المستلمة</string>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema que está enfrentando es que cuando la aplicación se cambia al idioma árabe, intenta cargar la versión árabe de los recursos de cadena. Sin embargo, algunos de los recursos de cadena podrían faltar o no estar disponibles en árabe, lo que lleva a un fallo.

    Para resolver este problema y forzar a la aplicación a que use el recurso de cadena predeterminado en inglés, puede crear un nuevo archivo de recurso específicamente para el idioma árabe, que utilizará las cadenas en inglés como alternativa. Aquí están los pasos:

    1. Cree un nuevo archivo de recurso en el directorio res/values-ar/. Nómbrelo strings.xml. Este será el archivo de recurso para el idioma árabe.
    2. En el nuevo archivo de recurso, defina los recursos de cadena que desea usar en árabe. Para las cadenas que falten, puede hacer referencia a las cadenas en inglés utilizando el atributo “translatable”. Aquí hay un ejemplo:

      <resources>
         <string name="btnStr_crtOrder" translatable="false">إضافة طلب</string>
         <string name="str_whPo_rcvdPrm" translatable="false">الطلبيات المستلمة</string>
         <string name="str_whPo_dfrdPrm" translatable="false">الطلبيات المؤجلة</string>
      </resources>
      

      El atributo “translatable = false” evita que la cadena se traduzca, por lo que siempre se usará la versión en inglés.

    3. Finalmente, en el método onBindViewHolder de su RecyclerViewAdapter, modifique la línea que obtiene el ID del recurso de cadena para utilizar el contexto del idioma inglés. Aquí está el código actualizado:

      val stringConvertToId = it.resources.getIdentifier(
         context.createConfigurationContext(Configuration().apply {
             setLocale(Locale.ENGLISH)
         }).resources.getString(item.subSectionSrcID).replace("\\s".toRegex(), ""),
         "id",
         context.packageName
      )
      

      Este código crea un nuevo contexto con la configuración de idioma inglés y lo utiliza para obtener el ID del recurso de cadena. La parte replace ("\\ s". ToRegex(), "") elimina cualquier carácter de espacio en blanco de la cadena antes de usarlo como ID de recurso.

    Con estos cambios, su aplicación siempre debería utilizar los recursos de cadena en inglés, incluso al utilizar el idioma árabe.

Comments are closed.