Как стать автором
Обновить

Комментарии 23

спасибо, тут про silverlight мало статей — да и мне было очень полезно прочесть про локализацию, как раз предстоит ее делать.
Всегда приятно осознавать, что твой труд интересен еще кому-то. Спасибо.
Прошу прощенья, но все-таки: «Привет, мир!». Обращение обособляется запятыми :-)
Досадная ошибка, связанная с подстрочным переводом.
Статья хорошая, НО…

Использование механизма ресурсных сборок для локализации как минимум неудобно.

Лично я предпочитаю выностить как строки, так и другие (картинки) локализуемые ресурсы в [подгружаемый/изменяемый] xaml-стиль.
Мороки при этом никак не больше, а плюсы вполне очевидны.
НЛО прилетело и опубликовало эту надпись здесь
Вы, безусловно, правы. Пользование данной библиотекой затруднено различными опциями. Я задумывался об этом и обещаю, во второй части, поделиться своими мыслями о решение данной проблемы.
Неплохо бы даже короткое (неподробное) описание глянуть.
Со стилями — интересный вариант.

Не будет проблем если в приложении уже подгружается куча стилей для разных тем (скинов). Или в итоге для каждой темы надо будет делать копии с различными переводами? Или визуальные стили отдельно — текст отдельно?
Вкратце.
По памяти, ибо не с рабочей машины пишу.
За описки — не бить. Весь MSDN в мозг не влазит.

Загрузка XAML на C#:
	// Имя файла: lang.enu.xaml
	fName = stirng.Format("lang.{0}.xaml", Thread.CurrentUICulture,.ThreeLetterISOLanguageName);
	// Грузим откуда-то-там наш файл
	ResourceDictionary dic = (ResourceDictionary)XamlReader.Load(...);
	Resources.MergedDictionaries.Clear();
	Resources.MergedDictionaries.Add(dic);


Файл XAML ресурсов:
<ResourceDictionary
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:System="clr-namespace:System;assembly=mscorlib"
	>
	<System:String x:Key="sHello">Hello, world</System:String>
</ResourceDictionary>


Использование — XAML:
	<Label Text="{DynamicResource sHello}" />


Использование — C#:
	string strHello = (string)Application.Current.FindResource("sHello");


Динамическая загрузка/смена поддерживается.
Кстати, советую на какую-нибуть комбинацию клавиш повесить принудительную загрузку.

Не будет проблем если в приложении уже подгружается куча стилей для разных тем (скинов).

Нет. Не будет. Единственное требование — доступ к ним должен быть не через StaticResource, а через DynamicResource.

Или в итоге для каждой темы надо будет делать копии с различными переводами? Или визуальные стили отдельно — текст отдельно?


Как хотите.
Лично я предпочитаю отдельные файлы локализации для каждого из языков. Правда не только со строками, но и с локализабельными элементами стиля (картинки / векторная графика). А сами стили отдельным .xaml.

P.S.: Если что не понятно и есть достаточно заинтересовавшихся, могу и полноценную статью написать.
У Silverlight нет поддержки DynamicResource, поэтому возникает вопрос — откуда он взят и(или) как он реализован?
Спасибо за уточнение.

Лействительно, в Silverlight нет DynamicResource.
Зато есть Binding и Converter'ы.

Sapienti sat
Зато есть Binding и Converter'ы.

Которые не смогут заменить DynamicResource, и не только из-за отсутствия такового, а ввиду различий в реализации класса ResourceDictionary между WFP(в котором присутствует DynamicResource) и Silverlight.

Было бы интересно провести параллели между подходами, я бы с удовольствием почитал вашу статью.
Спасибо, здорово.

На следующем проекте попробую, может понравится такой подход. :)
Silverlight reduce size
Проблему больших xap файлов можно решить галочкой «Reduce XAP size by using application library caching» в свойствах проекта Silverlight и приложив к каждой библиотеке *.extmap.xml файл примерно такого содержания:

  1.  
  2. <?xml version="1.0" encoding="utf-8" ?>
  3. <manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  5.   <assembly>
  6.     <name>Lib</name>
  7.     <version>1.0.0.0</version>
  8.     <publickeytoken>c29bf231c66490a5</publickeytoken>
  9.     <relpath>Lib.dll</relpath>
  10.     <extension downloadUri="Lib.zip" />
  11.   </assembly>
  12. </manifest>
  13.  

«Reduce XAP size by using application library caching» — не работает с Out-of-Browser
Это да
Отличная практика кэширование Silverlight сборок. Может получиться отличная статья. Только, к сожалению, данный подход не работает с дополнительными(satellite) сборками.
Видимо, да. Сателлитные сборки как-то мимо меня прошли. Хотя, может, если как следует «покопать», наверное что-нибудь из этого придумать можно.
Скажите, на лету интерфейс переключается? Т.е. чтобы сменить язык нужно ли перезапускать приложение?

Хотелось бы увидеть подход переключения именно на лету, без перезагрузки.
Если вы сделаете связку(binding) между пользовательским элементом и ресурсом, то при смене культуры данные обновятся.
К сожалению не факт. Культура изменится, но забинденные данные будут ждать принудительного обновления.
После смены культуры в ResourcesProvider`е и загрузки данных сработает событие PropertyChanged. Binding, который автоматически подписывается на это событие, сработает и обновит данные.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации