Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Поддержка многоязычности
Goto page Previous  1, 2
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Fri Mar 10, 2006 05:11    Post subject: Reply with quote

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

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

З.Ы. Кому такой подход не нравится, просьба свое "Фа" в мой адрес оставить при себе Smile и прочитать первые строки этого поста Smile.
Back to top
View user's profile Send private message
Nik



Joined: 01 Jan 2005
Posts: 583
Location: Киров

Post (Separately) Posted: Fri Mar 10, 2006 20:38    Post subject: Reply with quote

SCHMaster

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

Аналогично Smile В свое время нашел этот способ в исходниках InnoSetup и приспособил под свои нужны. Очень удобно (и не только для локализации)...
Back to top
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Sat Mar 11, 2006 04:28    Post subject: Reply with quote

Nik
Совершенно верно, зачем в очередной раз изобретать велосипед (хотя не спорю, некоторые приимущества в TIniFile есть), когда можно с успехом пользоваться "колесами" самой системы.
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Mon Mar 13, 2006 11:29    Post subject: Reply with quote

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;
Back to top
View user's profile Send private message
Nik



Joined: 01 Jan 2005
Posts: 583
Location: Киров

Post (Separately) Posted: Mon Mar 13, 2006 12:21    Post subject: Reply with quote

Моторокер
Имхо, это не оптимально. В моем случае, например, локализуется лишь 10% компонентов формы. А такой вот алгоритм будут "бегать" по всем. Смысл?
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Fri Jun 30, 2006 16:16    Post subject: Reply with quote

10% – это 10 компонентов или больше?
Понятно, что если переводить много не нужно, то можно и перечислить все компоненты по порядку. Читать переводы можно даже не используя ini файлы, просто читать ReadLn из TextFile.
Но так ли уж долго выполняется данный цикл?

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

Есть ещё правда константы, но их тоже можно занести в какой-нибудь массив и читать тоже в цикле.
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Mon Jul 10, 2006 15:49    Post subject: Reply with quote

Можно ещё избавиться от
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
Back to top
View user's profile Send private message
vserd



Joined: 26 Apr 2005
Posts: 118

Post (Separately) Posted: Wed Jul 12, 2006 11:49    Post subject: Reply with quote

Моторокер
Quote:
Можно ещё избавиться от
if Components[i] is TButton then [\quote]
можно но не нужно. Не факт что компонент всегда будет иметь свойство которое имеет TButton. В данном случае Hint.
Всякая оптимизация должна иметь свои границы.
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Wed Jul 12, 2006 13:00    Post subject: Reply with quote

Quote:
Не факт что компонент всегда будет иметь свойство которое имеет TButton.

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


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

Взбрело в голову – да так можно и координаты контролов менять. Допустим, надпись не помещается, сменил Width или Left в ini файле и всё путём.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group