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.4k
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
290
『ヘブンバーンズレッド』におけるフィールドギミックの裏側
gree_tech
PRO
2
210
セキュリティインシデント対応の体制・運用の試行錯誤 / greetechcon2024-session-a1
gree_tech
PRO
1
210
『アナザーエデン 時空を超える猫』国内海外同時運営実現への道のり ~別々で開発されたアプリを安定して同時リリースするまでの取り組み~
gree_tech
PRO
1
180
『アサルトリリィ Last Bullet』におけるクラウドストリーミング技術を用いたブラウザゲーム化の紹介
gree_tech
PRO
1
230
UnityによるPCアプリの新しい選択肢。「PC版 Google Play Games」への対応について
gree_tech
PRO
1
420
実機ビルドのエラーによる検証ブロッカーを0に!『ヘブンバーンズレッド』のスモークテスト自動化の取り組み
gree_tech
PRO
1
260
"ゲームQA業界の技術向上を目指す! 会社を超えた研究会の取り組み"
gree_tech
PRO
1
320
Jamstack でリニューアルするグリーグループのメディア
gree_tech
PRO
2
470
Other Decks in Technology
See All in Technology
AIエージェントについてまとめてみた
pharma_x_tech
8
4.8k
インシデントキーメトリクスによるインシデント対応の改善 / Improving Incident Response using Incident Key Metrics
nari_ex
0
3.9k
サーバーレスで楽しよう!お気軽に始められる3つのポイント / Have fun with Serverless!
_kensh
2
220
AWSエンジニアに捧ぐLangChainの歩き方
tsukuboshi
0
220
private spaceについてあれこれ調べてみた
operando
1
160
業務ツールをAIエージェントとつなぐ - Composio
knishioka
0
110
バクラクの組織とアーキテクチャ(要約)2025/01版
shkomine
13
2.9k
Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ
pyama86
9
5.6k
日本語プログラミングとSpring Bootアプリケーション開発 #kanjava
yusuke
2
340
横断SREの立ち上げと、AWSセキュリティへの取り組みの軌跡
rvirus0817
3
4.5k
例外処理を理解して、設計段階からエラーを「見つけやすく」「起こりにくく」する
kajitack
12
3.7k
一人から始めたSREチーム3年の歩み - 求められるスキルの変化とチームのあり方 - / The three-year journey of the SRE team, which started all by myself
vtryo
7
5.7k
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Visualization
eitanlees
146
15k
Building Adaptive Systems
keathley
39
2.4k
The World Runs on Bad Software
bkeepers
PRO
67
11k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
380
Code Reviewing Like a Champion
maltzj
521
39k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
30
2.1k
Documentation Writing (for coders)
carmenintech
67
4.6k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
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