语言资源

发布时间 2023-03-26 16:47:46作者: 六十五度
语言资源
行政
2023 年 3 月 2 日
约4分钟
在本页
通过外部文件使用语言资源
为应用程序的语言常量创建语言资源
默认语言资源
使用动态语言资源加载的演示项目
Delphi标准建议对依赖于语言的常量字符串使用资源字符串和 dfm 文件的各个版本。

EhLib 自第 9 版起使用略有不同的技术来存储语言资源。

不使用 resourcestring 类型的常量。
所有字符串资源都存储在一个文件中 -EhLibLangConsts.dfm以及EhLibLangConsts.XXX.dfm每种语言的文件。
语言字符串存储为TEhLibLanguageConsts类的属性。
该技术具有以下优点:

程序运行时可以随时下载语言资源。
语言可以设置为最终用户并自动选择。
语言资源可以存储为单独的文件,因此嵌入到一个 exe 文件中。
![](../images/Language resources.png)

所有依赖于语言的字符串库常量都存储在类的属性中TEhLibLanguageConsts(源文件EhLibLangConsts.dfm+ EhLibLangConsts.pas)

要访问类对象,请使用全局函数EhLibLanguageConsts: TEhLibLanguageConsts。其他语言的字符串版本存储在具有相应名称的类似文件中


EhLibLangConsts.ENU.dfm
EhLibLangConsts.FRA.dfm
EhLibLangConsts.RUS.dfm
EhLibLangConsts.UKR.dfm
...
in folder<EhLib archive >\LangResources\Res\在IDE中安装库时,要把这个文件夹中的文件复制到文件夹中<EhLib installed dir>\Lib\如果你的语言的文件不在文件夹中,你可以创建它。为此,将文件复制EhLibLangConsts.ENU.dfm到一个新文件EhLibLangConsts.XXX.dfm,其中XXX包含三个字母的语言代码。使用文本编辑器,将文件中的文本更改dfm为所需的文本。三字母语言代码可以在以下地址的表格中找到: https: //www.microsoft.com/resources/msdn/goglobal/default.mspx在文件中,还将类名从 更改TEhLibLanguageConsts_ENU为新名称TEhLibLanguageConsts_XXX(其中 XXX 是三字母语言代码)。

当程序在运行时更改语言,算法通过三个字母代码找到所需的语言文件,并作为外部 dfm 资源加载到 EhLibLanguageConsts 对象中,或者通过资源名称中的最后三个字符加载到嵌入式资源中TEhLibLanguageConsts_XXX。在程序内部,以下代码用于更改语言


  LanguageResourceManagerEh.ActiveLanguageAbbr := 'THREE-LETTER CODE'.
要自动选择语言,请使用以下代码


LanguageResourceManagerEh.ActiveLanguageAbbr := LanguageResourceManagerEh.AutoselectLanguage();
根据变量选择语言 -System.SysUtils.SysLocale.DefaultLCID如果未找到适合的文件或所选语言的内置资源,默认语言将从文件中描述的内置资源下载EhLibLangConsts.dfm。EhLibLangConsts.dfm 文件在编译时链接到 EXE 文件。

#通过外部文件使用语言资源
当从文件中加载资源时,该算法会查找具有以下名称的文件:<EXE File Placment>\Res\EhLibLangConsts.[XXX].dfm

XXX三字符语言代码在哪里。您可以通过分配一个全局变量来配置资源下载文件夹LanguageResourcesEh.LanguageResourcesFolder: String

EhLibLangConsts.XXX.dfm要在您的应用程序中使用其他资源,您必须随文件一起提供文件EXE。

Res 文件夹中的文件以 Utf8 编码存储。对于这些版本的 Delphi 中的这项技术的工作Delphi7-Delphi2005,类似的文件以 Ansi 编码存储在 Res.Ansi 文件夹中。

在程序代码中,您可以下载可用资源列表,以使用代码下载语言


LanguageResourceManagerEh.LoadListOfAvailableLanguages('EhLibLangConsts');
该算法将扫描文件\Res夹中的EhLibLangConsts.[XXX].dfm文件并填写 的内部属性EhLibLanguageConsts.LanguageList。要访问可用语言列表,请使用该属性LanguageResourceManagerEh.LanguageList

#为应用程序的语言常量创建语言资源
您还可以使用存储语言相关常量的技术来存储应用程序的字符串。为了这

创建一个继承自 TComponent 的类,并将其写入已发布的部分,其属性值在您的应用程序中取决于语言。(例如,请参阅AppLangConsts.pas演示应用程序中的文件DEMOS\MainDemo\)

  TApplicationLanguageConsts = class(TComponent)
  ..
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Caption: String read FCaption write SetCaption;
    property MenuFile: String read FMenuFile write FMenuFile;
  end;
在类构造函数中,使用下一个代码加载默认情况下使用的常量值:


  constructor TApplicationLanguageConsts.Create(AOwner: TComponent);
  begin
    inherited Create(AOwner);
    InitInheritedComponent(Self, TCustomControl);
  end;
创建一个资源dfm文件(AppLangConsts.dfm)来存储类的属性值

  object TApplicationLanguageConsts
    Caption = 'EhLib Main Complex Demo'
    MenuFile = 'File'
  end
将 dfm 文件写入应用程序的资源


  {$R AppLangConsts.dfm}
创建文件


  AppLangConsts.ENU.dfm
  AppLangConsts.BGR.dfm
  AppLangConsts.CHS.dfm
  AppLangConsts.CSY.dfm
  AppLangConsts.DEU.dfm
...
类比文件 EhLibLangConsts.XXX.dfm

在程序代码中,创建一个用于存储资源的变量

  FApplicationLanguageConsts := TApplicationLanguageConsts.Create(nil);
在程序代码中,在 LanguageResourceManager 中注册资源

  LanguageResourceManagerEh.AddLocalizableObject(FApplicationLanguageConsts,
       FApplicationLanguageConsts.ClassName, 'AppLangConsts', 'ENU');
更改语言时,WM_SETTINGCHANGE事件会发送到所有窗体和控件。

#默认语言资源
有一个概念——默认内置库语言。如果您不执行任何操作来更改应用程序中的语言,则会使用库中的默认语言资源。要更改所有使用的程序的默认内置语言:

将文件复制LangResources\Res\EhLibLangConsts.XXX.dfm到安装库文件夹中的Lib\EhLibLangConsts.dfm文件中。
_XXX删除带有类名后缀的文件的第一行,使其如下所示:object TEhLibLanguageConsts
重新编译库包。当库安装时EhLibInstaller.exe,程序会自动执行此操作。
#使用动态语言资源加载的演示项目
有关使用内置和外部资源的示例,请参见 Demo 项目


DEMOS\LanguageResEmbeddedExternal\Project1.dpr
在Unit1.pas文件中,您可以注释掉或取消注释这些行


{$DEFINE EMBEDDED_LANGUAGE_RESOURCES} 
{$DEFINE EMBEDDED_LANGUAGE_RESOURCES_ALL}
改变使用资源的方式,了解使用内置资源和外部资源的区别。有关如何使用指定的 DEFINE 定义来更改资源使用模式的详细信息,请参阅文件

Demos\LanguageResEmbeddedExternal\Info.Txt

另一个使用动态加载语言资源的例子可以看Demo工程

DEMOS\MainDemo\Project1.dpr

项目使用语言资源的主要方法如下:

procedure AppLangConsts.InitUnit;

注册将存储应用程序字符串资源的类 TApplicationLanguageConsts。
procedure TForm1.InitLanguageRes;

加载可用语言列表。
如果上次启动程序时选择了 Ini 文件中的语言,则激活该语言。
procedure TForm1.BuildLanguageMenu;

基于 LanguageResourceManagerEh.LanguageList 对象形成可用语言的菜单
procedure TForm1.MenuItemSelectLanguage(Sender: TObject);

当用户在菜单中选择另一种语言时加载新语言的文件。
procedure TForm1.ResourceLanguageChanged;

更改语言时分配属性和表单变量。