คุณสามารถใช้ API การแปลในท้องถิ่นสำหรับงานแปลเฉพาะที่ไม่ได้รับการจัดการโดย เพิ่มการแปล ในตารางการแปล โรบ็อกสนับสนุน LocalizationService สำหรับการจัดกา
หากคุณใช้ API การแปลใด ๆ เมื่อแปลประสบการณ์ของคุณ ฟังสำหรับการเปลี่ยนแปลงใด ๆ ใน LocaleID ของผู้ใช้เพื่อ ตอบสนองต่อผู้ใช้ที่เปลี่ยนภาษาของพวกเขาในขณะที่อยู่ในประสบการณ์
เมื่อใช้รหัสแปลใหม่ คุณควรใช้ TranslationHelper ModuleScript เพื่อจัดการข้อผิดพลาดและข้อแปลที่หายไป
การแปลภาพและเสียง
เพิ่มการแปลในพื้นที่นอกเหนือข้อความในประสบการณ์ของคุณโดยการให้รหัสภาพและเสียงที่ไม่เหมือนกันตามภูมิภาคของผู้ใช้ เพื่อให้สินทรัพย์ในพื้นที่นี้ ให้เพิ่ม
เพื่อเริ่มต้นการแปลภาพและเสียงให้เริ่มต้นด้วยการเพิ่ม ทรัพยากรของคุณ และ เป้าหมายของคุณ ในโต๊ะการแปลของคุณ รายการ ID ทรัพยากรในโต๊ะการแปล
ต่อไปนี้คือตัวอย่างการเขียนโค้ดในตารางการแปลโดยใช้รหัสสัญลักษณ์:
กุญแจ | ที่มา | es | ปท |
---|---|---|---|
รูปปั้นสําคัญ | 2957093606 | 2957093671 | 2957093727 |
รหัสต่อไปนี้จะแทนที่รหัสสินทรัพย์ของ ImageLabel ด้วยรหัสสินทรัพย์สเปนที่ให้ในตารางการแปลภาษา:
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
-- รับรหัสสินทรัพย์จากโต๊ะการแปลโดยอ้างอิงจากกุญแจ
localizedImageID = translator:FormatByKey("Key_JewelsImage")
-- ตั้งรูป
localizedImage.Image = "rbxassetid://" .. localizedImageID
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
แปลสตริงแต่ละบุคคล
ในบางสถานการณ์คุณอาจต้องการเป้าหมายสตริงเฉพาะสำหรับการแปล Translator:Translate() สามารถดึงเอาเนื้อหาของสตริงเฉพาะได้จากโต๊ะการแปลขึ้นอ้างอิงตามสตริงที่แหล่ง
ในตัวอย่างต่อไปนี้ใช้รายการ localization ต่อไปนี้:
ที่มา | es | es | ปท |
---|---|---|---|
หน้าจอ | แพนตาลล่า | 295093671 | 2957093727 |
สคริปต์ต่อไปนี้จะพิมพ์คำแปลภาษาสเปนของ "หน้าจอ" ใน หน้าต่าง ที่:
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
-- ใช้งานฟังก์ชันแปลภาษา ซึ่งให้บริบายข้อมูลและสตริงตัวอักษร
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- คาดหวังออกมา: "Pantalla"
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
การใช้งาน Overrides ของบริบท
มีบางกรณีที่สตริงเดียวอาจมีหลายความหมาย เช่น "หน้าจอ" สามารถแสดงทั้งหน้าจอคอมพิวเตอร์และหน้าจอหน้าต่าง แต่คำแปลภาษาสเปนแตกต่างกันอย่างสมบูรณ์
คอลัม บริบท ของโต๊ะการแปลคือสำหรับการระบุคำแปลผ่านการเปลี่ยนแปลงบริบทของคอนเท็กส์ ระบุวัตถุในเกมในโต๊ะการแปลของคุณด้วยวิธีต่อไปนี้:
บริบท | ที่มา | es |
---|---|---|
Workspace.WindowScreen.SurfaceGui.TextLabel | หน้าจอ | โมสกิตโตร |
หน้าจอ | แพนตาลล่า |
สคริปต์ต่อไปนี้ใช้ค่าเปลี่ยนแปลงบริบที่จะเรียงลำดับการแปลเฉพาะ:
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
-- ใช้งาน หน้าแปล เพื่อให้ข้อมูลบริบทของตัวอักษรและสตริง
local sourceTranslation = translator:Translate( workspace.WindowScreen.SurfaceGui.TextLabel, "Screen")
print(sourceTranslation) -- การออกมาตรฐาน: Mosquitero
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
หลายบริบท
ในกรณีของหลายบริบท บริการลอกอินจะเปรียบเทียบความสัมพันธ์ของเหตุการณ์ในฟิลด์บริบท จากซ้ายไปขวา ตรงกัน
เช่นตารางแปลในประสบการณ์ของคุณอาจมีรายการสตริงที่แชร์ของแหล่งที่มาต่างๆ ด้วย
บริบท | ที่มา | es |
---|---|---|
Workspace.WindowScreen.SurfaceGui.TextLabel | หน้าจอ | โมสกิตโตร |
playerGui.ScreenGui.TextButton | หน้าจอ | แพนตาลล่า |
หากสตริง "Screen" ถูกเพิ่มใน playerGui.ScreenGui.TextLabel วัตถุในประสบการณ์ของคุณ บริการลอกเลขที่พูดคุยจะแสดง "Mosquitero" ตรงกัน
การแทนที่ตัวอักษร
เมื่อใช้ตัวแปรเพื่อแปล เนื้อหาดินามิก ตั้งค่ามูลค่าให้เป็น ตาราง และส่งตารางผ่าน API
ในตัวอย่างนี้ ประสบการณ์มีตารางการแปลภาษาที่มีรายการต่อไปนี้:
กุญแจ | ที่มา | es |
---|---|---|
รางวัล_1 | เครื่องประดับ 1:int ชิ้น | เครื่องประดับ 1:int |
รางวัล_2 | เงิน $AmountCash:fixed และ NumJewels:int เพชร | $AmountCash:fixed ดินเนอร์และ NumJewels:int เครื่องประดับ |
ใช้ตัวอย่างรหัสต่อไปนี้เพื่อแปลค่าตัวแปรเหล่านี้ด้วย:
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 อัญมณี
-- ตั้งค่าตัวแปรหลายตัวให้เป็น 500 และ 100 ตามชื่อ
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- คาดว่าจะได้รับ: $500.00 เงินและ 100 อัญมณี
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
การเปลี่ยนภาษา
ในบางกรณีคุณอาจต้องการแสดงคำแปลของภาษาอื่นในประสบการณ์ของคุณ คุณสามารถตั้งค่าผู้แปลใหม่ด้วยรหัสประเทศที่แตกต่างกันโดยใช้ LocalizationService:GetTranslatorForLocaleAsync()
ตัวอย่างรหัสต่อไปนี้ตั้งค่าผู้แปลภาษาหนึ่งด้วยรหัสประเทศแมนวลและรหัสผู้แปลเพิ่มเติมที่ขึ้นอยู่กับการตั้งค่าภาษาของผู้ใช้:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- แปรตั้งค่าในท้องถิ่น
local player = Players.LocalPlayer
-- โหลด Translator สำหรับ "pt" หุ้มคุณสมบัติ Translator ภายใน pcall() เพื่อป้องกันการล้มเหลว
local res1, translator = pcall(function()
return LocalizationService:GetTranslatorForLocaleAsync("pt")
end)
-- โหลดผู้แปลภาษาที่สองด้วยภาษาของผู้ใช้ในตัวอย่างนี้ "es"
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- ใช้งาน หน้าแปล กับผู้แปลคนแรก
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- คาดหวังออกมาใน pt: joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
-- ใช้งานฟังก์ชันแปลภาษาด้วย Translator ตัวที่สอง
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- คาดหวังผลลัพธ์ในกรณีที่ผู้ใช้ตั้งค่าเป็น 'es': jóias
else
print('GetTranslatorForPlayerAsync failed: ' .. fallbackTranslator)
end
ตอบสนองต่อผู้ใช้เปลี่ยนภาษา
ผู้ใช้สามารถเปลี่ยนการตั้งค่าภาษาของพวกเขาได้ตลอดเวลาโดยใช้เมนูการตั้งค่าในประสบการณ์ของพวกเขา นี้การตั้งค่าเปลี่ยนอัตโนมัติไม่สคริปต์ไม่เครื่องมือแปลของเราเหมาะ
เพื่อให้แน่ใจว่าสคริปต์ของคุณอัปเดตเนื้อหาในท้องถิ่นได้อย่างถูกต้อง ฟังก์ชัน Class.Instance
ตัวอย่างรหัสต่อไปนี้พิมพ์ ID ภาษาของผู้ใช้และ ID ภาษาของโครงการ Translator สำหรับผู้ใช้เมื่อผู้ใช้เปลี่ยนภาษา:
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- หาก GetTranslatorForPlayerAsync ประสบความสำเร็จ จะกลับมาที่นักแปลภาษาสำหรับตำแหน่งภาษาปัจจุบันของผู้เล่น
local res, translator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- ฟังก์ชันที่ถูกเรียกเมื่อตรวจพบ ID ภูมิภาคของผู้เล่น
local function OnLocaleIdChanged()
print("Translator has changed to: " .. translator.LocaleId)
-- คุณควรแปลเนื้อหาใด ๆ ที่แปลโดยใช้ API การแปลภาษาของโครงสร้างผู้สนับสนุนท้องถิ่นเป็นภาษาใหม่ของผู้เล่นที่นี่
end
-- ตรวจสอบว่า GetTranslatorForPlayerAsync ประสบความสำเร็จหรือไม่
if res then
-- หากประสบความสำเร็จให้แปลสินทรัพย์ที่นี่โดยใช้ผู้แปล
-- ฟังสำหรับการเปลี่ยนแปลง ID ของภาษาผู้เล่น
translator:GetPropertyChangedSignal("LocaleId"):Connect(OnLocaleIdChanged)
else
print('GetTranslatorForPlayerAsync failed: ' .. 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)
--เฉพาะเปลี่ยนแปลงปัจจุบันของผู้เล่นถ้ามันถูกต้อง (fallbackTranslator จะเป็นภาษาที่ใช้ในประสบการณ์)
if success and newPlayerTranslator then
playerTranslator = newPlayerTranslator
return true
end
end
return false
end
-- สร้างฟังก์ชันแปลที่ใช้ตัวแปลภาษาเดิมหากตัวแรกล้มเหลวในการโหลดหรือกลับมาสำเร็จ คุณยังสามารถตั้งค่าตัวแปลภาษาเดิมเป็นค่าเริ่มต้นไปยังวัตถุเกมทั่วไป
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"))-- ใช้หน้างานที่มีให้ใน TranslationHelperTranslationHelper.setLanguage("es")local sourceTranslation = TranslationHelper.translate("Screen")print(sourceTranslation) -- Expected Output in 'es': "Pantalla"