Ранее я уже писала про рантайм локализацию в посте Легкая локализация во Flex. А будет ли runtime локализация? И с выходом третьей беты Flex 3 можно с уверенностью сказать, что рантайм локализация не только будет, но уже и есть.

И вообще, радуют изменения которые произойдут в третьей версии Adobe Flex в области локализации приложений.
На мой взгляд основными бонусами станут:

  • компиляция приложения с несколькими locale одновременно
  • возможность переключения locale в рантайме (причем соотвествующие resource bundles могут быть как вкомпилены в приложение, так и подгружены)
  • возможность программного создания resources, например из XML файла
  • возможность использования картинок, звуков, видео, стилей и т. д. при локализации

Мало того, что вы можете запросто сделать кнопочку переключения языков у себя в приложении, так еще и при этом переключении менять не только надписи GUI, но и картинки, звуки и например размер шрифта. Кстати, изменение размера шрифта для некоторых языков прямо таки жизненно необходимо, на мой взгляд.

Более того, locale, загружаемую по умолчанию, можно определить в параметрах HTML обертки. А это говорит о том, что вы можете доставлять один swf файл со всеми языками и только в html в параметрах определять, какой язык сейчас увидит пользователь.

А теперь о менее приятном - о том, что вам придется переписать в своих существующих приложениях для перевода их на Flex 3 SDK и использования выше обозначенных бонусов.

Установив третью бету 3-его Flex, сразу же бросились в глаза варнинги по поводу устаревшего применения ResourceBundle с помощью соответствующего метатега.

  1. [ResourceBundle("bundlename")]
  2. private static var rb:ResourceBundle;

Примечательно, что использование директивы @Resource не изменилось. Однако в доках недвусмысленно намекается на то, что лучше не использовать этот способ, так как например, он не позволяет использовать переключение locale в рантайме.

Почему же так не нравится компилятору применение метатега ResourceBundle? Потому что при таком способе, вы лишаетесь удовольствия компилить приложение сразу с несколькими локалиями.

Новый способ взаимодействия с resource bundle - это использование ResourceManager. А скорее всего, вы будете использовать свойство resourceManager, которое теперь есть у всех потомков от UIComponent, Formatter или Validator.

Еще одной приятной вещью станет то, что не обязательно теперь файлы ресурсов делать полностью копиями друг друга. Можно забыть при экспшены при обращении к ресурсу, так как в localeChain можно задать массив locale-ей. Тут и произойдет чудо. Например, ваш язык приложения русский, но недостающие строки могут автоматически цепляться из английских ресурсов.

Все эти радости можно увидеть уже на существующей Flex 3 SDK 3 beta 3.

Например, в дополнительных параметрах компиляции прописываете -locale=US,RU,GE.
Кстати, не забудьте, произвести операции описанные в статье Flex 3:Feature Introductions: Runtime Localization, а иначе не избежать вам ошибок компиляции вида Unable to resolve resource bundle “collections” for locale. Правда для чартингов мне все равно пришлось ручками копировать.
В результате получаете swf с тремя встроенными locale-ми: английская, русская, немецкая. Добавляем в html-оболочку во flashVars localeChain=RU,US. В результате наблюдаем русскоязычное приложение, недостающая часть перевода которого пока на английском.

В общем, поздравляю нас всех - локализация приложений станет удобнее! :)

Трекбек адрес этой записи

URL трекбека (щелкните правой кнопкой мыши и скопируйте ссылку)

10 комментариев, 1 Трекбек

Комментарий от: agahov [Посетитель] Email · http://riapriority.com/blogs/agahov.php
хорошая статья, мне даже захотелось что нибудь локализовать:)
2008-01-11 @ 11:04
Комментарий от: fsb [Учаснег] Email · http://www.skypetr.com
Адобовцы наконец-то написали ресурсменеджер, прогресс не стоит на месте ) Я даже догадываюсь, почем у они до сих пор тормозили с такими простыми, но жизненно необходимыми фичами - фреймворк тяжелый и плохо масштабируемый, для внедрения глобальной, хоть и простой фичи, но не предусмотренной в базовой версии фреймворка, приходится переписывать бОльшую часть классиков, что занимает и время.
2008-01-11 @ 13:29
хорошая статья, мне даже захотелось что нибудь локализовать:)


Так надо срочно что-нибудь локализовать. :)
2008-01-11 @ 13:45
Я даже догадываюсь, почем у они до сих пор тормозили с такими простыми, но жизненно необходимыми фичами - фреймворк тяжелый и плохо масштабируемый, для внедрения глобальной, хоть и простой фичи, но не предусмотренной в базовой версии фреймворка, приходится переписывать бОльшую часть классиков, что занимает и время.


На мой взгляд разработка фрейворков как раз и является настолько трудоемкой, из-за необходимости выдерживать шаткий баланс между такими взаимно влияющими вещами как широта функционала, стабильность, расширяемость и т.д. и т.п.
По поводу жизненной необходимости этих фич, то, например, нашему проекту это не было жизненно важно. Да. Что-то станет удобнее, но не критично. :)
2008-01-11 @ 14:22
Комментарий от: rost [Учаснег] Email · http://flash-ripper.com/
Кстати, не забудьте, произвести операции описанные в статье Flex 3:Feature Introductions: Runtime Localization, а иначе не избежать вам ошибок компиляции вида Unable to resolve resource bundle “collections” for locale.


Я нашел грубый, некрасивый, но работающий способ _обойти_ эти ошибки. Так не нужно делать, и я хочу публично раскаяться в содеянном. В опциях компилятора я написал "-locale=" (т.е. пустая локаль) и мой Флекс Билдер 3 Бета 3 перестал сыпать ошибку "Unable to resolve resource bundle "Strings" for locale "en_US".", возникшую после переноса проекта из Flex 2 во Flex 3.

Вот, исповедался, стало легче :)
2008-01-24 @ 00:18
В опциях компилятора я написал "-locale=" (т.е. пустая локаль) и мой Флекс Билдер 3 Бета 3 перестал сыпать ошибку "Unable to resolve resource bundle "Strings" for locale "en_US".", возникшую после переноса проекта из Flex 2 во Flex 3.


А вот это не спортивно. :)
Во-первых, это тебе не позволит компилить swf с разными локалиями.
А во-вторых, у Кости был пост по этому поводу, там описано еще одно решения именно твоей проблемы. Надо в properties ярлыка для запуска эклипса дописать -nl "en_US" к Target.
2008-01-24 @ 11:28
Комментарий от: rost [Учаснег] Email · http://flash-ripper.com/
Спасибо! Я исправил свой старый код.
2008-01-25 @ 14:29
Комментарий от: rost [Учаснег] Email · http://flash-ripper.com/
Кстати, что интересно, эта конструкция — "-locale=" упоминается в той самой официальной доке со словами:

"change the -locale option to

-locale=

to tell the application not to compile any resources into itself"


— это из описания процедуры определения ресурсов, реально используемых приложением :)
2008-02-02 @ 18:11
Комментарий от: Acid [Посетитель]
Что то я не понял. Все отлично загрузил я 2 языка. А как их переключать в RunTime?
2008-04-03 @ 09:22
Что то я не понял. Все отлично загрузил я 2 языка. А как их переключать в RunTime?

Существует свойство ресурс-менеджера localeChain.
Подробнее можно почитать тут: http://livedocs.adobe.com/flex/3/html/help.html?content=l10n_4.html.
2008-04-03 @ 11:06
Трекбек от: Constantiner's blog [Посетитель]
Лучшие посты на Riapriority.com за уходящий год

По уже сложившейся традиции в последние дни уходящего года в первые дни нового года хочу подвести некоторые итоги по части того, что пол
2009-01-01 @ 22:29

Оставить комментарий


Ваш email адрес. (Не будет показан на сайте.)

Ваш URL будет показан.
:!: :?: :idea: :) :D :p B) ;) :> :roll: :oops: :| :-/ :( :'( |-| :>> :yes: ;D :P :)) 88| :. :no: XX( :lalala: :crazy: >:XX
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)
3 + 2 + 7 - 1?
antispam test

Вы можете использовать OpenID чтобы предоставить ваше имя, email и url.