.NET のページが日本語化されました

みなさんごきげんよう。本日は、.NET のページがついに日本語化されたことをお知らせいたします。

https://dotnet.microsoft.com/ja-jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1529732/041b8c6e-68ec-0704-9271-8d5bd031fc4f.png)

#.NET のページ、日本語ができました
.NET は何百万もの開発者の皆様のグローバル コミュニティがあるにもかかわらず、.NET についてのサイトは英語版だけしかありませんでした。これまでの日本の開発者の皆様からのフィードバックをもとに、12 月 7 日（米国時間）に、ついに英語版だけでなく、日本語、および簡体字中国語のサイトを公開する運びとなりました。

ただ、サイト コンポーネントにまだ英語版のみの内容がちらほらあるかと思います。これらは、今後数か月以内に日本語版もリリースする予定です。下記のブログの下方のコメント欄で、フィードバックや、多言語についてのサポートの要望などもぜひお寄せいただけると幸いです。

https://devblogs.microsoft.com/dotnet/dotnet-website-translation-updates/

また、サイトの動きがなんかおかしいぞ、という場合は、.NET サイトの最下方右の [`Feedback`] からお寄せくださいませ。（モバイル環境から見た場合は、ページの下にあります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1529732/c6f3e04c-4c12-de02-1c70-3a702d564ad6.png)

#補足情報 : .NET のページが何でできてるか、どういう作りか
.NET のページですが、[ASP.NET Core Razor Pages](https://docs.microsoft.com/ja-jp/aspnet/core/razor-pages/?view=aspnetcore-6.0&tabs=visual-studio) で構成されています。実はこのサイトの作りは、多言語対応を考えるうえで参考になる実装となっています。

https://docs.microsoft.com/ja-jp/aspnet/core/razor-pages/?view=aspnetcore-6.0&tabs=visual-studio

##フェーズ 1 : サイトの設計を多言語対応にする
日本語化は、既存の英語版サイトの多言語対応、つまりアプリケーションを言語やカルチャに依存しないように設計し、実装するという流れで行われました。

* AddViewLocalization メソッドや UseRequestLocalization メソッドの呼び出しなど、ミドルウェアへのサービスを追加
* ニュートラル カルチャな実装とする
* _ViewImports.cshtml ファイル経由で、`IViewLocalizer` によって、ビューに HTML 対応のローカライズを設定

```csharp
@inject IViewLocalizer T;
```

* `IViewLocalizer` に渡される必要のある文字列を特定（以下は、多言語対応の実施前、実施後を示したものです）

![img](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2021/12/code-diff.png)

参考

https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/localization?view=aspnetcore-6.0

##フェーズ 2 : サイトのリソースを用意する、適切なルーティングとエラー処理を実装する
次の段階では、サイトのローカライズ、つまりこの時点ではまだ英語だけのリソースを対象の言語（今回は日本語と簡体字中国語）に翻訳し、さらに適切なルーティングとエラー処理を伴う処理を実装します。具体的には、`ja-JP` と `zh-CN` のカルチャ　サポートの追加、言語セレクタの追加が行われました。このフェーズでは、Portable Object (PO) ファイルと Orchard Core フレームワークを使用しています。

> POファイルとは
特定の言語の翻訳された文字列を含むテキスト ベースのファイルです。PO ファイルは各言語ごとに 1 つずつ用意されています。`IViewLocalizer` に渡された各文字列が、それぞれのリソースのキーになります。
例）

```css
msgid "Microservices with .NET and Docker containers"
msgstr ".NETとDockerコンテナを使ったマイクロサービス""

msgid "Learn to build independently deployable, highly scalable & resilient services using .NET and Docker on Linux, macOS, and Windows."
msgstr "Linux、macOS、Windows 上で .NET と Docker を使って、デプロイ可能で拡張性の高い、弾力性のあるサービスを独立して構築する方法を学ぶ。"
```

PO ファイルは、文字列の辞書のようなものと考えることができます。Orchard Core は、PO ファイルにデータを抽出するために、これらのキー値をマッピングするのに役立ちます。Orchard Core を使うには、NuGet パッケージの [`OrchardCore.Localization.Core`](https://www.nuget.org/packages/OrchardCore.Localization.Core/) への参照を追加するだけで済みます。Web サイトのコンテンツを更新するたびに、空の `msgstr` の値を含む英語の resources.po ファイルに文字列が追加されます。新規および更新された文字列は、数日後にローカリゼーションチームから翻訳が戻ってくるまで、サイト上に英語で表示されます。

PO ファイルの詳細については、[ASP.NET Core で Portable Object のローカライズを構成する](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/portable-object-localization?view=aspnetcore-6.0)を 参照してください。

https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/portable-object-localization?view=aspnetcore-6.0

次のフェーズでは、他のサイト コンポーネントのローカライズと言語の追加を行います。

##フェーズ 3 : サイトでカルチャ検出をする仕組みを実装する
URLのカルチャは、言語-地域のペアコードで表されます。今回のリリースでは、以下のカルチャをサポートするようになりました。

* en-US - 英語(米国)
* ja-JP - 日本語 (日本)
* zh-CN - 中国語(簡体字、中国)

サイトを訪れたユーザーは、[https://dotnet.microsoft.com/download](https://dotnet.microsoft.com/download) や 
 [https://dotnet.microsoft.com/ja-jp/download](https://dotnet.microsoft.com/download) のように、URL にカルチャを含んでいても、含んでいなくても適切なリソースにアクセスすることができます。

カルチャが指定されたリクエストが来た場合は、指定されたカルチャでコンテンツを提供します。一方で、カルチャが指定されていないリクエストが来た場合、次のプロセスを使用してどのカルチャを表示するかを決定する必要があります。

**Step 1 :** サイトはユーザーが Cookie を持っているかどうかを調べ、見つかった場合はそのカルチャにリダイレクトします。(ユーザーが以前に.サイトを訪れたことがあれば、Cookie を持っていることが多いでしょう ※ User の Cookie 設定によりますが。）
**Step 2 :** Cookie が見つからなかった場合、サイトは受信リクエストの Accept-Language HTTP ヘッダを検査します。この値は、クライアントの言語とロケールを示しています。それがサポートされている値の 1 つに含まれていれば、そのカルチャを使用してコンテンツを表示します。そうではない場合は、en-US カルチャでコンテンツが表示されます。
コンテンツを別の言語で表示したい場合は、ページの下部にある Language ピッカーを使って言語を変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1529732/6e8c7581-8cea-62e2-d930-8cabd30e3eb3.png)

#終わりに
英語版の、ブログでのアナウンスを見ていて、日本人のエンジニアの皆さんのお名前をたくさん見つけました。皆さんありがとうございます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1529732/160ac60e-5ac0-b4f5-07b9-811b0814f139.png)

もしかしたら、.NET のサイト、ビミョーな感じの翻訳かもと思われる方もいらっしゃるかもしれませんが、オープンソースの世界の .NET のページですから、ぜひ皆さんもどんどんフィードバックしてあげてください。ページの右下をクリックです！

それでは皆さんごきげんよう。