powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 2 GunSmoker по поводу ITM
25 сообщений из 112, страница 1 из 5
2 GunSmoker по поводу ITM
    #37611901
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил локализовать свое приложение, покурил Вашу статью , очень здорово написано, спасибо!

Столкнулся с проблемой. У меня в приложении есть дата-модуль (у которого, само собой, есть DFM-файл), так вот этот DFM не попадает в проект локализации.

Вот, генерирую визардом русскую локализацию, создается проект MyCoolApplication.RUS, в который попадают DFM-файлы от всех форм моего проекта, а DFM от дата-модуля туда не попадает. Получается, когда я выбираю в меню IDE пункт Project/Languages/Set Active (Русский(Россия)) , приложение при запуске выбивает ексепшен

Код: plaintext
Project MyCoolApplication.exe raised exception class EResNotFound with message 'Resource TDM not found'.

поскольку сериализованные данные форм тянутся уже из ресурсной DLL, а в этой ресурсной DLL нет DFM-ки от дата-модуля.

Если из приложения исключить дата-модуль, то все формы нормально локализуются и все работает.

Если в проект локализации добавить DFM от дата-модуля вручную, то при клике на эту DFM вместо Translation editor открывается исходник дата-модуля.

Может быть, я что-то делаю не так. Посоветуйте, как это пофиксить или обойти.

When a movie is over, it's a black
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37612212
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу ничего специального сказать про модули данных - с базами данных я работаю крайне редко. Есть мнение, что он не должен отличаться от формы.

Попробовал воспроизвести ситуацию на пустом проекте (XE2) - не получилось. Модуль данных нормально попал в оба языковых проекта (два языка создавал). При загрузке опять же, нормально всё работало.

Возможно, среда почему-то не может его найти. Быть может, модуль (unit) с модулем данных не подключен как часть проекта или что-то такое?

В общем, не знаю.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37612215
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже ничего сказать не могу, но есть предположение, что не попадает, потому что нечего локализировать. Нет ни resourcestring, ни визуальных элементов. Ничего нет у автора.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37612248
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал на пустом проекте с дата-модулем, DFM-ка дата-модуля попадает под локализацию. Пичалька.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37612249
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerБыть может, модуль (unit) с модулем данных не подключен как часть проекта или что-то такое?
Подключен, там все честно.

Если разберусь, что у меня не работает - отпишусь.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37612259
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, у меня был косяк в .dproj-файле. Дата-модуль был объявлен без ссылки на его форму. Все в порядке.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613060
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу перевода. Может лучше использовать сторонние компоненты или программы?

Я в прошлом году перепробовал несколько разных компонент и программ.
Остановился на Radialix.
Программа на русском, сравнительно не дорого. Русскоязычная тех. поддержка в виде форума.
Я не вижу смысла в динамическом переключении языков (и не только я).

Radialix очень похожа на Lingobit, но стоимость последней.... для компаний-миллионеров.
Очень большое преимущество таких программ - это перевод, используя готовые программы перевода и онлайн сервисы, типа гуглопереводчика или M$переводчика. Гуглопереводчик значительно умнее оказался. M$переводчик переводит в стиле "Моя идёт купаться" или "Один палка два струна - я хозяин вся страна".

Выделил в таблице 1-2-50 строк, нажал кнопку, подождал 10-15 секунд - готово, только подкорректировать нужно.
Я не знаю, как в других случаях, но при переводе с русского на украинский гуглопереводчик даёт на 99% верный, литературно-правильный и корректный перевод. Единственное, что иногда добавляет лишние пробелы перед скобками, многоточием и другими служебными символами.

Я обращался к автору каких-то delphi компонент для перевода с просьбой добавить такой функционал в его компоненты. Авто не поддержал мою идею.

Но время перевода с помощью ПроМТ или гуглопереводчика сокращается в разы.

Где-то Radialix лучше, а где-то Lingobit. Везде есть свои ++ и --, в том числе и баги.
Ещё прелесть Radialix`а в том, что отдавая проект перевода переводчику, не нужно покупать дополнительную лицензию на Radialix, т.к. в режиме "Переводчик" программу можно использовать бесплатно.

Там можно как-то сделать и динамическое переключение, используя библиотеки ресурсов, но я пока не понял как, а в справке очень слабо описано. Сама программа Radialix так использует локализацию - 1 exe`шник + несколько Dll с переводом.
Если кто подскажет - буду рад.

В каких-то других компонентах я обнаружил неплохую возможность перевода данных из базы, т.е. можно держать справочники в разных языках.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613087
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11По поводу перевода. Может лучше использовать сторонние компоненты или программы?
Я работаю в профессиональном бюро переводов. Для перевода мы используем пакет SDL Trados , который умеет зачитывать билингуальный формат XLIFF (.dfn, .rcn - это XLIFF-файлы, которые генерирует штатный Delphi ITE). Переведенные XLIFF я просто "подкидываю" в проект локализации, ITE их компилирует в ресурс. Вуаля!
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613106
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Там можно как-то сделать и динамическое переключение, используя библиотеки ресурсов, но я пока не понял как, а в справке очень слабо описано.
Если кто подскажет - буду рад.


Смотри ...\Samples\Delphi\VCL\RichEdit\reinit.pas, там готовый код для runtime-переключения языков приложения.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
unit reinit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;

procedure ReinitializeForms;
function LoadNewResourceModule(Locale: LCID): Longint;

implementation

type
  TAsInheritedReader = class(TReader)
  public
    procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer); override;
  end;

procedure TAsInheritedReader.ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer);
begin
  inherited ReadPrefix(Flags, AChildPos);
  Include(Flags, ffInherited);
end;

function SetResourceHInstance(NewInstance: Longint): Longint;
var
  CurModule: PLibModule;
begin
  CurModule := LibModuleList;
  Result := 0;
  while CurModule <> nil do
  begin
    if CurModule.Instance = HInstance then
    begin
      if CurModule.ResInstance <> CurModule.Instance then
        FreeLibrary(CurModule.ResInstance);
      CurModule.ResInstance := NewInstance;
      Result := NewInstance;
      Exit;
    end;
    CurModule := CurModule.Next;
  end;
end;

function LoadNewResourceModule(Locale: LCID): Longint;
var
  FileName: array [0..260] of char;
  NewName: string;
  LocaleName: array[0..4] of Char;
  NewInst: Longint;
begin
  GetModuleFileName(HInstance, FileName, SizeOf(FileName));

    // create libname from base name

  GetLocaleInfo(Locale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
  NewInst := 0;
  Result := 0;
  begin
    if LocaleName[0] <> #0 then
    begin
      NewName := StringReplace(FileName, '.exe', '.' + String(LocaleName), [rfIgnoreCase]) ;

      // Then look for a potential language/country translation

      NewInst := LoadLibraryEx(PChar(NewName), 0, LOAD_LIBRARY_AS_DATAFILE);
      if NewInst = 0 then
      begin
        // Finally look for a language only translation

        LocaleName[2] := #0;
        NewName := StringReplace(FileName, '.exe', '.' + String(LocaleName), [rfIgnoreCase]) ;
        NewInst := LoadLibraryEx(PChar(NewName), 0, LOAD_LIBRARY_AS_DATAFILE);
      end;
    end;
  end;
  if NewInst <> 0 then
    Result := SetResourceHInstance(NewInst)
end;

function InternalReloadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent): Boolean;
var
  HRsrc: THandle;
  ResStream: TResourceStream;
  AsInheritedReader: TAsInheritedReader;
begin                   { avoid possible EResNotFound exception }
  if HInst = 0 then HInst := HInstance;
  HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA);
  Result := HRsrc <> 0;
  if not Result then Exit;
  ResStream := TResourceStream.Create(HInst, ResName, RT_RCDATA);
  try
    AsInheritedReader := TAsInheritedReader.Create(ResStream, 4096);
    try
      Instance := AsInheritedReader.ReadRootComponent(Instance);
    finally
      AsInheritedReader.Free;
    end;
  finally
    ResStream.Free;
  end;
  Result := True;
end;

function ReloadInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;

  function InitComponent(ClassType: TClass): Boolean;
  begin
    Result := False;
    if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit;
    Result := InitComponent(ClassType.ClassParent);
    Result := InternalReloadComponentRes(ClassType.ClassName, FindResourceHInstance(
      FindClassHInstance(ClassType)), Instance) or Result;
  end;

begin
  Result := InitComponent(Instance.ClassType);
end;

procedure ReinitializeForms;
var
  Count: Integer;
  I: Integer;
  Form: TForm;
begin
  Count := Screen.FormCount;
  for I := 0 to Count - 1 do
  begin
    Form := Screen.Forms[I];
    ReloadInheritedComponent(Form, TForm);
  end;
end;

end.


...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613230
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, на вскидку...
Новые формы (которых нет в Screen.Forms) создаются уже в новой LCID?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613267
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Квейд и X11: а нет желания потом поделиться опытом в виде статьи сами знаете куда ? :)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613285
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдСмотри ...\Samples\Delphi\VCL\RichEdit\reinit.pas, там готовый код для runtime-переключения языков приложения.

Который работает отвратительно, только на очень простых проектах нормально.
Проще перезапустить проект.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613377
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker2Квейд и X11: а нет желания потом поделиться опытом в виде статьи сами знаете куда ? :)

Можно попробовать. Только я не уверен, что статью выпустят.
Я ни разу статьи не писал, тем более для журналов :)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613399
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11GunSmoker2Квейд и X11: а нет желания потом поделиться опытом в виде статьи сами знаете куда ? :)

Можно попробовать. Только я не уверен, что статью выпустят.
Я ни разу статьи не писал, тем более для журналов :)
Напиши для GunSmoker, для его блога.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613416
xen2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
про delloc знаете? (был в обзоре )
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613804
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Там можно как-то сделать и динамическое переключение, используя библиотеки ресурсов, но я пока не понял как, а в справке очень слабо описано. Сама программа Radialix так использует локализацию - 1 exe`шник + несколько Dll с переводом.
Если кто подскажет - буду рад.

Как оказалось, в Radialix это решается просто: включение в программе нужного чекбокса для создания dll и потом копирование созданных dll в папке программы.

Нужно будет попробовать.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37613895
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFF
Квейд> Я работаю в профессиональном бюро переводов.
А кто у вас именно переводом занимается? Сотрудники/агенты/фриланс переводчики? Не гугл же...
Как обходитесь с "предметными областями", терминами?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37614054
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorOFF
Квейд> Я работаю в профессиональном бюро переводов.
А кто у вас именно переводом занимается? Сотрудники/агенты/фриланс переводчики? Не гугл же...


Гугл у нас - один из заказчиков.

У нас в штате есть проджект-менеджеры, которые работают с удаленными переводчиками-фрилансерами.

Так же имеются штатные переводчики-профессионалы. Например, у нас переводчик, который переводит тексты на медицинскую тематику, имеет диплом врача.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37614310
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Можно попробовать. Только я не уверен, что статью выпустят.
Я ни разу статьи не писал, тем более для журналов :)

Да ничего страшного. Могу помочь подправить, если будет нужно.

Но даже если вдруг почему-то в журнал не попадёт - работа не пропадёт же, найдём куда пристроить.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37614503
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статью на какую тему? На тему сравнения двух программ? Или вообще на тему локализации?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37614706
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker2Квейд и X11: а нет желания потом поделиться опытом в виде статьи сами знаете куда ? :)Я закончу со своим проектом, и мог бы накропать статью. Другое дело, что imho Ваша статья про ITM - вполне себе раскрывает тему, нужно ли плодить сущности?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37614958
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имелось в виду: вот есть теоретический материал по локализации - хорошо.

А можно было бы написать про практический аспект. Какие инструменты использовали, как их вместе соединяли, где брали словари/переводы, что там с совместимостью форматов, какие возникали проблемы, как их решали и т.п.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37615051
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе не было никаких особых проблем, была задача выбрать максимально удобный инструмент, с помощью которого можно было бы максимально быстро перевести и при этом потратить минимальное время на установку.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37615052
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял, попробую что-то накрапать.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37615211
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, насильно вытаскивать из себя, конечно, не надо. Но если вдруг есть что интересное, чем можно поделится - было бы неплохо :)
...
Рейтинг: 0 / 0
25 сообщений из 112, страница 1 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 2 GunSmoker по поводу ITM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]