Re[7]: Компонент для перевода интерфейса - версия 1.0а
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 06.10.04 19:36
Оценка:
Здравствуйте, alive, Вы писали:

A>Потом, если собирать все строковые ресурсы то это потащит и vcl-ные и ресурсы сторонних компонент — мало не покажется . Но при использовании resourcestring компилятор сам назначает строкам id и отделить "свои" от "чужих" по-моему нельзя.

A>Как вариант можно подключать строковые ресурсы через rc — файлы в определенном диапазоне id и уже в компоненте указывать этот диапазон для их выцепления, помещения в отдельную секцию выходного файла и перевода.

Да, пожалуй, в любом случае автоматизмом и не запахнет на 100%. Ну что-же, раз мы с вами тут беседуем вдвоем, тогда можно сказать, что мы пришли к выводу, как наиболее прозрачно сделать custom-секцию в файле с интерфейсом: сама секция делается ручками с нужным именем (раз пока один ini-like формат выгрузки — это вдвойне просто), а для случаев, когда имеются ресурсные строки, просто зашитые в код строки и пр. я предусмотрю следующие методы:

// будет что-то типа перечисления в настройках компонента:
typedef enum
{
  daLoadFromResource, // загрузить из ресурса, если не найдено в файле интерфейса
    daReturnDefault // вернуть значение, переданное в функцию

} TDefaultAction;

String __fastcall Translate(int ID, TDefaultAction DefaultAction, const String& DefaultValue="");
String __fastcall Translate(String ID, TDefaultAction DefaultAction, const String& DefaultValue="");
// ну и еще пяток перегруженных, если будет необходимость ;)


То есть, в первом приближении, работа будет вестись так:
// задали имя секции, в которой определенные нами настройки
InterfaceTranslator->CustomSectionName = "MYSECTION";

// пытаемся загрузить из ресурса с ID 100, если строка вида "100=bla-bla" не найдена в файле интерфейса
Label1->Caption = InterfaceTranslator->Translate(100,daLoadFromResource);

// возвращаем дефолтное значение, если строка вида "100=bla-bla" не найдена в файле интерфейса
Label1->Caption = InterfaceTranslator->Translate(100,daReturnDefault,"Default value");


В таком вот аксепте, в общем. То есть вроде как почти убиваем двух зайцев, за исключением того, что секцию [MYSECTION] (как в нашем примере) придется делать ручками.

В общем, если это у вас не вызывает возражений — имплементирую к следующему релизу.

З.Ы. Пока писал, понял, что лучше сделать не enum, а set для обеспечения перебора методов поиска:
typedef enum
{
  daLoadFromResource, // загрузить из ресурса, если не найдено в файле интерфейса
    daReturnDefault // вернуть значение, переданное в функцию

} TDefaultAction;

typedef System::Set<TDefaultAction, daLoadFromResource,daReturnDefault> TDefaultActions;

// ну и потом делаем:
TDefaultActions actions = TDefaultActions() << daLoadFromResource << daReturnDefault;
// то есть компонент будет искать в ресурсах, если не найдет, то вернет дефолтное значение.
// а если добавится еще один путь для поиска - совсем хорошо :)
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.