Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.10.2017, 06:24
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 51  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
На самом деле, у Партизана вариант вполне рабочий, но он более ресурсоемкий. Там, где каждый килобайт памяти и каждая секунда процессорного времени не имеет значения, можно им воспользоваться. Тут уже личное предпочтение. Но в общемировой практике, так мало кто делает. Особенно если речь идет о приложении / игре, предназначенном для личного пользования (на счет терминальных не знаю, но почему-то почти уверен, что с ними всё точно так же). Стоит посмотреть код большинства доступных в сети пакетов локализаций на разных платформах, и сразу станет понятным, что там везде используются отдельные файлы для разных языков, которые подгружаются по требованию. Нет никакой нужды тянуть все языки сразу в оперативку. Что если фраз там не 100, а, скажем, 20000, а языков не 3, а 50, к примеру, + добавь сюда кучу XML тегов, отъедающих добрую половину веса всего файла. Довольно увесистый файлик получится. И оперативки много сожрет и читаться будет с тормозами.
А вот возможные ошибки переводчика - это, как по мне, за уши притянутый аргумент. Переводчик легко может ошибиться и в случае, если все переводы размещаются в одном теге, errare humanium est. Наверняка переводом будет заниматься не один человек.
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 18.10.2017 в 06:46.
Старый 18.10.2017, 23:28
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 52  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Там, где каждый килобайт памяти и каждая секунда процессорного времени не имеет значения, можно им воспользоваться. Тут уже личное предпочтение. Но в общемировой практике, так мало кто делает.
А можно пример, где это AS3 используется в таком ограниченном ресурсами пространстве? Я что-то не помню чтобы на AS3 микроконтроллеры программировались... Если вы так утрировали мобильники, то опять же скажу вам что ваша теория разбивается моим опытом. Посмотрел сейчас вес языкового файла под три языка для мобильника из последнего проекта... 16 килобайт. Если разбить на три файла, в сумме будет намного больше, хоть и языковой пакет конечно будет легче. Но иконка 96х96 весит больше чем все три языка интерфейса. А это малая часть того что висит в памяти. Так что не надо воду лить... И про мировую практику лечить... Строки интерфейса - это куда легче, чем медиа интерфейса. Есть куда большие проблемы в интерфейсах о которых можно сказать, что они существенно влияют на память или процессор. Пара градиентов или фото в клочья разнесут всю эту вашу экономию на строках интерфейса...

Старый 18.10.2017, 23:51
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 53  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
тут скорее общепринятой является практика отдавать переводчику xml со всеми текстами в виде одного xml, напортачить там практически нереально, а вот переводить портянку со всеми языками чревато.

Старый 19.10.2017, 00:43
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 54  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Тут уже пару страниц обсуждений, выложу для разнообразия код, может кому пригодится... Как видите, кода меньше чем обсуждений, был написан хз когда, под мультиязычный проект с рантаймом, с тех пор мало что меняю.
Код AS3:
{
	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));
		}
	}
 
}
Код AS3:
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;
		}
 
	}
 
}
Код AS3:
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;
		}
 
	}
 
}

Старый 19.10.2017, 07:23
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 55  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
А можно пример, где это AS3 используется в таком ограниченном ресурсами пространстве?
Да. Мобильные игры. Часто бывает так, что оптимизиоровать нужно буквально всё.
Цитата:
Если вы так утрировали мобильники, то опять же скажу вам что ваша теория разбивается моим опытом.
Готов поспорить, что опыта программирование под мобильники у меня, как минимум не меньше) Так что не надо тут разговоров про опыт, теории и что там обо что разбивается.
Цитата:
Так что не надо воду лить... И про мировую практику лечить..
Чтобы не лечить тут всех тем, что написание всех переводов в одном файле это правильно, рекомендую всё-таки посмотреть эту общемировую практику. Начать, хотя бы, с андроида, потом глянуть пакеты i18n или l10n, которые используются вообще сплошь и рядом
Цитата:
Тут уже пару страниц обсуждений, выложу для разнообразия код, может кому пригодится... Как видите, кода меньше чем обсуждений, был написан хз когда, под мультиязычный проект с рантаймом, с тех пор мало что меняю.
Да уж)
Пара вопросов по этому коду, на вскидку:
1) В чем смысл использования XML, если он все равно жестко вшивается в код? Можно было бы легко обойтись нативным Object
2) Для чего там добавляется stage и вообще фигурируют какие-то дисплей объекты? Что мешает сделать Translator синглтоном и использовать его в качестве диспетчера событий? Посылать события от имени stage - это моветон и может легко перерасти в дикий гемор по поиску багов.

Выкладывая подобный код, про опыт лучше вообще не упоминать)
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 19.10.2017 в 07:47.
Старый 19.10.2017, 09:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 56  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Аккуратней. На личности не переходим!
__________________
Reality.getBounds(this);

Старый 19.10.2017, 15:03
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 57  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Цитата:
Чтобы не лечить тут всех тем, что написание всех переводов в одном файле это правильно, рекомендую всё-таки посмотреть эту общемировую практику.
Спасибо за рекомендацию, мне она известна далеко не поверхностно, но я кажется уже описывал почему этот стандарт не всегда подходит. Что касается небольших приложений, то опять же с целью сокращения объема приложения и увеличения производительности не вижу смысла раздувать количество файлов и лишних операций.
Цитата:
1) В чем смысл использования XML, если он все равно жестко вшивается в код? Можно было бы легко обойтись нативным Object
Жестко вшивается оттого, что в будущем не предполагалось изменение языкового пакета приложения после его компиляции, операция загрузки файла тут лишняя. Думаю, я ответил почему XML.
Цитата:
2) Для чего там добавляется stage и вообще фигурируют какие-то дисплей объекты? Что мешает сделать Translator синглтоном и использовать его в качестве диспетчера событий? Посылать события от имени stage - это моветон и может легко перерасти в дикий гемор по поиску багов.
Отправка событий через stage была оправдана в одном из проектов конфликтом имен или областью видимости подгружаемых роликов точно наверное уже не вспомню, может быть версией AVM. Не суть важно... Моветон или нет вопрос спорный, не один холивар на эту тему был. Багов по этой схеме не припомню. DisplayObject'ы регистрируются для того, чтобы в момент смены языка менялся только текст который отображается на экране. Если к примеру textfield вне display list, его регистрация стирается.
Цитата:
Выкладывая подобный код, про опыт лучше вообще не упоминать)
Как же я жил без Вашей оценки? И как дальше-то жить с этим?

Старый 20.10.2017, 10:16
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 58  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Моветон или нет вопрос спорный, не один холивар на эту тему был. Багов по этой схеме не припомню.
Ну, в принципе, логично. Можно писать вообще любой г-код и оправдывать это тем, что сложно припомнить баги по этой схеме, и много холиваров было. Работает? Да. Значит написано хорошо!

Цитата:
DisplayObject'ы регистрируются для того, чтобы в момент смены языка менялся только текст который отображается на экране. Если к примеру textfield вне display list, его регистрация стирается.
Уже вижу, как при добавлении новых объектов на сцену, они добавляются с неизмененным языком, потому что при создании какого-то нового объекта, разработчик забыл из зарегистрировать. И это при том, что если делать "нормально", то объекты вьюшки сами должны слушать изменение модели, и сами менять свои надписи, если произошло событие смены языка. Языковой пакет уж точно этим заниматься не должен. Он должен лишь хранить переводы и отдавать нужный по запрошенному ID. Он даже событий никаких может не слать
В правильной схеме во вьюшках должно быть что-то вроде:
Код AS3:
 
_viewModel.addEventListener(LocalizationEvent.LOCALE_CHANGE, onLocaleChange);
 
private function onLocaleChange(e:LocalizationEvent):void {
    // ....
    playButton.label = i18n.translate("play");
    stopButton.label = i18n.translate("stop");
}
И не надо никаких заморочек с регистрацией объектов в языковом пакете и отправкой событий через stage. И 100% все нужные тексты при смене языка будут сразу переведены.
Если речь идет об экономии процессорного времени на вычисление атласов растровых шрифтов, то в этом случае, можно обновлять текст только в переменной, а прорисовывать уже при добавлении вьюшки в дисплей лист, но это все равно должна делать сама вьюшка.

Цитата:
Отправка событий через stage была оправдана в одном из проектов конфликтом имен или областью видимости подгружаемых роликов точно наверное уже не вспомню, может быть версией AVM
Есть такая вещь, как рефакторинг. Которая работала всегда, независимо от версий avm. Любые конфликты имен легко исправляются.
Цитата:
Спасибо за рекомендацию, мне она известна далеко не поверхностно
Заметно
Цитата:
Как же я жил без Вашей оценки?
Не знаю, но могу предположить, что хвастаясь своим опытом перед кем-то менее опытным)
Цитата:
И как дальше-то жить с этим?
Жить не вводя новичков в заблуждение подобными рассуждениями и примерами. А то они могут подумать, что раз у человека много лет опыта, значит он их точно научит делать правильно. А в реальности окажется, что он просто выложил свой древний кривой код, который, по каким-то причинам, ленинтся переделать правильно, при этом сам понимает, что это фигня, но признать это, после таких длительных рассуждений, будет равносильно падению лицом в грязь. Это моё имхо)
__________________
Ко мне можно и нужно обращаться на ты)

Старый 20.10.2017, 17:59
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 59  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Цитата:
Ну, в принципе, логично. Можно писать вообще любой г-код и оправдывать это тем, что сложно припомнить баги по этой схеме, и много холиваров было. Работает? Да. Значит написано хорошо!
В моем случае я вижу решение, а вы почему-то г... Хотя есть один анекдот, суть которого можно описать как "Пчела видит жизнь в мёде, а муха..."
Цитата:
Уже вижу, как при добавлении новых объектов на сцену, они добавляются с неизмененным языком, потому что при создании какого-то нового объекта, разработчик забыл из зарегистрировать.
Исключено, для этого собственно и создавалась "регистрация"...
Код AS3:
var tf:TextField = new TextField();
Translator.getTranslation('strID_hello', tf); // Приветствие.
Цитата:
И это при том, что если делать "нормально", то объекты вьюшки сами должны слушать изменение модели, и сами менять свои надписи, если произошло событие смены языка. Языковой пакет уж точно этим заниматься не должен. Он должен лишь хранить переводы и отдавать нужный по запрошенному ID. Он даже событий никаких может не слать
В правильной схеме во вьюшках должно быть что-то вроде:
Код AS3:

_viewModel.addEventListener(LocalizationEvent.LOCALE_CHANGE, onLocaleChange);

private function onLocaleChange(e:LocalizationEvent):void {
// ....
playButton.label = i18n.translate("play");
stopButton.label = i18n.translate("stop");
}
И не надо никаких заморочек с регистрацией объектов в языковом пакете и отправкой событий через stage. И 100% все нужные тексты при смене языка будут сразу переведены.
Т.е. если я правильно понимаю, то "нормально" для вас это:
1. Присвоить текст на стадии создания tf.
2. Создать слушатель LocalizationEvent.
3. При изменении языка, заново запросить строку... (здесь дублировать ID)
А теперь я вам расскажу что вам еще нужно будет сделать:
4. этот пункт перед третьим будем считать. Загрузить нужную локаль... У вас же все должно быть отдельно)
5. Не забыть удалить все слушатели с tf в случае удаления его со сцены. Это еще один слушатель, еще одна функция и перечисление всех tf в ней...
Не слишком ли много действий и кода для одной строки? (для каждой к тому же).... И все это еще нужно будет заставить работать, если это отдельный подгружаемый swf... (к вопросу о stage).

Мне достаточно первого пункта. Код выше.

З.Ы. Остальные ваши скучно-нудные умозаключения могли бы оставить в месте, коим их придумали...

Старый 21.10.2017, 10:03
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 60  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Исключено, для этого собственно и создавалась "регистрация"...
Ну можно тогда и сказать тоже самое про ошибку переводчика. Она так же исключена. Для этого и создавались ID. Как-то так.
Цитата:
Хотя есть один анекдот, суть которого можно описать как "Пчела видит жизнь в мёде, а муха..."
А еще есть поговорка "ему хоть .. в глаза, а он всё - Божья роса!" )
Цитата:
В моем случае я вижу решение, а вы почему-то г...
Да, решение. Но костыльное. Новичка такому учить явно не надо. Не всё, что решает проблему, является её правильным решением. Если не важно как, лишь бы работало, то можно что угодно нагородить. Мол "и так сойдёт".
Цитата:
Т.е. если я правильно понимаю, то "нормально" для вас это:
1. Присвоить текст на стадии создания tf.
2. Создать слушатель LocalizationEvent.
3. При изменении языка, заново запросить строку... (здесь дублировать ID)
А теперь я вам расскажу что вам еще нужно будет сделать:
4. этот пункт перед третьим будем считать. Загрузить нужную локаль... У вас же все должно быть отдельно)
5. Не забыть удалить все слушатели с tf в случае удаления его со сцены. Это еще один слушатель, еще одна функция и перечисление всех tf в ней...
Не слишком ли много действий и кода для одной строки? (для каждой к тому же).... И все это еще нужно будет заставить работать, если это отдельный подгружаемый swf... (к вопросу о stage).
А теперь я расскажу, что происходит на самом деле:
1) Программа запускается и грузит ту локаль, которая соответствует выбранной в операционной системе. Это называется локаль "по умолчанию" (раз уже не понятно)
2) После инициализации вьюшки (без присвоения какого-либо текста текстовым полям), там же в методе инициализации вызывается метод onLocaleChange и передается аргумент null. Открою секрет, метод, при этом нормально вызывается)
При этом меняются тексты сразу для всех полей вьюшки, в которых они должны поменяться. Легко и быстро.
Цитата:
5. Не забыть удалить все слушатели с tf в случае удаления его со сцены. Это еще один слушатель, еще одна функция и перечисление всех tf в ней...
Не слишком ли много действий и кода для одной строки? (для каждой к тому же).... (к вопросу о stage).
К текстовым полям не добавляются никакие слушатели, никогда. Не понимаю коим местом было сделано это умозаключение. Слушатель (только один) добавляется внутри вьюшки к модели. При удалении со сцены он не удаляется. А удаляется, только если у вью был вызван метод dispose(), который уничтожает и всё остальное.
Цитата:
И все это еще нужно будет заставить работать, если это отдельный подгружаемый swf...
Вот это вообще не понял к чему сказано)
Да хоть десять подгруженных swf, все будет работать точно так же. Мне не приходится ничего "заставлять" работать. Всё просто работает, потому что написано без костылей.
__________________
Ко мне можно и нужно обращаться на ты)

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.