Локализация Xamarin iOS с использованием .NET.

Я пытаюсь использовать локализацию .NET в переносимой библиотеке классов для проекта Xamarin iOS / Android. Я выполнил следующие шаги:

Как использовать локализацию в C #

И иметь код, который выглядит следующим образом:

string sText = strings.enter_movie_name; Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr"); sText = strings.enter_movie_name; lblEnterMovieName.Text = sText; 

Я также пробовал:

 ResourceManager resman = new ResourceManager(typeof(MyApplication.strings)); string sText = resman.GetString("enter_movie_name", new CultureInfo("fr")); 

Я создал strings.resx с enter_movie_name, равным «Enter movie name:» и strings.fr.resx, равным «Entre la movie name:»

Однако sText всегда заканчивается как «Enter movie name:». Кажется, я не могу получить версию «Entre la movie name:».

Я также видел сообщение в кросс-платформенной локализации, но не смог его обработать. Я также не хочу использовать конкретную версию iOS в Localization на Xamarin.iOS, так как я бы хотел получить мои строки из независимой от платформы библиотеки.

Может ли кто-нибудь указать, где я ошибаюсь?

  • Как я могу получить уведомление о соединении Bluetooth, когда приложение iOS основано на Xamarin?
  • ViewController Segue Xamarin
  • Как добавить меню с вкладками в представление карусели в форме Xamarin?
  • Каков наилучший способ передачи данных между представлениями?
  • как получить текущие координаты gps в xamarin
  • ERROR ITMS-90085: «Никаких архитектур в двоичном формате. Lipo не удалось обнаружить какие-либо архитектуры в исполняемом пакете ».
  • xamarin.ios datetime сбой на устройстве
  • Xamarin, C ++, Cocos2D-X и Visual Studio
  • 2 Solutions collect form web for “Локализация Xamarin iOS с использованием .NET.”

    Я создал немного уродливого решения, но он работает. В моей переносимой библиотеке классов (PCL) я создал папку под названием «строки» и внутри которой создаются файлы:

    • strings.resx
    • strings_fr.resx
    • strings_ja_JP.resx

    Я установил все это как Embedded Resource с помощью специального инструмента как ResXFileCodeGenerator. Это означает, что у меня есть отдельная DLL ресурсов для каждого языка.

    В iOS я могу получить локаль, позвонив:

     string sLocale = NSLocale.CurrentLocale.LocaleIdentifier; 

    Я бы предположил, что есть эквивалент Android, использующий Locale, но я не знаю, что это такое.

    Это дает мне строку типа «ja_JP» или «fr_FR» или «en_GB» (обратите внимание, что они подчеркивают, а не тире). Затем я использую это со следующим статическим классом, который я создал, чтобы получить соответствующий менеджер ресурсов и получить из него строку.

    Если задана локаль aa_BB, она сначала ищет strings_aa_BB, затем для strings_aa, затем для строк.

     public static class Localise { private const string STRINGS_ROOT = "MyPCL.strings.strings"; public static string GetString(string sID, string sLocale) { string sResource = STRINGS_ROOT + "_" + sLocale; Type type = Type.GetType(sResource); if (type == null) { if (sLocale.Length > 2) { sResource = STRINGS_ROOT + "_" + sLocale.Substring(0, 2); // Use first two letters of region code type = Type.GetType(sResource); } } if (type == null) { sResource = STRINGS_ROOT; type = Type.GetType(sResource); if (type == null) { System.Diagnostics.Debug.WriteLine("No strings resource file when looking for " + sID + " in " + sLocale); return null; // This shouldn't ever happen in theory } } ResourceManager resman = new ResourceManager(type); return resman.GetString(sID); } } 

    Пример того, как это будет использоваться (со ссылкой на приведенный выше код), будет:

     string sText = Localise.GetString("enter_movie_name", sLocale); lblEnterMovieName.Text = sText; 

    Существенным недостатком этого является то, что все представления должны будут иметь свой набор текста программно, но у него есть тот потенциал, что переводы могут выполняться один раз, а затем повторно использоваться на многих платформах. Они также остаются отдельно от основного кода в своих собственных DLL и поэтому могут быть перекомпилированы индивидуально, если это необходимо.

    Я создал аналогичное решение для принятого ответа, но с использованием txt-файлов вместо Resx и nuget готов к работе: https://github.com/xleon/I18N-Portable . Сообщение в блоге.

    Другие улучшения:

    • "anyKey".Translate(); // from anywhere
    • Автоматическое определение текущей культуры
    • Получить список поддерживаемых переводов: List<PortableLanguage> languages = I18N.Current.Languages;
    • Поддержка привязки данных в рамках Mvvm / Xamarin.Forms
    • и т.д
    Interesting Posts

    Лучшая практика? – Массив / Словарь в качестве основного атрибута объекта данных

    Почему Rand () всегда генерирует случайные числа с фиксированным количеством уникальных групп?

    Проблема при повторном использовании ячейки представления таблицы?

    IOS: отклонить два viewController

    Есть ли переопределение для изменения размера текста в реальном времени с использованием WKWebView для загрузки локальных файлов HTML?

    Отменить NSData initWithContentsOfURL в NSOperation

    Увеличьте UIScrollView после применения любого «преобразования» в subview

    Несколько баз данных с MagicalRecord или синхронизация только части базы данных для iCloud

    Приостановка анимации CALayer с анимацией с задержкой

    В iOS, как я могу отложить автоматическое вращение во время пользовательской анимации (segue)

    Как работает CMTimeCompare?

    UICollectionView на UITableViewCell с прокруткой в ​​том же направлении

    Сделать UIButton как отображаемым, так и текстовым

    Панель действий во всех uiviewcontrollers в iOS

    Очистка кеша IOS BLE

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.