WinUI3/WPFプロジェクトに持っている言語リソースと、OSの表示言語設定、表示言語優先順位の関係のまとめ

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

以前書いた下記の記事で調べた内容をまとめたい。

https://tera1707.com/entry/2023/03/16/222146

前提

  • .NET6
  • WindowsAppSDK 1.2.221109.1

結果

  • resw方式は、言語の優先順位が1位の言語で表示を行う。
    正確には、アプリが持っている言語リソースの中で、言語の優先順位が一番高い言語で表示を行う。
  • resx方式は、OSの表示言語設定の言語で表示を行う。

ざっくりまとめると下表のようになった。

WInUI3(resw方式)

「優先順位」の高い言語に従う。

WinUI3(パッケージ)(resw) WinUI3(非パッケージ)(resw)
優先順位表にある言語と、言語コードと地域コードが一致する言語リソースをアプリが持っている 条件に合う一番優先順位が高い言語で表示を行う 条件に合う一番優先順位が高い言語で表示を行う
優先順位表にある言語と、言語コードのみ一致する言語リソースをアプリが持っている 条件に合う一番優先順位が高い言語で表示を行う 条件に合う一番優先順位が高い言語で表示を行う
優先順位表にある言語が、アプリのもつ言語リソースにない(アプリがen-USのリソースを持っている) en-USのリソースで表示を行う en-USのリソースで表示を行う
優先順位表にある言語が、アプリのもつ言語リソースにない(アプリがen-USのリソースを持っていない) アプリのもつリソースを言語-地域コードでABC順に並べたときの先頭のリソースを使う InitializeComponent()で例外を吐いてアプリ落ちる

WPF(resx方式)

「OSの表示言語」に従う。

WPF(resx)
OS表示言語と、言語コードと地域コードが一致する言語リソースをアプリが持っている その言語のリソースを表示
OS表示言語と、言語コードのみ一致する言語リソースをアプリが持っている その言語のリソースを表示
OS表示言語のリソースを、アプリが持っていない アプリの「ニュートラル言語」設定の言語リソースを表示

resw/resx

試せてないのだが、
上の表では

  • WinUI3は優先順位が高い言語に従って表示
  • WPFはOSの表示言語設定に従って表示

とも読める書き方をしたが、おそらくそうではなくて、

  • resw方式は優先順位が高い言語に従って表示
  • resxはOSの表示言語設定に従って表示

だと思われる。
今回たまたまreswを使ったのがWinUI3で、resxがWPFだっただけ。

なので、UWPでresw方式を使った場合はそのUWPアプリは優先順位に従うし、WinUI3でresx方式を使った場合はOSの表示言語に従うと思われる。(すみません、未確認)

用語

フォールバック

OSにインストールされている言語が、アプリに言語コードは一致だが地域コードは違う言語のリソースがある場合に、ドンピシャじゃないけどそのリソースで表示すること。
例)OSには「ドイツ語(リヒテンシュタイン)」(de-li)がインストールされてるが、アプリには「ドイツ語」(de)のリソースがある場合に、アプリがdeで表示を行うこと。
下記のページのような感じ。 https://learn.microsoft.com/en-us/windows/apps/design/globalizing/manage-language-and-region#examples

OS表示言語/優先順位

これ。

言語-地域

ja-JPなら

  • 日本語(日本)
    • jaが言語
    • JPが地域

en-USなら

  • 英語(米国)
    • enが言語
    • USが地域

みたいなこと。

所感

上のように表にまとめたが、あくまで今回私が試した結果の表。

特にreswの方の「WinUI3(非パッケージ)(resw)」の全くリソースがない場合に「InitializeComponent()で例外を吐いてアプリ落ちる」なんてのは、ホンマか?と思ってしまうほど自信がないのだが、試した限りそうなってしまった。

もしかすると、私の環境や設定の作り方がまずかったり、現時点のWinUI3のバグだったりするのかもだが、とりあえず現状こうなるということでノウハウ残しておく。

実験に使ったコード

https://github.com/tera1707/ResourceTest

参考

前回リソースがないときの動きを調べた記事

https://tera1707.com/entry/2023/03/16/222146

resw方式のやり方

https://tera1707.com/entry/2022/03/24/224855

resw方式のやり方

https://qiita.com/tera1707/items/fb6570f3894a607f9dcehttps://tera1707.com/entry/2023/03/01/221055