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.1k
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
kustomizeをいい感じに使う方法
gree_tech
PRO
5
2.9k
スケーラビリティとコスト管理 Google Cloud Spanner 費用最適化の取り組み
gree_tech
PRO
0
880
「アナザーエデン 時空を超える猫」の5年前のログを引っ越してデータドリブンで事業運用プロセスを改善した話
gree_tech
PRO
0
570
全社総会における「REALITY Spaces」の活用と、Addressableを用いたコンテンツ配信技術について
gree_tech
PRO
0
730
AWSのEKS環境でログ機能を構築/リリースしたお話
gree_tech
PRO
0
550
「ヘブンバーンズレッド」の大規模アップデートにおける国内及び翻訳QAの取り組み
gree_tech
PRO
0
670
アプリ「REALITY」の12言語対応プロセスの仕組みと品質向上の取り組み
gree_tech
PRO
0
980
REALITYアプリのメンテナンスなしでの機能リリースを実現する、Istio導入とB/Gデプロイ実現の取り組み
gree_tech
PRO
1
800
Web3のバリデーター運営の開始、運用、課題、今後の取り組みについて
gree_tech
PRO
0
1.3k
Other Decks in Technology
See All in Technology
contenteditableと向き合う
kikuchikakeru
2
140
データウェアハウス製品のSnowflakeでPythonが動くって知ってました?
foursue
1
150
チームが自己組織化してから敢えて専任スクラムマスターを置いてみたらめちゃめちゃワークした話 / How bringing in a Scrum Master to an already self-organized team totally worked out
hc0208
2
1.6k
Evolving DevOps Teams and Flexible Organizational Culture
kakehashi
1
130
Oracle Base Database Service:サービス概要のご紹介
oracle4engineer
PRO
0
13k
実践vs理論 叩き上げのスクラムマスターが実践した手法を研究者が学術的に分析する / Practical Scrum Master vs. Theoretical Scrum Researcher
shinop
4
1.4k
実践的なバグバウンティ入門
scgajge12
4
2.1k
ことばをそろえる / Bridging the Terminology Gap
amaotone
5
1k
FastlyとfalcoでNode.jsレスな Webサーバー構築 : IPTV版 ABEMAアプリインフラ刷新 / Building web server using Fastly and falco without Node.js for IPTV ABEMA app
nodaguti
0
240
技術ブログや登壇資料を秒で作るコツ伝授します
minorun365
PRO
15
4.3k
なぜクラウドサービスで Web コンソールを提供するのか
shuta13
2
760
手軽に始める? おうちサーバーのすゝめ
nyagasan
0
180
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
294
20k
No one is an island. Learnings from fostering a developers community.
thoeni
18
2.9k
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
WebSockets: Embracing the real-time Web
robhawkes
59
7.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
24
2k
Designing the Hi-DPI Web
ddemaree
278
34k
A Modern Web Designer's Workflow
chriscoyier
690
190k
Producing Creativity
orderedlist
PRO
340
39k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.4k
Happy Clients
brianwarren
96
6.6k
Robots, Beer and Maslow
schacon
PRO
157
8.1k
Building Adaptive Systems
keathley
36
2.1k
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