O texto na Unreal Engine (UE) é o principal componente para localização. É uma string especializada, representada pelo tipo "FText" em C++. Deve ser usada quando você tiver um texto voltado para o usuário e que precisa ser localizado.
Internamente, o "FText" é implementado como um "TSharedRef" para um "ITextData". Isso facilita muito o processo de cópia, e o utilitário "FTextSnapshot" fornece uma maneira eficiente de detectar se um valor de "FText" em cache foi alterado.
Os dados contidos nas instâncias de "FText" variam dependendo de como o "FText" foi criado. Essa variação é processada pelo "histórico de texto" interno ("FTextHistory"). Os históricos de texto permitem a reconstrução de texto com correção de cultura e também são o componente principal para fazer o seguinte:
-
Trocar de cultura em tempo real.
-
Enviar "FText" pela rede.
-
Criar fontes invariáveis de cultura.
A conversão de "FText" para "FString" geralmente é uma operação com perdas, pois perde o histórico de texto. Isso só deve ser feito se você não precisar mais dos dados de localização. Por exemplo, se houver uma API de nível inferior que funciona em strings, que é gerenciada por uma API de nível superior que monitora alterações de texto (como "STextBlock"). Essa conversão também pode ser usada ao passar os dados para uma API externa que só aceita strings.
Se precisar de um texto não localizável (como converter o nome de um jogador de uma API externa em algo que possa ser exibido na IU), use "FText::AsCultureInvariant", que produz uma instância de "FText" sem dados de localização (e que não podem ser localizados). A macro "INVTEXT" pode fazer o mesmo para strings literais.
Literais de texto
O texto localizável é formado por três componentes: um Namespace, um Key (que forma a identidade) e um Source String (que é a base do que é traduzido e atua como validação em traduções "obsoletas"). A maneira mais comum de criar um texto localizável na UE é usando um literal de texto.
Como criar literais de texto em C++
É possível criar literais de texto em C++ usando a família de macros "LOCTEXT".
Macros de texto literal
| Macro | Descrição |
|---|---|
| NSLOCTEXT | Cria um texto localizado definindo o namespace, a key e a source string. |
| LOCTEXT | Cria um texto localizado definindo a key e a source string, com o namespace sendo definido com "LOCTEXT_NAMESPACE". |
Exemplo:
// Define o namespace a ser usado com LOCTEXT
// Isso só é válido em um único arquivo e deve tornar-se indefinido antes do fim do arquivo
#define LOCTEXT_NAMESPACE "MyNamespace"
// Crie literais de texto
constFTextHelloWorld= NSLOCTEXT("MyOtherNamespace","HelloWorld","Olá, mundo!")
constFTextGoodbyeWorld= LOCTEXT("GoodbyeWorld","Adeus, mundo!")
// Torne indefinido o namespace antes do fim do arquivo
#undef LOCTEXT_NAMESPACE
Como criar literais de texto em arquivos .ini
É possível criar literais de texto em arquivos .ini usando a sintaxe de macro "NSLOCTEXT" (https://api.unrealengine.com/INT/API/Runtime/Engine/NSLOCTEXT/129/index.html)
Como criar literais de texto em ativos
É possível criar literais de texto usando propriedades de "FText". Uma key é gerada automaticamente, mas você pode definir um namespace ou key personalizada para o texto usando o combo avançado ao lado do campo de texto. Também não há problema em usar o namespace ou a key padrão.
Formatação de texto
A formatação de texto fornece uma forma de combinar texto de uma maneira mais fácil de localizar, usando um padrão de formato localizável que injeta texto real para substituir espaços reservados de formato.
Os placeholders de formato estão contidos em um par de chaves e podem ser números (para formatação baseada em índice) ou strings (para formatação baseada em nome). Por exemplo:
"Você tem {0} de vida restantes." "Você tem {CurrentHealth} pontos de vida restantes."
Os placeholders de formato também podem especificar uma função (chamada de "modificador de argumento") a ser executada nos dados de argumento. Elas são especificadas como um canal seguido pelo nome da função e argumentos. Por exemplo:
"{NumCats} {NumCats}|plural(one=cat,other=cats)"
Você pode usar o caractere crase (\’) para ignorar chaves e barras verticais e evitar tratá-las como marcações de formatação. Você também pode usar crase para produzir um caractere literal.
Exemplo: A tabela a seguir presume que o valor de "Res" é um integer com valor 10.
| Entrada | Resultado do texto formatado |
|---|---|
|
|
|
|
Formatação de texto em C++
A formatação de texto em C++ é feita pela família de funções ["FText::Format"] (https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FText/Format/1/index.html) Cada função usa um padrão "FTextFormat", que será construído implicitamente a partir de uma instância de "FText", seguido por argumentos adicionais, conforme definido na tabela a seguir.
| Argumento | Tipo de formatação | Descrição |
|---|---|---|
| FText::Format | Formatação geral de texto. | Aceita argumentos baseados em índice (usando "FFormatOrderedArguments" ou argumentos variados), ou argumentos baseados em nomes (usando "FFormatNamedArguments"). |
| FText::FormatOrdered | Formatação baseada em índice variável. | Aceita qualquer argumento a partir do qual FFormatArgumentValue possa ser construído. |
| FText::FormatNamed | Formatação variável baseada em nome. | Aceita nomes consecutivos (algo a partir do qual "FString" possa ser construído) e argumentos de valor (algo a partir do qual "FFormatArgumentValue" possa ser construído). |
Você deve considerar pré-compilar os padrões de formato que você usa com frequência em um "FTextFormat" para melhorar o desempenho de formatação. O padrão compilado será recompilado automaticamente se a cultura ativa mudar.
Formatação de texto em Blueprints
A formatação de texto em Blueprints é feita pelo nó Format Text. Esse nó pode receber um padrão de formato literal, ou ter o padrão vinculado a outro pin de texto.
-
Quando um padrão de formato literal for especificado, os pins de argumento de formato serão gerados automaticamente.

-
Quando o padrão de formato está vinculado a outro pin de texto, você deve especificar manualmente os argumentos para o formato usando o painel Details do nó.

Modificadores de argumento
Os modificadores de argumento fornecem uma maneira de pré-processar um argumento antes que ele seja adicionado à string formatada. Os modificadores de argumento são extensíveis. Você cria um modificador de argumento implementando a interface "ITextFormatArgumentModifier" e registrando uma função de fábrica para uma determinada palavra-chave (confira "FTextFormatter::RegisterTextArgumentModifier").
A UE fornece alguns modificadores de argumento por padrão: há modificadores para pluralidade, gênero e pós-posições Hangul.
Formas de plurais
As formas de plurais permitem usar textos diferentes com base em uma variável numérica específica do formato de texto. As formas de plurais podem ser cardinais (como "Há 1 gato" ou "Há 4 gatos") ou ordinais (como "Você terminou em primeiro lugar!" ou "Você terminou em segundo!"). Formas de plurais são especificadas como pares de valor-chave e são compatíveis com qualquer uma das seguintes palavras-chave (conforme definido para sua cultura pelos dados de CLDR): zero, um, dois, poucos, muitos, outro. Valores são uma string opcional com aspas que também pode conter marcadores de formato.
Exemplo de formato cardinal:
"{NumCats}|plural(one=Existe,other=Existem) {NumCats} {NumCats}|plural(one=gato,other=gatos)"
Exemplo de formato ordinal:
"Você ficou em {Place}{Place}|ordinal(one=º,two=º,few=º,other=º)!"
Formas de gênero
As formas de gênero permitem usar textos diferentes baseados em um valor "ETextGender" dado ao seu formato de texto, como "Le guerrier est fort" ou "La guerriére est forte". Formas de gênero são especificadas como uma lista de valores da ordem de [masculino, feminino, neutro], em que neutro é opcional. Valores são uma string opcional que também pode conter marcadores de formato.
Exemplo de formato:
"{Gender}|gender(Le,La) {Gender}|gender(guerrier,guerrière) est {Gender}|gender(fort,forte)"
Pós-posições de Hangul
As pós-posições do Hangul ajudam a seguir as regras gramaticais presentes em coreano e inserem os glifos corretos com base no fato de o valor inserido terminar em uma consoante ou uma vogal, como "사람은" ou "사자는". As pós-posições do Hangul são especificadas como uma lista de valores na ordem de [consoante, vogal]. Os valores são uma string entre aspas opcional.
Exemplo de formato:
"{Arg}|hpp(은,는)"
Práticas recomendadas para formatação de texto
-
Ao injetar um número que afeta a frase, lide com essas variações usando os modificadores de argumento das formas plurais em vez de ramificar no código. Quando você usa formas plurais, a frase é traduzida corretamente para idiomas que não compartilham as regras de plurais do idioma de origem.
-
Ao injetar um nome pessoal, certifique-se de incluir um argumento para o gênero da pessoa. Isso é importante em idiomas com regras gramaticais de gênero, pois permite que os tradutores mudem a tradução com base no gênero (consulte Formas de gênero).
-
Evite injetar nomes para objetos (como "mesa", "porta" ou "cadeira") ou esteja preparado para torná-los localizáveis. Esses nomes podem ter um gênero em um idioma e um gênero diferente em outro. Isso impossibilita a localização precisa da string de padrão de formato sem metadados por cultura. O ideal é incluir frases completas em vez de apenas o nome. Isso garantirá traduções precisas.
Versões futuras da UE podem incluir uma função para que tradutores usem metadados para marcar textos que representam nomes, que eles possam ramificar posteriormente em padrões de formato para produzir traduções precisas.
-
Evite concatenar frases parciais. Isso pode causar problemas, pois é possível que cada cláusula ou parte seja traduzida corretamente e a tradução do todo esteja incorreta. É melhor reescrever o texto em frases completas, para garantir uma tradução correta.
Geração de texto
A geração de texto usa dados de internacionalização para produzir texto com correção de cultura que não depende da localização direta. Há três tipos de geração de texto: numérica, cronológica e transformativa.
Geração de texto numérica
A geração numérica é usada para converter tipos numéricos em uma representação de texto legível para humanos. As regras exatas para isso são específicas da cultura e também podem ser ajustadas a cada geração se um controle mais específico for necessário.
Por exemplo, nas regras de geração padrão, o número float "1234.5" seria gerado como "1.234,5". em inglês, "1 234,5" em francês e "١٬٢٣٤٫٥" em árabe.
Geração numérica em C++
A geração numérica em C++ é processada pelas funções a seguir.
| Função | Descrição |
|---|---|
| FText::AsNumber | Converte qualquer tipo numérico suportado pela UE em uma representação de texto fácil de usar ("1234.5" passa a ser "1.234,5"). |
| FText::AsPercent | Converte um float ou double em uma representação de texto de porcentagem ("0.2" passa a ser 20%). |
| FText::AsMemory | Converte um valor (em bytes) em uma representação de memória fácil de usar ("1234" se torna "1.2 KiB"). |
| FText::AsCurrencyBase | Converte um valor na representação-base de uma moeda em uma representação de moeda fácil de usar ("1234.50" para "USD" passa a ser "$1.234,50"). |
A maioria das funções na tabela usa uma "FNumberFormattingOptions" opcional para controlar a saída (o padrão é obtido na localidade ativa) e uma cultura opcional (o padrão é a localidade ativa).
Geração numérica em Blueprints
A geração numérica em Blueprints é processada pelos nós a seguir.
| Nós | Descrição |
|---|---|
| ToText (byte), ToText (integer), ToText (float) | Converte os tipos numéricos suportados em uma representação de texto fácil de usar ("1234.5" passa a ser "1.234,5"). |
| AsPercent | Converte um float ou double em uma representação de texto de porcentagem ("0.2" passa a ser 20%). |
| AsCurrency | Converte um valor na representação-base de uma moeda em uma representação de moeda fácil de usar ("1234.50" para "USD" passa a ser "$1.234,50"). |
A maioria dos nós na tabela usa argumentos avançados para controlar a saída.
Cronológica
A geração cronológica é usada para converter tipos de data e hora em uma representação de texto legível para humanos. As regras exatas para isso são específicas da cultura, e o estilo de data/hora pode ser ajustado por geração se um controle mais específico for necessário.
De acordo com as regras de geração padrão, uma data que representasse o 22º dia do 5º mês do ano de 1998 geraria "May 22, 1998" em inglês (Estados Unidos), "22 May 1998" em inglês (Reino Unido), "22 mai 1998" em francês e "٢٢/٠٥/١٩٩٨" em árabe.
Geração cronológica em C++
A geração cronológica em C++ é processada pelas funções a seguir.
| Função | Descrição |
|---|---|
| FText::AsDate | Converte um valor "FDateTime" em uma representação de data fácil de usar. |
| FText::AsTime | Converte um valor "FDateTime" em uma representação de tempo fácil de usar. |
| FText::AsDateTime | Converte um valor "FDateTime" em uma representação fácil de data e hora. |
| FText::AsTimespan | Converte um valor "FTimespan" em uma representação de tempo delta fácil de usar (em horas, minutos e segundos). |
A maioria das opções acima usa "EDateTimeStyle" para controlar a saída (o padrão é obtido na localidade ativa, mas pode ser definido como "short", "medium", "long" ou "full").
A geração de tempo espera receber um horário baseado em UTC por padrão (que será convertido no fuso horário local). Se a hora específica não for baseada em UTC (como se já estivesse na hora local), passe "FText::GetInvariantTimeZone() como o argumento do fuso horário.
Geração cronológica em Blueprints
A geração cronológica em Blueprints é processada pelos nós a seguir.
| Nós | Descrição |
|---|---|
| AsDate | Converte um valor "DateTime" não baseado em UTC em uma representação de data fácil de usar como está (sem ajustar ao fuso horário local). |
| AsDate (from UTC) | Converte um valor "DateTime" baseado em UTC em uma representação de data fácil de usar (ajustando-se ao fuso horário local). |
| AsTime | Converte um valor "DateTime" não baseado em UTC em uma representação de hora fácil de usar (sem ajustar ao fuso horário local). |
| AsTime (from UTC) | Converte um valor "DateTime" baseado em UTC em uma representação de hora fácil de usar (ajustando-se ao fuso horário local). |
| AsDateTime | Converte um valor "DateTime" não baseado em UTC em uma representação de data e hora fácil de usar (sem ajustar-se ao fuso horário local). |
| AsDateTime (from UTC) | Converte um valor "DateTime" baseado em UTC em uma representação de data e hora fácil de usar (ajustando-se ao fuso horário local). |
| AsTimespan | Converte um valor "Timespan" em uma representação de tempo delta fácil de usar (em horas, minutos e segundos). |
Transformativa
A geração transformativa é usada para converter um texto em uma representação diferente de si. Por exemplo, você pode converter texto em minúsculas em maiúsculas ou converter texto em maiúsculas em minúsculas.
Geração transformativa em C++
A geração transformativa em C++ é processada pelas funções a seguir.
| Função | Descrição |
|---|---|
| FText::ToLower | Converte uma instância de "FText" em sua forma com letras minúsculas compatível com Unicode. |
| FText::ToUpper | Converte uma instância de "FText" em sua forma com letras maiúsculas compatível com Unicode. |
Geração transformativa em Blueprints
A geração transformativa em Blueprints é processada pelos nós a seguir.
| Nó | Descrição |
|---|---|
| Text to Lower | Converte uma instância de "Text" em sua forma com letras minúsculas compatível com Unicode. |
| Text to Upper | Converte uma instância de "Text" em sua forma com letras maiúsculas compatível com Unicode. |
Tabelas de strings
As tabelas de strings fornecem uma maneira de centralizar o texto localizado em um (ou vários) locais conhecidos e, em seguida, referência as entradas em uma tabela de strings de outros ativos ou código de forma robusta que permite a reutilização fácil de tabelas de strings localizadas de texto.
As tabelas de string podem ser definidas em C++, carregadas usando um arquivo CSV ou criadas como um ativo. Confira a página Tabelas de string para obter mais informações.
Empacotamento de valor de texto
Os valores de texto podem ser empacotados como strings sem perdas (usando "FTextStringHelper" ou o "ImportText" e as funções "ExportText" de "UTextProperty").
Os seguintes formatos são suportados:
| Texto literal | Descrição |
|---|---|
| "NSLOCTEXT" | Um literal de texto que especifica o namespace, a key e a string de origem. |
| "LOCTEXT" | Um literal de texto que especifica a key e a string de origem. |
| "LOCtable" | Uma referência de tabela de string. |
| "INVTEXT" | Um texto invariável em relação à cultura (consulte "FText::AsCultureInvariant"). |
| "LOCGEN_NUMBER" | Um texto gerado a partir de um número (consulte "FText::AsNumber"). |
| "LOCGEN_NUMBER_GROUPED" | Um texto gerado a partir de um número com o agrupamento habilitado (consulte "FText::AsNumber" e "FNumberFormattingOptions::DefaultWithGrouping"). |
| "LOCGEN_NUMBER_UNGROUPED" | Um trecho de texto gerado a partir de um número com agrupamento desabilitado (consulte "FText::AsNumber" e "FNumberFormattingOptions::DefaultNoGrouping"). |
| "LOCGEN_NUMBER_CUSTOM" | Um trecho de texto gerado a partir de um número com opções de formatação personalizada (confira "FText::AsNumber" e "FNumberFormattingOptions"). |
| "LOCGEN_PERCENT" | Um texto gerado a partir de um número em forma de porcentagem (consulte "FText::AsPercent"). |
| "LOCGEN_PERCENT_GROUPED" | Um texto gerado a partir de um número como uma porcentagem com o agrupamento habilitado (consulte "FText::AsPercent" e "FNumberFormattingOptions::DefaultWithGrouping"). |
| "LOCGEN_PERCENT_UNGROUPED" | Um texto gerado a partir de um número como uma porcentagem com o agrupamento desabilitado (consulte "FText::AsPercent" e "FNumberFormattingOptions::DefaultNoGrouping"). |
| "LOCGEN_PERCENT_CUSTOM" | Um texto gerado a partir de um número como uma porcentagem com opções de formatação personalizadas (confira "FText::AsPercent" e "FNumberFormattingOptions"). |
| "LOCGEN_CURRENCY" | Um texto gerado a partir de um número como uma moeda (consulte "FText::AsCurrencyBase"). |
| "LOCGEN_DATE_UTC" | Um texto gerado a partir de uma data UTC ajustada ao fuso horário local ou especificado (consulte "FText::AsDate"). |
| "LOCGEN_DATE_LOCAL" | Um texto gerado a partir de uma data diferente de UTC sem ajuste de fuso horário (consulte "FText::AsDate"). |
| "LOCGEN_TIME_UTC" | Um texto gerado a partir de uma hora UTC ajustada ao fuso horário local ou especificado (consulte "FText::AsTime"). |
| "LOCGEN_TIME_LOCAL" | Um texto gerado a partir de uma hora diferente de UTC sem ajuste de fuso horário (consulte "FText::AsTime"). |
| "LOCGEN_DATETIME_UTC" | Um texto gerado a partir de uma data e hora UTC ajustadas ao fuso horário local ou especificado (consulte "FText::AsDateTime"). |
| "LOCGEN_DATETIME_LOCAL" | Um texto gerado a partir de uma data e hora diferente de UTC sem ajuste de fuso horário (consulte "FText::AsDateTime"). |
| "LOCGEN_TOLOWER" | Um trecho de texto convertido em minúsculas de acordo com Unicode (consulte "FText::ToLower"). |
| "LOCGEN_TOUPPER" | Um trecho de texto convertido em maiúsculas de forma compatível com Unicode (confira "FText::ToUpper"). |
| "LOCGEN_FORMAT_ORDERED" | Um texto gerado a partir de um padrão de formatação usando argumentos baseados em índice (consulte "FText::FormatOrdered"). |
| "LOCGEN_FORMAT_NAMED" | Um texto gerado a partir de um padrão de formatação usando argumentos baseados em nome (consulte "FText::FormatNamed"). |
Strings "brutas" também podem ser importadas, mas uma nova chave será gerada para cada importação. Isso produz chaves instáveis para a localização.
Tabelas de dados
Uma causa comum de chaves com localização instáveis é a importação iterativa de strings brutas de um arquivo CSV para uma Data Table, pois isso gera a geração de uma nova chave após cada importação. Uma solução para isso é atribuir uma chave determinística ao texto importado após a importação, substituindo a função "OnPostDataImport" na estrutura de linha e chamando "FText::ChangeKey" para atribuir a nova chave.
Em geral, usamos o nome da tabela de dados como o namespace e uma combinação do nome da linha e do nome da propriedade como a chave. Por exemplo:
voidFMyTableRow::OnPostDataImport(constUDataTable*InDataTable,constFNameInRowName,TArray&OutCollectedImportProblems)
{
#if WITH_EDITOR
MyTextProperty = FText::ChangeKey(
InDataTable->GetName(),
FString::Printf(TEXT("%s_%s"),*InRowName.ToString(), GET_MEMBER_NAME_STRING_CHECKED(FMyTableRow,MyTextProperty)),
MyTextProperty
);
#endif// WITH_EDITOR
}
A partir da versão 4.22, as chaves determinísticas já são aplicadas a strings brutas importadas para uma tabela de dados. No entanto, você ainda pode substituir "OnPostDataImport" se precisar de um comportamento de keying personalizado.
Dados poliglotas
Os dados poliglotas permitem que novos dados de localização sejam adicionados em tempo de execução, seja para fazer a interface com um sistema externo ou para permitir a localização com hotfixing sem criar novos arquivos "LocRes".
Dados poliglotas são formados por: um namespace e uma key (identidade); uma string nativa; a categoria do texto (como jogo, engine, editor) que controlará quando os dados poliglotas serão usados; uma cultura nativa opcional (que retorna para a cultura nativa da categoria se não for definida); e uma série de traduções por cultura.
Se quiser usar dados poliglotas para substituir uma tradução existente, verifique se o namespace, a key e a string nativa dos dados poliglotas correspondem ao texto de origem que você pretende substituir.
Dados poliglotas em C++
Dados poliglotas em C++ são representados pelo tipo "FPolyglotTextData" e podem ser usados diretamente (com "FPolyglotTextData::GetText" para resolver os dados poliglotas em uma instância de texto), ou serem passados para o nó "FTextLocalizationManager::RegisterPolyglotTextData" (para corrigir entradas de texto existentes).
Dados poliglotas em Blueprints
Dados poliglotas em Blueprints são representados pelo tipo Polyglot Text Data e podem ser usados com a função Polyglot Data to Text para transformar os dados poliglotas em uma instância de texto.
Fontes de textos localizados
As fontes de texto localizados são a principal forma usada pelo gerenciador de localização de texto da UE para descobrir e processar dados de texto localizados. A UE fornece dois desses por padrão: "FLocalizationResourceTextSource" (que hospeda o suporte "LocRes") e "FPolyglotTextSource" (que hospeda o suporte a dados poliglotas).
Fontes de texto localizados podem fornecer uma maneira de interagir com um sistema externo e podem ser adicionadas a cada projeto. Para isso, crie e registre um tipo derivado de "ILocalizedTextSource".