スクリプトを使用した多言語化

多言語化テーブルに翻訳を追加しても自動的に処理されない特殊な翻訳タスクには、多言語化 API を使用できます。 Roblox(ロブロックス)は、すべての多言語化スクリプトのニーズを処理するためにLocalizationServiceを提供しています。 以下のタスクにはLocalizationServiceを使用します。

バーチャル空間を翻訳しているときに何らかの多言語化 API を使用する場合、ユーザーのロケール ID の変更に注意を払い、バーチャル空間内に言語を切り替えたユーザーに対応します。

翻訳コードを再利用している場合には、エラーや不足している翻訳を処理するためにTranslationHelper ModuleScriptを使用する必要があります。

画像とサウンドの多言語化

ユーザーのロケールに応じたユニークな画像やサウンド(音声)を提供することで、バーチャル空間にテキスト以外の多言語化ができます。 アセットを翻訳するには、まずソースターゲットアセット ID をバーチャル空間の多言語化テーブルに追加し、次に多言語化 API を使用してさまざまなアセットを取得します。

English (Source) - rbxassetid://2957093606
Spanish(es)-rbxassetid://2957093671
Portuguese (pt) - bxassetid://2957093727

画像やサウンドの翻訳を開始するには、多言語化テーブルにソースターゲットアセット ID を追加します。 多言語化テーブル上のアセット ID 入力には、API によって呼び出される識別子としてキーを入れる必要があります。 以下は、アセット ID を使用した多言語化テーブル上の入力例です。

キーソースespt
Key_JewelsImage295709360629570936712957093727

以下のコードは、ImageLabelのアセット ID を多言語化テーブルで提供されているスペイン語のアセット ID に置き換えます


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalizationService = game:GetService("LocalizationService")
-- Local 変数
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 failed: ' .. translator)
end

個々の文字列の翻訳

状況によっては、翻訳のために個々の文字列をターゲットにしたくなる場合があります。 Translator:Translate()は、多言語化テーブルの個々のエントリをソース文字列に基づいて取り込むことができます。

次の例では、以下の多言語化エントリが使用されます。

ソースesespt
ScreenPantalla2950936712957093727

以下のスクリプトは、「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
-- オブジェクトのコンテキストと文字列を提供して翻訳関数を使用
local sourceTranslation = translator:Translate(game, "Screen")
print(sourceTranslation) -- Expected Output: "Pantalla"
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

コンテキストオーバーライドの使用

同じ文字列が複数の意味を持つ場合があります。 たとえば、「Screen」という英単語は、パソコン画面とウィンドウ画面の両方を表すことができますが、スペイン語の翻訳では全く違います。

多言語化テーブルのコンテキストの列はコンテキストの上書きによる翻訳を指定するためのものです。 以下の例のように、多言語化テーブル上のゲーム内オブジェクトを指定します。

コンテキストソースes
workspace.WindowScreen.SurfaceGui.TextLabelScreenMosquitero
ScreenPantalla

以下のスクリプトは、特定の翻訳の優先順位付けのためにコンテキストの上書きを使用します。


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) -- Expected Output: Mosquitero
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

複数のコンテキスト

複数のコンテキストの場合、翻訳サービスは、最も近い一致を使用して、コンテキストフィールド内オブジェクト関係を右から左に比較します。

例えば、バーチャル空間内の多言語化テーブルには、以下の共有ソース文字列エントリが含まれていることがありま

コンテキストソースes
workspace.WindowScreen.SurfaceGui.TextLabelScreenMosquitero
playerGui.ScreenGui.TextButtonScreenPantalla

文字列「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) -- Expected Output: 100 joyas
-- 複数のパラメータを名前で500と100に設定
local keyTranslation2 = translator:FormatByKey("Key_Prize_2", {AmountCash=500, NumJewels=100})
print(keyTranslation2) -- Expected Output: $500.00 dinero y 100 joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end

言語の切り替え

場合によっては、バーチャル空間内の他の言語の翻訳を表示したい場合があります。 LocalizationService:GetTranslatorForLocaleAsync()を使用して、別の国コードで新しい翻訳者を設定できます。

以下のコードサンプルでは、手動で国コードを使用して、1 人の翻訳者を設定し、ユーザーのグローバルロケール設定に基づいてもう一人の翻訳者を設定します。


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)
-- 2番目の翻訳者はプレイヤーのロケールで読み込む。この例は"es"
local res2, fallbackTranslator = pcall(function()
return LocalizationService:GetTranslatorForPlayerAsync(player)
end)
-- 翻訳関数を最初の翻訳者で使用
if res1 then
local translate1 = translator:Translate(game, "jewels")
print(translate1) -- Expected Output in pt: joyas
else
print('GetTranslatorForPlayerAsync failed: ' .. translator)
end
-- 2番目の翻訳者で翻訳関数を使用
if res2 then
local translate2 = fallbackTranslator:Translate(game, "jewels")
print(translate2) -- Expected Output in if user is set to 'es': jóias
else
print('GetTranslatorForPlayerAsync failed: ' .. fallbackTranslator)
end

言語を切り替えるユーザーへの対応

ユーザーは、バーチャル空間内の設定メニューを使用して、いつでも言語設定を変更できます。 このユーザー設定の変更は、自動翻訳で処理される文字列など、非スクリプト翻訳アセットを自動的に更新しますが、GUI 画像やサウンドなど、すでにレンダリングされているスクリプト翻訳変更は更新されません。

バーチャル空間内の言語設定
ユーザーは、バーチャル空間に設定された利用可能な言語を選択できます

スクリプト化された翻訳アセットが正しく更新されることを保証するには、LocalizationService.GetTranslatorForPlayerAsyncにより返されるTranslatorインスタンスのロケール ID プロパティの変更のGetPropertyChangedSignalイベントをお聞きください。 LocalizationService.GetTranslatorForPlayerAsyncを使用する場合、エラーが発生すると、pcall内で関数をラップします。

以下のコードサンプルは、ユーザーのロケール ID と、ユーザーが言語を切り替える際のユーザーの翻訳インスタンスのロケール ID を表示します。


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を設定します。

以下のコードサンプルは、ReplicatedStorageModuleScriptとして、自分のプロジェクトにコピーできる TranslationHelper が実装されています。


local TranslationHelper = {}
local LocalizationService = game:GetService("LocalizationService")
local Players = game:GetService("Players")
-- Local 変数
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に新しい翻訳を読み込んでTranslationHelper.setLanguage メソッドを作成
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
-- 最初の読み込みができなかったり、返してこなかった場合、フォールバック翻訳を使用する翻訳関数を作成します。 参照されたオブジェクトを一般的なゲームオブジェクトのデフォルトに設定することもできます
function TranslationHelper.translate(text, object)
if not object then
object = game
end
local translation = ""
local foundTranslation = false
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) -- Expected Output in 'es': "Pantalla"