Concordancia de género
Algunos idiomas flexionan verbos y adjetivos según el género de la persona de la que trata una oración. En inglés casi nunca ocurre, así que una frase que escribes como {username} has been invited es una sola oración en inglés y dos o tres en español, francés o ruso. Langsys se encarga de eso durante la traducción, de la misma forma en que genera las formas plurales, y tú pasas un solo argumento.
Qué produce el pipeline
Cuando un idioma de destino requiere concordancia, Langsys reescribe la cadena de ese locale en las ramas que necesita: un select de ICU. Tu frase original nunca cambia y nunca tienes que escribir las ramas a mano.
// Your source phrase, unchanged:
"{username} has been invited"
// What the Spanish translation becomes — note invitado / invitada:
"{username_gender, select, male {{username} ha sido invitado} \
female {{username} ha sido invitada} \
other {{username} ha sido invitado/a}}" Dos consecuencias que vale la pena tener presentes. El argumento se nombra con la variable que flexiona más _gender al final: {username} te da username_gender, y las ramas son siempre male, female, other. Además, aparece solo en las configuraciones regionales que lo necesitan: esto pasa inadvertido hasta que alguien carga la app en un idioma con género.
Cómo pasarlo
Pasa el argumento siempre que lo conozcas, y el lector recibirá la oración con la flexión correcta:
// The argument is named after the variable it inflects, + _gender.
// Branches are always male / female / other.
t('{username} has been invited', 'Team', {
username: user.name,
username_gender: user.gender ?? 'other',
}); ¿No conoces el género? Pasa 'other' de forma explícita: es la rama neutra. Lo que se muestra cuando falta un argumento varía según el SDK; cada página de SDK lo indica. Además, cada página de SDK muestra la llamada con su propia sintaxis.
¿Qué frases la necesitan?
No se puede saber a partir de tu propio código, y es algo inherente: el argumento se agrega durante la traducción, para cada idioma de destino, por lo que nada en la frase original ni en tu código lo sugiere. Hay tres maneras de averiguarlo.
Lee el catálogo. Las traducciones que obtiene tu app son las cadenas promovidas, así que la respuesta ya está en el cliente. Descarga el catálogo de un idioma que admitas (todos los SDK lo exponen) y busca entradas que contengan , select,. Eso te da las frases exactas y los nombres de los argumentos, y es lo bastante económico como para ejecutarlo en CI con cada idioma que publiques.
// The catalog your app fetches IS the promoted strings — grep it.
const wanting = Object.entries(catalog)
.filter(([, translation]) => translation.includes(', select,'))
.map(([phrase]) => phrase);
// → every phrase (and, from the string, every argument) this locale needs Activa la depuración (SDK de JavaScript). Pasa debug: true en la configuración de inicialización y navega por la app en una configuración regional con género: el SDK registra una Langsys Warning por cada frase cuya traducción requiere un argumento que no proporcionaste, e indica el nombre del argumento. Se registra una vez por frase y por configuración regional, y no aparece en producción. Un detalle: dentro de los componentes de bloque de contenido y de frase, un _gender pasado por precaución se reporta como un parámetro sin coincidencia, porque esa verificación se ejecuta contra tu texto fuente, donde el select nunca aparece.
Ante la duda, pásalo. Un valor para un argumento que la cadena no tiene se ignora al renderizar, así que enviar _gender para cada variable que represente a una persona es seguro y cubre las configuraciones regionales que aún no has revisado.
Una variable por frase. Solo una variable puede determinar la concordancia. Una cadena donde lo hacen dos, una cantidad y un género, se deja sin cambios en lugar de convertirse en ICU anidado, por lo que se traduce como una sola oración plana.