您可以使用本地化 API 进行一些不是通过 添加翻译 到本地化表自动处理的专业翻译任务。Roblox 提供了 LocalizationService 来处理所有本地化脚本需求。使用 LocalizationService 执行以下任务:
如果在翻译游戏时使用任何本地化 API,请监听用户的 LocaleID 的任何更改,以便在游戏中 响应用户切换语言。
在重用翻译代码时,您应该使用 TranslationHelper ModuleScript 来处理错误和缺失的翻译。
本地化图像和声音
通过根据用户的区域提供独特的图像和声音,为您的游戏添加超出文本的本地化。要本地化资产,请首先将 源 和 目标 资产 ID 添加到您游戏的 本地化表,然后使用本地化 API 获取不同的资产。



要开始本地化图像和声音,请将您的 源和目标 资产 ID 添加到您的本地化表中。当地化表中的资产 ID 条目必须包括一个 键 作为 API 调用的标识符。
以下是使用资产 ID 的本地化表的示例条目:
| 键 | 源 | es | pt |
|---|---|---|---|
| Key_JewelsImage | 2957093606 | 2957093671 | 2957093727 |
以下代码将用本地化表中提供的西班牙资产 ID 替换 ImageLabel 的资产 ID:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- 本地变量
local localizedImageID
local localizedImage = Instance.new("ImageLabel")
-- 为 "es" 加载翻译器。将函数包裹在 pcall() 中以防止失败。
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- 通过引用键从本地化表获取资产 ID
localizedImageID = translator:FormatByKey("Key_JewelsImage")
-- 设置图像
localizedImage.Image = "rbxassetid://" .. localizedImageID
else
print('GetTranslatorForPlayerAsync 失败: ' .. translator)
end
翻译单个字符串
在某些情况下,您可能希望针对单个字符串进行翻译。Translator:Translate() 可以根据源字符串从本地化表中获取单个条目。
在下一个示例中,使用以下本地化条目:
| 源 | es | es | pt |
|---|---|---|---|
| Screen | Pantalla | 295093671 | 2957093727 |
以下脚本会将“Screen”的西班牙语翻译打印到 输出 窗口:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- 为 "es" 加载翻译器。将函数包裹在 pcall() 中以防止失败。
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- 使用 Translate 函数,提供对象上下文和字符串
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- 预期输出: "Pantalla"
else
print('GetTranslatorForPlayerAsync 失败: ' .. translator)
end
使用上下文覆盖
在某些情况下,相同的字符串可能具有多种含义。例如,单词“Screen”可以指计算机屏幕和窗口屏幕,但西班牙语翻译却完全不同。
本地化表的 上下文 列用于通过上下文覆盖指定翻译。在您的本地化表中指定游戏内对象,如下例所示:
| 上下文 | 源 | es |
|---|---|---|
| workspace.WindowScreen.SurfaceGui.TextLabel | Screen | Mosquitero |
| Screen | Pantalla |
以下脚本使用上下文覆盖来优先考虑特定翻译:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Workspace = game:GetService("Workspace")
-- 为 "es" 加载翻译器。将函数包裹在 pcall() 中以防止失败。
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- 使用 Translate 函数,提供对象上下文和字符串
local sourceTranslation = translator:Translate(Workspace.WindowScreen.SurfaceGui.TextLabel, "Screen")
print(sourceTranslation) -- 预期输出: Mosquitero
else
print('GetTranslatorForPlayerAsync 失败: ' .. translator)
end
多重上下文
在多重上下文的情况下,本地化服务从 右到左 比较上下文字段中的对象关系,使用最接近的匹配。
例如,您游戏中的本地化表可能有以下共享源字符串条目:
| 上下文 | 源 | es |
|---|---|---|
| workspace.WindowScreen.SurfaceGui.TextLabel | Screen | Mosquitero |
| playerGui.ScreenGui.TextButton | Screen | Pantalla |
如果字符串“Screen”被添加到您游戏中的 playerGui.ScreenGui.TextLabel 对象中,则本地化服务会将 "Mosquitero" 显示为西班牙语翻译,因为这是最接近的上下文匹配。
替代参数
当使用参数来翻译 动态内容 时,将值设置为一个 表,并通过 API 传递该表作为参数。
在此示例中,游戏有一个本地化表,包含以下条目:
| 键 | 源 | es |
|---|---|---|
| Key_Prize_1 | {1:int} jewels | {1:int} joyas |
| Key_Prize_2 | ${AmountCash:fixed} cash and {NumJewels:int} jewels | ${AmountCash:fixed} dinero y {NumJewels:int} joyas |
使用以下代码示例将这些字符串翻译为带有参数值的内容:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- 为 "es" 加载翻译器。将函数包裹在 pcall() 中以防止失败。
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- 将 "Key_Prize_1" 的参数值设置为 100
local keyTranslation1 = translator:FormatByKey("Key_Prize_1", {100})
print(keyTranslation1) -- 预期输出: 100 joyas
-- 将多个参数设置为 500 和 100,通过名称
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- 预期输出: $500.00 dinero y 100 joyas
else
print('GetTranslatorForPlayerAsync 失败: ' .. translator)
end
切换语言
在某些情况下,您可能希望在游戏中显示其他语言的翻译。您可以使用 LocalizationService:GetTranslatorForLocaleAsync() 设置一个新翻译器,使用不同的国家代码。
以下代码示例设置一个手动国家代码的翻译器以及一个基于用户全球区域设置的额外翻译器:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- 本地变量
local player = Players.LocalPlayer
-- 为 "pt" 加载翻译器。将翻译器函数包装在 pcall() 中以防止失败。
local res1, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("pt")
end)
-- 使用玩家的区域加载第二个翻译器,在此示例中为 "es"
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- 使用第一个翻译器的 Translate 函数
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- 在 pt 中的预期输出: joyas
else
print('GetTranslatorForPlayerAsync 失败: ' .. translator)
end
-- 使用第二个翻译器的 Translate 函数
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- 如果用户设置为 'es': 预期输出: jóias
else
print('GetTranslatorForPlayerAsync 失败: ' .. fallbackTranslator)
end
响应用户切换语言
用户可以随时通过游戏内的设置菜单更改他们的语言设置。这个用户设置的更改会自动更新非脚本的本地化资产,例如由 自动翻译 处理的字符串,但可能不会更新已经呈现的脚本本地化更改,例如 GUI 图像或声音。


为了确保您的脚本本地化资产正确更新,请监听 GetPropertyChangedSignal 事件,以检测 Translator 实例的 LocaleID 属性的变化,该实例由 LocalizationService.GetTranslatorForPlayerAsync 返回。当使用 LocalizationService.GetTranslatorForPlayerAsync 时,将函数包裹在 pcall() 中,以防止错误。
以下代码示例在用户切换语言时打印用户的 Locale ID 和翻译器实例的 Locale ID:
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- 如果 GetTranslatorForPlayerAsync 成功,它将返回玩家当前区域的 Translator
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- 当检测到玩家的区域 ID 变化时调用的函数
local function OnLocaleIdChanged()
print("翻译器已更改为: " .. translator.LocaleId)
-- 在这里您应该重新翻译使用本地化 API 翻译的任何资产到玩家的新语言
end
-- 检查 GetTranslatorForPlayerAsync 是否成功
if res then
-- 如果成功,在这里使用翻译器翻译资产
-- 监听玩家区域 ID 的变化
translator:GetPropertyChangedSignal("LocaleId"):Connect(OnLocaleIdChanged)
else
print('GetTranslatorForPlayerAsync 失败: ' .. translator)
end
创建 TranslationHelper 模块
当您根据玩家的默认区域加载翻译器时,您可能会重用代码。为了重用代码,设置一个辅助的 ModuleScript,安全地根据玩家的默认区域加载翻译器,并包括提供特定翻译和切换语言的功能。
以下代码示例实现了您可以复制到自己的项目中的 TranslationHelper,作为 ModuleScript 在 ReplicatedStorage 中:
local TranslationHelper = {}
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- 本地变量
local player = Players.LocalPlayer
local sourceLanguageCode = "en"
-- 获取翻译器
local playerTranslator, fallbackTranslator
local foundPlayerTranslator = pcall(function()
playerTranslator = LocalizationService:GetTranslatorForPlayerAsync(player)
end)
local foundFallbackTranslator = pcall(function()
fallbackTranslator = LocalizationService:GetTranslatorForLocaleAsync(sourceLanguageCode)
end)
-- 创建一个 TranslationHelper.setLanguage 方法,以加载 TranslationHelper 的新翻译
function TranslationHelper.setLanguage(newLanguageCode)
if sourceLanguageCode ~= newLanguageCode then
local success, newPlayerTranslator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync(newLanguageCode)
end)
-- 仅在新翻译器有效时覆盖当前 playerTranslator(fallbackTranslator 保持为游戏的源语言)
if success and newPlayerTranslator then
playerTranslator = newPlayerTranslator
return true
end
end
return false
end
-- 创建一个 Translate 函数,如果第一个翻译器加载失败或未能成功返回,则使用后备翻译器。您还可以将引用的对象默认为通用对象
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
-- 创建一个 FormatByKey() 函数,如果第一个翻译器加载失败或未能成功返回,则使用后备翻译器
function TranslationHelper.translateByKey(key, arguments)
local translation = ""
local foundTranslation = false
-- 首先尝试翻译玩家的语言(如果找到翻译器)
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
一旦模块在 ReplicatedStorage 中,请从 LocalScript 引用它以调用模块的函数。以下代码使用此模块的辅助函数翻译单个字符串:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- 引用翻译模块local TranslationHelper = require(ReplicatedStorage:WaitForChild("TranslationHelper"))-- 使用 TranslationHelper 中提供的函数TranslationHelper.setLanguage("es")local sourceTranslation = TranslationHelper.translate("Screen")print(sourceTranslation) -- 在 'es' 中的预期输出: "Pantalla"