Локализация Silverlight
Какие есть варианты перевода приложения silverlight 5 (Prism + MEF)? Если возможно, я бы хотел:
- нет файлов resx (мне не нравится, как они управляются)
- скорее, извлекать, а затем переводить строку xaml (я думаю, что был инструмент от Microsoft, который пометил все узлы XAML пользовательским атрибутом и извлек строки)
- иметь переводы во внешних сборках (в Prism они могут быть модулями) и загружать их при необходимости
- изменить язык во время выполнения
Я открыт для предложений и лучших практик по этой теме.
edit: LocBaml - это то, о чем я говорил выше, но похоже, что он недоступен для Silverlight
2 ответа
Я знаю, что это получит ряд традиционных ответов, но я также хотел бы выдвинуть что-то совершенно оригинальное, что мы пытались (и преуспели) делать сами для более эффективной локализации Silverlight:
Локализация проектов Silverlight после завершения
Он в основном использует вложенные свойства для обеспечения хуков в XAML для динамического изменения строк локализации. Когда они анализируются впервые, ваш код получает возможность вносить изменения в связанные элементы, а языковой обмен просто означает перезагрузку текущей страницы.
Строки локализации приходят из базы данных сервера с помощью простого вызова служб RIA. Возвращенные записи являются простыми парами ключ / значение для выбранного языка.
Этот метод также не имеет (довольно больших) накладных расходов по сравнению с традиционными методами привязки, которые вы увидите много. Мы загружаем только выбранные языковые строки при запуске приложения. Это также потенциально позволяет отправлять правки / исправления обратно на сервер (если вы можете нести накладные расходы на редактор в приложении... мы сделали это, но это была большая работа).
PS Мы использовали PRISM, но он работает также в любом приложении Silverlight, так как нет никаких зависимостей (например, от Unity и т. Д.).
PPS. Когда я вернусь домой сегодня вечером, я выложу несколько фрагментов кода для этой системы.
(Resx такой "прошлый век")
Мое текущее решение использует DataBinding для свойств, которые вы хотите локализовать (т.е. TextBox
"s Text
, Button
"s Content
, Всплывающие подсказки и т. Д.) В глобально доступную коллекцию строк, другими словами, Singleton. В моем случае, так как я использую MVVM Light, у меня есть LocalizedStringCollection
выставлено ViewModelLocator
,
Эта коллекция загружается из файла XLIFF (см. https://en.wikipedia.org/wiki/Xliff) в Dictionary<string, string>
это член моей коллекции.
Вот ключевые части коллекции, чтобы выставить строки.
/// <summary>
/// A Singleton bindeable collection of localized strings.
/// </summary>
public class LocalizedStringCollection : ObservableObject, INotifyCollectionChanged
{
private Dictionary<string, string> _items;
/// <summary>
/// The content of the collection.
/// </summary>
public Dictionary<string, string> Items
{
get { return _items; }
private set
{
_items = value;
RaisePropertyChanged();
if (CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
/// <summary>
/// Convenience accessor, most likely entry point.
/// </summary>
/// <param name="key">A localized string name</param>
/// <returns>The localized version if found, an error string else (ErrorValue in DEBUG mode, the key in RELEASE)</returns>
public string this[string key]
{
get
{
Contract.Requires(key != null);
Contract.Ensures(Contract.Result<string>() != null);
string value;
if (Items.TryGetValue(key, out value))
return value ?? String.Empty;
#if DEBUG
return ErrorValue;
#else
return key;
#endif
}
}
}
Разбор XLIFF тривиален с использованием встроенной поддержки XML.
А вот примеры использования XAML (могут быть более или менее подробными в зависимости от используемого синтаксиса):
<TextBlock Text="{Binding LocalizedStrings[login_label], Source={StaticResource Locator}}" />
<Button ToolTipService.ToolTip="{Binding LocalizedStrings[delete_content_button_tip], Source={StaticResource Locator}}" />
Надеюсь это поможет:)
Я мог бы сделать статью об этом (с полным источником), если люди заинтересованы.