Localizing với Scripting

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Bạn có thể sử dụng các API dịch bản văn để thực hiện các công việc dịch bản văn chuyên ngành mà không được tự động xử lý bởi thêm bản dịch vào bảng dịch để xử lý tất cả các nhu cầu dịch bản văn. Sử dụng Class

Nếu bạn sử dụng bất kỳ API bản địa hóa nào khi dịch kinh nghiệm của bạn, lắng nghe bất kỳ thay đổi nào về LocaleID của người dùng để phản ứng với người dùng chuyển ngôn ngữ của họ trong một trải nghiệm khi đang ở trong một trải nghiệm.

Khi sử dụng lại mã dịch, bạn nên sử dụng một TranslationHelper ModuleScript để xử lý lỗi và thiếu dịch bản.

Hóa hình ảnh và âm thanh địa phương

Thêm bản địa hóa vượt qua văn bản trong trải nghiệm của bạn bằng cách cung cấp các hình ảnh và âm thanh độc đáo dựa trên vị trí người dùng. Để localize tài nguyên, hãy đầu tiên thêm các nguồn và mục tiêu tài nguy

Tiếng Anh (Nguồn) - rbxassetid://2957093606
Tiếng Tây Ban Nha (es) - rbxassetid://2957093671
Tiếng Bồ Đào Nha (pt) - rbxassetid://2957093727

Để bắt đầu bản địa hóa hình ảnh và âm thanh, hãy thêm các nguồnmục tiêu của bạn vào bảng hiệp nhập của bạn. Các mục hiệp nhập trên bảng hiệp nhập phải bao gồm một như một nhận dạng để đ

Cái này là một ví dụ về một bảng dịch ngữ sử dụng ID tài nguyên:

Chìa khóaNguồnespt
Hình ảnh_chìa khóa_đá quý295709360629570936712957093727

Mã sau đây sẽ thay thế ID tài sản của một ImageLabel bằng ID tài sản Tây Ban Nha cung cấp trong bảng dịch bản địa hóa:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Biến địa phương
local localizedImageID
local localizedImage = Instance.new("ImageLabel")
-- Tải Translator cho "es". Wrap hàm trong pcall() để bảo vệ chống lại các lỗi.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Lấy ID tài sản từ bảng hiệu chỉnh bằng cách tham chiếu Chìa khóa
localizedImageID = translator:FormatByKey("Key_JewelsImage")
-- Thiết lập hình ảnh
localizedImage.Image = "rbxassetid://" .. localizedImageID
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Dịch các dòng riêng lẻ

Trong một số trường hợp, bạn có thể muốn mục tiêu các chuỗi riêng lẻ cho dịch. Translator:Translate() có thể lấy các mục từ bảng dịch bằng cách sử dụng chuỗi nguồn.

Trong ví dụ tiếp theo, hàng sau localization được sử dụng:

Nguồnesespt
Màn hìnhMàn hình2950936712957093727

Script sau đây sẽ in bản dịch tiếng Tây Ban Nha của "Màn hình" vào cửa sổ Thoát :


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Tải Translator cho "es". Wrap hàm trong pcall() để bảo vệ chống lại các lỗi.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Sử dụng chức năng Dịch, cung cấp context và chuỗi
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- Kỳ vịt ra: "Pantalla"
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Sử dụng Overrides Kontext

Có một số trường hợp nơi cùng một chuỗi có thể có nhiều ý nghĩa. Ví dụ, từ "Screen" có thể cho thấy cả một màn hình máy tính và một màn hình cửa sổ, nhưng các bản dịch tiếng Tây Ban Nha hoàn toàn khác nhau.

Cột Context của bảng dịch hội nhập là để quy định các bản dịch qua các trình đơn quy định. Đặc biệt hóa các đối tượng trong trò chơi trên bảng dịch của bạn như trong ví dụ sau:

Kiến ​​thứcNguồnes
Workspace.WindowScreen.SurfaceGui.TextLabelMàn hìnhMosquito
Màn hìnhMàn hình

Các câu script sau đây sử dụng một hành động ngược lại ngữ cảnh để ưu tiên một bản dịch cụ thể:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Tải Translator cho "es". Wrap hàm trong pcall() để bảo vệ chống lại các lỗi.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- sử dụng chức năng Dịch, cung cấp context và chuỗi
local sourceTranslation = translator:Translate( workspace.WindowScreen.SurfaceGui.TextLabel, "Screen")
print(sourceTranslation) -- Kỳ vọng ra: Mosquitero
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Nhiều Kontext

Trong trường hợp của nhiều ngữ cảnh, dịch vụ localization so sánh mối quan hệ mối quan hệ trong trường Context từ phải sang trái , bằng cách sử dụng mối quan tương thíchgần nhất.

Ví dụ, một bảng dịch hội thoại trong trải nghiệm của bạn có thể có những mục dòng Nguồn chung sau đây:

Kiến ​​thứcNguồnes
Workspace.WindowScreen.SurfaceGui.TextLabelMàn hìnhMosquito
playerGui.ScreenGui.TextButtonMàn hìnhMàn hình

Nếu dòng chuỗi "Screen" được thêm vào một playerGui.ScreenGui.TextLabel đối tượng trong trải nghiệm của bạn, dịch vụ localization hiển thị "Mosquitero" như là ngôn ngữ địa phương nhất cùng với ngôn ngữ gần tương thích.

Đang đổi biểu tượng

Khi sử dụng các biến để dịch nội dung động nguyên tắc nội quy, thiết lập giá trị vào một bảng và truyền bảng như một lý do qua API.

Trong ví dụ này, trải nghiệm có một bảng localization với các thành phần sau:

Chìa khóaNguồnes
Giải thưởng_1đá quý 1:intvòng đá quý 1:int
Giải thưởng_2$AmountCash:fixed tiền mặt và NumJewels:int đá quý$AmountCash:fixed tiền mặt và NumJewels:int đá quý

Sử dụng mẫu mã code sau đây để dịch các chuỗi này với giá trị biến:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Tải Translator cho "es". Wrap hàm trong pcall() để bảo vệ chống lại các lỗi.
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("es")
end)
if res then
-- Đặt giá trị tham số trong "Key_Prize_1" lên 100
local keyTranslation1 = translator:FormatByKey("Key_Prize_1", {100})
print(keyTranslation1) -- Kỳ vọng ra: 100 joyas
-- Đặt nhiều tham số lên 500 và 100 theo tên
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- Kỳ vọng ra: $500.00 dinero và 100 trang sức
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Bản chuyển ngôn ngữ

Trong một số trường hợp, bạn có thể muốn hiển thị bản dịch của các ngôn ngữ khác trong trải nghiệm của bạn. Bạn có thể thiết lập một người dịch mới với một mã quốc gia khác bằng cách sử dụng LocalizationService:GetTranslatorForLocaleAsync() .

Các mẫu mã code sau đây thiết lập một người dịch với một mã quốc gia hướng dẫn và một người dịch nâng cấp dựa trên cài đặt ngôn ngữ toàn cầu của người dùng:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Biến địa phương
local player = Players.LocalPlayer
-- Tải Translator cho "pt". Wrap các hàm Translator trong một pcall() để bảo vệ chống lại các lỗi.
local res1, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("pt")
end)
-- Tải thứ hai Translator với ngôn ngữ của người chơi, trong ví dụ này "es"
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Sử dụng chức năng Dịch với người dịch đầu tiên
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- Kỳ vọng ra力在 pt: joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
-- Sử dụng chức năng Dịch với người dịch thứ hai
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- Thông báo ra mắt trong trường hợp người dùng được thiết lập 'es': jóias
else
print('GetTranslatorForPlayerAsync failed: ' .. fallbackTranslator)
end

Phản ứng đối với người dùng chuyển ngôn ngữ

Người dùng có thể thay đổi cài đặt ngôn ngữ của họ bất cứ lúc nào bằng cách sử dụng menu Cài đặt trong trải nghiệm của họ. Điều này thay đổi cài đặt ngôn ngữ mà không phải là scripting localization assets, ví dụ như các chuỗi được xử lý bởi bản dịch tự độ

Cài đặt ngôn ngữ trong kinh nghiệm
Người dùng có thể chọn ngôn ngữ có sẵn đã được cài đặt trong trải nghiệm

Để đảm bảo rằng các tài nguyên địa phương của bạn được cập nhật đúng cách, hãy lắng nghe sự kiện Class.Instance.GetPropertyChangedSignal|

Các mẫu mã sau đây in ID Ngôn ngữ của người dùng và ID Ngôn ngữ của hành động Translator đối với người dùng khi người dùng chuyển ngôn ngữ:


local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- Nếu GetTranslatorForPlayerAsync thành công, nó sẽ trả lại một Translator cho người người chơihiện tại của người dùng
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- Hành động được gọi khi phát hiện ID ngôn ngữ của người chơi
local function OnLocaleIdChanged()
print("Translator has changed to: " .. translator.LocaleId)
-- Bạn nên dịch lại bất kỳ tài nguyên được dịch bằng API localization nào sang ngôn ngữ mới của người chơi ở đây
end
-- Kiểm tra nếu GetTranslatorForPlayerAsync thành công
if res then
-- Nếu thành công, dịch tài nguyên ở đây bằng người dịch
-- Lắng nghe một thay đổi trong ID ngữ cảnh của người chơi
translator:GetPropertyChangedSignal("LocaleId"):Connect(OnLocaleIdChanged)
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

Tạo một mô-đun TranslationHelper

Khi bạn tải các máy dịch theo ngôn ngữ mặc định của người chơi, bạn có thể sử dụng lại mã. Để sử dụng lại mã, hãy cài đặt một trợ giúp ModuleScript an toàn tải các máy dịch theo ngôn ngữ mặc định của người chơi và bao gồm các chức năng cung cấ

Mẫu mã code sau đây thực hiện một TranslationHelper mà bạn có thể sao chép vào dự án của riêng bạn như một ModuleScript trong ReplicatedStorage :


local TranslationHelper = {}
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Biến địa phương
local player = Players.LocalPlayer
local sourceLanguageCode = "en"
-- Nhận người dịch
local playerTranslator, fallbackTranslator
local foundPlayerTranslator = pcall(function()
playerTranslator = LocalizationService:GetTranslatorForPlayerAsync(player)
end)
local foundFallbackTranslator = pcall(function()
fallbackTranslator = LocalizationService:GetTranslatorForLocaleAsync(sourceLanguageCode)
end)
-- Tạo một phương thức TranslationHelper.setLanguage để tải một bản dịch mới cho TranslationHelper
function TranslationHelper.setLanguage(newLanguageCode)
if sourceLanguageCode ~= newLanguageCode then
local success, newPlayerTranslator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync(newLanguageCode)
end)
--Chỉ đổi mới nhà cung cấp dịch nếu nhà cung cấp mới đó hợp lệ (fallbackTranslator vẫn là ngôn ngữ nguồn kinh nghiệm)
if success and newPlayerTranslator then
playerTranslator = newPlayerTranslator
return true
end
end
return false
end
-- Tạo một chức năng Dịch chuyển sử dụng một người dịch chuyển mặc định nếu người đầu tiên không tải hoặc trả lại thành công. Bạn cũng có thể thiết lập người được tham chiếu đến mặc định cho người chơi game genéric
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
-- Tạo một hàm KeyByFormat để sử dụng một người dịch nội suy nghĩa nếu thứ nhất không tải hoặc trả lại thành công
function TranslationHelper.translateByKey(key, arguments)
local translation = ""
local foundTranslation = false
-- Lần đầu tiên cố gắng dịch cho ngôn ngữ của người chơi (nếu có người dịch)
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

Một khi module đã ở trong ReplicatedStorage , yêu cầu nó từ một LocalScript để gọi các hàm của module. Mã sau đây sử dụng chức năng hỗ trợ của module để dịch một dòng chuỗi cụ thể:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Yêu cầu một module dịch
local TranslationHelper = require(ReplicatedStorage:WaitForChild("TranslationHelper"))
-- Sử dụng các chức năng được cung cấp trong TranslationHelper
TranslationHelper.setLanguage("es")
local sourceTranslation = TranslationHelper.translate("Screen")
print(sourceTranslation) -- Expected Output in 'es': "Pantalla"