2016-09-18 5 views
2

J'ai une expérience Delphi et j'essaye de construire un projet avec Lazarus, ce qui est complètement nouveau pour moi.Lazarus localisation/plusieurs projets

Je pense, j'ai lu toutes les informations disponibles sur Lazarus, traduction/internationalisation/localisation, mais je ne pouvais pas trouver ce que je veux vraiment.

J'ai travaillé dans un projet avec 3 ou 4 EXEcutables, qui partagent entre eux, la même base de données la même interface (héritage de formulaire), les utilitaires communs, les paramètres et les chaînes communes et connexes.

Je ne veux pas avoir 3 ou 4 fichiers .po avec des noms différents (un pour chaque EXE), avec les mêmes chaînes communes partagées entre eux.

Existe-t-il une solution pour cela?

  • probablement forcer un "gobal.po" pour toutes les applications? Comment?
  • dois-je créer mon propre système pour localiser \ centraliser toutes les chaînes dans un fichier?

des suggestions?

merci pour toute aide. regards,

Répondre

4

Utilisez une unité de langue partagée dans laquelle vous placez toutes les chaînes de tous les projets. Créez un package dans lequel vous ajoutez cette unité de chaînes partagées. Activez i18n pour ce package. Compilez le paquet et vous obtiendrez le fichier po partagé dans le dossier des langues.

Pour chaque projet nécessitant les chaînes de ressources, vous devez ajouter ce package comme une exigence - la manière la plus simple de le faire est dans l'éditeur de package et de sélectionner «Use»/​​«Add to project». Ne pas activer i18n pour les projets car cela ajouterait les fichiers po du projet au dossier des langues.

Pour utiliser les chaînes traduites dans chaque projet, ajoutez l'unité « Traductions » aux usages et appeler

TranslateUnitResourceStrings(
    StringsUnit, 
    Format('languages\%s.%s.po', [StringsUnit, ALang]) 
); 

Ici StringsUnit est le nom de l'unité partagée avec toutes les chaînes de ressources collectées. ALang est le symbole de langue à utiliser, par ex. 'de' pour l'allemand, 'fr' pour le français, etc.

Et maintenant la partie difficile ... Puisque i18n est désactivé, les chaînes affectées aux sous-titres des composants ne sont pas automatiquement placées dans le fichier po. Ainsi, vous laissez les sous-titres de composant seuls, créez une chaîne de ressources pour chacun (dans la 'chaîne de caractères', bien sûr), puis, au moment de l'exécution, affectez les légendes à la chaîne de ressources. Peut-être quelque chose comme ceci:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    SetCaptions; 
end; 

procedure TForm1.SetCaptions; 
begin 
    Caption := RSTitleOfForm1;   // resource string for form title 
    Label1.Caption := RSYDateLabel; // label caption showing "Date:" 
    // etc. 
end; 

Si l'utilisateur sélectionne une nouvelle langue, par exemple d'un combobox avec toutes les traductions disponibles, vous devez appeler TranslateUnitResourceStrings puis SetCaptions pour chaque forme actuelle (en cas de formes créées dynamiquement, SetCaptions sera appelé automatiquement puisqu'il est dans l'événement FormCreate).

+0

c'est exactement ce que je cherchais. merci! – antseq