|
|
|||||
На самом деле, у Партизана вариант вполне рабочий, но он более ресурсоемкий. Там, где каждый килобайт памяти и каждая секунда процессорного времени не имеет значения, можно им воспользоваться. Тут уже личное предпочтение. Но в общемировой практике, так мало кто делает. Особенно если речь идет о приложении / игре, предназначенном для личного пользования (на счет терминальных не знаю, но почему-то почти уверен, что с ними всё точно так же). Стоит посмотреть код большинства доступных в сети пакетов локализаций на разных платформах, и сразу станет понятным, что там везде используются отдельные файлы для разных языков, которые подгружаются по требованию. Нет никакой нужды тянуть все языки сразу в оперативку. Что если фраз там не 100, а, скажем, 20000, а языков не 3, а 50, к примеру, + добавь сюда кучу XML тегов, отъедающих добрую половину веса всего файла. Довольно увесистый файлик получится. И оперативки много сожрет и читаться будет с тормозами.
А вот возможные ошибки переводчика - это, как по мне, за уши притянутый аргумент. Переводчик легко может ошибиться и в случае, если все переводы размещаются в одном теге, errare humanium est. Наверняка переводом будет заниматься не один человек.
__________________
Ко мне можно и нужно обращаться на ты) Последний раз редактировалось caseyryan; 18.10.2017 в 06:46. |
|
|||||
А можно пример, где это AS3 используется в таком ограниченном ресурсами пространстве? Я что-то не помню чтобы на AS3 микроконтроллеры программировались... Если вы так утрировали мобильники, то опять же скажу вам что ваша теория разбивается моим опытом. Посмотрел сейчас вес языкового файла под три языка для мобильника из последнего проекта... 16 килобайт. Если разбить на три файла, в сумме будет намного больше, хоть и языковой пакет конечно будет легче. Но иконка 96х96 весит больше чем все три языка интерфейса. А это малая часть того что висит в памяти. Так что не надо воду лить... И про мировую практику лечить... Строки интерфейса - это куда легче, чем медиа интерфейса. Есть куда большие проблемы в интерфейсах о которых можно сказать, что они существенно влияют на память или процессор. Пара градиентов или фото в клочья разнесут всю эту вашу экономию на строках интерфейса...
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
тут скорее общепринятой является практика отдавать переводчику xml со всеми текстами в виде одного xml, напортачить там практически нереально, а вот переводить портянку со всеми языками чревато.
|
|
|||||
Тут уже пару страниц обсуждений, выложу для разнообразия код, может кому пригодится... Как видите, кода меньше чем обсуждений, был написан хз когда, под мультиязычный проект с рантаймом, с тех пор мало что меняю.
{ import flash.display.Stage; /** * ... * @author Mikhail Klabukov */ [Event(name="language_change", type="LanguageEvent")] public class Language { private static var _stage:Stage; private static var _self:Language; public static const RU:String = 'ru'; public static const EN:String = 'en'; public static const KZ:String = 'kz'; static public const TR:String = "tr"; public static var CUR:String = 'ru'; public function Language() { } public static function setStage(stage:Stage):void { _stage = stage; } public static function setLanguage(lang:String):void { CUR = lang; _stage.dispatchEvent(new LanguageEvent(LanguageEvent.LANGUAGE_CHANGE, CUR)); } } } package { import flash.events.Event; /** * ... * @author Mikhail Klabukov */ public class LanguageEvent extends Event { public static const LANGUAGE_CHANGE:String = 'language_change'; private var _language:String; public function LanguageEvent(type:String, language:String, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); _language = language; } public function get language():String { return _language; } } } package { import avmplus.getQualifiedClassName; import flash.display.Stage; import flash.utils.Dictionary; import starling.events.Event; /** * ... * @author Mikhail Klabukov (xpochta@gmail.com) */ public class Translator { [Embed(source = "../lib/translations.xml", mimeType = "application/octet-stream")] private static const LANGXML:Class; public static var _self:Translator; private var _xml:XML; private var _stage:Stage; private var _clients:Dictionary = new Dictionary(true); public function Translator(stage:Stage) { _stage = stage; _self = this; _xml = XML(new LANGXML()); stage.addEventListener(LanguageEvent.LANGUAGE_CHANGE, translate) } private function translate(e:LanguageEvent):void { for (var i:Object in _clients) { var obj:Object = _clients[i]; for (var j:* in obj) { i[j] = _self.getTranslationFromXML(obj[j]); } } } static public function getTranslation(stringId:String, obj:* = null, propertyName:String = 'text'):void { var str:String = _self.getTranslationFromXML(stringId); if (str == '') { trace('StringId:', stringId, 'is empty!'); } if (obj != null) { var o:Object; if ( _self._clients[obj] != null || _self._clients[obj] != undefined){ o = _self._clients[obj]; }else{ o = {}; } o[propertyName] = stringId; _self._clients[obj] = o; obj[propertyName] = str; obj.addEventListener(Event.REMOVED_FROM_STAGE,onRemove) } } static private function onRemove(e:Event):void { e.currentTarget.removeEventListener(Event.REMOVED_FROM_STAGE, onRemove); delete _self._clients[e.currentTarget]; } public function getTranslationFromXML(id:String, lang:String = null):String { return _xml.string.(@id == id).attribute(checkLang(lang)); } private function checkLang(lang:String):String { if (lang == null) lang = Language.CUR; return lang; } } } |
|
|||||
Цитата:
Цитата:
Цитата:
Цитата:
Пара вопросов по этому коду, на вскидку: 1) В чем смысл использования XML, если он все равно жестко вшивается в код? Можно было бы легко обойтись нативным Object 2) Для чего там добавляется stage и вообще фигурируют какие-то дисплей объекты? Что мешает сделать Translator синглтоном и использовать его в качестве диспетчера событий? Посылать события от имени stage - это моветон и может легко перерасти в дикий гемор по поиску багов. Выкладывая подобный код, про опыт лучше вообще не упоминать)
__________________
Ко мне можно и нужно обращаться на ты) Последний раз редактировалось caseyryan; 19.10.2017 в 07:47. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Аккуратней. На личности не переходим!
__________________
Reality.getBounds(this); |
|
|||||
Цитата:
Цитата:
Цитата:
Цитата:
|
|
|||||||
Цитата:
Цитата:
В правильной схеме во вьюшках должно быть что-то вроде: _viewModel.addEventListener(LocalizationEvent.LOCALE_CHANGE, onLocaleChange); private function onLocaleChange(e:LocalizationEvent):void { // .... playButton.label = i18n.translate("play"); stopButton.label = i18n.translate("stop"); } Если речь идет об экономии процессорного времени на вычисление атласов растровых шрифтов, то в этом случае, можно обновлять текст только в переменной, а прорисовывать уже при добавлении вьюшки в дисплей лист, но это все равно должна делать сама вьюшка. Цитата:
Цитата:
Цитата:
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Цитата:
Цитата:
var tf:TextField = new TextField(); Translator.getTranslation('strID_hello', tf); // Приветствие. Цитата:
1. Присвоить текст на стадии создания tf. 2. Создать слушатель LocalizationEvent. 3. При изменении языка, заново запросить строку... (здесь дублировать ID) А теперь я вам расскажу что вам еще нужно будет сделать: 4. этот пункт перед третьим будем считать. Загрузить нужную локаль... У вас же все должно быть отдельно) 5. Не забыть удалить все слушатели с tf в случае удаления его со сцены. Это еще один слушатель, еще одна функция и перечисление всех tf в ней... Не слишком ли много действий и кода для одной строки? (для каждой к тому же).... И все это еще нужно будет заставить работать, если это отдельный подгружаемый swf... (к вопросу о stage). Мне достаточно первого пункта. Код выше. З.Ы. Остальные ваши скучно-нудные умозаключения могли бы оставить в месте, коим их придумали... |
|
|||||||
Цитата:
Цитата:
Цитата:
Цитата:
1) Программа запускается и грузит ту локаль, которая соответствует выбранной в операционной системе. Это называется локаль "по умолчанию" (раз уже не понятно) 2) После инициализации вьюшки (без присвоения какого-либо текста текстовым полям), там же в методе инициализации вызывается метод onLocaleChange и передается аргумент null. Открою секрет, метод, при этом нормально вызывается) При этом меняются тексты сразу для всех полей вьюшки, в которых они должны поменяться. Легко и быстро. Цитата:
Цитата:
Да хоть десять подгруженных swf, все будет работать точно так же. Мне не приходится ничего "заставлять" работать. Всё просто работает, потому что написано без костылей.
__________________
Ко мне можно и нужно обращаться на ты) |
Часовой пояс GMT +4, время: 15:03. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|