Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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.3k
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
REALITY株式会社における開発生産性向上の取り組み: 失敗と成功から学んだこと
gree_tech
PRO
2
130
『ヘブンバーンズレッド』におけるフィールドギミックの裏側
gree_tech
PRO
2
91
セキュリティインシデント対応の体制・運用の試行錯誤 / greetechcon2024-session-a1
gree_tech
PRO
1
96
『アナザーエデン 時空を超える猫』国内海外同時運営実現への道のり ~別々で開発されたアプリを安定して同時リリースするまでの取り組み~
gree_tech
PRO
1
78
『アサルトリリィ Last Bullet』におけるクラウドストリーミング技術を用いたブラウザゲーム化の紹介
gree_tech
PRO
1
90
UnityによるPCアプリの新しい選択肢。「PC版 Google Play Games」への対応について
gree_tech
PRO
1
110
実機ビルドのエラーによる検証ブロッカーを0に!『ヘブンバーンズレッド』のスモークテスト自動化の取り組み
gree_tech
PRO
1
110
"ゲームQA業界の技術向上を目指す! 会社を超えた研究会の取り組み"
gree_tech
PRO
1
140
Jamstack でリニューアルするグリーグループのメディア
gree_tech
PRO
2
300
Other Decks in Technology
See All in Technology
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
180
データプロダクトの定義からはじめる、データコントラクト駆動なデータ基盤
chanyou0311
2
300
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
5
610
透過型SMTPプロキシによる送信メールの可観測性向上: Update Edition / Improved observability of outgoing emails with transparent smtp proxy: Update edition
linyows
2
210
いざ、BSC討伐の旅
nikinusu
2
780
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
170
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
AIチャットボット開発への生成AI活用
ryomrt
0
170
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
140
Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
akexorcist
0
120
Featured
See All Featured
Navigating Team Friction
lara
183
14k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Optimizing for Happiness
mojombo
376
70k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Teambox: Starting and Learning
jrom
133
8.8k
Code Reviewing Like a Champion
maltzj
520
39k
A better future with KSS
kneath
238
17k
Facilitating Awesome Meetings
lara
50
6.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
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