powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 2 GunSmoker по поводу ITM
112 сообщений из 112, показаны все 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
2 GunSmoker по поводу ITM
    #37615517
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поздно, из меня уже попёрло
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37619547
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд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
    #37619794
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Демка RichEdit использует ITE.

В ITE язык берётся из настроек системы (язык UI). Опционально можно задать override на программу. Делается это записью в реестр (подробнее написано в справке).

Соответственно, чтобы сделать смену языка (с ITE), нужно записать строчку в реестр и перезапустить программу.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37619824
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerСоответственно, чтобы сделать смену языка (с ITE), нужно записать строчку в реестр и перезапустить программу.Эээ... Перезапускать-то зачем?
Перелопатить все открытые формы с новой DLL (или что там...) как, напр. в FAR, TC и т.п.

С другой стороны, "Новые настройки вступят в силу при следующем запуске программы", конечно проще
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37619845
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.




А как бы мне это правильно организовать при начальной загрузке Приложения?
Я так полагаю, что нужно где-то хранить выбранный язык и при старте программы подгружать библиотекиХрани в реестре LCID выбранного языка своей программы и при старте программы вызывай

Код: pascal
1.
2.
LoadNewResourceModule(YourPreviouslySavedLCID);
ReinitializeForms;
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37619869
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в качестве LCID я должен передать код языка, константу, которая находится в модуле windows?
Например, LANG_UKRAINIAN, или LANG_RUSSIAN?


Код: pascal
1.
2.
3.
4.
5.
const
{ Primary language IDs. }
...
...
...
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620009
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11А в качестве LCID я должен передать код языка, константу, которая находится в модуле windows?
Например, LANG_UKRAINIAN, или LANG_RUSSIAN?
Ага
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620071
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно туда передать не константу, а цифровой код языка: 1049, 1054?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620093
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11А можно туда передать не константу, а цифровой код языка: 1049, 1054?Попробуй
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620135
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто GetThreadLocale возвращает именно 1049 или 1058
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620162
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У МЕНЯ ПОЛУЧИЛОСЬ!!!!!!!! O_o
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620271
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обнаружил небольшую проблему в локализованной версии.
Если в коде идет ссылка, например, на чекбокс, но в локализованной версии нет упоминания этого чек бокса, то вываливается AV.

И как с этим бороться?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620279
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, например, у меня есть некая проверка в коде:

Код: pascal
1.
if chboxCalcMedByPhones.Checked then..



на этой строке вываливается AV
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620361
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorGunSmokerСоответственно, чтобы сделать смену языка (с ITE), нужно записать строчку в реестр и перезапустить программу.Эээ... Перезапускать-то зачем?
Перелопатить все открытые формы с новой DLL (или что там...) как, напр. в FAR, TC и т.п.

С другой стороны, "Новые настройки вступят в силу при следующем запуске программы", конечно проще
Не забудь, что кроме форм, еще есть и датамодули, то есть все это тоже надо перезапускать, проще попросить перезагрузить программу
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620509
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Обнаружил небольшую проблему в локализованной версии.
Если в коде идет ссылка, например, на чекбокс, но в локализованной версии нет упоминания этого чек бокса, то вываливается AV.

И как с этим бороться?А каким образом этот чек-бокс НЕ попал в локализацию?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620644
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не не успел я пользователю отправить новый файл с локализацией.
Мало того, даже у самого разработчика может возникнуть эта проблема, ведь вначале разрабатывается приложение, а потом оно локализуется. Я на форму кинул кнопку, работаю с ней, но ещё не успел локализовать. Я же не буду всё время локализовать программу, а только перед выпуском.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620680
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не не успел я пользователю отправить новый файл с локализацией.
Мало того, даже у самого разработчика может возникнуть эта проблема, ведь вначале разрабатывается приложение, а потом оно локализуется. Я на форму кинул кнопку, работаю с ней, но ещё не успел локализовать. Я же не буду всё время локализовать программу, а только перед выпуском.Ну, напримердва варианта:
1. Дать средства правки локал-ресурсных строк
2. Считайте, что релиз не готов, пока не будут готовы все ресурсные файлы (вряд ли у вас их больше трёх).
А к ночным сборкам какие претензии? :)
3. Искуственно разделить релизы по языкам. Т.е. "Новая версия. Поддерживаются ... языки" Остальные добавляются по мере перевода.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620702
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не не успел я пользователю отправить новый файл с локализацией.

Когда делается сборка проекта, то ведь ничто не мешает и DLL локализации пересобрать? Вот и пересобираем. И пользователю отдаём. Конечно, там может не быть новых строк, но их добавляем позднее.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620758
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было бы замечательно если бы AV не выскакивало. Пусть будет нелокализованным тот чекбокс, но AV зачем :(
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37620941
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Было бы замечательно если бы AV не выскакивало. Пусть будет нелокализованным тот чекбокс, но AV зачем :(

Ну, потому что метод такой. При ресурсных DLL в языковых файлах лежит DFM. Соответственно, если в DFM языковой DLL chboxCalcMedByPhones не описан - на форме его просто не будет (кто и как его создаст?). Откуда следует, что ты получишь AV при обращении к chboxCalcMedByPhones, потому что он - nil.

Плюсы ресурсных DLL: можно менять не только строки, но и ворочать формой. Родной формат, нет обвеса.
Минусы ресурсных DLL: нет возможности смешивать ресурсы. Сложности редактирования.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37621046
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Именно поэтому ресурсную локализацию применяют в основном в крупно-средних проектах, где локализация распространяется централизовано и нет проблем её пересобрать. Мелкие программы предпочитают прикладываеть "словари" в виде текстовых форматов - с прицелом на перевод за счёт энтузиастов.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37621133
По правде говоря, меня такое обстоятельство дел не устраивает.

Слишком муторно и много кода писать нужно.

Должен быть способ попроще.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37621383
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локализатор #Слишком муторно и много кода писать нужно.

Должен быть способ попроще.

Это про что речь? С ресурсными DLL код не надо писать. В чём, собственно, их плюс.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37626983
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу предоставить на ваш суд свою версию статьи "Как я локализовал свое приложение на Delphi".

Прошу её не распространять.

http://rghost.ru/private/36060353/67cefcfc90e38d0a897bdbf7ac6692f9
пароль на скачивание: sql.ru
ссылка доступна в течение 30 дней

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

http://rghost.ru/private/36060353/67cefcfc90e38d0a897bdbf7ac6692f9
пароль на скачивание: sql.ru
ссылка доступна в течение 30 дней

Чего не хватает, что нужно добавить?
Как с оформлением?
Ну и вообще :)

Дай вместо PDF-а вордовский документ, я поправлю несколько ошибок, можно на мыло quaid(a)ukr.net. Статья понравилась.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627636
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже понравилось.
Вполне достойный обзор и руководство старта.

Другое дело, когда локализуется что-то вроде "суммы прописью". Тут уже надо локализовать подключать исполняемые модули (DLL) для соответствующего языка. :( Сами подумайте, нафига, например, падежные окончания числительных в аглицком?

сравнил "переводчики"Перекодировать символы \n и \r по правилам, описанным в x:\Translate\Rules\Test.xml, файлы из x:\Some и переслать их в http://xxx.info/nnn/rrr

URLText http://translate.google.ru/#ru|en| Encode characters \ n and \ r to the rules described in x: \ Translate \ Rules \ Test.xml, files from x: \ Some and send them to http://xxx.info/nnn/rrr http://www.microsofttranslator.com/ Transcode the characters \r and \n as described in x:\Translate\Rules\Test.xml, the files from x:\Some and send them to http://xxx.info/nnn/rrr http://www.online-translator.com/Default.aspx/Text To recode symbols \n and \r by the rules described in x:\Translate\Rules\Test.xml, files from x:\Some and to send them in http://xxx.info/nnn/rrr http://www.translate.ru/ To recode symbols \n and \r by the rules described in x:\Translate\Rules\Test.xml, files from x:\Some and to send them in http://xxx.info/nnn/rrr Это к тому, что можно иметь текстовый файл (ini, xml, ...) и переводить его куда надо.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627686
Статья хорошая, годная, чуть более чем на половину

Но хочу присоединиться вон к тому челу и согласиться с ним: нужно выложить в док, а то как-то не по православному все это...
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627692
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Та без проблем, но какой смысл в *.docx? Тем более, пока что я принимаю замечания и статья по сути ещё не совсем-то готова.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627877
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Та без проблем, но какой смысл в *.docx?Никакого имхо. Достаточно cтр. 12, абзац 4 cверху (В настройках программы...) напр,В настройках программы <указать путь к настройкам или картинкой> я <выбрал язык из списка> и сохранение кода языка в ini-файл с просьбой перезапустить программу после выбора языка.
В настройках программы [указать путь к настройкам и настройки] или [показать картинкой] я <выбрал язык из списка (указал нужные языки)>. А также сохранение кода языка в ini-файл. <тут не понятно, чей это ini и что такое код языка: LCID, что-то ещё? .
Обратите внимание на опцию? (галку?) не перезапустить программу после выбора языка. <что будет, если её не включить?

Всякие стилистические правки определяются правилами лит.редактора и приходят с опытом. И вычитки
нужны.

Но, вот в разделе "Подготовка Delphi-проекта к локализации." (стр.1) я бы добавил абзац о функции Format. а-ля '%d строк, содержащих %s'
________
PS. Не попросить ли Модератора создать подфорум "Локализация приложений"?
Тема специфична и актуальна IMHO
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627928
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В настройках программы <указать путь к настройкам или картинкой> я <выбрал язык из списка> и сохранение кода языка в ini-файл с просьбой перезапустить программу после выбора языка.

Просто у меня сделано с использованием cxLocalizer.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627930
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, вот в разделе "Подготовка Delphi-проекта к локализации." (стр.1) я бы добавил абзац о функции Format. а-ля '%d строк, содержащих %s'

Но я с ней не работал.
Давайте описание, я вставлю.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627951
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Но, вот в разделе "Подготовка Delphi-проекта к локализации." (стр.1) я бы добавил абзац о функции Format. а-ля '%d строк, содержащих %s'

Но я с ней не работал.
Давайте описание, я вставлю.
Речь о стандартной функции Format, часто используемой при выводе сообщений, в содержание которых вставляются передаваемые параметры. Очень полезно использовать для локализуемого приложения вместо склейки строк. Кроме того, есть возможность поменять порядок вывода параметров в строке с помощью индекса: %[Index:]... Gator, ты про это?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37627995
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой, Да.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628007
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю, что это за функция. В принципе я её использовал, но не для локализации приложений. Поэтому я её и не упомянул.
Давай коды, примеры, что да как и тогда можно сделать нормально описание. А так...
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628010
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати, (не знаю, куда добавить в статью) в ресурсах (не важно, где и как они хранятся, чем делаются и как грузятся) НЕОБХОДИМ раздел/секция/строчка) - ... с цифирьным кодом (версией). Можно с разделителями.
Это поможет, напр., не подставить приложению ресурс несоответствующей верии.
Думаю, понятно, почему цифры - чтобы от локали и алфавита отвязаться.
Хранить можно хоть для всего файла, хоть для группы языков.




Можно минБД, xml,)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628022
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот изменённый docx файл.
Со страницы 12 сделал доп. описание (так или нет), оформил код цветом.
Пароль на скачивание sql.ru
http://rghost.ru/private/36070719/1c815b22458fb63ca97d66473fbe42a9
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628029
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Чего не хватает, что нужно добавить?
забыл меня упомянуть за пинок в сторону радиаликса на одном из форумов ;)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628037
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Я знаю, что это за функция. В принципе я её использовал, но не для локализации приложений. Поэтому я её и не упомянул.
Давай коды, примеры, что да как и тогда можно сделать нормально описание. А так...Ну какие коды? Просто упомянуть, что лучше заранее заюзать
Код: pascal
1.
2.
3.
4.
5.
resourcestring
  msgConfirmDelete = 'Удаляются %d файлов. Вы уверены?';
//msgConfirmDelete = '%d file(s) are deleted. Are you sure?';

ShowMessage(Format(msgConfirmDelete, [FilesForDelete.Count]));
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628042
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и Док напомнил. Локализация терминов - то ещё геморрой! Один MedDRA чего стоит.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628054
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorЛокализация терминов - то ещё геморрой! Один MedDRA чего стоит.
В медицине язык "межнационального" общения придуман давно и одним из первых - латынь. Потому, как термин не произноси, чаще он пишется везде одинаково.

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

Вы про рубоадр :),
так давно это было, тем более, что не забыл, а написал, что на одном из форумов посоветовали радиаликс :)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628119
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGatorЛокализация терминов - то ещё геморрой! Один MedDRA чего стоит.
В медицине язык "межнационального" общения придуман давно и одним из первых - латынь. Потому, как термин не произноси, чаще он пишется везде одинаково.

А вот "описательно-пояснительная" часть документации сильно варьирует от местности и содержит в себе все особенности национального колорита. Потому проще писать софт сугубо с привязкой к местным аборигенам, чем пытаться его локализовать.

Т.е. писать совершенно отдельно программу для России, и совершенно отдельную для Украины? О_о
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628124
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorX11Я знаю, что это за функция. В принципе я её использовал, но не для локализации приложений. Поэтому я её и не упомянул.
Давай коды, примеры, что да как и тогда можно сделать нормально описание. А так...Ну какие коды? Просто упомянуть, что лучше заранее заюзать
Код: pascal
1.
2.
3.
4.
5.
resourcestring
  msgConfirmDelete = 'Удаляются %d файлов. Вы уверены?';
//msgConfirmDelete = '%d file(s) are deleted. Are you sure?';

ShowMessage(Format(msgConfirmDelete, [FilesForDelete.Count]));



Я понимаю, что так кому-то легче, но я такого не использую.
Я написал бы так:
ShowMessage('Будет удалено файлов: ' + StrToInt(FilesForDelete.Count) + sLineBreak + 'Продолжить?');
(только теперь уже с учетом resourcestring)
Ну да, я так привык. И мне так больше нравится.
И как я могу писать в статье, что я делал так-то и так-то, если я так не делал :(

Я просто допишу Ваш совет, как один из вариантов.
Да это и к локализации не относится по идее, это уже непосредственно один из способов вывода сообщений пользователю.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628128
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а если уж быть конца честным, то я количество никогда не пишу.
Я пишу так: "Удалить выделенные записи?" или "Удалить выделенные файлы?", или "Выделенные записи будут удалены. Продолжить?"
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628313
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правила виндоус ХР

авторВы действительно хотите удалить <ИМЯ>?
Для удаления одного файла.

авторВы действительно хотите удалить эти объекты (2 шт.)?
Для удаления нескольких файлов.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628326
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Ну а если уж быть конца честным, то я количество никогда не пишу.

Зря. Указание количества спасло многих от неосторожных действий...

X11"Выделенные записи будут удалены. Продолжить?"

Совсем грустно сформулированный вопрос. Подразумевает, что записи таки будут удалены.
Если бы не пару кнопок при выборе (Да-нет, ок-кенсел), у пользователя может сложиться ощущение, что вопрос только в том, когда пользователь хочет продолжить: прямо сейчас или чуть-чуть позже :). Можете их и завести "Да, давай, не томи" и "Погоди чуток, я ща подготовлюсь к этой исторической минуте" .
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37628472
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последние сообщения никак не относятся к локализации.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37629634
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Я понимаю, что так кому-то легче, но я такого не использую.
Я написал бы так:
ShowMessage('Будет удалено файлов: ' + StrToInt(FilesForDelete.Count) + sLineBreak + 'Продолжить?');
(только теперь уже с учетом resourcestring)
Ну да, я так привык. И мне так больше нравится.
И как я могу писать в статье, что я делал так-то и так-то, если я так не делал :(
Я просто допишу Ваш совет, как один из вариантов.
Да это и к локализации не относится по идее, это уже непосредственно один из способов вывода сообщений пользователю.
В том то и дело, что относится, и ты с этим не столкнулся, просто потому что не использовал (наверное, в отличие от большинства...).
Никто не заставляет исправлять статью, здесь только советуют...

Сравни:

1.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
resourcestring
  constFilesWillBeRemoved = 'Будет удалено файлов: ';
//  constFilesWillBeRemoved = 'Files will be removed: ';
  constContinueQuestion = 'Продолжить?';
//  constContinueQuestion = 'Continue?';

  buttonSelected := MessageDlg(constFilesWillBeRemoved + StrToInt(FilesForDelete.Count) + sLineBreak + constContinueQuestion,
    mtConfirmation, mbOKCancel, 0);


2.

Код: pascal
1.
2.
3.
4.
5.
6.
resourcestring
  constFilesWillBeRemovedConfirmation = 'Будет удалено файлов: %d. '#13#10'Продолжить?';
//  constFilesWillBeRemoved = 'Files will be removed: %d.'#13#10'Continue?';

  buttonSelected := MessageDlg(Format(constFilesWillBeRemovedConfirmation, [FilesForDelete.Count]),
    mtConfirmation, mbOKCancel, 0);



И сравни, что придётся менять в обеих случаях, если завтра ты решишь исправить сообщение на более стандартное "Вы действительно хотите удалить отмеченные файлы (2 шт.)?". А если переводчик сочтёт необходимым переставить предложения или части, из которых ты формируешь текст?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37629651
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой, плюсую.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37632706
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11, см. почту
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636359
Чтец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11Вот изменённый docx файл.
Со страницы 12 сделал доп. описание (так или нет), оформил код цветом.
Пароль на скачивание sql.ru
http://rghost.ru/private/36070719/1c815b22458fb63ca97d66473fbe42a9 Все?, это последняя редакция? Статья завершена? Полна? Хорошая, годная?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636372
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я её ещё немного правил, а также Квейд помог исправить некоторые ошибки и неточности. Последняя версия была отправлена GunSmoker`у.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636414
Чтец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так выложи тут
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636449
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://rghost.ru/private/36173765/54f62cac950f23f2f248bdf01fa9d8a8
документ от 26/01/2012
пароль на скачивание: sql.ru
ссылка доступна в течение 30-ти дней
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636450
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будут вопрос и замечания, пишите :)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636471
Чтец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему не в doc ? У меня нет ридера. Выложи и в доке плиз.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636487
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 99% случаев именно в PDF и выкладывают в интернете.

http://rghost.ru/private/36174470/eac8a03fdace046d0017ae815388dbf1
пароль на скачивание: sql.ru
ссылка доступна в течение 30-ти дней
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636549
Чтец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пароль не подходит
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #37636617
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
2 GunSmoker по поводу ITM
    #38268784
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Походу автор radialix`а забросил проект :(
сайты не пашут, на письма не отвечает
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #38269259
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдX11Там можно как-то сделать и динамическое переключение, используя библиотеки ресурсов, но я пока не понял как, а в справке очень слабо описано.
Если кто подскажет - буду рад.Смотри ...\Samples\Delphi\VCL\RichEdit\reinit.pas, там готовый код для runtime-переключения языков приложения.
столкнулся с такой проблемой, что если в системе украинский формат активирован (Панель управления/Язык и региональные стандарты/Закладка Форматы/В списке Формат выбран Украинский), то программа в любом случае будет загружаться с украиской локализацией, даже если в функцию передать 1049 (код русского языка).

В функции LoadNewResourceModule я закомментировал строку:
Код: pascal
1.
//        NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);


и вместо неё добавил новую:
Код: pascal
1.
        NewInst := LoadLibraryEx(PAnsichar(ParamStr(0)), 0, LOAD_LIBRARY_AS_DATAFILE);



Получается, что у меня 2 файла всего: один exe-файл и второй UKR-файл. Оригинальные ресурсы (русский язык) живёт в exe.
Поєтому и грузим данные из
Код: pascal
1.
LoadLibraryEx(PAnsichar(ParamStr(0)), ....



я так понял, что функция ищет файл с расширением RU или RUS, я перенаправил её в exe.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #38270523
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Квейдпропущено...
Смотри ...\Samples\Delphi\VCL\RichEdit\reinit.pas, там готовый код для runtime-переключения языков приложения.
столкнулся с такой проблемой, что если в системе украинский формат активирован (Панель управления/Язык и региональные стандарты/Закладка Форматы/В списке Формат выбран Украинский), то программа в любом случае будет загружаться с украиской локализацией, даже если в функцию передать 1049 (код русского языка).

В функции LoadNewResourceModule я закомментировал строку:
Код: pascal
1.
//        NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);


и вместо неё добавил новую:
Код: pascal
1.
        NewInst := LoadLibraryEx(PAnsichar(ParamStr(0)), 0, LOAD_LIBRARY_AS_DATAFILE);



Получается, что у меня 2 файла всего: один exe-файл и второй UKR-файл. Оригинальные ресурсы (русский язык) живёт в exe.
Поєтому и грузим данные из
Код: pascal
1.
LoadLibraryEx(PAnsichar(ParamStr(0)), ....



я так понял, что функция ищет файл с расширением RU или RUS, я перенаправил её в exe.

У меня такой проблемы нет. Моя программа начитывает свою локаль из реестра, куда ее предварительно засовывает инсталлятор программы (а в инсталляторе, собственно, пользователь выбирает язык интерфейса программы).
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #38645327
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XE5 up2
Попробовал добавить язык.
Простейший проект, 1 форма + label
Перевел текст на форме, собрал.
Запускаю exe-ник - Resource TForm1 not found
посмотрел языковую длл-ку - и действительно, нет в ней dfm-ки.

ЧЯДНТ?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #38645660
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747XE5 up2
Попробовал добавить язык.
Простейший проект, 1 форма + label
Перевел текст на форме, собрал.
Запускаю exe-ник - Resource TForm1 not found
посмотрел языковую длл-ку - и действительно, нет в ней dfm-ки.

ЧЯДНТ?Покажи свой .dproj
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #38645943
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

dpr:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
program Translated;

uses
  Vcl.Forms,
  Unit2 in 'Unit2.pas' {Form2},
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.



dproj:
Код: xml
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.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>{941B484B-437B-4E62-9354-236EF1FA3029}</ProjectGuid>
        <ProjectVersion>15.3</ProjectVersion>
        <FrameworkType>VCL</FrameworkType>
        <MainSource>Translated.dpr</MainSource>
        <Base>True</Base>
        <Config Condition="'$(Config)'==''">Debug</Config>
        <Platform Condition="'$(Platform)'==''">Win32</Platform>
        <TargetedPlatforms>3</TargetedPlatforms>
        <AppType>Application</AppType>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
        <Base_Win32>true</Base_Win32>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
        <Base_Win64>true</Base_Win64>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
        <Cfg_1>true</Cfg_1>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
        <Cfg_1_Win32>true</Cfg_1_Win32>
        <CfgParent>Cfg_1</CfgParent>
        <Cfg_1>true</Cfg_1>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
        <Cfg_2>true</Cfg_2>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Base)'!=''">
        <VerInfo_Locale>1049</VerInfo_Locale>
        <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
        <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
        <VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
        <DCC_OutputDRCFile>true</DCC_OutputDRCFile>
        <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
        <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
        <DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
        <DCC_E>false</DCC_E>
        <DCC_N>false</DCC_N>
        <DCC_S>false</DCC_S>
        <DCC_F>false</DCC_F>
        <DCC_K>false</DCC_K>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Base_Win32)'!=''">
        <DCC_UnitSearchPath>D:\Sources_XE\Common\AdvToolBarsXE4\;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
        <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
        <VerInfo_Locale>1033</VerInfo_Locale>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Base_Win64)'!=''">
        <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
        <VerInfo_Locale>1033</VerInfo_Locale>
        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_1)'!=''">
        <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
        <DCC_DebugDCUs>true</DCC_DebugDCUs>
        <DCC_Optimize>false</DCC_Optimize>
        <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
        <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
        <DCC_RemoteDebug>true</DCC_RemoteDebug>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
        <DCC_ExeOutput>Bin</DCC_ExeOutput>
        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
        <VerInfo_Locale>1033</VerInfo_Locale>
        <DCC_RemoteDebug>false</DCC_RemoteDebug>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_2)'!=''">
        <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
        <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
        <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
        <DCC_DebugInformation>0</DCC_DebugInformation>
    </PropertyGroup>
    <ItemGroup>
        <DelphiCompile Include="$(MainSource)">
            <MainSource>MainSource</MainSource>
        </DelphiCompile>
        <DCCReference Include="Unit2.pas">
            <Form>Form2</Form>
            <FormType>dfm</FormType>
        </DCCReference>
        <DCCReference Include="Unit1.pas">
            <Form>Form1</Form>
            <FormType>dfm</FormType>
        </DCCReference>
        <BuildConfiguration Include="Release">
            <Key>Cfg_2</Key>
            <CfgParent>Base</CfgParent>
        </BuildConfiguration>
        <BuildConfiguration Include="Base">
            <Key>Base</Key>
        </BuildConfiguration>
        <BuildConfiguration Include="Debug">
            <Key>Cfg_1</Key>
            <CfgParent>Base</CfgParent>
        </BuildConfiguration>
    </ItemGroup>
    <ProjectExtensions>
        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
        <Borland.ProjectType/>
        <BorlandProject>
            <Delphi.Personality>
                <VersionInfo>
                    <VersionInfo Name="IncludeVerInfo">False</VersionInfo>
                    <VersionInfo Name="AutoIncBuild">False</VersionInfo>
                    <VersionInfo Name="MajorVer">1</VersionInfo>
                    <VersionInfo Name="MinorVer">0</VersionInfo>
                    <VersionInfo Name="Release">0</VersionInfo>
                    <VersionInfo Name="Build">0</VersionInfo>
                    <VersionInfo Name="Debug">False</VersionInfo>
                    <VersionInfo Name="PreRelease">False</VersionInfo>
                    <VersionInfo Name="Special">False</VersionInfo>
                    <VersionInfo Name="Private">False</VersionInfo>
                    <VersionInfo Name="DLL">False</VersionInfo>
                    <VersionInfo Name="Locale">1049</VersionInfo>
                    <VersionInfo Name="CodePage">1251</VersionInfo>
                </VersionInfo>
                <VersionInfoKeys>
                    <VersionInfoKeys Name="CompanyName"/>
                    <VersionInfoKeys Name="FileDescription"/>
                    <VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
                    <VersionInfoKeys Name="InternalName"/>
                    <VersionInfoKeys Name="LegalCopyright"/>
                    <VersionInfoKeys Name="LegalTrademarks"/>
                    <VersionInfoKeys Name="OriginalFilename"/>
                    <VersionInfoKeys Name="ProductName"/>
                    <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
                    <VersionInfoKeys Name="Comments"/>
                    <VersionInfoKeys Name="CFBundleName"/>
                    <VersionInfoKeys Name="CFBundleDisplayName"/>
                    <VersionInfoKeys Name="UIDeviceFamily"/>
                    <VersionInfoKeys Name="CFBundleIdentifier"/>
                    <VersionInfoKeys Name="CFBundleVersion"/>
                    <VersionInfoKeys Name="CFBundlePackageType"/>
                    <VersionInfoKeys Name="CFBundleSignature"/>
                    <VersionInfoKeys Name="CFBundleAllowMixedLocalizations"/>
                    <VersionInfoKeys Name="UISupportedInterfaceOrientations"/>
                    <VersionInfoKeys Name="CFBundleExecutable"/>
                    <VersionInfoKeys Name="CFBundleResourceSpecification"/>
                    <VersionInfoKeys Name="LSRequiresIPhoneOS"/>
                    <VersionInfoKeys Name="CFBundleInfoDictionaryVersion"/>
                    <VersionInfoKeys Name="CFBundleDevelopmentRegion"/>
                    <VersionInfoKeys Name="package"/>
                    <VersionInfoKeys Name="label"/>
                    <VersionInfoKeys Name="versionCode"/>
                    <VersionInfoKeys Name="versionName"/>
                    <VersionInfoKeys Name="persistent"/>
                    <VersionInfoKeys Name="restoreAnyVersion"/>
                    <VersionInfoKeys Name="installLocation"/>
                    <VersionInfoKeys Name="largeHeap"/>
                    <VersionInfoKeys Name="theme"/>
                </VersionInfoKeys>
                <Source>
                    <Source Name="MainSource">Translated.dpr</Source>
                </Source>
                <Language>
                    <Language Name="ProjectLang">$00000409</Language>
                    <Language Name="ActiveLang">ENU</Language>
                </Language>
                <Resource_DLL_Projects>
                    <Resource_DLL_Projects Name="Item0">Албанский (Албания)*$0000041C*SQI*SQI</Resource_DLL_Projects>
                    <Resource_DLL_Projects Name="Item1">Английский (США)*$00000409*ENU*ENU</Resource_DLL_Projects>
                </Resource_DLL_Projects>
                <RDP_Source_Files>
                    <RDP_Source_Files Name="Item0">Win32\Debug\Translated.drc</RDP_Source_Files>
                    <RDP_Source_Files Name="Item1">Unit2.dfm</RDP_Source_Files>
                    <RDP_Source_Files Name="Item2">Unit1.dfm</RDP_Source_Files>
                    <RDP_Source_Files Name="Item3">Bin\Translated.drc</RDP_Source_Files>
                </RDP_Source_Files>
            </Delphi.Personality>
            <Deployment/>
            <Platforms>
                <Platform value="Win32">True</Platform>
                <Platform value="Win64">True</Platform>
            </Platforms>
        </BorlandProject>
        <ProjectFileVersion>12</ProjectFileVersion>
    </ProjectExtensions>
    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
    <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>

<!-- EurekaLog First Line
[Exception Log]
EurekaLog Version=7007
Activate=0
DeleteMapAfterCompile=1
Encrypt Password=""
EurekaLog Last Line -->

...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #38646458
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема была в объявлении ресурса в проектах длл:
было так (не работало, падало):
{$R 'Unit1.dfm' Form1:TForm}
сделал так (работает, изменяет свойства):
{$R 'Unit1.dfm'}
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
2 GunSmoker по поводу ITM
    #40053015
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
Смотри ...\Samples\Delphi\VCL\RichEdit\reinit.pas, там готовый код для runtime-переключения языков приложения.


А теперь у меня возник вопрос.
А как сделать так, чтобы это всё работало без раздельных библиотек, т.е. когда все в одном exe-файле?

На сайте Lingobit Localizer не нашел.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053017
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
А как сделать так, чтобы это всё работало без раздельных библиотек, т.е. когда все в одном exe-файле?
Имхо, глупость. Наоборот каждый перевод должен лежать в отдельном хранилище, чтобы его было удобно обновлять и добавлять новые языки
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053021
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
X11
А как сделать так, чтобы это всё работало без раздельных библиотек, т.е. когда все в одном exe-файле?
Имхо, глупость. Наоборот каждый перевод должен лежать в отдельном хранилище, чтобы его было удобно обновлять и добавлять новые языки
Кроме того, эти отдельные хранилища можно использовать из других бинарников.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053024
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема у меня в том, что когда интерфейс винды украинский, то resourcestring все пустые.
Рядом с exe файл .UKR есть.
Т.е. интерфейс программы частично не выводит некоторые строки, которые касаются Resourcestring.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
unit uConstMsg;

interface

Resourcestring
  constFrom                            = 'с';
  constTo                              = 'по';
  constMin                             = 'min';
  constMax                             = 'max';
  constToday                           = 'Сегодня';
  constPrice                           = 'Цена';



я ведь вижу, что все Resourcestring в Лингобит имеют перевод

когда переключаю интерфейс винды на русский, то проблема уходит (надо проверить английский)

можно я неправильно локаль включаю/выбираю?

вот мой:
модуль uReinit
Код: 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.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
unit uReinitLocale;

interface

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

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

var
 iLang: cardinal;


implementation

uses uShares, IniFiles;

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;
  P: PChar;
  LocaleName: array[0..4] of Char;
  NewInst: Longint;
begin
  GetModuleFileName(HInstance, FileName, SizeOf(FileName));
  GetLocaleInfo(Locale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
  P := PChar(@FileName) + lstrlen(FileName);
  while (P^ <> '.') and (P <> @FileName) do Dec(P);
  NewInst := 0;
  Result := 0;
  if P <> @FileName then
  begin
    Inc(P);
    if LocaleName[0] <> #0 then
    begin
      // Then look for a potential language/country translation
      lstrcpy(P, LocaleName);
      NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
      if NewInst = 0 then
      begin
        // Finally look for a language only translation
        LocaleName[2] := #0;
        lstrcpy(P, LocaleName);
        NewInst := LoadLibraryEx(Pchar(ParamStr(0)), 0, LOAD_LIBRARY_AS_DATAFILE);
//        NewInst := LoadLibraryEx(FileName, 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;


procedure GetLocaleFromIni;
begin
//  iLang := GetThreadLocale;
// 1049 или 1058

  if FileExists(sUserDocPath + kvx_ini) then
  begin
    with TMemIniFile.Create(sUserDocPath + kvx_ini) do
    begin
      iLang := ReadInteger('LANG', 'Locale', GetThreadLocale);//если пользователь ещё не указал, то берём локаль винды
      free;
    end//with
  end
  else
  begin
    iLang := GetThreadLocale;//если пользователь ещё не указал, то берём локаль винды
  end;
end;



initialization
  GetLocaleFromIni; // получаем код языка из ini и присваиваем переменной iLang
  LoadNewResourceModule(iLang);
  ReinitializeForms;
end.

...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053027
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На английском интерфейсе винды тоже нет проблем.
Попадают ли в файл ukr переводы ресурсных строк?
Я сделал поиск с помощью FAR переведенной строки и FAR показал, что искомая строка была найдена в ukr файле.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053051
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Посмотри редактором ресурсов, в какой LangID падают строки
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053052
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А заодно посмотри, что в настройках проекта
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053053
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А заодно посмотри, что в настройках проекта


оказалось, что в разных конфигах по разному: по английский, то российский

а что должно быть? как правильно?

Если в Лингобите установлено, что основной - русский, то и на странице версий тоже должен быть русский?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053054
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Посмотри редактором ресурсов, в какой LangID падают строки


так правильно?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053056
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал бряку в function LoadNewResourceModule(Locale: LCID): Longint;
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053057
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут казан код $0422, т.е. Українська (Україна)
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053060
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Как по мне - ресурсы зло :( Я делал на обычных ini файлах локализацию - все работает 10 лет уже без ошибок.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053066
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
X11,

Как по мне - ресурсы зло :( Я делал на обычных ini файлах локализацию - все работает 10 лет уже без ошибок.
Та же история, земляк.
3 языка - 3 инифайла. И десятки экзешников/длл, которые из них тянут тексты. И никаких проблем.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053090
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
DarkMaster
X11,

Как по мне - ресурсы зло :( Я делал на обычных ini файлах локализацию - все работает 10 лет уже без ошибок.
Та же история, земляк.
3 языка - 3 инифайла. И десятки экзешников/длл, которые из них тянут тексты. И никаких проблем.

Аналогично. 'Инишки' удобно же и в гите хранить, в отличие от бинарников. И коллективная модификация сильно упрощается, инсталлятор из гита забирает данные для своей сборки и собирается с наиболее актуальными данными.
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053100
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а gettext в сообществе делфи используется?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053113
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,
мы у себя вот такой код юзаем, давно и успешно:
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1210906&msg=19093757
сразу говорю, что его, возможно и скорее всего нужно под частные компоненты дописывать
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053137
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при чем здесь ваши ini?
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053143
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
так правильно?
Я не знаю как правильно. Я предположил источник проблемы. Смотри отладчиком как эти строки загружаются и какой LangID используется
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053178
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11
при чем здесь ваши ini?


при том, что пошёл решать проблему через гланды
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053297
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
придется сделать 2 отдельных exe-шника
...
Рейтинг: 0 / 0
2 GunSmoker по поводу ITM
    #40053428
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
X11,

Как по мне - ресурсы зло :( Я делал на обычных ini файлах локализацию - все работает 10 лет уже без ошибок.

бедные братья по цеху. Дебаркадер так и посчитал приоритетом прикрутить кошерные *.po файлы в качестве стандартных средств интернационализации
...
Рейтинг: 0 / 0
112 сообщений из 112, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 2 GunSmoker по поводу ITM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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