Здравствуйте, 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 >>