Delphi翻译字符串

时间:2010-12-20 10:29:33

标签: string delphi localization

我正在使用Delphi 2007,我想知道如何解决以下问题:

我必须翻译AComp.Caption例如,但我想要分配给标题的string通常取决于某些数据(例如日期或数字){{1 }})。因此,我必须将数据和字符串保存在每个翻译的新变量中,这真的很烦人。

我想做的是这样的事情:

Formatted

(注意,AComp.Caption(“Hello%s ..”)可以用不同的方法改变)

当切换到另一种语言时,您将调用// will add the string and data to an internal list of Translator // and will then return a DynamicString, which represents the translated value AComp.Caption := T.NewTranslatedString("Hello %s, do you like cheese?", User) 并且将翻译所有字符串的值,如果给出数据,则会再次格式化。

这是可能的,还是您知道另一种解决问题的方法?

提前致谢

其他问题: 字符串是普通对象吗,我可以子类化并添加动态行为,在特殊情况下改变字符串本身?

4 个答案:

答案 0 :(得分:3)

Delphi字符串不是对象,不能向它们添加行为。你需要开发自己的课程。

本地化应用程序的Windows方法是利用资源,可以更改(并加载重定向)而无需更改代码(无需调用特殊函数或添加新组件),也没有运行时调用但是加载资源。资源的唯一缺点是最终用户无法轻易更改它们。 Delphi 2007标准本地化工具使用这种方法。

无论如何,有一些像dxGetText(它是GNU gettext库的一个端口)或TsiLang的库,例如使用更“干扰”的方法,需要更改代码或添加组件。作为交换,它们可以简化最终用户的本地化。

在开发自己的本地化库之前,我会检查现有的一个是否符合您的需求。

注意:请注意,Delphi本地化工具存在重大问题,直到XE(我尚未测试)才解决这些问题。参见例如QC#79449。不幸的是,修复程序从未被移植到早期版本。

答案 1 :(得分:3)

您可以使用Delphi自己的翻译工具。它能够从源代码中提取字符串和资源字符串并形成DFM文件,并为您提供图形用户界面以将其转换为任何语言。然后,它为每种语言创建一个资源DLL。包含已翻译字符串和DFM数据的DLL。您应该将此项目的翻译DLL部署到目标计算机。

在您的情况下,您的字符串分为两组;不需要任何进一步处理的固定字符串,以及需要一些额外数据才能正确格式化的参数化字符串。对于固定字符串,您只需键入翻译成翻译工具即可。对于参数化字符串,将每个字符串保存为resourcestring,并使用resourcestring对其进行格式化。例如:

resourcestring
  strDoYouLikeCheese = 'Hello %s, do you like cheese?';

...

AComp.Caption := Format(strDoYouLikeCheese,[User]);

现在您可以使用翻译工具或任何资源编辑器将resourcestring转换为您想要的语言,而无需更改源代码或重新编译它。

答案 2 :(得分:2)

您要做的是本地化您的应用程序。 Delphi基于resourcestring关键字对此提供支持。但是,我自己从未做过任何本地化,所以我建议您为此主题做一些网络搜索,或者等待其他专家提供更详细的帮助!

答案 3 :(得分:1)

您可以使用字典来跟踪字符串映射,如下所示

TTranslator = class
private
  FMappings : TDictionary <String, String>;
public
  function  Translate (const SrcStr : String) : String;
  procedure SetMapping (const SrcStr, DestStr : String);
end;

function TTranslator.Translate (const SrcStr : String) : String;
begin
  if not FMappings.TryGetValue (SrcStr, Result) then
    Result := SrcStr;
end;

procedure TTranslator.SetMapping (const SrcStr, DestStr : String);
begin
  FMappings.AddOrSetValue (SrcStr, DestStr);
end;

翻译只需几次调用SetMappings即可。这为您提供了很多灵活性。无论如何,您可以考虑使用内置的本地化支持甚至是第三方解决方案。

编辑:刚刚看到您使用的是Delphi 2007,因此您没有TDictionary可用。这个想法应该仍然有效,只需使用任何字典实现或基于列表的方法。

回答问题的另一部分:不,字符串不是普通对象(实际上它们根本不是对象)。它们以各种方式(内存管理,写时复制行为)是特殊的,并且不可能对它们进行子类化。但如果我正确地理解了这个问题,那就不是你想要的了。