ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-06-22中級

アプリ内の言語切り替えを、端末の言語設定と切り離して実装する — Android Per-App Language の実装メモ

Android のアプリ内言語切り替えを AppCompatDelegate.setApplicationLocales と locales_config で実装する手順と、API 33 未満の互換・プロセス再生成・AdMob まわりの落とし穴を実装視点でまとめた記録です。

Android14localization2per-app-languageAppCompatapp-dev33

プレミアム記事

設定画面に言語切り替えのスイッチを置いてほしい、という要望は、海外向けに公開しているアプリほど早く届きます。個人開発で運用している壁紙・ユーティリティ系の Android アプリでも、英語圏の方から「端末は英語のままで、このアプリだけ日本語で見たい」という声をいただいたことがありました。端末の言語設定を丸ごと切り替えてもらう、という案内では解決しない要望です。

Android にはこの「アプリ内だけ言語を切り替える」仕組みが、API 33(Android 13)で正式に入りました。Per-App Language Preferences と呼ばれる機能です。ただ、実際に組んでみると、API 33 未満の端末をどう扱うか、言語を変えた瞬間に画面がちらつく問題、設定が再起動で消える問題と、地味なつまずきが連続します。この記事は、Antigravity のエージェントに下調べと実装の叩き台を任せつつ、私が手元で詰めた実装メモです。

端末言語の上書きと、アプリ言語の切り替えは別物です

古くからある手法は、Configurationlocale を上書きして Context を作り直すやり方でした。attachBaseContext でロケールを差し替える、というコードを見たことがある方も多いと思います。これは動くのですが、二つの弱点があります。

一つは、OS がアプリの言語設定を知らないこと。システムの設定アプリにある「アプリの言語」一覧に、自分のアプリが出てきません。もう一つは、再生成のたびに自前でロケールを当て直す必要があり、ライブラリやシステムダイアログが端末言語のまま残りやすいことです。

API 33 以降の setApplicationLocales は、この設定を OS に預けます。OS がアプリ単位の言語を覚えてくれるので、設定アプリにも反映され、起動のたびに OS が正しいロケールで Context を用意してくれます。両者の違いを整理すると、次のようになります。

観点Configuration 上書き(旧来)setApplicationLocales(API 33+ / AppCompat 後方互換)
OS への登録されないされる(設定アプリのアプリ言語に表示)
設定の永続化自前で SharedPreferences 等に保存OS(または AppCompat の保存先)が保持
再起動後の復元自前で再適用自動で復元
システムダイアログの言語端末言語のまま残りやすいアプリ言語に追従しやすい
実装量多い(Context 差し替え)少ない(1 行の呼び出し+設定)

新規・既存を問わず、これから組むなら AppCompatDelegate.setApplicationLocales を中心に据えるのが私の結論です。AppCompat 1.7 系がこの API を API 33 未満にも後方移植してくれるため、最小バージョンが古くても同じコードで書けます。

対応言語を OS に宣言する locales_config

まず、アプリが対応している言語を OS に教えます。res/xml/locales_config.xml を作り、android:localeConfig でマニフェストから参照します。これを置くと、システム設定の「アプリの言語」画面に言語一覧が出るようになります。

<!-- res/xml/locales_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
    <locale android:name="en" />
    <locale android:name="ja" />
    <locale android:name="ko" />
    <locale android:name="zh-Hans" />
</locale-config>
<!-- AndroidManifest.xml -->
<application
    android:localeConfig="@xml/locales_config"
    ... >
</application>

ここで一つ目の落とし穴があります。locales_config.xml に並べる言語タグは、実際に values-xx フォルダが存在する言語と一致させてください。zh-Hans のような地域・文字種つきのタグは、リソースフォルダ側を values-zh-rCN ではなく values-b+zh+Hans で用意すると食い違いません。並べた言語とリソースがずれると、設定画面には出るのに選んでも切り替わらない、という分かりにくい状態になります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
端末言語を変えずにアプリ内だけ言語を切り替える、Android 13 以降の正攻法と API 33 未満への後方互換の組み方
言語変更時の Activity 再生成・プロセス再生成・設定永続化でつまずく箇所と、その回避コード
AdMob や WebView がアプリ言語に追従しないときの原因切り分けと、実際に効いた対処
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-05-20
Localizable.xcstrings の8言語翻訳を Antigravity に2週間任せた運用メモ
Localizable.xcstrings に追加した新規キーの8言語翻訳を、Antigravity に2週間下書きさせて運用した記録です。任せた範囲と最終判断に残した範囲、想定外だった挙動、既訳資産との突き合わせ方を率直に書きました。
アプリ開発2026-05-03
io.github.sceneview を使った Antigravity AR 開発入門——AnchorNode のエラーを乗り越えて
SceneView(io.github.sceneview)を使ってAndroidのAR機能を実装する方法を解説。AnchorNodeのエラー対処、ARCoreのインストール処理、平面検出の可視化、Antigravity AIを組み合わせたシーン生成まで、実機で詰まった箇所を中心に紹介します。
アプリ開発2026-06-21
戻るボタンで広告が出る/出ないが安定しない — 入れ子のifを独立ガードのリストに作り替えた記録
戻るボタン押下時のインタースティシャル表示判定が、入れ子のif文で優先度が暗黙化して壊れていました。各条件を理由つきの独立ガードに分解し、決定表からテストを生成した設計をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →