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).
c'est exactement ce que je cherchais. merci! – antseq