Lokalisierung mit Skripten

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Sie können lokalisierte APIs für spezialisierte Übersetzungsaufgaben verwenden, die nicht automatisch von eine Übersetzung hinzufügen zu der Lokalisierungstabelle behandelt werden. Roblox bietet ein LocalizationService für alle Lokalisierungs-Skripts an. Verwenden Sie das LocalizationService für die folgenden Aufgaben:

Wenn Sie irgendwelche Lokalisierungs-APIs verwenden, wenn Sie Ihr Erlebnis übersetzen, hören Sie auf alle Änderungen an der Sprach-ID des Benutzers, um auf Benutzer, die ihre Sprache wechseln reagieren, während Sie in einem Erlebnis sind.

Wenn Sie Codeswiederverwenden, sollten Sie ein TranslationHelper-Modul-Skript zu verwenden, um Fehler und fehlende Übersetzungen zu behandeln.

Bilder und Sounds lokalisieren

Fügen Sie Lokalisierung jenseits des Textes in Ihrem Erlebnis hinzu, indem Sie einzigartige Bilder und Sounds bereitstellen, basierend auf der lokalen Sprache eines Benutzers. Um Assets zu lokalisieren, fügen Sie zuerst die Quelle und Ziel Asset-IDs zu Ihres Erlebnisses Lokalisierungstabelle hinzu und verwenden Sie dann die Lokalisierungs-API, um die verschiedenen Assets zu erhalten.

Englisch (Quelle) - rbxassetid://2957093606
Spanisch (es) - rbxassetid://2957093671
Portugiesisch (pt) - rbxassetid://2957093727

Um lokalisierte Bilder und Geräusche zu starten, füge deine Quelle und Ziel Assets zu deiner Lokalisierungstabelle hinzu. Asset-ID-Einträge auf der Lokalisierungstabelle müssen einen 0> Schlüssel 0> als Identifikator enthalten, um von der API aufgerufen zu werden.

Das Folgende ist ein Beispiel für einen Eintrag in einer Lokalisierungstabelle mit Asset-IDs:

SchlüsselQuelleespt
Key_Juwelenbild295709360629570936712957093727

Der folgende Code wird die Asset-ID eines ImageLabel durch die in der Lokalisierungs-Tabelle bereitgestellte Asset-ID ersetzen:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Lokale Variablen
local localizedImageID
local localizedImage = Instance.new("ImageLabel")
-- Laden Sie den Übersetzer für "es". Wrap the function within a pcall() to protect against failures.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Erhalten Sie die Asset-ID aus der Lokalisierungstabelle, indem Sie auf den Schlüssel verweisen
localizedImageID = translator:FormatByKey("Key_JewelsImage")
-- Setzen Sie das Bild
localizedImage.Image = "rbxassetid://" .. localizedImageID
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Individuelle Strings übersetzen

In einigen Situationen möchten Sie einzelne Zeichen für die Übersetzung anvisieren. Translator:Translate() kann einzelne Einreichungen auf der Übersetzungstabelle basierend auf der Stringabrufen.

Im folgenden Beispiel wird die folgende Lokalisierungseinheit verwendet:

Quelleesespt
BildschirmPantalla2950936712957093727

Das folgende Skript wird die spanische Übersetzung von "Screen" in das Ausgabe-Fenster drucken:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Laden Sie den Übersetzer für "es". Wrap the function within a pcall() to protect against failures.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Verwenden Sie die Übersetzungsfunktion, einschließlich Objekt-Kontext und String
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- Erwartete Ausgabe: "Pantalla"
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Verwendung von Kontext-Überschreibungen

Es gibt einige Fälle, in denen die gleiche Zeile mehrere Bedeutungen haben kann. Zum Beispiel kann das Wort "Bildschirm" sowohl einen Computer-Bildschirm als auch einen Fenster-Bildschirm指示, aber die übersetzungen sind völlig unterschiedlich.

Die Kontext-Säule der Übersetzungstabelle dient zur Spezifikation von Übersetzungen durch Kontext-Überschreibungen. Spezifizieren Sie das in-Game-Objekt auf Ihrer Übersetzungstabelle wie im folgenden Beispiel:

KontextQuellees
Arbeitsbereich.WindowScreen.SurfaceGui.TextLabelBildschirmMosquito
BildschirmPantalla

Das folgende Skript verwendet einen Kontext-Überschlag, um eine bestimmte Übersetzung zu priorisieren:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Laden Sie den Übersetzer für "es". Wrap the function within a pcall() to protect against failures.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Verwenden Sie die Übersetzungsfunktion, einschließlich Objekt-Kontext und String
local sourceTranslation = translator:Translate( workspace.WindowScreen.SurfaceGui.TextLabel, "Screen")
print(sourceTranslation) -- Erwartete Ausgabe: Mosquitero
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Mehrere Kontexte

Im Falle mehrerer Kontexte vergleicht der Lokalisierungsservice die Objektbeziehungen im Feld Kontext von rechts nach links, mit dem nächsten übereinstimmen.

Zum Beispiel kann eine Lokalisierungs-Tabelle in deiner Erfahrung die folgenden geteilten Quellen-Zeilen enthalten:

KontextQuellees
Arbeitsbereich.WindowScreen.SurfaceGui.TextLabelBildschirmMosquito
playerGui.ScreenGui.TextButtonBildschirmPantalla

Wenn der Strings "Screen" zu einem playerGui.ScreenGui.TextLabel-Objekt in deiner Erlebnishinzugefügt wird, zeigt der Lokalisierungs-Dienst "Mosquitero" alsSpanisch-Übersetzung den nächsten übereinstimmenan.

Parametresemplätze

Wenn SieParameter verwenden, um dynamischen Inhalt zu übersetzen, setzen Sie die Werte auf eine Tabelle und übergeben Sie die Tabelle als Argent über die API.

In diesem Beispiel hat das Erlebnis eine Lokalisierungstabelle mit den folgenden Einträgen:

SchlüsselQuellees
Preis_1schmuck 1:intjoyas 1:int
Preis_2$AmountCash:fixed Bargeld und NumJewels:int Schmuck$AmountCash:fixed Geld und NumJewels:int Schmuck

Verwenden Sie das folgende Codebeispiel, um diese Strings mit Parameterelementen zu übersetzen:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Laden Sie den Übersetzer für "es". Wrap the function within a pcall() to protect against failures.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Setzen Sie den Parametervarto in "Key_Prize_1" auf 100
local keyTranslation1 = translator:FormatByKey("Key_Prize_1", {100})
print(keyTranslation1) -- Erwartete Ausgabe: 100 joyas
-- Setzen Sie mehrere Parameter auf 500 und 100 nach Namen
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- Erwartetes Ausgabe: $500.00 Dinero und 100 Juwelen
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Sprachen wechseln

In einigen Fällen möchten Sie Übersetzungen anderer Sprachen in Ihrem Erlebnis anzeigen. Sie können einen neuen Übersetzer mit einem anderen Landcode verwenden, indem Sie LocalizationService:GetTranslatorForLocaleAsync() .

Das folgende Codebeispiel setzt einen Übersetzer mit einem manuellen Ländercode und einem zusätzlichen Übersetzer basierend auf den globalen Konfigurationseinstellungen des Benutzers:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Lokale Variablen
local player = Players.LocalPlayer
-- Laden Sie den Übersetzer für "pt". Wrap Übersetzerfunktionen in pcall () , um Fehler zu schützen.
local res1, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("pt")
end)
-- Laden Sie den zweiten Übersetzer mit dem lokalen "es" des Spielers
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Verwenden Sie die Übersetzungsfunktion mit dem ersten Übersetzer
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- Erwartete Ausgabe in pt: joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
-- Verwenden Sie die Übersetzungsfunktion mit dem zweiten Übersetzer
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- Erwartete Ausgabe in if Benutzer auf 'es' eingestellt ist: Jóias
else
print('GetTranslatorForPlayerAsync failed: ' .. fallbackTranslator)
end

Reagieren auf Benutzer, die Sprachen wechseln

Benutzer können ihre Spracheinstellungen jederzeit mit dem Einstellungen-Menü in der Erfahrung ändern. Dieser Benutzer-Einstellungs-Change aktualisiert automatisch nicht-skriptliche Lokalisierungs-Assets, wie Strings, die von automatischer Übersetzung verarbeitet werden, aber nicht skriptbasierte Lokalisierungs-Änderungen, die bereits gerendert wurden, wie GUI-Bilder oder Sounds.

In-Experience-Sprach-Einstellungen
Benutzer können verfügbare Sprachen in der Erfahrung auswählen.

Um sicherzustellen, dass deine skriptierten lokalisierten Assets richtig aktualisiert werden, hören Sie dem Ereignis GetPropertyChangedSignal für Änderungen in der LocaleID-Eigenschaft der Translator

Das folgende Codebeispiel druckt die lokale ID des Benutzers und die lokale ID der Translator-Instanz für den Benutzer, wenn der Benutzer die Sprachen wechseln:


local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- Wenn GetTranslatorForPlayerAsync erfolgreich ist, gibt es einen Translator für das aktuelle lokale des Spieler:inzurück
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Funktion, die aufgerufen wird, wenn die lokale ID des Spieler:ingeändert wird
local function OnLocaleIdChanged()
print("Translator has changed to: " .. translator.LocaleId)
-- Du solltest alle mit Lokalisierungs-APIs übersetzten Assets hier in die neue Sprache des Spieler:inübersetzen
end
-- Überprüfen Sie, ob GetTranslatorForPlayerAsync erfolgreich war
if res then
-- Wenn erfolgreich, übersetzen Sie Assets hier mit dem Übersetzer
-- Hören Sie auf eine Änderung der Sprach-ID des Spieler:in
translator:GetPropertyChangedSignal("LocaleId"):Connect(OnLocaleIdChanged)
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Erstellen eines Übersetzungshilfe-Moduls

Wenn Sie Übersetzer basierend auf der Standardlokalisierung des Spieler:inladen, können Sie Codeswiederverwenden. Um Codeswiederzuverwenden, erstellen Sie einen Helper ModuleScript, der die Übersetzer basierend auf der Standardlokalisierung des Spieler:inund Funktionen zum Bereitstellen bestimmter Übersetzungen und zum Wechseln von Sprachen enthält.

Das folgende Codebeispiel implementiert einen TranslationHelper, den du in dein eigenes Projekt als ModuleScript in ReplicatedStorage kopieren kannst:


local TranslationHelper = {}
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Lokale Variablen
local player = Players.LocalPlayer
local sourceLanguageCode = "en"
-- Erhalte Übersetzer
local playerTranslator, fallbackTranslator
local foundPlayerTranslator = pcall(function()
playerTranslator = LocalizationService:GetTranslatorForPlayerAsync(player)
end)
local foundFallbackTranslator = pcall(function()
fallbackTranslator = LocalizationService:GetTranslatorForLocaleAsync(sourceLanguageCode)
end)
-- Erstellen Sie einen Methode TranslationHelper.setLanguage, um eine neue Übersetzung für den TranslationHelper zu laden
function TranslationHelper.setLanguage(newLanguageCode)
if sourceLanguageCode ~= newLanguageCode then
local success, newPlayerTranslator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync(newLanguageCode)
end)
--Überschreiben Sie nur den aktuellen PlayerTranslator, wenn der neue zulässig ist (fallbackTranslator bleibt als Quellsprache des Erlebnisses)
if success and newPlayerTranslator then
playerTranslator = newPlayerTranslator
return true
end
end
return false
end
-- Erstellen Sie eine Übersetzungsfunktion, die einen Rückgabeverb verwendet, wenn das erste nicht erfolgreich geladen oder zurückgegeben wird. Sie können auch das verwendete Objekt auf das Standard-Spielobjekt zurücksetzen
function TranslationHelper.translate(text, object)
if not object then
object = game
end
if foundPlayerTranslator then
return playerTranslator:Translate(object, text)
end
if foundFallbackTranslator then
return fallbackTranslator:Translate(object, text)
end
return false
end
-- Erstellen Sie eine FormatByKey() -Funktion, die einen Rückfall-Übersetzer verwendet, wenn der erste nicht erfolgreich geladen oder zurückgegeben wird
function TranslationHelper.translateByKey(key, arguments)
local translation = ""
local foundTranslation = false
-- Versucht zuerst, für die Sprache des Spieler:inzu übersetzen (wenn ein Übersetzer gefunden wurde)
if foundPlayerTranslator then
foundTranslation = pcall(function()
translation = playerTranslator:FormatByKey(key, arguments)
end)
end
if foundFallbackTranslator and not foundTranslation then
foundTranslation = pcall(function()
translation = fallbackTranslator:FormatByKey(key, arguments)
end)
end
if foundTranslation then
return translation
else
return false
end
end
return TranslationHelper

Sobald das Modul in ReplicatedStorage ist, benötigen Sie es von einem LocalScript , um die Funktionen des Moduls aufzurufen. Der folgende Code verwendet die Hilfsfunktion des Moduls, um eine einzelne Stringzu übersetzen:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Benötige Übersetzungsmodul
local TranslationHelper = require(ReplicatedStorage:WaitForChild("TranslationHelper"))
-- Verwenden Sie die bereitgestellten Funktionen in TranslationHelper
TranslationHelper.setLanguage("es")
local sourceTranslation = TranslationHelper.translate("Screen")
print(sourceTranslation) -- Expected Output in 'es': "Pantalla"