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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.10.2017, 18:57
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 21  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от GBee Посмотреть сообщение
Я бы не работал напрямую с хмл, перегнал бы все в словарь какой-нить [ключ]-[значение] и тягал бы из него по мере надобности.
Имеется в виду некий объект, создаваемый непосредственно в программе? То есть при запуске формировать словарь из файла с нужным языком, а потом уже к нему по ключам обращаться?

Цитата:
Если словарик не типизирован, то да. На самом деле в качестве значения может быть более сложный объект, который там содержит заодно окончания слов всякие для разных чисел и т.п. Тут уж фантазия может разойтись.
А есть примеры использования? Я раньше с JSON не сталкивался, сейчас впервые посмотрел на него. Действительно, выглядит аккуратнее и компактнее, по сравнению с XML. Но у последнего огромное преимущество - все механизмы работы с ним разжёваны вдоль и поперёк

Старый 11.10.2017, 19:25
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 22  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™

А я не стесняюсь работать напрямую с XML.
(здесь названия элементов соответствуют id элементов на странице, и скрипт затем подставляет в них содержимое)
__________________
There is no thing in this world that is not simple.

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Потихоньку дополз до реализации некоторых моментов, описанных уважаемым wolsh. Теперь прошу пояснить кое-что по мелочи.

Цитата:
Сообщение от Wolsh Посмотреть сообщение
Для каждой фразы имеется идентификационный номер. В коде, когда надо вывести текст, идет обращение к классу Language и вызывается его статический метод getText(id:uint):String. Этот класс в начале программы загружает XML, в котором все фразы хранятся со своими идентификаторами
Цитата:
Language открывает этот файл и считывает его в объект XML
программа двигается дальше, отрисовывает интерфейс, периодически обращаясь к Language.getText(#)
Чего-то я туплю. Как заставить класс Language загрузить в начале программы фразы из XML и обеспечить возможность обращаться к ним периодически в рантайме? Я правильно понимаю, что если на старте программы (или после смены языка пользователем) мы вызовем статический метод getPhraseBase класса Language с передачей туда id языка из конфига, он загрузит содержимое XML файла на нужном языке
и сохранит в статическую переменную, то в дальнейшем мы всегда сможем обратиться к этой переменной за фразой? Или нет?

Цитата:
3>>Не совсем понял, что значит "руками это не делается"? При чем тут "статические таблицы"? А их кто писал? Не руками? Как-то вообще непонятно, что ты имеешь ввиду.
Я имею в виду, что если к примеру идентификатор каждой фразы формируется из значений каких-то переменных в программе (в частности, уже несколько раз упоминавшейся нами вариант 'наименование свойства + идентификатор пола персонажа as String' для определения массива расшифровок значения данного свойства), то файл XML с этими самыми расшифровками было бы сподручнее и, что важнее, гораздо надёжнее сгенерировать, чем писать вручную, рискуя допустить очепятку. Благо нужные идентификаторы и слова/фразы уже есть в статической таблице Object.

Старый 12.10.2017, 21:28
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 24  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Как заставить класс Language загрузить в начале программы фразы из XML и обеспечить возможность обращаться к ним периодически в рантайме?
Да проще простого. Поскольку класс "статический" (в смысле содержит только статические методы и свойства, не предполагает создание экземпляров), а его нужно "настроить" перед работой, то я делаю статический метод activate(). В принципе, прямо в него можно передать параметром идентификатор языка, который ему загружать (взят ранее из конфига, либо будет замена языка в рантайме), а можно и не делать этого, а жестко прописать обращение в конфиг за языком в самом теле метода activate(). Ну и дальше да, в этом методе загружается нужный .xml - файл и сохраняется в переменную (у меня также создается 4 XMLList'а, так как xml языка содержит 4 "категории" текстов — лейблы на элементах GUI, тексты сообщений для всплывающих окон, тексты инструкций и подсказки (хинты). Но это просто вопрос удобства — я уже как-то писал, что мне нравится "человечность" в коде, когда понятно, что именно запрашивается, а не голое getText(). Ну и вот, создаются статические методы для получения текстов по идентификатору. У меня это выглядело так:
Код AS3:
static public function activate():void
		{
			if (_activated) return;
			currentLanguage = FileManager.configXML.language;
			var languageFile:File = File.applicationDirectory.resolvePath("languages" + File.separator + currentLanguage + ".xml");
			_currenLanguageXML = FileManager.getXML(languageFile).language[0]; //// FileManager загружает файл языка
			_labels = _currenLanguageXML.label; //// список ссылок на лейблы
			_activated = true;
		}
 
static public function getLabel(code:String) : String
{
	return _labels.(@id == code).text();
}
Соответственно в ENG.xml было
Код:
<?xml version="1.0" encoding="utf-8" ?>
<data>
<language id="ENG" native="English">
<!--FileList Context Menu---->
	<label id="0500">Add to Bookmarks</label>
	<label id="0501">Copy the Name</label>
	<label id="0502">Copy the Link</label>
	<label id="0503">Copy the File</label>
	<label id="0504">Rename</label>
	<label id="0505">Delete</label>
	<label id="0506">Add Link</label>
</language>
</data>
__________________
Reality.getBounds(this);

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

Регистрация: Mar 2007
Сообщений: 319
рекомендую значения заворачивать в CDATA
__________________
RocketJump

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Да проще простого. Поскольку класс "статический" (в смысле содержит только статические методы и свойства, не предполагает создание экземпляров), а его нужно "настроить" перед работой, то я делаю статический метод activate().
Во, я примерно об этом и спрашивал. Выходит, что запустив статический метод activate() в самом начале программы, _currenLanguageXML остаётся "заряженным" нужным списком фраз в течение всего рантайма, верно?

Цитата:
Ну и дальше да, в этом методе загружается нужный .xml - файл и сохраняется в переменную
А можешь показать код загрузки XML от файл-менеджера, если не секрет?

И по коду вопросы:

Код AS3:
if (_activated) return;
Просто защита от дурака или ещё какой-то смысл есть в этом?

Код AS3:
_currenLanguageXML = FileManager.getXML(languageFile).language[0]; //// FileManager загружает файл языка
Не понял в этой конструкции .language[0] на конце...

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
1.
Код AS3:
static public function getText(file:File) : String
		{
			if (!file.exists) return null;
			var text:String;
			_stream.open(file, FileMode.READ); //// _stream это объект класса FileStream
			_stream.position = 0;
			text = _stream.readUTFBytes(_stream.bytesAvailable);
			_stream.close();
			return text;
		}
 
		static public function getXML(file:File) : XML
		{
			var xml:XML = null;
			if (!file.exists) //// в системе нет заданного файла
			{
				//// ....выводится попап-окно с ошибкой "файл # не найден"
				return null;
			}
			//// валидация XML
			try 
			{ 
				xml = XML(getText(file)); //// вызывается универсальная загрузка текстового файла getText()
			} 
			catch (err:TypeError) 
			{ 
				//// ....выводится попап-окно с ошибкой "файл # содержит ошибки форматирования"
			}
			return xml;
		}
2. Просто защита от дурака.
3. FileManager.getXML(languageFile) возвращает объект XML. Далее идет синтаксис е4х: .language запускает поиск всех узлов language, и возвращает (внимание!) XMLList (в Adobe ж не знают, что узел language у меня один). Но мне нужен не XMLList, а просто один узел language в виде XML-документа. Поэтому из "всего" списка узлов language я беру первый (нулевой). То есть [0] это индекс узла в списке XMLList.

Добавлено через 23 минуты
Предвидя вопрос "а зачем тогда ты вообще делал такую структуру <data><language/></data>" отвечаю : всё просто, в ФАЙЛЕ может содержаться также информация, относящаяся только к файлу, а не к "языку": автор перевода, версия, дата и т.п. Это будут узлы одного уровня с <language/>.
__________________
Reality.getBounds(this);

Старый 14.10.2017, 13:25
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 28  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Wolsh, большое спасибо. Если не возражаешь, возьму за основу в свой проект. У меня почему-то "не стоит" на все эти сервисные функции типа чтения файлов.

Цитата:
Предвидя вопрос "а зачем тогда ты вообще делал такую структуру <data><language/></data>" отвечаю : всё просто, в ФАЙЛЕ может содержаться также информация, относящаяся только к файлу, а не к "языку": автор перевода, версия, дата и т.п. Это будут узлы одного уровня с <language/>.
Всё ясно, ещё одна защита от дурака. Не напасёшься дураков на твои программы. Хоть открывай XML и ещё один <language> туда вставляй!

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

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Потому что AIR позволяет открывать или сохранять файлы синхронно. То есть исполнение дальнейшего кода останавливается и ждет, пока операция выполнится. Поэтому события типа COMPLETE не нужны. Но при желании конечно можно работать асинхронно "по старинке", для этого тоже есть методы (и свои плюшки типа более полного контроля процесса с ловлей ошибок и событий).
__________________
Reality.getBounds(this);

Старый 14.10.2017, 19:32
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 30  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Друзья, пардон, здесь был ещё один нубский вопрос, но я разобрался сам.


Последний раз редактировалось Appleman; 14.10.2017 в 19:45.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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