iOSDC japan 2023で発表した資料です。 開発チームとして単一言語対応のアプリを多言語対応させる際にどのような作業を行ったのか、また仕組み化して継続的に多言語対応を進めるためにどのような対応を行ったのかなど、多言語対応に関わる内容やノウハウについて発表しました。
© GO Inc.2023.09.01 16:40〜 Track A開発本部 ソフトウェア開発統括部 ユーザーシステム開発部 ユーザーシステム1グループ / 髙橋秀宗GO株式会社タクシーアプリの多言語対応・ローカライズにおける課題と解決策
View Slide
© GO Inc.2022年12月に入社。タクシーアプリ『GO』のiOSアプリ開発を担当趣味はギターとカメラ好きなバンドはUNISON SQUARE GARDENと[Alexandros]2自己紹介プロフィール写真GO株式会社ユーザーシステム1グループ / 髙橋秀宗@h1d3mun3
Index© GO Inc.1. 文言管理ツールについて2. 多言語対応について3. 仕組み化について4. 現状の課題5. 多言語対応を進めてみて6. まとめ3
© GO Inc.今まで『GO』アプリでは日本語のみの単一言語をサポートしていましたが、2023年2月のリリースで英語もサポートし多言語に対応しました。本日は多言語対応の際に開発チームとして取り組んできた内容や、ノウハウについてお話いたします。本日お話すること4
© GO Inc.文言管理ツールについて01
© GO Inc.● SwiftのDictionaryのようなイメージで、言語ごとにKeyと文言を登録しておける日本語: [“common_send_button_text” : “送信する"]英語: [“common_send_button_text” : “Send”]● Strings形式のファイルを出力することができ、アプリ内部に組み込んで利用できる文言管理ツールについて6
© GO Inc.文言管理ツールについて7
© GO Inc.多言語対応について02
© GO Inc.多言語対応で目指すところ(ゴール)9現状: アプリ内の一部の文言で文言管理ツールを利用 + 日本語のみの対応↓ゴール: アプリの全ての機能で利用される文言で文言管理ツールを利用+ 日本語に加えて英語も対応
© GO Inc.アプリの全ての文言で文言管理ツールを利用するための取り組み101. アプリ側のソースコードから多言語対応していないString を抽出2. スプレッドシートでまとめて整理3. 各Stringに対してユニークなキーを定義してチーム内に共有● iOS / Androidで共通のキーを利用するため4. 文言管理ツールに新しく定義した文言を登録5. アプリ側のソースコードを多言語対応に適用させる
© GO Inc.Before: 文言管理ツールを利用しないコード11let attributedStrings = [NSAttributedString(string: "車両をお探しの上、",attributes: planeTextAttributes),NSAttributedString(string: "\(dateFormatter.string(from: deadline))まで",attributes: heavyTextAttributes),NSAttributedString(string: "にご乗車ください",attributes: planeTextAttributes)]
© GO Inc.After: 文言管理ツールを利用するコード12let attributedStrings = [NSAttributedString(string: R.string.arrival_onboard_request_onboard_prefix(),attributes: planeTextAttributes),NSAttributedString(string: R.string.arrival_onboard_request_onboard_value(dateString)),attributes: heavyTextAttributes),NSAttributedString(string: R.string.arrival_onboard_request_onboard_suffix(),attributes: planeTextAttributes)]
© GO Inc.日本語に加えて英語も対応する13● 文言管理ツールに英語の文言を適用する● 日本語と英語の文法の違いによる課題
© GO Inc.日本語に加えて英語も対応する14● 文言管理ツールに英語の文言を適用する● 日本語と英語の文法の違いによる課題
© GO Inc.日本語と英語の文法の違いによる課題15● 言語ごとに装飾するべき箇所が異なる● 言語ごとに語順が異なる→ 言語間での違いを吸収する仕組みの構築が必要
© GO Inc.日本語と英語の文法の違いによる課題16車両をお探しの上、16:44までにご乗車くださいarrival_onboard_request_onboard_prefixarrival_onboard_request_onboard_valuearrival_onboard_request_onboard_suffix
© GO Inc.日本語と英語の文法の違いによる課題17🤔arrival_onboard_request_onboard_prefixarrival_onboard_request_onboard_valuearrival_onboard_request_onboard_suffixLook for the vehicle and board by HH:MM
© GO Inc.日本語と英語の文法の違いによる課題18英語の場合arrival_onboard_request_onboard_suffix キーに設定する文言がないため、半角スペースを配信することで表示を解決
© GO Inc.多言語対応で目指すところ(ゴール)19現状: アプリ内の一部の文言で文言管理ツールを利用 + 日本語のみの対応↓ゴール: アプリの全ての機能で利用される文言で文言管理ツールを利用+ 日本語に加えて英語も対応✅
© GO Inc.多言語対応で目指すところ(ゴール)20現状: アプリ内の一部の文言で文言管理ツールを利用 + 日本語のみの対応↓ゴール: アプリの全ての機能で利用される文言で文言管理ツールを利用+ 日本語に加えて英語も対応今後の開発においても多言語対応を進める必要があるため、仕組み化を行う✅
© GO Inc.仕組み化について03
© GO Inc.仕組み化する上で検討するべき点22● 文言管理ツールにキーが登録されていないと、既存コードにキーを適用できない● 開発と並行して文言管理ツールの文言が更新されることへの影響○ PdMをメインに、文言を更新する必要がある際に、任意のタイミングで更新作業を行っていた● 文言管理ツールに文言を登録・更新するコスト○ 現状の『GO』では2000以上のキーが登録済○ 多い施策では100以上のキーを更新⇒ 文言管理ツールの運用コストを抑えつつ、文言管理ツール側を意識せずに開発が進められるような仕組み
© GO Inc.事前準備● スプレッドシートに紐づいたGoogle App Scriptに認証情報等を設定更新作業1. スプレッドシートに文言を記入2. スプレッドシート上のインポートボタンを押す3. スプレッドシート上の反映ボタンを押して手動で反映→ 文言管理ツールが更新される今までの更新フロー23
© GO Inc.今までの更新フロー 文言更新画面24
© GO Inc.今までの更新フロー 認証情報設定25● スプレッドシートで正しく更新できるよう認証情報・設定等を適切に入力する必要がある○ アクセストークン○ プロジェクトID○ スプレッドシート名○ …etc● プロジェクト開発ごとに差し替える必要もある
© GO Inc.新しい更新フロー事前準備● なし更新作業1. GitHubのmainブランチからtopicブランチを作成2. topicブランチ上のjsonファイルを更新3. PRを作成して、topicブランチにマージ4. 機能開発が完了したら、topicブランチをmainブランチにマージ→ GitHub Actionsが更新を検知して、文言管理ツールが更新される26
© GO Inc.JSONファイルについて27
© GO Inc.JSONファイルについて28
© GO Inc.GitHub Actionsを利用した文言管理ツールの更新自動化29maintopicfeature日本語を更新project 作成mainproject英語を更新GitHub文言管理ツールproject 更新 project 更新project をマージ&削除GitHub Actionsで自動化
© GO Inc.Before● 多言語対応を実施した段階では、文言管理ツールの更新作業が属人化○ 更新ツールの設定にかなりの習熟が必要■ 設定を間違えると意図せぬプロジェクトが更新されるなどの大きな問題が容易に発生○ 結果、特定の個人に更新タスクが集中After● エンジニアの誰でも文言管理ツールを安全に更新できるようになった● 更新作業をエンジニアチームが実施できるようになった特徴①: 文言管理ツールを安全に更新できるようにし、非属人化30
© GO Inc.Before● 今までのやり方では参照するファイルが違うことによるリスクや、更新内容のチェックがないことによるリスクがあった○ 文言管理ツールの更新ミスが発生After● 操作するファイルを1つに絞ることで作業者の負荷を低減● PRでのレビューを必須とすることで更新ミスの可能性を低減特徴②: 作業者の負荷を低減し、ヒューマンエラーのリスクを低減31
© GO Inc.Before● スプレッドシートの設定に、かなりの習熟と慣れが必要○ 特定のメンバーに更新作業が集中することを誘発する状況だった○ 複数の新機能開発を進める際、文言管理ツールの更新作業が滞る恐れがあったAfter● スプレッドシートの設定に相当する作業をGitHub Actions側で吸収し、作業者の作業負荷を低減● スムーズに複数の新機能開発を実施できる体制を構築特徴③: 複数の新機能開発への対応32
© GO Inc.現状の課題04
© GO Inc.現状の課題34● gitの利用スキルが必要○ 暗黙的にエンジニアがターゲットになってしまっていて、PdM・デザイナー・Bizなどの非エンジニア職が文言配信に参加する際の障壁となっている● 文言管理ツールとの連携に問題があり、ドキュメント通り作業しても更新に失敗するケースが有る○ 回復ドキュメントを整備して、個別対応● 文字装飾の仕組みが言語の語順に依存してしまっている○ 将来別言語対応のときにハードルになる可能性がある
© GO Inc.多言語対応を進めてみて05
© GO Inc.多言語対応を進めてみて36● 自アプリが置かれている状況を踏まえて、多言語化を進めていく● その一方で、出てきた課題に対しては1つ1つ対処していく事が大事○ 今回採用している方法では将来別言語対応しようとしたときに破綻してしまう可能性があるので、改善を進めていく
© GO Inc.まとめ06
© GO Inc.まとめ38● 多言語対応を進めるために、まずプログラムで文言管理ツールを利用できるように改修● 多言語対応は継続して実施することに意味があるので、チームとして無理なく継続的な多言語対応を進められるやり方を模索し、チームに導入● 発生している課題については1つ1つ解決していく
© GO Inc. 39タクシーアプリ『GO』の開発を一緒にしませんかhttps://hrmos.co/pages/goinc/jobs
© GO Inc. 40後夜祭 iOSDC Japan 2023 のご参加お待ちしています2023年09月26日 19:00 ~ 20:30https://hey.connpass.com/event/290854/
文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください。© GO Inc.