Help us understand the problem. What is going on with this article?

【.Net/Xamarin】I18N-Portableで手軽に多言語対応

More than 1 year has passed since last update.

I18N-Portableを紹介します

https://github.com/xleon/I18N-Portable

Xamarinと.Netに対応しているそうです。UWPアプリでも使えました。

初期化

アプリリソース内からローカリゼーションデータのテキストリソースを巡回するため、初期化にはAppクラスのAssemblyが必要。

I18NPortable.I18N.Current
       .SetLogger(text => System.Diagnostics.Debug.WriteLine(text))
       .SetNotFoundSymbol("🍣")
       .SetFallbackLocale("en")
       .Init(GetType().Assembly);

Localesフォルダに翻訳データを配置

デフォルトはKeyValuePairで翻訳データを記述します。

  • 翻訳データファイルはファイルのプロパティからビルドアクションを「埋め込みリソース」に指定する必要があります。
  • ファイル名は言語コード(ja-JPやen-USなど)である必要があります。
Locales/ja-JP.txt
# key = value (the key will be the same across locales)
one = uno
two = dos
three = tres 
four = cuatro
five = cinco

# Enums are supported
Animals.Dog = Perro
Animals.Cat = Gato
Animals.Rat = Rata
Animals.Tiger = Tigre
Animals.Monkey = Mono

# Support for string.Format()
stars.count = Tienes {0} estrellas

TextWithLineBreakCharacters = Line One\nLine Two\r\nLine Three

Multiline = Line One
    Line Two
    Line Three

Jsonで扱いたい場合は別途Readerの追加指定が必要
https://github.com/xleon/I18N-Portable#supported-formats

使用例:コードからローカライズ

Locales/ja-JP.txt
YourName = 君の名は

としたとき

var localizedText = "YourName".Translate();

とすることで現在のロケールに応じたテキストが取得できます。

使用例:Xamlでローカライズ

ここではValueConverterを使った方法を紹介します。

LocalizeConverter.cs
using System;
using Windows.UI.Xaml.Data;
using I18NPortable;

namespace MyApp.Locales
{
    public sealed class LocalizeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value is Enum enumValue)
            {
                return enumValue.Translate();
            }
            else if (value is string stringValue)
            {
                if (parameter is string str)
                {
                    return stringValue.Translate(str);
                }
                else if (parameter is object[] p)
                {
                    return stringValue.Translate(p);
                }
                else
                {
                    return stringValue.Translate();
                }
            }
            else
            {
                throw new ArgumentException("Failed localize : " + value?.ToString());
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}


App.xaml
<prism:PrismApplication
    x:Class="Nicolify.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="using:Prism.Unity"
  xmlns:localization="using:Nicolify.Locales"
  >

  <prism:PrismApplication.Resources>

    <!-- ↓ 追加 -->
    <localization:LocalizeConverter x:Key="LocalizeConverter" />

  </prism:PrismApplication.Resources>
</prism:PrismApplication>
MainPage.xaml
<TextBlock Text="{Binding Source=YourName, Converter={StaticResource LocalizeConverter}}" />

注意点

本家で紹介されているViewModelからi18N.Currentをプロパティとして公開して{Binding Strings[key]}とする方法でなければ言語変更に動的に対応することが出来ません。

ここで紹介したConveterを使った方法でアプリ内から言語を変更する場合には、ページのキャッシュを破棄してロードし直すか、言語変更後にアプリ再起動を促すUIを追加し再起動して貰う、などする必要があります。

tor4kichi
シンプルで"使える"アプリを作ろう
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした