Localizzazione con Scripting

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Puoi utilizzare le API di localizzazione per compiti di traduzione specializzati che non sono gestiti automaticamente dal aggiungere le traduzioni alla tabella di localizzazione. Roblox fornisce un LocalizationService per gestire tutte le esigenze di script di localizzazione. Usa il LocalizationService per le seguenti attività:

Se usi API di localizzazione quando traduci la tua esperienza, ascolta per qualsiasi cambiamento nel LocaleID dell'utente per reagire agli utenti che cambiano la lingua mentre in un'esperienza.

Quando si riutilizza il codice di traduzione, si dovrebbe utilizzare un TranslationHelperModuleScript per gestire gli errori e le traduzioni mancanti.

Localizzazione delle immagini e dei suoni

Aggiungi localizzazione oltre il testo nella tua esperienza fornendo uniche immagini e suoni in base alla posizione dell'utente. Per localizzare le risorse, prima aggiungi il 源 e target ID delle risorse all'esperienza's tabella di localizzazione e quindi usa l'API di localizzazione per ottenere le diverse risorse.

Inglese (Fonte) - rbxassetid://2957093606
Spagnolo (es) - rbxassetid://2957093671
Portuguese (pt) - rbxassetid://2957093727

Per iniziare a localizzare immagini e suoni, aggiungi i tuoi 源 e target alla tua tavola di localizzazione. Gli ID risorsa e target sulla tavola di localizzazione devono includere un 0> Key0> come identificatore per essere chiamato dall'API.

Il seguente è un esempio di entry on a localization table using asset IDs:

ChiaveFonteespt
Key_JewelsImage295709360629570936712957093727

Il seguente codice sostituirà l'ID dell'asset di un ImageLabel con l'ID dell'asset fornito nella tabella di localizzazione:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Variabili locali
local localizedImageID
local localizedImage = Instance.new("ImageLabel")
-- Carica il traduttore per "es". Wrap la funzione all'interno di un pcall() per proteggere contro i guasti.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Ottieni l'ID dell'asset dalla tabella di localizzazione facendo riferimento alla chiave
localizedImageID = translator:FormatByKey("Key_JewelsImage")
-- Imposta l'immagine
localizedImage.Image = "rbxassetid://" .. localizedImageID
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Traduzione delle singole corde

In alcune situazioni, potresti voler target individuali per la traduzione. Translator:Translate() può recuperare singoli elementi sulla tabella di localizzazione in base alla Stringadi origine.

Nel prossimo esempio, viene utilizzata la seguente impostazione di localizzazione:

Fonteesespt
SchermoSchermo2950936712957093727

Il seguente script stamperà la traduzione spagnola di "Screen" nella finestra Output :


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Carica il traduttore per "es". Wrap la funzione all'interno di un pcall() per proteggere contro i guasti.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Usa la funzione traduci , fornendo contesto oggetto e Stringa
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- Output previsto: "Pantalla"
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Uso di Context Overrides

Ci sono alcuni casi in cui la stessa stringa può avere più significati. Ad esempio, la parola "Screen" può indicare sia uno schermo del computer che uno schermo della finestra, ma le traduzioni spagnole sono completamente diverse.

La colonna Contesto della tabella di localizzazione è per specificare le traduzioni attraverso gli overrid del contesto.Specify the in-game object on your localization table come in the following example:

ContestoFontees
workspace.WindowScreen.SurfaceGui.TextLabelSchermoMosquito
SchermoSchermo

Il seguente script usa un'覆盖 del contesto per priorizzare una traduzione specifica:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Carica il traduttore per "es". Wrap la funzione all'interno di un pcall() per proteggere contro i guasti.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- utilizzare la funzione Traduci , fornendo contesto dell'oggetto e Stringa
local sourceTranslation = translator:Translate( workspace.WindowScreen.SurfaceGui.TextLabel, "Screen")
print(sourceTranslation) -- Output previsto: Mosquitero
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Più contesti

Nel caso di più contesti, il servizio di localizzazione confronta le relazioni degli oggetti nel campo Context da destra a sinistra , utilizzando la Corrispondepiù vicina.

Ad esempio, una tabella di localizzazione nella tua esperienza potrebbe avere le seguenti entrade condivise delle stringhe di origine:

ContestoFontees
workspace.WindowScreen.SurfaceGui.TextLabelSchermoMosquito
playerGui.ScreenGui.TextButtonSchermoSchermo

Se la stringa "Screen" viene aggiunta a un oggetto playerGui.ScreenGui.TextLabel nella tua esperienza, il servizio di localizzazione mostra "Mosquitero" come traduzione spagnola come il contesto Corrispondevicino.

Sostituzione dei parametri

Quando si utilizzano i parametri per tradurre contenuto dinamico, imposta i valori in una tabella e passa la tabella come argomento attraverso l'API.

In questo esempio, l'esperienza ha una tabella di localizzazione con le seguenti entrade:

ChiaveFontees
Premio_1gemme 1:intgioie 1:int
Premio_2$AmountCash:fixed contanti e NumJewels:int gioielli$AmountCash:fixed denaro e NumJewels:int gioielli

Usa il seguente esempio di codice per tradurre queste stringhe con valori di parametro:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Carica il traduttore per "es". Wrap la funzione all'interno di un pcall() per proteggere contro i guasti.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Imposta il valore del parametro in "Key_Prize_1" su 100
local keyTranslation1 = translator:FormatByKey("Key_Prize_1", {100})
print(keyTranslation1) -- Output previsto: 100 joyas
-- Imposta più parametri su 500 e 100 per nome
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- Ricompensa prevista: $ 500.00 denaro e 100 gioielli
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Cambio di lingue

In alcuni casi, potresti voler visualizzare le traduzioni di altre lingue nella tua esperienza. Puoi impostare un nuovo traduttore con un codice di paese diverso usando LocalizationService:GetTranslatorForLocaleAsync() .

Il seguente codice di esempio imposta un traduttore con un codice paese manuale e un traduttore aggiuntivo basato sulle impostazioni globali dell'utente:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Variabili locali
local player = Players.LocalPlayer
-- Carica il traduttore per "pt". Wrap le funzioni del traduttore in un pcall() per proteggere contro i guasti.
local res1, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("pt")
end)
-- Carica il secondo traduttore con il linguaggio del giocatore, in questo esempio "es"
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Usa la funzione Traduci con il primo traduttore
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- Output previsto in pt: joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
-- Usa la funzione di traduzione con il secondo traduttore
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- Output Esperto in if utente è impostato su 'es': jóias
else
print('GetTranslatorForPlayerAsync failed: ' .. fallbackTranslator)
end

Reattare agli utenti che cambiano lingue

Gli utenti possono modificare le impostazioni linguistiche in qualsiasi momento usando il loro menu Impostazioni in-experience . Questa impostazione utente cambia automaticamente le risorse di localizzazione non scriptate, come le stringhe gestite dal traduzione automatico, ma potrebbe non aggiornare le modifiche alle localizzazioni scriptate che sono già state generate, come le immagini GUI o i suoni.

Impostazione della lingua in-experience
Gli utenti possono scegliere le lingue disponibili impostate nell'esperienza

Per assicurarti che le tue risorse scriptate localizzate si aggiornino correttamente, ascolta l'evento GetPropertyChangedSignal per le modifiche nella proprietà LocaleID della istanza Translator restituita da

Il seguente esempio di codice stampa l'ID Locale dell'utente e l'ID Locale dell'istanza Translator per l'utente quando l'utente cambia lingue:


local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- Se GetTranslatorForPlayerAsync ha successo, restituirà un traduttore per la lingua corrente del Giocatore
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Funzione che viene chiamata quando viene rilevato l'ID della lingua del Giocatore
local function OnLocaleIdChanged()
print("Translator has changed to: " .. translator.LocaleId)
-- Dovresti ri-tradurre qualsiasi risorsa tradotta con API di localizzazione nella nuova lingua del Giocatorequi
end
-- Controlla se GetTranslatorForPlayerAsync è riuscito
if res then
-- Se ci riesci, traduci le risorse qui usando il traduttore
-- Ascolta per un cambiamento nell'ID della lingua del Giocatore
translator:GetPropertyChangedSignal("LocaleId"):Connect(OnLocaleIdChanged)
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Creazione di un Modulo di Traduzione

Quando carichi i traduttori in base alla lingua predefinita del Giocatore, potresti riutilizzare il codice. Per riutilizzare il codice, configura un aiutante ModuleScript che carica in sicurezza i traduttori in base alla lingua predefinita del Giocatoree include funzioni per fornire traduzioni specifiche e per passare da una lingua all'altra.

Il seguente codice di esempio implementa un TranslationHelper che puoi copiare nel tuo progetto come ModuleScript in ReplicatedStorage :


local TranslationHelper = {}
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Variabili locali
local player = Players.LocalPlayer
local sourceLanguageCode = "en"
-- Ottieni traduttori
local playerTranslator, fallbackTranslator
local foundPlayerTranslator = pcall(function()
playerTranslator = LocalizationService:GetTranslatorForPlayerAsync(player)
end)
local foundFallbackTranslator = pcall(function()
fallbackTranslator = LocalizationService:GetTranslatorForLocaleAsync(sourceLanguageCode)
end)
-- Crea un metodo TranslationHelper.setLanguage per caricare una nuova traduzione per il TranslationHelper
function TranslationHelper.setLanguage(newLanguageCode)
if sourceLanguageCode ~= newLanguageCode then
local success, newPlayerTranslator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync(newLanguageCode)
end)
--Sovrascrivi solo il playerTranslator attuale se il nuovo è valido (fallbackTranslator rimane come la lingua di origine dell'esperienza)
if success and newPlayerTranslator then
playerTranslator = newPlayerTranslator
return true
end
end
return false
end
-- Crea una funzione di traduzione che usa un traduttore di fallback se il primo non carica o non torna con successo. Puoi anche impostare l'oggetto di riferimento su un oggetto di gioco generico
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
-- Crea una funzione di nome Fallback che usa un traduttore di fallback se il primo non carica o non ritorna con successo
function TranslationHelper.translateByKey(key, arguments)
local translation = ""
local foundTranslation = false
-- Prima cerca di tradurre per la lingua del Giocatore(se un traduttore è stato trovato)
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

Una volta che il modulo è in ReplicatedStorage , richiedilo da un LocalScript per chiamare le funzioni del modulo. Il seguente codice usa la funzione di aiuto del modulo per tradurre una singola Stringa:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Requires translation module
local TranslationHelper = require(ReplicatedStorage:WaitForChild("TranslationHelper"))
-- Usa le funzioni fornite in TranslationHelper
TranslationHelper.setLanguage("es")
local sourceTranslation = TranslationHelper.translate("Screen")
print(sourceTranslation) -- Expected Output in 'es': "Pantalla"