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

Вернуться   Форум Flasher.ru > Flash > Общие вопросы о Flash (не затрагивающие ActionScript)

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

Регистрация: Oct 2005
Сообщений: 6
По умолчанию Локализация 2..N SWF в FLP с паблишем не в корневую папку

Есть веб-приложение (ASP.NET, C#, .NET 2002), в котором отображается граф. редактор на Flash (MX2004, 7.0). Flash организован в виде FLP-проекта, в главную SWF погружаются дочерние SWF. Нужно сделать локализацию Flash-надписей (EN/DE/RU/...).

Хочу использовать панель Strings и галку "Insert ActionScript for automatic language detection" для автоматической локализации.

Проблем возникло три:

1. флеш определяет текущий язык через переменную System.capabilities.language (язык операционной системы), а хотелось текущую культуру передавать через ASPX на стороне клиента, независимо от языка ОС

2. архитектура ВСЕГО проекта такова, что все SWF паблишатся не в текущую для себя директорию (там, где находятся FLA), а в отдельную папку (..\Web\Flash), где их юзают ASPX-страницы. Флеш же ищет файлы ресурсов по адресу, наподобие: \Fla_Directory\de\SwfName_de.xml и не находит файл: \Web\Flash\de\SwfName_de.xml
Это видно исходя из трейсов, которые я добавил в метод initialize() класса mx.lang.Locale, который Флеш использует для локализации:
C:\Documents and Settings\<<My profile>>\Local Settings\Application Data\Macromedia\Flash MX 2004\en\Configuration\Classes\mx\lang\Locale.as

3. SWF для локализации несколько, а у СИСТЕМНОГО (править его нежелательно) класса mx.lang.Locale все статическое - поля и функции. Поэтому, поле класса Locale.xmlMap конечно позволяет хранить таблицу путей до НЕСКОЛЬКИХ XML с локализацией. Но в методе initialize() используется такая запись: xmlDoc.load(xmlMap[langCode][0]) - что некорректно, т.к. индекс (0,1,2...) должен определяться исходя из установленного поля Locale.flaName.

-----------------------

Проблема_1 решена: Сделан класс (и включен в проект) MyLocale, отнаследованный от mx.lang.Locale. В нем добавлено свойство для установки извне поля xmlLang (из ASPX передается значение Request.languages[0] через JavaScript Флешу). Далее, в первом кадре локализуемой SWF вызывается Locale.initialize() и т.о. Флеш подгружает SWF заданного языка. (PS: пробовал вызывать MyLocale.initialize() - но это не сработало. Поэтому пришлось поступить "нелогично" - видно это работает, т.к. MyLocale наследник Locale и он может устанавливать статическое поле родителя).

Проблема_2: В том же классе MyLocale сделал метод CorrectPaths(), который корректирует поле xmlMap (устанавливает корректные пути). Но это не работает, т.к. СНАЧАЛА (я смотрел скомпилированную SWF через SwfDecompiler) Флеш пытается загружать ХМL по неправильному пути (у него это не получается и он выдает бесконечные ошибки в окно Output - "Не могу загрузить файл по заданному URL"), потом срабатывает мой метод CorrectPaths(), пути исправляются, и Флеш загружает наконец XML по корректному пути. Но видимо Флешу настолько "поплохело" после предыдущих ошибок, что он не имеет в себе силы отобразить надписи с данными из XML по "правильным" путям. (Кстати, этот трюк с исправлением путей работает в случае с одной SWF - тоже выдаются бесконечные ошибки в Output, но после исправления пути, Флеш загружает хороший ХМL и отображает то, что надо).

Проблема_3 - решения нет. Static поля, ничего не поделаешь :-( (хочется переписать всю локализацию самостоятельно, в крайнем случае взять за основу класс Locale..., но чувствую, что геморрой еще тот...).

Кто-нибудь может помочь? А опубликовать работающий пример (1 FLP, 2 SWF, паблиш "не в корень", установка культуры извне) было бы совсем супер.

PS: Сорри, за "многабукф" ;-), но ИМХО лучше написать подробно, чем публиковать топик с темой "Памагите!!!" и вопросом "У меня ничего не работает" :-D
Вложения
Тип файла: txt Locale.as.txt (4.6 Кб, 101 просмотров)


Последний раз редактировалось berk; 28.10.2005 в 02:32.
Старый 01.11.2005, 17:09
berk вне форума Посмотреть профиль Отправить личное сообщение для berk Найти все сообщения от berk
  № 2  
Ответить с цитированием
berk

Регистрация: Oct 2005
Сообщений: 6
Есть тут кто живой? :-) Или флеш-гуру не сталкивались с проблемой локализации? :-)

Старый 07.11.2005, 12:46
berk вне форума Посмотреть профиль Отправить личное сообщение для berk Найти все сообщения от berk
  № 3  
Ответить с цитированием
berk

Регистрация: Oct 2005
Сообщений: 6
Спасибо всем за подробные и многочисленные ответы :-D. Тема закрыта.

В общем, проблема решилась путем написания своего класса, аналогичного по функциональности с системным классом Locale. И там самому приделать исправление путей, хранения путей для нескольких FLA, передача локали снаружи и т.п. Галку "Insert ActionScript for automatic language detection" выключил, и сам добавляю ранее автосгенерированный текст в начала каждого файла *.AS

Пришлось по пути решить несколько возникших проблем, типа:
- внутри загрузчика XML onLoad область видимости другая (т.е. внутри этого метода класса не видно собственно других методов этого же класса) - пршлось применять конструкцию типа:
var parent = this;
xmlDoc.onLoad = function(success:Boolean) {
parent.onXMLLoad(success); // parse the XML
callback.call(null, success);
}

- хотя сделали все элементы класса MyLocale нестатическими, член класса private var xmlMap:Object = new Object(); все равно был "един" для всех экземпляров этого класса (т.е. добавление в него объектов из разных инстансов пополняло его во всех других инстансах)... Сделали поэтому в нем массив еще большей размерности (еще одна размерность - имя локализуемой FLA). Теперь метод addXMLPath стал таким:
function addXMLPath(langCode:String, path:String):Void {
if(xmlMap[flaName] == undefined) {
xmlMap[flaName] = new Object();
}
xmlMap[flaName][langCode] = path;
}

Вот такие пироги :-)
Макромедия маст дай за такую кривую локализацию ;-)

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

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

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


 


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


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