Text in Unreal Engine (UE) ist die Hauptkomponente für die Lokalisierung. Es ist ein spezialisierter String, repräsentiert durch den Typ FText
in C++. Sie sollten diese Funktion verwenden, wenn Sie nutzerorientierten Text haben, der lokalisiert werden muss.
Intern ist FText
als [TSharedRef
] (https://api.unrealengine.com/INT/API/Runtime/Core/Templates/TSharedRef/index.html) zu [ITextData
] (https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/ITextData/index.html) implementiert. Das macht das Kopieren sehr billig, und das Hilfsmittel FTextSnapshot
bietet einen effizienten Weg, um zu erkennen, ob sich ein zwischengespeicherter FText
-Wert tatsächlich geändert hat.
Die in FText
-Instanzen enthaltenen Daten variieren, je nachdem, wie der FText
erstellt wurde. Diese Varianz wird vom internen „Textverlauf“ (FTextHistory
) verarbeitet. Textverläufe unterstützen die Sprachregion-korrekte Neuerstellung von Text und bilden zudem die Schlüsselkomponente für Folgendes:
-
Live-Sprachregionswechsel.
-
Senden von
FText
über das Netzwerk. -
Erstellung Sprachregion-invarianter Quellen.
Das Konvertieren von FText
zu FString
ist üblicherweise ein verlustbehafteter Vorgang, da der Textverlauf verloren geht. Das sollten Sie nur ausführen, wenn Sie die Lokalisierung nicht länger benötigen. Zum Beispiel, wenn es eine niedrigere API gibt, die mit Strings arbeitet, die von einer höheren API verwaltet wird, die Textänderungen überwacht (wie z. B. STextBlock
). Diese Konvertierung kann auch verwendet werden, wenn die Daten an eine externe API weitergegeben werden, die nur Strings akzeptiert.
Wenn Sie Text benötigen, der nicht lokalisierbar ist (z. B. die Konvertierung eines Spielernamens von einer externen API in etwas, das Sie in Ihrer Benutzeroberfläche anzeigen können), können Sie [FText::AsCultureInvariant
]https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FText/AsCultureInvariant/2/index.html) verwenden, das eine FText
-Instanz erzeugt, die keine Lokalisierungsdaten enthält (und nicht lokalisiert werden kann). Das Makro INVTtext
kann dasselbe mit Literal-Strings tun.
Textliterale
Lokalisierbarer Text besteht aus drei Komponenten: einem Namespace, einem Schlüssel (der seine Identität formt) und einem Quell-String (der die Grundlage für das bildet, was übersetzt wird und als Validierung gegen „abgelaufene“ Übersetzungen dient). Die gebräuchlichste Methode, lokalisierbaren Text in UE zu erstellen, ist die Verwendung eines Textliterals.
Erstellen von Textliteralen in C++
Textliterale können in C++ mit der Makro-Familie LOCTEXT
erstellt werden.
Textliteral-Makros
Makro | Beschreibung |
---|---|
NSLOCTTEXT | Erstellt einen lokalisierten Textabschnitt durch Definition von Namespace, Schlüssel und Quell-String. |
LOCTTEXT | Erstellt einen lokalisierten Text durch Definition des Schlüssels und des Quell-Strings, wobei der Namespace durch LOCTEXT_NAMESPACE definiert wird. |
Beispiel:
// Namespace definieren, der mit LOCTTEXT verwendet werden soll
// Dies ist nur innerhalb einer einzelnen Datei gültig und muss vor dem Ende der Datei undefiniert sein
#define LOCTEXT_NAMESPACE "MyNamespace"
// Textliterale erstellen
constFTextHelloWorld= NSLOCTEXT("MyOtherNamespace","HelloWorld","Hello World!")
constFTextGoodbyeWorld= LOCTEXT("GoodbyeWorld","Goodbye World!")
// Definition des Namespace vor dem Ende der Datei aufheben
#undef LOCTEXT_NAMESPACE
Erstellen von Textliteralen in INI-Dateien
Textliterale in INI-Dateien können mit der Makro-Syntax NSLOCTEXT
erstellt werden.
Erstellen von Textliteralen in Assets
Textliterale können mithilfe der FText
-Eigenschaften erstellt werden. Ein Schlüssel wird automatisch generiert, aber Sie können auch einen benutzerdefinierten Namespace oder Schlüssel für Ihren Text definieren, indem Sie das erweiterte Kombinationsfeld neben dem Textfeld verwenden. Es ist auch in Ordnung, den Standard-Namespace oder -Schlüssel zu verwenden.
Textformatierung
Die Textformatierung bietet eine Möglichkeit, Text auf eine Weise zu kombinieren, die sich leichter lokalisieren lässt, indem ein lokalisierbares Formatmuster verwendet wird, das echten Text einfügt und Formatplatzhalter ersetzt.
Formatplatzhalter werden in einem Paar geschweifter Klammern eingeschlossen und können Zahlen (für indexbasierte Formatierung) oder Strings (für namensbasierte Formatierung) sein. Zum Beispiel:
"Sie haben noch {0} Kondition."
"Sie haben noch {CurrentHealth} Kondition."
Formatplatzhalter können auch eine Funktion („Argument-Modifikator“ genannt) spezifizieren, die mit ihren Argumentdaten ausgeführt wird. Diese werden als Pipe spezifiziert, gefolgt von dem Funktionsnamen und den Argumenten. Zum Beispiel:
"{NumCats} {NumCats}|plural(one=Katze,other=Katzen)"
Sie können das Backtick (`)-Zeichen verwenden, um geschweifte Klammern und Pipelines zu maskieren und diese nicht als Formatierungsauszeichnung zu behandeln. Sie können auch den Backtick verwenden, um sich selbst zu maskieren und ein literales `-Zeichen zu erzeugen.
Beispiel:
Die folgende Tabelle nimmt an, dass der Wert von Res
eine Ganzzahl mit dem Wert 10 ist.
Input | Formatiertes Textergebnis |
---|---|
|
|
|
|
Textformatierung in C++
Die Textformatierung in C++ erfolgt über die FText::Format
-Familie von Funktionen. Jede Funktion nimmt ein FTextFormat
-Muster an, das implizit aus einer FText
-Instanz konstruiert wird, gefolgt von zusätzlichen Argumenten, die in folgender Tabelle definiert sind.
Argument | Formatierungstyp | Beschreibung |
---|---|---|
FText::Format | Allgemeine Textformatierung. | Akzeptiert entweder indexbasierte Argumente (mit FFormatOrderedArguments oder variadische Argumente), oder namensbasierte Argumente (mit FFormatNamedArguments ). |
FText::FormatOrdered | Variadische, indexbasierte Formatierung. | Akzeptiert alle Argumente, aus denen FFormatArgumentValue konstruiert werden kann. |
FText::FormatNamed | Variadische namensbasierte Formatierung. | Akzeptiert aufeinanderfolgende Namensargumente (alles, woraus FString konstruieren kann), dann den Wert (alles, woraus FFormatArgumentValue konstruieren kann). |
Sie sollten erwägen, häufig verwendete Formatmuster vorab in ein FTextFormat
zu kompilieren, um die Formatierungsperformance zu verbessern. Das kompilierte Muster wird automatisch neu kompiliert, wenn sich die aktive Sprachregion ändert.
Textformatierung in Blueprints
Die Textformatierung in Blueprints erfolgt über den Knoten Format Text. Dieser Knoten kann entweder ein Literal-Formatmuster annehmen oder das Muster kann mit einem anderen Text-Pin verknüpft sein.
-
Wenn ein Literal-Formatmuster angegeben wird, werden die Formatargument-Pins automatisch generiert.
-
Wenn das Formatmuster mit einem anderen Text-Pin verknüpft ist, müssen Sie die Argumente für das Format manuell über das Details-Panel des Knotens angeben.
Argument-Modifikatoren
Argument-Modifikatoren bieten eine Möglichkeit, ein Argument vorzuverarbeiten, bevor es dem formatierten String hinzugefügt wird. Argument-Modifikatoren sind erweiterbar. Sie erstellen einen Argument-Modifikator, indem Sie das Interface ITextFormatArgumentModifier
implementieren und eine Factory-Funktion für ein bestimmtes Stichwort registrieren (weitere Informationen finden Sie unter FTextFormatter::RegisterTextArgumentModifier
).
UE bietet standardmäßig einige Argument-Modifikatoren: es gibt Modifikatoren für Pluralität, Geschlecht und Hangul-Nachpositionen.
Pluralformen
Pluralformen erlauben es Ihnen, unterschiedlichen Text basierend auf einer numerischen Variable zu verwenden, die im Text festgelegt ist. Pluralformen können Kardinalformen sein (zum Beispiel „Es gibt 1 Katze“ oder „Es gibt 4 Katzen“) oder Ordinalformen (zum Beispiel „Sie haben den 1en Platz belegt!“ oder „Sie haben den 20sten Platz belegt!“). Pluralformen werden als Key-Wert-Paare spezifiziert und unterstützen jedes der folgenden Stichworte (wie für Ihre Sprachregion durch die CLDR-Daten definiert): null, eins, zwei, wenige, viele, andere. Werte sind ein optionaler String in Anführungszeichen, der auch Formatmarkierungen enthalten kann.
Beispiel für ein Kardinalformat:
"Dort {NumCats}|plural(one=ist,other=sind) {NumCats} {NumCats}|plural(one=Katze,other=Katzen)"
Beispiel für ein ordinales Format:
"Sie haben Platz {place} ereicht!"
Geschlechtsformen
Geschlechtsformen erlauben Ihnen die Nutzung verschiedener Texte basierend auf einem ETextGender
-Wert Ihres Texts, etwa „Le Guerrier est fort“ oder „La Guerrière est forte“. Geschlechtsformen werden als Liste von Werten in der Reihenfolge [männlich, weiblich, neutral]\ spezifiziert, wobei „neutral“ optional ist. Bei den Werten handelt es sich um eine optional in Anführungszeichen gesetzten String, der auch Formatmarkierungen enthalten kann.
Formatbeispiel:
"{Gender}|gender(Le,La) {Gender}|gender(guerrier,guerrière) est {Gender}|gender(fort,forte)"
Hangul-Nachpositionen
Hangul-Nachpositionen helfen Ihnen, die in der koreanischen Sprachregion verwendeten Grammatikregeln einzuhalten, und fügen die korrekten Glyphen ein, basierend darauf, ob der eingefügte Wert auf einen Konsonanten oder einen Vokal wie „사람은“ oder „사자는“ endet. Hangul-Nachpositionen werden als Liste von Werten in der Reihenfolge [Konsonant, Vokal] spezifiziert. Werte sind ein String mit optionalen Anführungszeichen.
Formatbeispiel:
"{Arg}|hpp(은,는)"
Best Practices für die Textformatierung
-
Wenn Sie eine Zahl einfügen, die sich auf den Satz auswirkt, behandeln Sie diese Abweichungen mit den Pluralformen der Argument-Modifikatoren, anstatt im Code zu verzweigen. Wenn Sie Pluralformen verwenden, wird der Satz in Sprachen, die die Pluralregeln Ihrer Ausgangssprache nicht kennen, korrekt übersetzt.
-
Stellen Sie beim Einfügen eines persönlichen Substantivs sicher, dass Sie ein Argument für das Geschlecht der Person angeben. Dies ist wichtig für Sprachen mit Grammatikregeln für das Geschlecht, da Ihre Übersetzer ihre Übersetzung basierend auf dem Geschlecht ändern können (weitere Informationen finden Sie unter Geschlechtsformen).
-
Vermeiden Sie das Einfügen von Substantiven für Objekte (wie „Tisch“, „Tür“ oder „Stuhl“) oder seien Sie darauf vorbereitet, diese lokalisierbar zu machen. Diese Substantive können in einer Sprache ein Geschlecht besitzen und in einer anderen Sprache ein anderes Geschlecht. Dies macht es unmöglich, den Formatmuster-String ohne Sprachregion-spezifische Metadaten genau zu lokalisieren. Idealerweise sollten Sie ganze Sätze verwenden, nicht nur das Substantiv. So stellen Sie präzise Übersetzungen sicher.
Zukünftige Versionen von UE könnten eine Funktion für Übersetzer beinhalten, mit der sie Metadaten verwenden können, um Text zu taggen, der Substantive darstellt, wobei sie später in Formatmustern verzweigen können, um korrekte Übersetzungen zu erstellen.
-
Vermeiden das Verketten von Teilsätzen. Dies kann zu Problemen führen, da es möglich ist, dass jeder Satz oder Teil korrekt übersetzt wird, aber die Übersetzung des Ganzen falsch sein kann. Es ist besser, den Text in ganze Sätze umzuschreiben, so können Sie eine korrekte Übersetzung sicherstellen.
Textgenerierung
Bei der Textgenerierung werden Internationalisierungsdaten verwendet, um Sprachregions-korrekten Text zu erstellen, der nicht auf direkter Lokalisierung beruht. Es gibt drei Arten der Textgenerierung: numerisch, chronologisch und transformativ.
Numerische Textgenerierung
Die numerische Generierung wird verwendet, um numerische Typen in eine Textdarstellung zu konvertieren, die für Menschen gut lesbar ist. Die genauen Regeln dafür sind Sprachregion-spezifisch und können auch für jede Generierung angepasst werden, wenn eine spezifischere Kontrolle erforderlich ist.
Als Beispiel würde nach den Standard-Generierungsregeln die Fließkommazahl „1234.5“ als „1,234.5“ In Englisch generiert, „1 234,5“ in Französisch und „١٬٢٣٤٫٥“ in Arabisch.
Numerische Generierung in C++
Die numerische Generierung in C++ wird von den folgenden Funktionen durchgeführt.
Funktion | Beschreibung |
---|---|
FText::AsNumber | Konvertiert jeden von UE unterstützten numerischen Typ in eine nutzerfreundliche Textdarstellung („1234,5“ wird zu „1.234,5“). |
FText::AsPercent | Konvertiert einen Float- oder Double-Wert in eine prozentuale Textdarstellung („0,2“ wird zu 20 %). |
FText::AsMemory | Konvertiert einen Wert (in Bytes) zu einer nutzerfreundlichen Speicherdarstellung („1234“ wird zu „1,2 KiB“). |
FText::AsCurrencyBase | Konvertiert einen Wert in der Basisdarstellung einer Währung in eine nutzerfreundliche Währung („1234,50“) für „USD“ wird zu „$1.234,50“). |
Die meisten Funktionen in der Tabelle benötigen eine optionale [FNumberFormattingOptions](https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FNumberFormattingOptions/index.html)
, um den Output zu steuern (standardmäßig wird das aktive Gebietsschema verwendet), sowie eine optionale Sprachregion (Standard ist das aktive Gebietsschema).
Numerische Generierung in Blueprints
Die numerische Generierung in Blueprints wird von den folgenden Knoten durchgeführt.
Knoten | Beschreibung |
---|---|
ToText (Byte), ToText (Ganzzahl), ToText (Float) | Konvertiert die unterstützten numerischen Typen in eine nutzerfreundliche Textdarstellung („1234,5“ wird zu „1.234,5“). |
AsPercent | Konvertiert einen Float- oder Double-Wert in eine prozentuale Textdarstellung („0,2“ wird zu 20 %). |
AsCurrency | Konvertiert einen Wert in der Basisdarstellung einer Währung in eine nutzerfreundliche Währung („1234,50“) für „USD“ wird zu „$1.234,50“). |
Die meisten Knoten in der Tabelle verwenden erweiterte Argumente, um den Output zu steuern.
Chronologisch
Die chronologische Generierung dient dazu, Datums- und Zeitangaben in einen Text zu konvertieren, der für Menschen leichter zu lesen ist. Die genauen Regeln dafür sind Sprachregion-spezifisch, und der Datums-/Zeitstil kann für jede Generierung angepasst werden, wenn eine spezifischere Kontrolle erforderlich ist.
Unter den Standard-Generierungsregeln würde ein Datum, das der 22. Tag des 5. Monats des Jahres 1998 darstellt, „May 22, 1998“ für Englisch (Vereinigte Staaten von Amerika), „22 May 1998“ für Englisch (Vereinigtes Königreich), „22 mai 1998“ für Französisch und "٢٢/٠٥/١٩٩٨" für Arabisch generieren.
Chronologische Generierung in C++
Die chronologische Generierung in C++ wird von den folgenden Funktionen durchgeführt.
Funktion | Beschreibung |
---|---|
FText::AsDate | Konvertiert einen FDateTime -Wert zu einer nutzerfreundlichen Datumsdarstellung. |
FText::AsTime | Konvertiert einen FDateTime -Wert zu einer nutzerfreundlichen Zeitdarstellung. |
FText::AsDateTime | Konvertiert einen FDateTime -Wert in eine nutzerfreundliche Darstellung von Datum und Zeit. |
FText::AsTimespan | Konvertiert einen FTimspan -Wert zu einer nutzerfreundlichen Delta-Zeitdarstellung (in Stunden, Minuten und Sekunden). |
Die meisten der oben genannten Methoden verwenden EDateTimeStyle
, um den Output zu steuern (der Standard wird vom aktiven Gebietsschema übernommen, kann jedoch auf „kurz“, „mittel“, „lang“ oder „voll“ eingestellt werden).
Die Zeitgenerierung erwartet, dass sie standardmäßig eine auf UTC-basierte Zeit erhält (die in die lokale Zeitzone konvertiert wird). Wenn die angegebene Zeit nicht auf UTC basiert (zum Beispiel, wenn sie bereits in einer lokalen Zeit vorliegt), dann sollten Sie [FText::GetInvariantTimeZone()](https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FText/GetInvariantTimeZone/index.html)
als Zeitzonen-Argument übergeben.
Chronologische Generierung in Blueprints
Die chronologische Generierung in Blueprints wird von den folgenden Knoten durchgeführt.
Knoten | Beschreibung |
---|---|
AsDate | Konvertiert einen nicht auf UTC basierenden „DateTime“-Wert unverändert in eine nutzerfreundliche Datumsdarstellung (ohne Anpassung an die lokale Zeitzone). |
AsDate (from UTC) | Konvertiert einen UTC-basierten „DateTime“-Wert in eine nutzerfreundliche Datumsdarstellung (unter Anpassung an die lokale Zeitzone). |
AsTime | Konvertiert einen UTC-basierten „DateTime“-Wert in eine nutzerfreundliche Zeitdarstellung (unter Anpassung an die lokale Zeitzone). |
AsTime (von UTC) | Konvertiert einen UTC-basierten „DateTime“-Wert in eine nutzerfreundliche Zeitdarstellung (unter Anpassung an die lokale Zeitzone). |
AsDateTime | Konvertiert einen UTC-basierten „DateTime“-Wert in eine nutzerfreundliche Datums- und Zeitdarstellung (unter Anpassung an die lokale Zeitzone). |
AsDateTime (von UTC) | Konvertiert einen UTC-basierten „DateTime“-Wert in eine nutzerfreundliche Datums- und Zeitdarstellung (unter Anpassung an die lokale Zeitzone). |
AsTimespan | Konvertiert einen „Timespan“-Wert in eine nutzerfreundliche Delta-Zeitdarstellung (in Stunden, Minuten und Sekunden). |
Transformativ
Die transformative Generierung dient dazu, Text in eine andere Darstellung seiner selbst zu konvertieren. Sie können beispielsweise Text in Kleinbuchstaben in Großbuchstaben oder Text in Großbuchstaben in Kleinbuchstaben konvertieren.
Transformative Generierung in C++
Die transformative Generierung in C++ wird von den folgenden Funktionen durchgeführt.
Funktion | Beschreibung |
---|---|
FText::ToLower | Konvertiert eine ‚FText‘-Instanz auf Unicode-konforme Weise in ihre Kleinbuchstabenform. |
FText::ToUpper | Konvertiert eine „FText“-Instanz auf Unicode-kompatible Weise in ihre Großbuchstabenform. |
Transformative Generierung in Blueprints
Die transformative Generierung in Blueprints wird von den folgenden Knoten durchgeführt.
Knoten | Beschreibung |
---|---|
Text to Lower | Konvertiert eine „Text“-Instanz auf Unicode-konforme Weise in ihre Kleinbuchstabenform. |
Text to Upper | Konvertiert eine „Text“-Instanz auf Unicode-konforme Weise in ihre Großbuchstabenform. |
Stringtabellen
Stringtabellen bieten eine Möglichkeit, Ihren lokalisierten Text an einem (oder mehreren) bekannten Speicherorten zu zentralisieren und dann die Einträge innerhalb einer Stringtabelle aus anderen Assets oder Codes auf robuste Weise zu referenzieren, was eine einfache Wiederverwendung des lokalisierten Textes erlaubt.
Stringtabellen können in C++ definiert, über eine CSV-Datei geladen oder als Asset erstellt werden. Weitere Informationen finden Sie auf der Seite Stringtabellen.
Textwert-Marshalling
Textwerte können verlustfrei als Strings arrangiert werden (mithilfe der Funktionen FTextStringHelper
, oder ImportText
und ExportText
von UTextProperty
).
Die folgenden Formate werden unterstützt:
Textliteral | Beschreibung |
---|---|
NSLOCTEXT |
Ein Textliteral, das den Namespace, Schlüssel und Quellstring angibt. |
LOCTEXT |
Ein Textliteral, das den Schlüssel und den Quellstring angibt. |
LOCTABLE |
Eine Stringtabellenreferenz. |
INVTTEXT |
Ein Sprachregion-invarianter Textabschnitt (weitere Informationen finden Sie unter FText::AsCultureInvariant ). |
LOCGEN_NUMBER |
Ein aus einer Zahl generierter Textabschnitt (weitere Informationen finden Sie unter FText::AsNumber . |
LOCGEN_NUMBER_GROUPED |
Ein aus einer Zahl generierter Textabschnitt mit aktivierter Gruppierung (weitere Informationen finden Sie unter FText::AsNumber und FNumberFormattingOptions::DefaultWithGrouping ). |
LOCGEN_NUMBER_UNGROUPED |
Ein aus einer Zahl generierter Textabschnitt mit deaktivierter Gruppierung (weitere Informationen finden Sie unter FText::AsNumber und [FNumberFormattingOptions::DefaultNoGrouping ]https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FNumberFormattingOptions/DefaultNoGrouping/index.html)). |
LOCGEN_NUMBER_CUSTOM |
Ein aus einer Zahl generierter Textabschnitt mit benutzerdefinierten Formatierungsoptionen (weitere Informationen finden Sie unter FText::AsNumber und FNumberFormattingOptions ). |
LOCGEN_PERCENT |
Ein aus einer Zahl generierter Textabschnitt als Prozentsatz (weitere Informationen finden Sie unter FText::AsPercent ). |
LOCGEN_PERCENT_GROUPED |
Ein aus einer Zahl generierter Textabschnitt als Prozentsatz mit aktivierter Gruppierung (weitere Informationen finden Sie unter FText::AsPercent und FNumberFormattingOptions::DefaultWithGrouping ). |
LOCGEN_PERCENT_UNGROUPED |
Ein aus einer Zahl generierter Textabschnitt als Prozentwert mit deaktivierter Gruppierung (weitere Informationen finden Sie unter FText::AsPercent und FNumberFormattingOptions::DefaultNoGrouping ). |
LOCGEN_PERCENT_CUSTOM ] |
Ein aus einer Zahl generierter Textabschnitt als Prozentwert mit benutzerdefiniert Formatierungsoptionen (weitere Informationen finden Sie unter FText::AsPercent und FNumberFormattingOptions ). |
LOCGEN_CURRENCY |
Ein aus einer Zahl generierter Textabschnitt als Währung (weitere Informationen finden Sie unter FText::AsCurrencyBase ). |
LOCGEN_DATE_UTC |
Ein Textabschnitt, der aus einem UTC-Datum generiert wird, das an die angegebene oder lokale Zeitzone angepasst ist (weitere Informationen finden Sie unter FText::AsDate ). |
LOCGEN_DATE_LOCAL |
Ein Textabschnitt, der aus einem Nicht-UTC-Datum ohne Zeitzonenanpassung generiert wird (weitere Informationen finden Sie unter FText::AsDate ). |
LOCGEN_TIME_UTC |
Ein Textabschnitt, der aus einer UTC-Zeit generiert wird, die an die angegebene oder lokale Zeitzone angepasst ist (weitere Informationen finden Sie unter FText::AsTime ). |
LOCGEN_TIME_LOCAL |
Ein Textabschnitt, der aus einer anderen Zeit als UTC ohne Zeitzonenanpassung generiert wurde (weitere Informationen finden Sie unter FText::AsTime ). |
LOCGEN_DATETIME_UTC |
Ein Textabschnitt, der aus einem UTC-Datum und einer UTC-Zeit generiert wird, angepasst an die angegebene oder lokale Zeitzone (weitere Informationen finden Sie unter FText::AsDateTime ). |
LOCGEN_DATETIME_LOCAL |
Ein Textabschnitt, der aus einem Nicht-UTC-Datum und einer Nicht-UTC-Zeit ohne Zeitzonenanpassung generiert wurde (weitere Informationen finden Sie unter FText::AsDateTime ). |
LOCGEN_TOLOWER |
Ein Textabschnitt, der Unicode-konform in Kleinbuchstaben konvertiert wird (weitere Informationen finden Sie unter FText::ToLower ). |
LOCGEN_TOUPPER |
Ein Textabschnitt, der Unicode-konform in Großbuchstaben konvertiert wurde (weitere Informationen finden Sie unter FText::ToUpper ). |
LOCGEN_FORMAT_ORDERED |
Ein Textabschnitt, der aus einem Formatierungsmuster unter Verwendung indexbasierter Argumente generiert wird (weitere Informationen finden Sie unter FText::FormatOrdered ). |
LOCGEN_FORMAT_NAMED |
Ein Textabschnitt, der aus einem Formatierungsmuster unter Verwendung namenbasierter Argumente generiert wird (weitere Informationen finden Sie unter FText::FormatNamed ). |
„Roh“-Strings können ebenfalls importiert werden, allerdings wird für jeden Import ein neuer Schlüssel generiert. Dadurch werden unbeständige Schlüssel für die Lokalisierung erstellt.
Daten-Tabellen
Eine häufige Ursache für unbeständige Lokalisierungsschlüssel ist der iterative Import von rohen Strings aus einer CSV-Datei in eine Daten-Tabelle, da hierbei nach jedem Import ein neuer Schlüssel erstellt wird. Eine Lösung dafür ist, dem importierten Text nach dem Import einen deterministischen Schlüssel zuzuweisen, indem die Funktion OnPostDataImport
auf Ihrer Zeilenstruktur überschrieben und FText::ChangeKey
aufgerufen wird, um den neuen Schlüssel zuzuweisen.
Normalerweise verwenden wir den Namen der Daten-Tabelle als Namespace und eine Kombination aus Zeilennamen und Eigenschaftsnamen als Schlüssel. Zum Beispiel:
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
}
In der Version 4.22 werden deterministische Schlüssel bereits auf alle rohen Strings angewendet, die in eine Daten-Tabelle importiert werden, aber Sie können weiterhin OnPostDataImport
überschreiben, wenn Sie benutzerdefiniertes Keying-Verhalten benötigen.
Polyglott-Daten
Polyglott-Daten erlauben das Hinzufügen neuer Lokalisierungsdaten zur Laufzeit, entweder um sich mit einem externen System zu verbinden oder um eine Hot-Fixing-Lokalisierung zu ermöglichen, ohne neue LocRes
-Dateien zu erstellen.
Polyglott-Daten bestehen aus: einem Namespace und einem Schlüssel (seine Identität), einem muttersprachlichen String, der Kategorie des Texts (zum Beispiel Spiel, Engine, Editor), um zu steuern, wann die Polyglott-Daten verwendet werden, einer optional primären Sprachregion (die auf die Fallback-Sprachregion der Kategorie zurückgreift, wenn sie nicht festgelegt wird), sowie einer Reihe von Sprachregion-spezifischen Übersetzungen.
Wenn Sie Polyglott-Daten nutzen möchten, um eine bestehende Übersetzung zu überschreiben, müssen Sie sicherstellen, dass Namespace, Schlüssel und muttersprachlicher String der Polyglott-Daten mit dem Quelltext übereinstimmen, den Sie ersetzen möchten.
Polyglott-Daten in C++
Polyglott-Daten werden in C++ durch den Typ FPolyglotTextData
repräsentiert und können entweder direkt verwendet werden (mit FPolyglotTextData::GetText
, um die Polyglott-Daten in eine Textinstanz aufzulösen), oder sie können an FTextLocalizationManager::RegisterPolyglotTextData
übergeben werden (um bestehende Einträge zu patchen).
Polyglott-Daten in Blueprints
Polyglott-Daten in Blueprints werden durch den Typ Polyglot Text Data repräsentiert und können mit der Funktion Polyglot Data to Text verwendet werden, um Polyglott-Daten in eine Text-Instanz aufzulösen.
Lokalisierte Textquellen
Lokalisierte Textquellen sind der Hauptweg, auf dem der Textlokalisierungsmanager von UE lokalisierte Textdaten ermittelt und verarbeitet. UE stellt standardmäßig zwei davon bereit: FLocalizationResourceTextSource
(das LocRes
-Support hostet) und FPolyglotTextSource
(das Polyglott-Datenunterstützung hostet).
Lokalisierte Textquellen können ein Interface zu einem externen System bieten und können projektspezifisch hinzugefügt werden, indem ein von [ILocalizedTextSource
] abgeleiteter Typ erstellt und registriert wird (https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/ILocalizedTextSource/index.html).