SSS

Sık sorulan sorular

TsiLang Components Suite hakkında en sık sorulan sorulara yanıtlar.

Veritabanı gridlerini çevirmek için ilgili veri kümesine tüm alanları ekleyin ve her alanın görüntülenen etiketini çevirmek için TsiLang’ın “DisplayLabels” özelliğini kullanın. Gridin “Columns” özelliğinde “Title” alt özelliğini ayarlamayın; alanın “DisplayLabel” özelliği tarafından üzerine yazılır. Veya bunları TsiLang’ın Collections özelliğini kullanarak da çevirebilirsiniz.

CONST bölümü için kullanılan tekniğin aynısını kullanın ve RESOURCESTRING anahtar sözcüğünü CONST olarak değiştirin.

Aşağıdaki dize sabiti bildirimi:

const
  constname =
  'stringvariable';
şu şekilde değiştirilmelidir:
const
  constname = 'stringvariable';

InfoPower’ın DBGrid bileşenini çevirmek için TsiLang’ın “Multilines” özelliğini kullanın ve gridin “Selected” özelliğini çevirin.

Not: Bu özelliği çevirirken dikkatli olun; biçimi ve sekme TAB karakterlerinin yerlerini koruduğunuzdan emin olun.

TsiLang’ın ExtendedTranslations özelliğini kullanın. Bu özellik, TsiLang tarafından doğrudan işlenmeyen diğer tüm özellikleri çevirmenize yardımcı olur.

TsiLang Expert’e bu satırların veya kod bloklarının çeviri için atlanması gerektiğini bildirmek üzere kaynak koda şu etiketleri ekleyebilirsiniz: {TSI:IGNORE}, {TSI:IGNORE ON},{TSI:IGNORE OFF}, {TSI:IGNORE NEXT} ve {TSI:IGNORE VALUE}. Bu etiketlerin ayrıntılı açıklaması için lütfen Kullanım Kılavuzuna ve yardım dosyasına bakın.

TsiLang bileşenlerinin ilgili yöntemlerini kullanın. MessageDlg(), ShowMessage(), InputBox() gibi tüm standart iletişim kutusu işlevleri, uluslararasılaştırma desteği sağlamak üzere TsiLang içinde yeniden uygulanmıştır.

Bu yalnızca işletim sisteminin ve IDE’nin eski sürümlerini kullanıyorsanız olabilir. Japonca (veya diğer Batılı olmayan) yerel ayar desteğini yüklemeniz ve/veya sisteminizin varsayılan yerel ayarını Japonca olarak ayarlamanız gerekebilir. Bunun için Control Panel|Regional Options|General sekmesine gidin. Yerel ayarınızla ilgili onay kutusunun işaretli olduğundan emin olun, ardından ilgili yerel ayarı sistem varsayılanı yapmak için Set Default düğmesine tıklayın. 

Ayrıca lütfen şu makaleye de bakın: https://www.tsilang.com/tr/support-for-unicode-languages/

Şu geçici çözümü öneriyoruz:

  • Kaynaklardan dize yüklemek için yeni bir işlev bildirin, örneğin:
extern PACKAGE AnsiString __fastcall LoadStr2(int Ident)
{
  TResStringRec ResRec;
  ResRec.module = (long *) &HInstance;
  ResRec.ident = Ident;
  return (LoadResString(&ResRec));
}
  • Tüm birimlerinizde LoadtStr() çağrılarını LoadStr2() çağrılarıyla değiştirin.
  • Uygulamanızı derleyin.

  • TsiLang Resource Strings Import Wizard öğesini çalıştırın (TsiLang Expert’in Tools|Wizards menüsünde bulunur) ve çevrilmesi gereken tüm dizeleri çalıştırılabilir dosyanızdan içe aktarın.

  • Sihirbazda seçilen tüm bu dizeler TsiLang’a aktarılır ve çeviri için kullanılabilir hale gelir.

  • Bu dizelerin çevirilerini girin ve projeyi yeniden derleyin.

Genellikle her TActionClientItem, istemcileri için dize verisi sağlayan ilgili bir TAction’a bağlıdır. TsiLang bileşenleri, Action’ın Caption veya Hint gibi dize özelliklerini yönetir; böylece etkin dil değiştirildiğinde Action’a bağlı tüm görsel denetimler güncellenir.

Ancak herhangi bir eyleme bağlı olmayan TActionClientItem öğelerinin, örneğin TActionMainMenuBar’ın üst düzey öğelerinin, yayımlanmış dize özellikleri yoktur ve doğrudan işlenemez. Bu tür TActionClientItem öğeleri için şu yöntemi öneririz:

  1. TAction’ı olmayan her TActionClientItem için “sahte” bir Action oluşturun ve bunları bağlayın. Örneğin, TActionMainMenuBar’ınızın üst düzey bir menü öğesi ‘File’ ise, FileFile1 adlı yeni bir action oluşturun, .Caption özelliğini ‘File’ olarak ayarlayın ve bunları bağlayın.
  2. Bu Action için çeviri verilerini Translation Editor’de girin.
  3. Bir action için olay işleyicisi tanımlanmamışsa bu action sürekli devre dışı kalır. Bu nedenle tüm “sahte” action öğelerinin OnUpdate olay işleyicisini şuna benzer bir yordam olarak tanımlayın:
    procedure TForm1.FakeActionUpdate(Sender: TObject);
    begin
      TAction(Sender).Enabled := True;
    end;
    

Bu durum için bir demo projesi şuradan indirilebilir: https://www.sicomponents.com/soft/ActionManager.zip

Aşağıdaki gibi veri yapıları kullanıyorsanız:

const
  str1 = 'My String constant 1';
  str2 = 'My String constant 2';
  str3 = 'My String constant 3';
  StrArr: array[0..2] of string = (str1, str2, str3);

StrArr bildirimini şununla değiştirmeniz gerekir:

StrArr: array[0..2] of PString = (@str1, @str2, @str3);

Ayrıca koddaki dizi öğelerine yapılan tüm başvurular, örneğin

...StrArr[Index]...

şununla değiştirilmelidir:

...StrArr[Index]^...

Maalesef bunu yapmanın kolay bir yolu yok. Ancak örneğin TsiFindDialog bileşeninin OnShow olayında şuna benzer bir şey yazarak bunu hack edebilirsiniz:

procedure TForm1.siFindDialog1Show(Sender: TObject);
var
  hnd: THandle;
  R: TRect;
begin
  with siFindDialog1 do
  begin
    if (siLang = nil) or (siLang.Language <> 'Dutch') then 
      Exit;
    GetWindowRect(Handle, R);
    SetWindowPos(Handle, 0, 0, 0, R.Right - R.Left + 26, R.Bottom - R.Top, SWP_NOMOVE or SWP_NOZORDER);
    hnd := GetDlgItem(Handle, 1);
    SetWindowPos(hnd, 0, 0, 0, 100, 23, SWP_NOMOVE or SWP_NOZORDER);
    hnd := GetDlgItem(Handle, IDCANCEL);
    SetWindowPos(hnd, 0, 0, 0, 100, 23, SWP_NOMOVE or SWP_NOZORDER);
  end;
end;

Evet, TsiLang bileşenlerini IntraWeb uygulamalarında olağan VCL/FMX uygulamalarındaki gibi kullanabilirsiniz. Demo projesi şuradan indirilebilir: http://www.sicomponents.com/soft/IW_SiLang.zip

Aynısı UniGUI ve benzeri diğer web çerçevesi kütüphaneleri için de geçerlidir. TsiLang bileşenleriyle çevrilmiş bir UniGUI uygulamasının video örneğini Videolar sayfamızda görebilirsiniz.

Evet, ancak bunun için bazı püf noktaları gerekir. Ayrıntıları forum gönderimizde… bulabilirsiniz.

İki olası durum vardır:

  • Üçüncü taraf formlar görünür arayüz öğeleri için kaynak dizeleri kullanıyor:

Kullanılan kaynak dizelerini TsiLang bileşenine aktarmak için Resource Strings Import Wizard öğesini kullanmanız yeterlidir. Üçüncü taraf formların her dilde görüntülenmek için kullandığı Font ve Charset değerlerini denetleyebilmek için TScreen.OnActiveFormChange olayını kullanabilirsiniz. Örneğin:

 

TForm1 = class(TForm)  {…}    
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure OnFormChange(Sender: TObject);
{…}
end
;
{…}

procedure
TForm1.FormCreate(Sender: TObject);
begin

Screen.OnActiveFormChange := OnFormChange;
end
;
procedure
TForm1.OnFormChange(Sender: TObject);
begin

if (Screen.ActiveForm <> nil) and (Screen.ActiveForm <> Self) then
Screen.ActiveForm.Font.Assign(Self.Font);
end
;
  • Üçüncü taraf formlar arayüz öğeleri için koda gömülü dizeler kullanıyor:

Her üçüncü taraf forma TsiLang yerleştirmeniz, bu formu projenize eklemeniz ve projenizdeki olağan bir form gibi çevirmeniz gerekir.

TDBNavigator bileşeninde küçük bir hata (veya tasarım gereği davranış) var. Bunu düzeltmek için şu örnek kodu kullanabilirsiniz:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBNavigator1.Hints.CommaText := 
  siLang1.GetStringValue(@siLang1.MultiLines,
  'DBNavigator1.Hints', siLang1.ActiveLanguage);
end;

XP Theme etkinken Developer Express bileşenleri, AnsiString değerini uygulamanın varsayılan yerel ayarını kullanarak WideString değerine dönüştürür. Bunu, dil değişikliği olayında uygulamanın iş parçacığı yerel ayarını değiştirerek düzeltebilirsiniz. Örneğin:

procedure TForm1.siLang1ChangeLanguage(Sender: TObject);
begin
  if siLang1.ActiveLanguage = 1 then
    SetThreadLocale(LANG_ENGLISH)
  else
    SetThreadLocale(LANG_JAPANESE);
end;

SysLocale global değişkeni Delphi ve C++Builder’ın daha yeni sürümlerinde kullanılabilir:

procedure TForm1.FormCreate(Sender: TObject);
begin
  if SysLocale.PriLangID = LANG_ENGLISH then
    siLangDispatcher1.ActiveLanguage := 1
  else if SysLocale.PriLangID = LANG_GERMAN then
    siLangDispatcher1.ActiveLanguage := 2
  else if SysLocale.PriLangID = LANG_FRENCH then
    siLangDispatcher1.ActiveLanguage := 3
  else
    siLangDispatcher1.ActiveLanguage := 1;
end;

İşletim sisteminin varsayılan dilini algılamak için WinAPI’yi de kullanabilirsiniz:

procedure TForm1.FormCreate(Sender: TObject);
var
  LangID: DWORD; 
begin
  LangID := GetUserDefaultLangID; 
  case Byte(LangID and $03FF) of 
    LANG_ENGLISH: siLangDispatcher1.ActiveLanguage := 1; 
    LANG_GERMAN: siLangDispatcher1.ActiveLanguage := 2; 
    LANG_FRENCH: siLangDispatcher1.ActiveLanguage := 3; 
  else
    siLangDispatcher1.ActiveLanguage := 1;
end;

Ya da şu faydalı makaleyi okumayı düşünebilirsiniz: “Kullanıcılar Tarafından Çevrilen Çok Dilli Uygulamalar Oluşturma“.

Bazen, temaların etkin olduğu Windows XP altında, dil değiştirildikten sonra ana menünün arka planı beyaz olur. Bu, XP hatası olarak bilinir ve geçici çözüm olarak şu yol izlenebilir:

  1. Dili değiştirmeden önce Images özelliğini nil olarak ayarlayın.
  2. Etkin dili değiştirin.
  3. Images özelliğinin değerini geri yükleyin.

Aşağıdaki Delphi kodu bunu göstermektedir:

  MainMenu1.Images := nil; 
  siLangDispatcher.ActiveLanguage := (computed value); 
  MainMenu1.Images := ImageList1; 

Delphi 6’ya tüm güncelleme ve servis paketlerini kurmamışsınız gibi görünüyor. TsiLang paketi en son paketlerin tümü kurulu olarak derlendiği için lütfen mevcut tüm servis ve güncelleme paketlerini (RTLUpdate 3 dahil) kurun.

Delphi ve C++Builder için tek bir paket sunabilmenin bedeli buydu. Yalnızca C++Builder kullanıyorsanız SI.INC dosyasının ilk satırına {$DEFINE BCB} ekleyip TsiLang paketlerini yeniden derleyerek bunu düzeltebilirsiniz. Hem Delphi hem de C++Builder kullanmanız gerekiyorsa, Full Source sürümüne sahip değilseniz veya TsiLang paketlerini yeniden derlemek istemiyorsanız C++ projelerinizde Application->Initialize(); çağrısından hemen sonra siComp.hpp içinde bildirilen siLang_Def_UsedInCpp global değişkenini true olarak ayarlamanız gerekir.

Derlenmiş birimler (DCU) yalnızca Win32, Win64, Android, Linux ve OSX platformları için sağlanır. iOS DCU’ları iOSSimulator hedefi için üretilir. Bu nedenle projelerinizi iOS hedef platformu için derlemeniz gerekiyorsa projenizi TsiLang Components Suite birimlerinin kaynaklarını kullanarak yeniden derlemeniz gerekir.

TsiLang birimlerini FireMonkey projelerinde derlemek için FMX genel koşullu tanımı gereklidir. Önceden derlenmiş TsiLang birimlerini FireMonkey projenize yalnızca bağlarsanız bu tanım gerekmez.

TsiLang Components Suite’in kayıtlı sürümünü Windows Server platformunda kurarken çökme yaşarsanız, lütfen işletim sisteminin Data Execution Prevention (DEP) ayarını OFF yapın. DEP, Windows Server platformlarında varsayılan olarak ON durumundadır ve bu, kurulum sırasında çökmeye neden olabilir.

RAD Studio uygulamalarınıza stil uygulamak için VCL Styles kullandığınızda, TsiLang’ın UseTaskDialog özelliği True olarak ayarlıysa TsiLang tarafından görüntülenen mesaj kutuları stillenmez. Bunu önlemek için bu özelliği False olarak ayarlamanız yeterlidir.

Ancak etkin bir uygulama stili olmadığında Task Dialog tabanlı mesaj kutuları kullanmak istiyorsanız şu yöntemi kullanabilirsiniz:

  1. UseTaskDialog özelliğini varsayılan olarak True yapın.
  2. Uygulamanın etkin formu değiştiğinde (Screen.OnActiveFormChange olayında) uygulamaya stil uygulanıp uygulanmadığını denetler ve stil uygulanmışsa bu özelliği False olarak ayarlarız.

Aşağıdaki kod örneği bunu göstermektedir:

procedure TForm1.ScreenFormChange(Sender: TObject);
  procedure ProcessActiveForm(AForm: TCustomForm);
  var
    I: Integer;
  begin
    for I := 0 to AForm.ComponentCount - 1 do
      if AForm.Components[I] is TsiCustomLang then
      begin
        TsiCustomLang(AForm.Components[I]).UseTaskMsgDlg := StyleServices(AForm).IsSystemStyle;
        Exit;
      end;
  end;
 
begin
  if Screen.ActiveCustomForm <> nil then
    ProcessActiveForm(Screen.ActiveCustomForm);
end;

Dispatcher bileşeninin FileName özelliğine değer atamanız ve LoadAllFromFile() yöntemini çağırmanız yeterlidir:

procedure TForm1.FormCreate(Sender: TObject);
begin
  siLangDispatcher1.FileName := "YourSILorSIBFileName.SIL";
  siLangDispatcher1.LoadAllFromFile(siLangDispatcher1.FileName);
end;

TsiLang Components Suite’i çevirmek için dilinizi tsilang_translations.sib dosyasına ekleyin ve dosya adını TsiLang Expert Language Options altındaki Custom file alanına girin.

SIB dosyasına dil eklemeye ilişkin adım adım bir kılavuzu burada bulabilirsiniz: Translate software with SIL Editor: A Step-by-Step Guide

Kaydet iletişim kutusunun Options değerinde ofOverwritePrompt bulunduğunda, "<file> already exists. Do you want to replace it?" sorusu Windows tarafından, "Confirm Save As" başlıklı bir sistem mesaj kutusu olarak gösterilir. TsiLang bunu çeviremez. Soruyu program dilinizde göstermek için Options içinden ofOverwritePrompt değerini kaldırın ve soruyu iletişim kutusunun OnCanClose olayında kendiniz sorun:

procedure TForm1.siSaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := not FileExists(siSaveDialog1.FileName) or
    (siLang1.MessageDlg(Format(SOverwriteQuestion, [siSaveDialog1.FileName]),
      mtConfirmation, [mbYes, mbNo], 0) = mrYes);
end;

SOverwriteQuestion sizin kendi dizenizdir, örneğin '%s already exists. Do you want to replace it?'. Programınızın geri kalanıyla birlikte çevrilmesi için bunu diğer dizeler gibi TsiLang bileşeninde tutun.

Lütfen ofOldStyleDialog seçeneğiyle VCL’nin OnCanClose olayını çağırmadığını unutmayın; bu nedenle bu yöntem yalnızca varsayılan iletişim kutusu stilinde çalışır.

Uygulamanızın bir sonraki dili burada başlıyor

Çok dilli olmaya hazır mısınız?

Her özelliği kendi projenizle deneyin.

Tam işlevli deneme sürümü. Yerelleştirilmiş uygulamanız çalışırken IDE’nizi açık tutun.