2012-04-18 2 views
0

Как говорится в названии, существует ли способ изменить ResourceManager getStringArray() таким образом, что он разделяет ресурсы точкой с запятой, а не запятой?Alter ResourceManager для разделения значений точкой с запятой, а не запятой

Фактический метод можно найти в классе ResourceManagerImpl, который можно найти в пакете mx.resources. Переопределение этого метода было бы неплохо, но в идеале я хотел бы написать свой собственный getStringArray с разделителем переменных, однако, похоже, не существует способа расширить класс ResourceManager или ResourceManagerImpl, чтобы каким-то образом добавить этот метод.

Кто-нибудь понял, что делать здесь?

ответ

2

Проблема не в том, что вы не можете продлить ResourceManagerImpl, так как это не final, а скорее, что вы должны иметь возможность зарегистрировать свою реализацию с приложением, а не по умолчанию. И делать это немного сложно.

Так сначала создать свою реализацию:

public class MyResourceManager extends ResourceManagerImpl { 

    private static var instance:IResourceManager; 

    static public function getInstance():IResourceManager 
    { 
     if (!instance) instance = new MyResourceManager(); 
     return instance; 
    } 

    override public function getStringArray(bundleName:String, 
              resourceName:String, 
              locale:String = null):Array { 
     //do your stuff 
    } 

} 

Итак, мы переопределен метод getStringArray. Обратите внимание, что мы сделали то же самое для getInstance, потому что мы хотим, чтобы он возвращал новый экземпляр MyResourceManager вместо ResourceManagerImpl (мы не должны отмечать override, потому что это метод static). Кроме того, вам может потребоваться написать несколько операторов импорта вручную, потому что некоторые из классов, которые вы используете, помечены как «исключенные».

Теперь мы должны сообщить Flex, чтобы использовать MyResourceManager вместо ResourceManagerImpl. Мы можем сделать это с помощью следующего кода:

import mx.core.Singleton; 
Singleton.registerClass("mx.resources::IResourceManager", MyResourceManager); 

Проблема заключается в том, что мы должны сделать это до Flex регистрирует ResourceManagerImpl, потому что вы не можете изменить его, как только он зарегистрирован. Для этого нам нужно создать собственный предварительный загрузчик, в котором мы регистрируем (к сожалению, фаза «preinitialize» приложения не достаточно ранняя).

public class RegisteringPreloader extends DownloadProgressBar { 

    override public function initialize():void { 
     super.initialize(); 
     Singleton.registerClass("mx.resources::IResourceManager", 
           MyResourceManager); 
    } 

} 

Теперь назначьте пользовательский прелоадер к приложению, и мы сделали:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       preloader="RegisteringPreloader" > 

Для получения дополнительной информации я отсылаю вас к довольно похож, но несколько более сложному ответу, который я написал для других вопрос: Is there a way to listen for events on the pop up manager class?

+0

Вау, я, конечно же, не ожидал такого подробного ответа! Большое вам спасибо за вашу помощь. Я сразу доберусь до него.Возможно, просто используйте класс «RegisteringPreloader» для некоторых других загрузочных материалов, которые я сейчас делаю на этапе preinit приложения. Еще раз спасибо! – AlBirdie

+0

Хорошо, после некоторых крошечных корректировок (я взял на себя смелость отредактировать ваш код соответственно [надеюсь, вы можете увидеть комментарий редактирования]), я вишу с фактической реализацией ResourceManager. Когда я пытаюсь вызвать функцию getStringArrayBySeparator, я получаю сообщение об ошибке 1061 (неопределенный метод). Объявление переменной выглядит следующим образом: 'var _resourceMan: IResourceManager = MyResourceManager.getInstance();' и вызов курса '_resourceMan.getStringArrayBySeparator '. – AlBirdie

+0

Хорошо, я полагаю, что я не могу добавить свой собственный метод, потому что метод на самом деле не определен интерфейсом IResourceManager, поэтому не найден. Предположим, что переопределение метода getStringArray с моим собственным будет возможно только в том случае, если я не добавлю другую переменную по той же причине. Хотя это была бы приятная функция, я мог бы сделать с простым переопределением и просто изменить запятую на точку с запятой. – AlBirdie

0

Только для записи: если вы хотите, чтобы обеспечить вашу локализацию с массивом строк, содержащих запятые, это способ проще использовать getObject метод IResourceManager.

В свойствах файла:

my.beloved.strings: ["That's it, string one", "Okay, string two"] 

В коде:

var strings:Array = _resourceManager.getObject(_bundleId, 'my.beloved.strings') as Array; 
var stringOne:String = strings[0]; 

Вам не нужно что-либо переопределить этот путь.