Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築
Search
gree_tech
PRO
October 13, 2023
Technology
0
1.9k
Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築
GREE Tech Conference 2023で発表された資料です。
https://techcon.gree.jp/2023/session/TrackB-3
gree_tech
PRO
October 13, 2023
Tweet
Share
More Decks by gree_tech
See All by gree_tech
変わるもの、変わらないもの :OSSアーキテクチャで実現する持続可能なシステム
gree_tech
PRO
0
2.1k
マネジメントに役立つ Google Cloud
gree_tech
PRO
0
24
今この時代に技術とどう向き合うべきか
gree_tech
PRO
3
2.4k
生成AIを開発組織にインストールするために: REALITYにおけるガバナンス・技術・文化へのアプローチ
gree_tech
PRO
0
150
安く・手軽に・現場発 既存資産を生かすSlack×AI検索Botの作り方
gree_tech
PRO
0
140
生成AIを安心して活用するために──「情報セキュリティガイドライン」策定とポイント
gree_tech
PRO
1
1.3k
あうもんと学ぶGenAIOps
gree_tech
PRO
0
260
MVP開発における生成AIの活用と導入事例
gree_tech
PRO
0
280
機械学習・生成AIが拓く事業価値創出の最前線
gree_tech
PRO
0
190
Other Decks in Technology
See All in Technology
Debugging Edge AI on Zephyr and Lessons Learned
iotengineer22
0
120
Snowflakeでデータ基盤を もう一度作り直すなら / rebuilding-data-platform-with-snowflake
pei0804
2
560
Ruby で作る大規模イベントネットワーク構築・運用支援システム TTDB
taketo1113
1
200
Kiro Autonomous AgentとKiro Powers の紹介 / kiro-autonomous-agent-and-powers
tomoki10
0
310
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
4
900
20251209_WAKECareer_生成AIを活用した設計・開発プロセス
syobochim
5
1.3k
非CUDAの悲哀 〜Claude Code と挑んだ image to 3D “Hunyuan3D”を EVO-X2(Ryzen AI Max+395)で動作させるチャレンジ〜
hawkymisc
1
160
regrowth_tokyo_2025_securityagent
hiashisan
0
170
計算機科学をRubyと歩む 〜DFA型正規表現エンジンをつくる~
ydah
3
190
【CEDEC+KYUSHU2025】学生・若手必見!テクニカルアーティスト 大全 ~仕事・スキル・キャリアパス、TAの「わからない」を徹底解剖~
cygames
PRO
0
140
グレートファイアウォールを自宅に建てよう
ctes091x
0
140
5分で知るMicrosoft Ignite
taiponrock
PRO
0
210
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Documentation Writing (for coders)
carmenintech
76
5.2k
BBQ
matthewcrist
89
9.9k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Agile that works and the tools we love
rasmusluckow
331
21k
Side Projects
sachag
455
43k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Transcript
Unity,PHP+Jenkins+GAS 多言語対応を意識させない 開発を目指したシステム構築 株式会社ポケラボ 基盤エンジニア 篠原 功
自己紹介 • 篠原 功 (Isao Shinohara) ◦ 2013年株式会社ポケラボに入社。 ◦ 「SINoALICE
-シノアリス-」「アサルトリリィ Last Bullet」などを経て 現在は基盤チームに所属。 ◦ ローカライズやリソース管理のシステム構築を中心に 「開発・運用フローも踏まえた最適化」を目指して絶賛開発中。 2
• これまでの海外対応状況と課題点・改修方針 • システム化のための実装ルール • 翻訳依頼から反映までの作業フロー • 積み残しになっている課題 • まとめ
アジェンダ 3
• 多言語対応のために開発メンバーにお願いしている具体的な実装ルール • ゲーム内で使っている日本語テキストの抽出や翻訳後のフロー 話すこと 4
• 言語や地域の違いで発生する問題 • リリース済みアプリを多言語対応するために役立つ情報 • 画像に埋め込まれた日本語テキストやフォントなど 話さないこと(話せないこと) 5
• これまでの海外対応状況と課題点・改修方針 • システム化のための実装ルール • 翻訳依頼から反映までの作業フロー • 積み残しになっている課題 • まとめ
アジェンダ 6
• 海外対応状況 ◦ 「SINoALICE -シノアリス-」「戦姫絶唱シンフォギア XD UNLIMITED」 などいくつかのアプリですでに海外リリース実績あり • 開発体制
◦ 日本版リリース後、海外版をリリース ◦ 開発チームは日本版、開発版で別チーム これまでの海外対応状況 7
課題点 • 日本語テキストの抽出作業負担 • 連番によるID管理と翻訳間違い • git管理で発生していたコンフリクト問題 • 翻訳チェックと巻き戻し作業の負荷 8
日本語テキストの抽出作業負担 • 内容 ◦ 実装が完了したタイミングでプランナー、エンジニアそれぞれが 翻訳対象となるテキストをまとめていた • 課題 ◦ 日本語テキスト実装箇所は多岐に渡るので抽出が大変
◦ 手動で行うため抜け漏れが発生する可能性がある 9
連番によるID管理と翻訳間違い • 内容 ◦ 翻訳対象の日本語テキストに対し連番 IDを付与 ▪ ID:1 おはよう ▪
ID:2 こんにちは ▪ ID:3 こんばんは ◦ 開発メンバーは日本語テキストと対応した IDを関連付ける • 課題 ◦ 日本語テキスト実装箇所は多岐に渡るので IDの関連付け作業が大変 ◦ 番号を間違えると誤った翻訳が行われる可能性がある ◦ 一度IDを割り振ったら変更することは至難 10
git管理で発生していたコンフリクト問題 • 内容 ◦ 翻訳データはcsv形式で保存しGitHub上で管理 • 課題 ◦ 同じcsvファイルを編集することがありコンフリクトが発生していた ◦
作業者にはgitのスキルが求められる 11
• 内容 ◦ QAチームは翻訳されたテキストを実機上ですべて確認 • 課題 ◦ 翻訳漏れが発生した場合の巻き戻し作業が多い ◦ 翻訳漏れは五月雨に発覚することもある
翻訳チェックと巻き戻し作業の負担 12
課題を踏まえた対応方針 13
課題点 • 日本語テキストの抽出作業負担 • 連番によるID管理と翻訳間違い • git管理で発生していたコンフリクト問題 • 翻訳チェックと巻き戻し作業の負担 14
翻訳が必要な日本語テキストを自動抽出 • 対応 ◦ ゲーム内で利用しているテキストすべてを自動で抽出できるようにする • 期待 ◦ 手動で日本語テキストを集めていた労力がなくなる ◦
翻訳漏れが発生した際の手戻りもなくなる ◦ QAチームの確認範囲を限定 15
課題点 • 日本語テキストの抽出作業負担 • 連番によるID管理と翻訳間違い • git管理で発生していたコンフリクト問題 • 翻訳チェックと巻き戻し作業の負担 16
IDを連番から日本語ハッシュ値に変更 • 内容 ◦ IDを日本語を元に生成したハッシュ値に変更 ▪ 例:) こんにちは • ID:
1 -> ID: 20427A708C3F6… • 期待 ◦ IDの採番と関連付けのための実装が不要になる ◦ IDの割り当て間違いによる誤った翻訳が防げる 17
課題点 • 日本語テキストの抽出作業負担 • 連番によるID管理と翻訳間違い • git管理で発生していたコンフリクト問題 • 翻訳チェックと巻き戻し作業の負担 18
GoogleSpreadSheetを利用 • 内容 ◦ 翻訳作業はGoogleSpreadSheetで行う • 期待 ◦ gitスキルが不要になる ◦
Web公開することで外部サービスとの連携が可能に 19
対応方針 • 翻訳が必要な日本語テキストを自動抽出 • IDを連番から日本語ハッシュ値に変更 • GoogleSpreadSheetを利用 20
所感・実装コンセプト • 所感 ◦ 日本語の開発完了後から翻訳対応までの作業量が多い ◦ どのような実装になっているかでその作業量は大幅に変わる • 実装コンセプト ◦
日本向けに開発しているメンバーがいつも通り作業をしているだけで 多言語対応のための実装も完了している 21
• これまでの海外対応状況と課題点・改修方針 • システム化のための実装ルール • 翻訳依頼から反映までの作業フロー • 積み残しになっている課題 • まとめ
アジェンダ 22
翻訳対象 • クライアント (Unity) ◦ シーン・プレハブ ▪ TextMeshProなどのコンポーネント ▪ SerializeField
◦ ソースコード (C#) ◦ ScriptableObject • サーバー (PHP, Spanner, Smarty) ◦ マスタデータ ◦ yaml ◦ ユーザーデータ ◦ WebView 23
シーン・プレハブ • 対象箇所 ◦ シーン、プレハブでアタッチしている TextMeshProなどのテキストコンポーネント • 実装ルール ◦ 翻訳用のコンポーネントをアタッチ
▪ 翻訳不要でもアタッチ • 抽出方法 ◦ AssetDatabase.FindAssets("t:Scene t:Prefab"); ◦ GameObjectにアタッチされているテキスト コンポーネントから翻訳対象テキストを取得 • 表示処理 ◦ シーン、プレハブをアクティブにするタイミングで 各言語の翻訳テキストに置き換え 24
SerializeField • 対象箇所 ◦ public stringや[SerializeField] private stringで 作成した変数にインスペクターから入力している テキスト
• 実装ルール ◦ 使用禁止 • 理由 ◦ 翻訳対象の日本語テキストを抽出するのが難しい ◦ 翻訳処理を通しているかの保証ができない 25
ScriptableObject • 対象箇所 ◦ ScriptableObject内に含まれるテキストデータ ◦ ADVパートのシナリオ管理に利用 • 実装ルール ◦
なし • 抽出方法 ◦ ScriptableObjectファイルをロード後、 翻訳対象の日本語テキストを取得 • 表示処理 ◦ 言語毎に翻訳された JSONファイルを用意して管理 ▪ story.asset -> story_en-Latn.json, story_ko-Kore.json ▪ JsonUtility.ToJson(); ◦ 空のScriptableObjectにJSONのデータを反映 ▪ JsonUtility.FromJsonOverwrite(); 26
ソースコード (C#) • 対象箇所 ◦ ソースコードに直に記述している日本語テキスト • 実装ルール ◦ 決められたクラス内に定義
◦ プロパティ形式にして翻訳メソッドを通す ◦ 決められたクラス以外で定義することは禁止 • 抽出方法 ◦ 決められたクラス内に存在する string or string[] を返すプロパティから翻訳対象のテキストを取得 • 表示処理 ◦ プロパティ利用時に各言語の翻訳テキストを返却 27
マスタデータ • 対象箇所 ◦ Spannerで管理されている全ユーザー共通データ • 実装ルール ◦ なし •
抽出方法 ◦ テーブルのスキーマ情報から STRING(XX)で 定義されているカラムの値を取得 • 表示処理 ◦ 言語毎に翻訳済みのマスタテーブルを用意し、 利用時に対象テーブルを切り替える ▪ ItemMst -> ItemMst_en-Latn, ItemMst_ko-Kore 28
yaml • 対象箇所 ◦ yamlファイル内に記述しているテキスト • 実装ルール ◦ なし •
抽出方法 ◦ 正規表現で「ひらがな」「カタカナ」「漢字」を 含んだテキストを抽出 ◦ 英語で記述されたテキストも翻訳対象だった ケースにどう対応するかは課題 ▪ 例:) HP, MP • 表示処理 ◦ yamlのパース処理後に対象日本語テキストを 各言語の翻訳テキストに置き換え ◦ 置き換えたyamlは言語毎にキャッシュ 29
ユーザーデータ • 対象箇所 ◦ データベースにユーザー個別で記録している 日本語テキスト • 実装ルール ◦ 日本語テキストで記録
• 抽出方法 ◦ マスタデータやyamlに記載されている 日本語テキストの場合は必要なし ◦ 上記以外の日本語テキストを利用するケースに どう対応するかは課題 • 表示処理 ◦ テーブルからデータ取得時に日本語テキストを 各言語の翻訳テキストに置き換える 30
WebView • 対象箇所 ◦ テンプレートファイル内に直接記述されている 日本語テキスト ◦ テンプレートエンジンを利用してプログラムから 埋め込まれている文字列 ▪
マスタデータやyamlに記載されている 日本語テキストの場合は必要なし • 実装ルール ◦ なし • 抽出方法 ◦ テンプレートファイル内の要素を取得 (予定) • 表示処理 ◦ テンプレート内に直接記述されている 日本語テキストはロード時に各言語の翻訳テキスト へと置き換える(予定) 31
• これまでの海外対応状況と課題点・改修方針 • システム化のための実装ルール • 翻訳依頼から反映までの作業フロー • 積み残しになっている課題 • まとめ
アジェンダ 32
翻訳対象となる日本語テキストの抽出フロー 33
翻訳対象となる日本語テキストの抽出フロー 34 ①
翻訳対象となる日本語テキストの抽出フロー 35 ② ②
翻訳対象となる日本語テキストの抽出フロー 36 ③ ③
翻訳対象となる日本語テキストの抽出フロー 37 ④ ④
Google Spread Sheet 38
Google Spread Sheet 39
Google Spread Sheet 40
Google Spread Sheet 41
Google Spread Sheet 42
Google Spread Sheet 43
翻訳作業後のフロー 44
翻訳作業後のフロー 45 ①
翻訳作業後のフロー 46 ②
翻訳作業後のフロー 47 ③
翻訳作業後のフロー 48 ④
翻訳作業後のフロー 49 ⑤
• これまでの海外対応状況と課題点・改修方針 • システム化のための実装ルール • 翻訳依頼から反映までの作業フロー • 積み残しになっている課題 • まとめ
アジェンダ 50
UI テキストエリアのサイズ問題 • 内容 ◦ 言語によってはテキストがエリア内に収まらない問題 • 原因 ◦ 想定されるケース、解決方法が多岐にわたりシステム化が難しい
• 方針 ◦ 現時点で良い案がないことを周知 ◦ ノウハウが溜まりシステム化できるまでは 1箇所1箇所対応 51
「やってはいけないこと」の厳守 • 内容 ◦ 開発メンバーが「やってはいけない」を「やってしまってはいないか?」 • 原因 ◦ 「やってはいけないこと」の対象範囲が広い ◦
チェックツールの作成も難しい • 方針 ◦ 現場レベルで各個人に厳守していただくことを口頭でお願い ◦ 問題ひとつひとうに対して泥臭く対応 52
• これまでの海外対応状況と課題点・改修方針 • システム化のための実装ルール • 翻訳依頼から反映までの作業フロー • 積み残しになっている課題 • まとめ
アジェンダ 53
実装ルール • クライアント (Unity) ◦ シーンやプレハブには必ず翻訳用のコンポーネントをアタッチ ◦ テキストは決められたクラスに定義 ▪ プロパティ形式で翻訳処理を通す
▪ 特定クラス以外以外は使用禁止 ◦ SerializeFieldを使った日本語テキストの利用は禁止 • サーバー (PHP, Spanner, Smarty) ◦ 基本なし。ただし注意点あり。 ▪ ユーザーデータに日本語テキストを保存する場合は日本語テキストのまま ▪ yamlに定義したテキストは英語のみだと翻訳されないので注意 54
今後の展望 • システムはまだ発展途上 ◦ ゲームはまだリリースもされていない ◦ 翻訳チームの要望もまだ組み込めていない ◦ QAチームの要望もまだ組み込めていない •
実装したい機能 ◦ デバッグツール ◦ Slack連携 55
56