root/trunk/MOExtractor.pas

Revision 162, 6.2 kB (checked in by sagrer, 5 months ago)

В связи с критикой моего патча к Lazarus (он был принят частично) - немного переделал механизм перевода, непринятая часть патча будет в исходнике моих модулей локализации.

  • Property svnmailer:content-charset set to cp1251
Line 
1 ///////////////////////////////////////////////////////////
2 //                    MOExtractor                        //
3 //     Модуль с классом-расширением класса MOFile        //
4 //                   из модуля gettext.                  //
5 //      Содержит дополнительный функционал для более     //
6 //         простого подключения mo-файлов, а также       //
7 //       для автоматического перекодирования строк в     //
8 //           используемую программой кодировку.          //
9 //                                                       //
10 //                Copyright (C) 2008 Sagrer              //
11 //              Распространяется на условиях             //
12 //                      LGPL v2.1                        //
13 //                                                       //
14 //                  версия модуля 0.1                    //
15 //                                                       //
16 //                   sagrer@yandex.ru                    //
17 ///////////////////////////////////////////////////////////
18
19 //К работе над данным файлом приложили руки, ноги.... короче аффтары:
20 // 1) Sagrer (sagrer@yandex.ru)
21
22 ////////////////////////////////////////////////////////////////////////
23
24 unit MOExtractor;
25
26 {$mode objfpc}{$H+}
27
28 interface
29
30 uses
31   Classes, SysUtils, gettext, ExtraFileUtilsLCL, LConvEncoding;
32  
33 type
34   TMOExtractor = class(TMOFile)    //Класс для выковыривания строк из mo.
35   private
36   protected
37     //Защищенные переменные
38     CurrLang : String;                   //Текущий язык
39     CurrFallbackLang : String;           //Текущий язык в минимальной форме
40     CurrEncoding : String;               //Текущая кодировка
41     MODir : String;                      //Директория с *.mo-файлами.
42     MOPref : String;                     //Префикс к имени *.mo-файла.
43     IsDummy : Boolean;                   //Является ли объект заглушкой без функции перевода и подключенного *.mo.
44   public
45     //Открытые переменные.
46     LangConnected : Boolean;             //Подключен ли *.mo для языка.
47    
48     //Конструкторы-деструкторы
49     constructor Create(const MODirectory, MOPrefix : String; const DefLang : String = 'default');  virtual;    //Конструктор, автоматически подключающий файл {MODirectory}\{MOPrefix}{lang}.mo, предварительно определяет {lang}.
50     constructor CreateAsDummy;  virtual;  //Конструктор, создающий объект-заглушку, тупо пропускающий строки сквозь себя, без перевода.
51
52     //Открытые методы.
53     function _(AOrig: String) : String; virtual;      //Выдернуть перевод строки, автоматически перекодированный в текущую кодировку.
54     function GetCurrLang : String;    //Вернуть текущий используемый язык.
55   end;
56  
57 //Глобальные функции
58 function GetUIEncoding: string;    //Gets encoding for a user interface - it may not be the same as a system encoding.
59
60 implementation
61
62 /////////////////////////////////////////////
63 //          TConsUtilServiceClass          //
64 /////////////////////////////////////////////
65
66 //-----------------------------------------//
67 //        Конструкторы-деструкторы...      //
68 //-----------------------------------------//
69
70 constructor TMOExtractor.Create(const MODirectory, MOPrefix : String; const DefLang : String = 'default');
71 //Конструктор, автоматически подключающий файл {MODirectory}\{MOPrefix}{lang}.mo, предварительно определяет {lang}.
72 begin
73   //Запомним переданные параметры...
74   Self.MODir := MODirectory;
75   Self.MOPref := MOPrefix;
76   //Определим текущий язык...
77   GetLanguageIDs(CurrLang, CurrFallbackLang);
78   if DefLang <> 'default' then begin
79     //Если язык указан в параметрах - то использовать его.
80     CurrFallbackLang := DefLang;
81   end;
82   //Определим кодировку...
83   CurrEncoding := GetUIEncoding();
84   //Отмечаемся что объект - не заглушка
85   Self.IsDummy := false;
86   //Проверяем - существует ли файлик для языка?
87   if FileExists(AddLastSlash(MODirectory)+MOPrefix+CurrFallbackLang+'.mo') = true then begin
88     //Файлик найден.
89     //Теперь можно этот файлик подключить унаследованным конструктором.
90     Self.LangConnected := true;
91     try
92       inherited Create(AddLastSlash(MODirectory)+MOPrefix+CurrFallbackLang+'.mo');
93     except
94       //Ошибка чтения файла - придется работать как будто файла не было.
95       Self.LangConnected := false;
96     end;
97   end
98   else begin
99     //Файл не найден - при переводе работаем по принципу "что спросили то и вернем"
100     Self.LangConnected := false;
101   end;
102 end;
103
104 constructor TMOExtractor.CreateAsDummy();
105 //Конструктор, создающий объект-заглушку, тупо пропускающий строки сквозь себя, без перевода.
106 begin
107   //Все-же определим текущий язык и кодировку, вдруг потребуется...
108   GetLanguageIDs(CurrLang, CurrFallbackLang);
109   CurrEncoding := GetSystemEncoding();
110   //Отмечаем, что у нас тупая заглушка...
111   Self.LangConnected := false;
112   Self.IsDummy := true;
113 end;
114
115 //-----------------------------------------//
116 //             Открытые методы.            //
117 //-----------------------------------------//
118
119 function TMOExtractor._(AOrig: String) : String;
120 //Выдернуть перевод строки, автоматически перекодированный в текущую кодировку.
121 begin
122   if (Self.LangConnected = true) and (Self.IsDummy = false) then begin
123     //Извлекаем искомую строку...
124     Result := ConvertEncoding(Self.Translate(AOrig),'utf-8',Self.CurrEncoding);
125     //Если в mo не найдено такой строки - вернуть оригинал.
126     if (Result = '') and (AOrig <> '') then Result := AOrig;
127   end
128   else begin
129     //Файлик не был прочитан - возвращаем то что спросили, без перевода.
130     Result := AOrig;
131   end;
132 end;
133
134 function TMOExtractor.GetCurrLang() : String;
135 //Вернуть текущий используемый язык.
136 begin
137   Result := Self.CurrFallbackLang;
138 end;
139
140 /////////////////////////////////////////////
141 //            Глобальные функции           //
142 /////////////////////////////////////////////
143
144 function GetUIEncoding: string;
145 //Gets encoding for a user interface - it may not be the same as a system encoding.
146 begin
147   Result := GetSystemEncoding;
148   {$IFDEF Windows}
149   if System.IsConsole = true then begin
150     if Result = 'cp1251' then begin
151       //Russian versions of Windows 9x-XP use a cp866 encoding for console i\o.
152       Result := 'cp866';
153     end;
154   end;
155   {$ENDIF}
156 end;
157
158 end.
159
Note: See TracBrowser for help on using the browser.