画像ファイルのローカライズ(言語により勝手に画像を切り替えてもらう)(ms-appx:)

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

やりたいこと

こういうプロジェクト構成をしているときに、

Imagesフォルダの下の言語毎のフォルダ(ruとかdeとか)の下にある画像を表示させるこういうxamlを書くと、

<Image Source="ms-appx:///Images/myimage.bmp" Width="100" Height="100"/>

なぜか、勝手にいい感じに画像を切り替えてもらえる。

しかしたまたまそうなっただけで、なんでそうなるのか?がさっぱりわからない。

なんでうまくいっちゃうのか?調べたい。

結論

「ms-appx:」が行ってくれる

「コンテントネゴシエーション

というもののおかげで、切り替えが行われていた。

しらべたこと

ここに、そうなるんですよと書いてあった。

learn.microsoft.com

どうも、"ms-appx:///Images/myimage.bmp" の部分は、「パス」として扱われているようで、そのパスは、実行時に、「コンテントネゴシエーション」というのを経て決定されるとある。

その「コンテントネゴシエーション」は、OSや言語などの設定、ディスプレイのスケール、テーマ、コントラスト設定などによって決まるらしい。

で、サンプルによると、

「ms-appx:///images/logo.png

「\Images\fr-FR\logo.scale-100_contrast-white.png

を指すことになる場合があるとのこと。

たぶんこの例の場合は、言語と、ディスプレイのスケールとコントラスト設定が入ったのだと思われる。

で、私の場合は、

Source="ms-appx:///Images/myimage.bmp"

だったのだが、これに対してその「コンテントネゴシエーション」というのを経た結果、 プロジェクト構成の中で存在していたのが、

「Images\de\myimage.bmp」もしくは「Images\ru\myimage.bmp

だったので、de(ドイツ語)とru(ロシア語)でうまく切り替えしてくれたものと思われる。

なので、今回たまたま言語のフォルダ分けをしててそういう動きをしてもらえたが、うまくやれば、ディスプレイのスケールによって画像を切り替えてもらう、とかもできそう。(たぶんやらないけど)

その他、気づいたこと

ms-appxは、そういう「コンテントネゴシエーション」をしてくれると分かったのだが、同じMSのページを見ると、 ms-appdataというのもあり、そっちのほうは、コンテントネゴシエーションが行われないとある。

そういう、自動で切り替えたりしてほしくない場合は、ms-appdataの方を使う、とかの使い分けがあるのかもしれない。(未検証)

追記 フォルダ/ファイル名のルールとサンプル

下記ページに、ルールが書かれてた。

https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast

ルール

フォルダ名に適用したサンプル

ファイル名に適用したサンプル

こういうルールでフォルダを作ってやり、そこに各言語、各モード(ダークライト、ハイコントラスト)に応じた画像ファイルを入れてやれば、自分のコードで切り替えとかしなくて済みそう。

表示言語についてはここに書いてある。

https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast#language

コードから同じことをする

下のページのようにすればよい。(未検証)

https://learn.microsoft.com/en-us/windows/uwp/app-resources/images-tailored-for-scale-theme-contrast#reference-an-image-or-other-asset-from-xaml-markup-and-code

参考

ms-appdata を パスで使う場合

https://learn.microsoft.com/en-us/windows/uwp/app-resources/uri-schemes#path-ms-appx-and-ms-appx-web

言語、スケール、ハイ コントラスト、およびその他の修飾子に合わせてリソースを調整します
→どういうフォルダorファイル名にしたらどういうパスの切り替えができるかのルール。
(このページの内容が、知りたかったことズバリ)

https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast

スケール、テーマ、ハイ コントラストなどに合わせて調整された画像とアセットを読み込む

https://learn.microsoft.com/en-us/windows/uwp/app-resources/images-tailored-for-scale-theme-contrast#reference-an-image-or-other-asset-from-xaml-markup-and-code