Поддержка многоязычности
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2  :| |:
Total Commander -> Написание плагинов для Total Commander

#16:  Author: SCHMasterLocation: Киев PostPosted: Fri Mar 10, 2006 05:11
    —
Не буду ни с кем спорить, что лучше, а что хуже - у каждого свое IMHO, и каждый в чем-то прав. Выскажу только свои соображения по этому поводу...
В свое время (когда был полным бараном в программировании) каких только компонентов я не перепробовал Smile. Чуток "поумневши" начал их (компоненты) "ковырять"... И был поражен (не во всех случаях, но в большинстве) "корявости" их работы.
Ну и как настоящий СНГ-овский программер начал сам "изобретать велосипед".
Пришел к выводу, что гибче (и при разработке, и при использовании - юзер сам может добавлять-изменять свою локализацию) формат текстового файла. Вариантов несколько -
1.TStringList - загрузил раз и "тянешь" оттель.
2.TIniFile - практически то-же, что и первый вариант (см. исходники TIniFile).
Ну а как быть, если программа на API и добавление любого из вышеуказанных классов неоправдвнно "раздует" размер?
Тут 3-й вариант
GetPrivateProfileString - работает аж со свистом... Даже на "медленных" машинах.
А подразобравшись с PrivateProfileString я вообще отказался в своих программах от TIniFile. И не жалею - работает быстрее.

Еще один момент. В качестве ключа я использую не название или Caption по дефолту компонента, а его Tag. Очень удобно, т.к. этот-же Tag используется в качестве идентификатора команды. Т.е. не на каждую кнопку-меню-и т.д. по событию OnClick, а одно OnClick на группу и дальше через case выполнение команды. Таким образом можно идентифицировать и сообщения, и внутренние команды и т.д. и т.п.

З.Ы. Кому такой подход не нравится, просьба свое "Фа" в мой адрес оставить при себе Smile и прочитать первые строки этого поста Smile.

#17:  Author: NikLocation: Киров PostPosted: Fri Mar 10, 2006 20:38
    —
SCHMaster

Quote:
А подразобравшись с PrivateProfileString я вообще отказался в своих программах от TIniFile. И не жалею - работает быстрее.

Аналогично Smile В свое время нашел этот способ в исходниках InnoSetup и приспособил под свои нужны. Очень удобно (и не только для локализации)...

#18:  Author: SCHMasterLocation: Киев PostPosted: Sat Mar 11, 2006 04:28
    —
Nik
Совершенно верно, зачем в очередной раз изобретать велосипед (хотя не спорю, некоторые приимущества в TIniFile есть), когда можно с успехом пользоваться "колесами" самой системы.

#19:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Mon Mar 13, 2006 11:29
    —
Quote:
это же всё в цикле делается

Ничево подобного!


Почему нет? Немного можно автоматизировать. Количество проверок будет cтолько же, сколько на форме будет компонентов разных типов. Можно также сделать цикл по формам.
Code:
  for i:= 0 to ComponentCount-1 do begin
    if Components[i] is TButton then
      (Components[i] as TButton).Caption:= ini.ReadString(Form1.Name, (Components[i] as TButton).Name, (Components[i] as TButton).Caption);
  end;


ini файл
Code:
[Form1]
Button1=Текст 1
Button2=Текст 2
Button3=Текст 3


Как вариант для большей наглядности ini файла:
Code:
  for i:= 0 to ComponentCount-1 do begin
    if Components[i] is TButton then
      (Components[i] as TButton).Caption:= ini.ReadString(Form1.Name, (Components[i] as TButton).Name + '.Caption', (Components[i] as TButton).Caption);
  end;

#20:  Author: NikLocation: Киров PostPosted: Mon Mar 13, 2006 12:21
    —
Моторокер
Имхо, это не оптимально. В моем случае, например, локализуется лишь 10% компонентов формы. А такой вот алгоритм будут "бегать" по всем. Смысл?

#21:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Fri Jun 30, 2006 16:16
    —
10% – это 10 компонентов или больше?
Понятно, что если переводить много не нужно, то можно и перечислить все компоненты по порядку. Читать переводы можно даже не используя ini файлы, просто читать ReadLn из TextFile.
Но так ли уж долго выполняется данный цикл?

Смысл в том, что алгоритм универсальный, точно так же можно выгружать ini файлы для перевода. А там уже неважно, какие компоненты куда положены, добавлены, ini файл всегда актуален.

Есть ещё правда константы, но их тоже можно занести в какой-нибудь массив и читать тоже в цикле.

#22:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Mon Jul 10, 2006 15:49
    —
Можно ещё избавиться от
if Components[i] is TButton TControl then
напрямую присваивать
try
(Components[i] as TButton TControl).Hint:= 'ля-ля-ля';
except
end;


Last edited by Моторокер on Wed Jul 12, 2006 13:06; edited 1 time in total

#23:  Author: vserd PostPosted: Wed Jul 12, 2006 11:49
    —
Моторокер
Quote:
Можно ещё избавиться от
if Components[i] is TButton then [\quote]
можно но не нужно. Не факт что компонент всегда будет иметь свойство которое имеет TButton. В данном случае Hint.
Всякая оптимизация должна иметь свои границы.

#24:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Wed Jul 12, 2006 13:00
    —
Quote:
Не факт что компонент всегда будет иметь свойство которое имеет TButton.

Ошибочка. Исправил. Посмотрел код – там так:
try
(Components[i] as TControl).Hint:= S;
except
end;


Прокатит только для хинтов, Caption придется всё-таки проверять на is для каждого вида контролов.
Так переделываю обычные хинты в многострочные.
Если не факт, срабатывает try..except.

Взбрело в голову – да так можно и координаты контролов менять. Допустим, надпись не помещается, сменил Width или Left в ini файле и всё путём.



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2  :| |:
Page 2 of 2

Powered by phpBB © 2001, 2005 phpBB Group