Локализация приложений

Материал из Вики проекта PascalABC.NET
Версия от 21:51, 9 августа 2009; 92.207.105.188 (обсуждение)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

В .NET есть развитые средства локализации приложений. Соответственно эти возможности доступны в PascalABC.NET. Ниже приведен минимальный код, использующий ресурсы для локализации приложения на лету.

На данный момент в PascalABC.NET нет редактора ресурсов. Однако их можно создать программно, используя класс ResourceWriter. Следует отметить, что имя файла ресурса (точнее корневая папка ресурса) должно совпадать с именем файла основной программы. Назовем основную программу CultureForm. Тогда код генерации ресурсов выглядит так.

 #reference 'System.Windows.Forms.dll'
 
 uses System, System.Windows.Forms, System.Globalization, System.Resources, System.Diagnostics;
 
 procedure MakeResource;
 begin
   var rw := new ResourceWriter('CultureForm.en-US.resources');
   rw.AddResource('MyButton','Click me');
   rw.Close();
   rw := new ResourceWriter('CultureForm.ru-RU.resources');
   rw.AddResource('MyButton','Нажми меня');
   rw.Close();
 end;
 
 begin
  MakeResource();  
 end.

Далее необходимо создать в папке программы CultureForm подпапку resources и скопировать туда файлы CultureForm.en-US.resources и CultureForm.ru-RU.resources. Теперь наша основная программа:

 program CultureForm
 #reference 'System.Windows.Forms.dll'
 #reference 'System.Drawing.dll'
 
 uses System, System.Windows.Forms, System.Globalization, System.Resources;
 
 var f : Form;
     btn : Button;
     rm : ResourceManager;
     ru_cult : CultureInfo := new CultureInfo('ru-RU');
     en_cult : CultureInfo := new CultureInfo('en-US');
     local : boolean;
     
 procedure ButtonClicked(sender : object; e : EventArgs);
 begin
   if not local then
     btn.Text := rm.GetString('MyButton',ru_cult) //надпись на русском языке
   else
     btn.Text := rm.GetString('MyButton',en_cult); //на английском языке
   local := not local;
 end;
     
 begin
   //загрузка ресурсов
   rm := ResourceManager.CreateFileBasedResourceManager('CultureForm',System.IO.Path.Combine(GetCurrentDir(),'resources'),nil);
   f := new Form;
   btn := new Button();
   
   btn.Text := rm.GetString('MyButton',en_cult);
   btn.Click += ButtonClicked;
   f.Controls.Add(btn);
   Application.Run(f);
 end.