Możesz używać lokalizacji API do specjalistycznych zadań tłumaczenia, które nie są automatycznie przetwarzane przez dodawanie tłumaczeń do lokalizacji tabeli. Roblox oferuje LocalizationService do wszystkich potrzeb lokalizacji skryptów. Użyj LocalizationService dla następujących zadań:
Jeśli używasz jakichkolwiek lokalizacji API podczas tłumaczenia swojego doświadczenia, słuchaj jakiekolwiek zmiany w lokalizacji użytkownika, aby zareagować na użytkownikach przenoszącym język podczas doświadczenia.
Podczas ponownego używania kodu tłumaczenia powinieneś użyć TranslationHelper ModuleScript do weryfikacji błędów i brakujących tłumaczeń.
Lokalizowanie obrazów i dźwięków
Dodaj lokalizację poza tekstem w swoim doświadczeniu, dostarczając unikalne obrazy i dźwięki oparte na lokalizacji użytkownika. Aby lokalizować zasoby, najpierw dodaj źródło i cel ID zasobów do swojego doświadczenia's tabeli lokalizacji i użyj lokalizacji API, aby uzyskać różne zasoby.
Aby rozpocząć lokalizację obrazów i dźwięków, dodaj swoje źródło źródło i cel do swojego lokalizacji stołu. Wpisy ID zasobów na lokalizacji stołu muszą zawierać Klucz jako identyfikator do wezwania przez API.
Poniżej znajduje się przykładowa pozycja w tabeli lokalizacji używając ID zasobów:
Klucz | Źródło | es | pt |
---|---|---|---|
Obraz klucza_jewel | 2957093606 | 2957093671 | 2957093727 |
Poniższy kod zastąpi ID zasobu ImageLabel przez dostarczony lokalizacji tabeli ID zasobów hiszpańskich:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Lokalne zmienne
local localizedImageID
local localizedImage = Instance.new("ImageLabel")
-- Załaduj tłumacz dla "es". Zapakuj funkcję w pcall() aby chronić przed niepowodzeniami.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Zdobądź lokalizacyjny identyfikator zasobu poprzez odniesienie się do klucza
localizedImageID = translator:FormatByKey("Key_JewelsImage")
-- Ustaw obraz
localizedImage.Image = "rbxassetid://" .. localizedImageID
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
Tłumaczenie poszczególnych smyczy
W niektórych przypadkach możesz chcieć celować na poszczególne wiersze do tłumaczenia. Translator:Translate() może odczytać poszczególne wpisy na tabeli lokalizacji w oparciu o źródłowy ciąg.
W następnym przykładzie użyto następującej lokalizacji:
Źródło | es | es | pt |
---|---|---|---|
Ekran | Pantalla | 295093671 | 2957093727 |
Poniższy skrypt wydrukuje hiszpańskie tłumaczenie "Ekran" do okna Wyjście :
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Załaduj tłumacz dla "es". Zapakuj funkcję w pcall() aby chronić przed niepowodzeniami.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Użyj funkcji Tłumacz , która dostarcza kontekst obiektu i ciąg
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- Oczekiwany wynik: "Pantalla"
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
Używanie Przycisków Kontekstowych
Są pewne przypadki, w których ta sama wiadomość może mieć wiele znaczeń. Na przykład słowo „Ekran” może oznaczać zarówno ekran komputera, jak i ekran okna, ale tłumaczenia hiszpańskie są całkowicie inne.
Kolumna Kontekst w tabeli lokalizacji służy do określenia tłumaczeń poprzez przeciwdziałania kontekstowe. Określ obiekt w grze na swojej tabeli lokalizacji, jak w następnym przykładzie:
Kontekst | Źródło | es |
---|---|---|
Workspace.WindowScreen.SurfaceGui.TextLabel | Ekran | Moskitiera |
Ekran | Pantalla |
Poniższy skrypt używa przejścia kontekstowego, aby zwiększyć priorytet tłumaczenia:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Załaduj tłumacz dla "es". Zapakuj funkcję w pcall() aby chronić przed niepowodzeniami.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- użyj funkcji Tłumacz, zapewniając kontekst obiektu i ciąg
local sourceTranslation = translator:Translate( workspace.WindowScreen.SurfaceGui.TextLabel, "Screen")
print(sourceTranslation) -- Oczekiwany wynik: Mosquitero
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
Wielorakie Konteksty
W przypadku wielu kontekstów usługa lokalizacji porównuje relacje obiektów w polu Kontekst z lewej do prawej, używając najbliższego dopasowywać.
Na przykład w tabeli lokalizacji w Twoim doświadczeniu mogą się znajdować następujące wspólne wiersze źródłowe:
Kontekst | Źródło | es |
---|---|---|
Workspace.WindowScreen.SurfaceGui.TextLabel | Ekran | Moskitiera |
playerGui.ScreenGui.Przycisk tekstowy | Ekran | Pantalla |
Jeśli znak „Screen” zostanie dodany do obiektu playerGui.ScreenGui.TextLabel w twoim doświadczeniu, lokalizacja usługi wyświetla „Mosquitero” jako najbliższą tłumaczenie jako najbliższego dopasowywać.
Parametry zastępcze
Podczas używania parametrów do tłumaczenia dynamicznej treści, ustaw wartości na tabeli i przekaż tabelę jako argument poprzez API.
W tym przykładzie doświadczenie ma tabelę lokalizacji z następującymi pozycjami:
Klucz | Źródło | es |
---|---|---|
Nagroda_Klucz_1 | klejnoty 1:int | zdobyte 1:int klejnotów |
Nagroda_Klucz_2 | $AmountCash:fixed pieniędzy i NumJewels:int klejnotów | $AmountCash:fixed pieniędzy i NumJewels:int biżuterii |
Użyj poniższego przykładu kodu, aby tłumaczyć te wartości parametru:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Załaduj tłumacz dla "es". Zapakuj funkcję w pcall() aby chronić przed niepowodzeniami.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Ustaw wartość parametru w "Key_Prize_1" na 100
local keyTranslation1 = translator:FormatByKey("Key_Prize_1", {100})
print(keyTranslation1) -- Oczekiwany wynik: 100 joyas
-- Ustaw wiele parametrów na 500 i 100 według nazwy
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- Oczekiwany wynik: $500.00 dinero i 100 klejnotów
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
Przełączanie języków
W niektórych przypadkach można chcieć wyświetlić tłumaczenia innych języków w swoim doświadczeniu. Możesz ustawić nowego tłumacza za pomocą innego kodu kraju używając LocalizationService:GetTranslatorForLocaleAsync() .
Poniższy kod przykładowy ustawia jednego tłumacza z krajowym kodem ręcznym i dodatkowego tłumacza opartego na ustawieniach globalnych użytkownika:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Lokalne zmienne
local player = Players.LocalPlayer
-- Załaduj tłumacz dla „pt”. Załaduj funkcje tłumacza w pcall() , aby chronić przed awariami.
local res1, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("pt")
end)
-- Załaduj drugiego tłumacza z lokalizacją gracza, w tym przykładzie "es"
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Użyj funkcji Tłumacz z pierwszym tłumaczem
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- Oczekiwany wynik w pt: joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
-- Użyj funkcji Tłumacz z drugim tłumaczem
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- Oczekiwany wyjście w przypadku ustawienia użytkownika na 'es': jóias
else
print('GetTranslatorForPlayerAsync failed: ' .. fallbackTranslator)
end
Reakcja na użytkowników przechodzących języki
Użytkownicy mogą zmieniać ustawienia języka w dowolnym momencie za pomocą menu ustawień w grze. Ta ustawienie użytkownika aktualizuje automatycznie nieobsługujące lokalizacji językowe, takie jak struny zarządzane przez tłumaczenie automatyczne, ale nie może aktualizować zmian lokalizacji skryptów, które już się zeskanowały, takich jak obrazy GUI lub dźwięk.
Aby upewnić się, że twoje skryptowane zasoby lokalizowane aktualizują się poprawnie, słuchaj wydarzenia GetPropertyChangedSignal dla zmian w właściwości Translator instancji <
Poniższy kod przyjmuje lokalne ID użytkownika i lokalne ID instancji Tłumacza dla użytkownika, gdy użytkownik przełącza się na język:
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- Jeśli GetTranslatorForPlayerAsync się powiórzy, zwróci tłumacz dla lokalizacji gracza
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Funkcja, która jest wzywana, gdy wykryto zmianę lokalizacji gracza
local function OnLocaleIdChanged()
print("Translator has changed to: " .. translator.LocaleId)
-- Powinieneś ponownie tłumaczyć wszystkie tłumione zasoby za pomocą API Lokalizacji do nowego języka gracza tutaj
end
-- Sprawdź, czy GetTranslatorForPlayerAsync się powiódł
if res then
-- Jeśli się udało, tłumacz tutaj zasoby przy użyciu tłumacza
-- Słuchaj zmiany lokalnej ID gracza
translator:GetPropertyChangedSignal("LocaleId"):Connect(OnLocaleIdChanged)
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
Tworzenie modułu tłumacza
Gdy ładasz tłumaczenia na podstawie domyślnego lokalnego języka gracza, możesz ponownie użyć kodu. Aby ponownie użyć kodu, ustaw pomocnika ModuleScript, który bezpiecznie ładowuje tłumaczenia na podstawie domyślnego lokalnego języka i zawiera funkcje do dostarczania określonych tłumaczeń i zmiany języków.
Poniższy kod przykładu implementuje TranslationHelper, który możesz skopiować w swoim własnym projekcie jako ModuleScript w ReplicatedStorage :
local TranslationHelper = {}
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Lokalne zmienne
local player = Players.LocalPlayer
local sourceLanguageCode = "en"
-- Zdobądź tłumaczy
local playerTranslator, fallbackTranslator
local foundPlayerTranslator = pcall(function()
playerTranslator = LocalizationService:GetTranslatorForPlayerAsync(player)
end)
local foundFallbackTranslator = pcall(function()
fallbackTranslator = LocalizationService:GetTranslatorForLocaleAsync(sourceLanguageCode)
end)
-- Utwórz metodę TranslationHelper.setLanguage, aby załadować nowy tłumacz dla TranslationHelper
function TranslationHelper.setLanguage(newLanguageCode)
if sourceLanguageCode ~= newLanguageCode then
local success, newPlayerTranslator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync(newLanguageCode)
end)
--Następujące przetłumaczenie tylko zastąpi obecnego playerTranslator, jeśli nowy jest ważny (fallbackTranslator pozostaje jako język źródłowy doświadczenia)
if success and newPlayerTranslator then
playerTranslator = newPlayerTranslator
return true
end
end
return false
end
-- Utwórz funkcję przetłumaczenia, która używa przetłumaczera domyślnego, jeśli pierwszy nie załadował się lub nie powrócił prawidłowo. Możesz również ustawić odniesiony obiekt na domyślny dla ogólnego obiektu gry
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
-- Utwórz funkcję formatByKey() używającą wskaźników zapasowych, jeśli pierwszy nie załadował się lub nie powrócił prawidłowo
function TranslationHelper.translateByKey(key, arguments)
local translation = ""
local foundTranslation = false
-- Najpierw próbuje tłumaczyć na język gracza (jeśli tłumacz został znaleziony)
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
Gdy moduł jest w ReplicatedStorage, wymagaj go z LocalScript, aby wejść w posiadanie funkcji modułu. Poniższy kod używa funkcji pomocniczego modułu, aby przetłumaczyć pojedynczą ciąg:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Wymaga modułu tłumaczenialocal TranslationHelper = require(ReplicatedStorage:WaitForChild("TranslationHelper"))-- Użyj funkcji dostarczonych w TranslationHelperTranslationHelper.setLanguage("es")local sourceTranslation = TranslationHelper.translate("Screen")print(sourceTranslation) -- Expected Output in 'es': "Pantalla"