Локализация для мобильной кросс-платформы с использованием xamarin и проблема с iOS

У меня есть проект в Xamarin, который нацелен на Android, iOS и Windows Phone. Я использовал core (библиотека PCL) для обмена общим кодом между различными платформами. Я добавил файлы ресурсов (ресурс .net).Resx в моей основной библиотеке и прочитал специфическую для культуры строку, которую я использовал в следующем фрагменте кода в одном из моих ViewModel:

public string GetString() 
{  
    // CommonResources is the name of my resource file   
    ResourceManager resManager = new ResourceManager(typeof(CommonResources));   
    return resManager.GetString("LoginLabel",CultureInfo.CurrentCulture); 
}

"LoginLabel" - это мой ключ ресурса, и его значение - "Вход" (на английском языке) и "inloggen" на голландском языке.

Я создал два файла ресурсов CommonResources для английского и голландского в моем проекте PCL. CommonResources.resx
CommonResources.nl-NL.resx

в Android-телефоне, iOS и Windows-телефоне я устанавливаю культуру следующим образом:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("nl-NL");

Это отлично подходит для Android и телефона с Windows.

Но для iOS он не работает. Он всегда возвращает строку ресурса из английского файла. Культура правильно настроена и отображается в режиме отладки. но каким-то образом он не может загрузить строку ресурса из ресурса голландского языка.

Итак, вопрос в том, можно ли локализовать строку (.Net) с помощью PCL для всей платформы? у кого есть идея? Спасибо заранее.

Ответы

Ответ 1

Для локализации на наших проектах Xamarin я использовал многоязычный набор инструментов для приложений (подробнее здесь) из шаблонов Microsoft и T4, чтобы преобразовать вывод из инструментарий для использования в форматах для Android и iOS.

Этот учебник имеет фантастический обзор процесса и основан на этот проект.

Ответ 2

Или:

  • Фактически вы не устанавливаете CurrentCulture на iOS.
  • Вы устанавливаете CurrentCulture на поток A и извлекаете его в поток B.

Попробуйте следующее:

public string GetString() 
{
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");
    Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("nl-NL");

    // CommonResources is the name of my resource file   
    ResourceManager resManager = new ResourceManager(typeof(CommonResources));   
    return resManager.GetString("LoginLabel",CultureInfo.CurrentCulture); 
}

Ответ 3

Проверяете ли вы его на реальном устройстве? В симуляторе невозможно изменить культуру. У меня была аналогичная проблема с моими языковыми файлами.