← Conceitos

Concordância de gênero

Alguns idiomas flexionam verbos e adjetivos de acordo com o gênero da pessoa de quem a frase fala. O inglês quase nunca faz isso, então uma frase escrita como {username} has been invited é uma só em inglês e duas ou três em espanhol, francês ou russo. O Langsys cuida disso durante a tradução — da mesma forma que gera as formas plurais — e você passa apenas um argumento.

Assistir · 0:39 Concordância de gênero

O que o pipeline produz

Quando um idioma de destino exige concordância, o Langsys reescreve a string dessa localidade nas ramificações necessárias, um select do ICU. Sua frase de origem nunca muda, e você nunca escreve as ramificações à mão.

Você nunca escreve isto — o pipeline escreve
// 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}}"

Duas consequências que vale a pena internalizar. O argumento recebe o nome da variável que ele flexiona, com _gender anexado — {username} resulta em username_gender — e as ramificações são sempre male, female, other. E ele aparece somente nos idiomas que precisam dele: isso passa despercebido até alguém carregar o app em um idioma com flexão de gênero.

Como passá-lo

Passe o argumento sempre que o souber, e o leitor recebe a frase com a flexão correta:

// 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',
});

Não sabe o gênero? Passe 'other' explicitamente — é o ramo neutro. O que um argumento ausente renderiza varia conforme o SDK; cada página de SDK explica. Cada página de SDK também mostra a chamada no seu próprio idioma de programação.

Quais frases precisam disso?

Você não consegue saber pelo seu próprio código, e isso é inerente: o argumento é adicionado durante a tradução, por idioma de destino, então nada na frase de origem nem na sua base de código indica isso. Há três maneiras de descobrir.

Leia o catálogo. As traduções que o seu app busca são as strings promovidas, então a resposta já está no cliente. Baixe o catálogo de um idioma que você suporta — todos os SDKs o expõem — e procure entradas que contenham , select,. Isso fornece as frases exatas e os nomes dos argumentos, e é leve o bastante para rodar no CI para cada idioma que você publica.

// 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

Ative o debug (SDKs JavaScript). Passe debug: true na configuração de inicialização e navegue pelo app em uma localidade com flexão de gênero: o SDK registra um Langsys Warning por frase cuja tradução espera um argumento que você não forneceu, indicando o nome do argumento. Isso acontece uma vez por frase por localidade e fica silencioso em produção. Um detalhe: dentro dos componentes de bloco de conteúdo e de frase, um _gender passado por precaução é reportado como parâmetro sem correspondência, porque essa verificação é feita sobre o seu texto de origem — onde o select nunca aparece.

Na dúvida, passe. Um valor para um argumento que a string não tem é ignorado na renderização, então enviar _gender para toda variável que representa uma pessoa é seguro e cobre as localidades que você ainda não analisou.

Uma variável por frase. Apenas uma variável pode determinar a concordância. Uma string em que duas atuam — uma quantidade e um gênero — fica inalterada em vez de virar ICU aninhado, e é traduzida como uma única frase simples.

Pesquisar na documentação e na Central de Aprendizado