root/trunk/MOExtractor.pas

Revision 168, 6.3 kB (checked in by sagrer, 6 months ago)

Сделал условно возможной сборку в Lazarus 0.9.28, также скрипт свн-клинера поправлен для работы с последней версией svn.

  • 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 var
73   tstr : String;
74 begin
75   //Запомним переданные параметры...
76   Self.MODir := MODirectory;
77   Self.MOPref := MOPrefix;
78   //Определим текущий язык...
79   GetLanguageIDs(CurrLang, CurrFallbackLang);
80   if DefLang <> 'default' then begin
81     //Если язык указан в параметрах - то использовать его.
82     CurrFallbackLang := DefLang;
83   end;
84   //Определим кодировку...
85   CurrEncoding := GetUIEncoding();
86   //Отмечаемся что объект - не заглушка
87   Self.IsDummy := false;
88   //Проверяем - существует ли файлик для языка?
89   tstr := AddLastSlash(MODirectory)+MOPrefix+CurrFallbackLang+'.mo';
90   if FileExists(AddLastSlash(MODirectory)+MOPrefix+CurrFallbackLang+'.mo') = true then begin
91     //Файлик найден.
92     //Теперь можно этот файлик подключить унаследованным конструктором.
93     Self.LangConnected := true;
94     try
95       inherited Create(AddLastSlash(MODirectory)+MOPrefix+CurrFallbackLang+'.mo');
96     except
97       //Ошибка чтения файла - придется работать как будто файла не было.
98       Self.LangConnected := false;
99     end;
100   end
101   else begin
102     //Файл не найден - при переводе работаем по принципу "что спросили то и вернем"
103     Self.LangConnected := false;
104   end;
105 end;
106
107 constructor TMOExtractor.CreateAsDummy();
108 //Конструктор, создающий объект-заглушку, тупо пропускающий строки сквозь себя, без перевода.
109 begin
110   //Все-же определим текущий язык и кодировку, вдруг потребуется...
111   GetLanguageIDs(CurrLang, CurrFallbackLang);
112   CurrEncoding := GetDefaultTextEncoding();
113   //Отмечаем, что у нас тупая заглушка...
114   Self.LangConnected := false;
115   Self.IsDummy := true;
116 end;
117
118 //-----------------------------------------//
119 //             Открытые методы.            //
120 //-----------------------------------------//
121
122 function TMOExtractor._(AOrig: String) : String;
123 //Выдернуть перевод строки, автоматически перекодированный в текущую кодировку.
124 begin
125   if (Self.LangConnected = true) and (Self.IsDummy = false) then begin
126     //Извлекаем искомую строку...
127     Result := ConvertEncoding(Self.Translate(AOrig),'utf-8',Self.CurrEncoding);
128     //Если в mo не найдено такой строки - вернуть оригинал.
129     if (Result = '') and (AOrig <> '') then Result := AOrig;
130   end
131   else begin
132     //Файлик не был прочитан - возвращаем то что спросили, без перевода.
133     Result := AOrig;
134   end;
135 end;
136
137 function TMOExtractor.GetCurrLang() : String;
138 //Вернуть текущий используемый язык.
139 begin
140   Result := Self.CurrFallbackLang;
141 end;
142
143 /////////////////////////////////////////////
144 //            Глобальные функции           //
145 /////////////////////////////////////////////
146
147 function GetUIEncoding: string;
148 //Gets encoding for a user interface - it may not be the same as a system encoding.
149 begin
150   Result := GetDefaultTextEncoding;
151   {$IFDEF Windows}
152   if System.IsConsole = true then begin
153     if Result = 'cp1251' then begin
154       //Russian versions of Windows 9x-XP use a cp866 encoding for console i\o.
155       Result := 'cp866';
156     end;
157   end;
158   {$ENDIF}
159 end;
160
161 end.
162
Note: See TracBrowser for help on using the browser.