Jewelry AI、言語と端末

選んだ言語は、その選択をした端末が保持します

言語の選択画面は、アカウントがあってもなくても開けます。選んだ言語は手元の端末に書き込まれ、アカウントに記録された言語は、自分では一度も言語を選んでいない端末にだけ適用されます。

言語の行はどこにあるか、サインインの前と後で

入口は二つあり、それぞれアプリの別の部分に属しています。ようこそ画面とサインイン画面では、隅に地球儀のボタンがあり、アカウントがなくても言語の選択画面が開きます(apps/jewelry-mobile/src/app/(auth)/welcome.tsx、<LanguageButton />)。同じボタンは、これらの画面が組み立てられている共通の土台を通じて他のサインイン画面にも届いているため、アカウントが存在する前に言語を設定できます。

サインイン後に開くタブ画面には、そのボタンはありません。そこでの入口は、プロフィールの環境設定にある言語の行で、同じ選択画面を開きます(apps/jewelry-mobile/src/app/(tabs)/profile.tsx、onPress={() => setLangOpen(true)})。

行そのものが、指し示す言語で書かれています。選択中の言語はその言語自身の名称で、国旗とともに表示されます。アプリが自動の状態にあるときは、名称の下の行がスマートフォンの設定に従っていることを示します。これが、自分で選んだ言語と、渡された言語との違いです。

選択がどこに書き込まれるか

言語の変更は二か所に書き込まれ、その二つは互いに独立しています。

選択は、それを行った端末に書き込まれます。
選択はスマートフォンに保存され、アプリを開き直したときにも有効であることが期待されます(apps/jewelry-mobile/src/i18n/locale-preference.ts、await AsyncStorage.setItem(LOCALE_PREFERENCE_KEY, preference))。
自動は、名前の付いた言語と同じ場所を占めます。
端末は言語コードを保存し、自動はそれ自体で一つの値として保存されます。自動に戻すことは設定を消す方法ではなく、それ自体が一つの設定です。
アカウントは控えを持ち、自動はそこでは空として保持されます。
設定が自動のとき、アカウントへ送られる値は言語なしです(apps/jewelry-mobile/src/app/_layout.tsx、const desired = preference === 'system' ? null : preference)。言語を持たないアカウントは、それぞれの端末を自分のスマートフォンに委ねます。
この流れの中で、ストアの国を参照する箇所はありません。
アカウントが購入に使うストアフロントや国は、ここでは言語の元として読まれません。関わるのは端末の選択とアカウント側の控えだけです。

二台目の端末は言語をどう扱うか

サインイン時に働く規則は左右非対称です。どちらの半分が当てはまるかは、その端末がこれまでに自分で選択したことがあるかどうかで決まります。

状況選択理由
新しいスマートフォンでサインインし、その端末では選択画面を一度も開いていない。スマートフォンの言語ではなく、アカウントの言語が出ると考える。保存された選択を持たない端末は、サインイン時にアカウントに記録された言語を渡されます。そのため、スマートフォンに設定されていない言語でアプリが開くことがあります(apps/jewelry-mobile/src/app/_layout.tsx、if (!preferenceStored && user.preferredLocale) {)。
新しいスマートフォンで、サインインする前に言語を選んだ。その選択が残り、それがアカウントの言語になると考える。すでに選択した端末はその選択を保ち、選択はアカウントに置き換えられるのではなく、アカウントへ書き込まれます。
どの端末も、それぞれのスマートフォンの設定に従わせたい。すべての端末で行を自動に設定する。自動はアカウントには言語なしとして保存されるため、次の端末が引き継ぐものがありません。
片方の端末で言語を変えたのに、もう片方は一緒に変わらなかった。二台目を別の事例として扱う。選択は、それを行った端末にとどまります。アカウント側の控えを参照するのは、自分の選択を持たない端末だけです。

二つの書き込みのどちらかが完了しないとき

端末への書き込みとアカウントへの書き込みは、別々の形で失敗します。その違いは、そのあとに見えるものに現れます。

  • アプリを閉じて開き直すと言語が元に戻る。

    端末への書き込みが完了しなかったため、選択はその起動中だけのものでした。もう一度選び直し、作業に頼る前に再起動して確認します。

  • このスマートフォンでは言語が保たれるのに、あとでサインインした端末はその言語で起動しない。

    アカウント側の控えは別に書き込まれます。その要求が完了しない場合、手元の選択はそのまま有効で、同期は何も告げずに再試行されます。再試行が成功するまでアカウントは以前の値を保持し続け、自分の選択を持たない端末はその古い値を渡されることがあります。

  • 言語の行を自動に戻し、アカウントの記録はそのまま残ると考える。

    自動はアカウントには言語なしとして書き込まれます。将来の端末を特定の言語で起動させたい場合は、行を自動に戻さず、その言語を選択したままにします。

共有している端末で言語を変える前に

共有中の端末や新しく追加した端末が、あとで驚きを生まないための四つの確認です。

  • 実際に作業する端末で選択する。すでに選択した端末が、アカウントによって直されることはありません。
  • アプリを一度閉じて開き直し、選択がその起動中だけのものではなく端末に書き込まれたことを確認する。
  • 店頭の端末を、持っている人に合わせて動かしたい場合は、自分の言語を残さず行を自動に設定する。
  • サインインしたまま選んだ言語は、将来の新しい端末が最初に起動する言語にもなることを覚えておく。

スマートフォンの設定に従い続ける二か所

アプリの中で行う選択が支配するのは、アプリ自身の画面です。その画面の周りで販売者が目にするもののうち、二つはそこから来ていません。ホーム画面のアイコンの下に出る名称と、写真へのアクセスをアプリが求めたときにOSが表示する二つのダイアログです。これらはスマートフォンの言語から取られ、apps/jewelry-mobile/app.json に列挙された言語ごとの別ファイルに保持されています。

それらのファイルが持っているのは、アプリの名称とその二つの権限用の文言だけです。アプリ内の画面テキストがそこから引かれることはありません。だからこそ、画面を英語に設定した販売者が、写真へのアクセスをスマートフォンの言語で尋ねられることがあり、画面の言語を変えてもアイコンの名称は変わりません。

利用規約とプライバシーポリシーの文書自体がどの言語で開くかは、別の規則で決まり、このページでは決着しません。

言語の選択そのものの外側

このページが扱うのは選択と、その保存先です。次のことは扱いません。

  • 端末で一度も選択が行われていないときにアプリがどの言語で開くかは、別の規則で決まり、ここでは説明しません。
  • 書字方向が変わるときに起きる再起動は、それ自体で一つの挙動であり、このページでは説明しません。
  • サーバーから届くメッセージが、選んだ言語に従うかどうかは、このページからは述べられません。
  • ストアの掲載情報がどの言語で公開されているかは、画面の言語とは別の作業の系統であり、ここでは何も報告しません。

よくある質問

アカウントを作る前に言語を変更できますか?

できます。ようこそ画面とサインイン画面には隅に地球儀のボタンがあり、あとで使うものと同じ選択画面が開きます(apps/jewelry-mobile/src/app/(auth)/welcome.tsx)。サインインしてタブ画面に入ると、入口はプロフィールの環境設定にある言語の行に移ります。

アプリを閉じたら前の言語に戻りました。なぜですか?

明示的な選択は、アプリを閉じても残るように端末へ書き込まれます。その書き込みが完了しない場合、選択はその起動中だけ続きます。もう一度選び直し、アプリを閉じて開き直して確認してください。

新しいスマートフォンでサインインしたら、その端末の言語ではありませんでした。なぜですか?

言語が一度も選ばれたことのない端末は、サインイン時にアカウントに記録された言語を渡されます。その言語は、スマートフォン自身の言語と違うことがあります。そのスマートフォンで言語を選べば、スマートフォン側の選択が残り、置き換えられる代わりにアカウントへ書き込まれます。

アプリ内の選択で、アイコンの下の名称も変わりますか?

変わりません。アイコンの名称と、写真へのアクセスを求めるOSの二つのダイアログはスマートフォンの言語に従い、画面テキストとは別のファイルに保持されているため、アプリで選んだ言語と違うことがあります。