大小字符串KB,MB,GB等的本地化字符串值?

时间:2019-04-07 06:45:23

标签: winapi localization

此约束资源在哪里存储在Windows上? 我需要以已安装的Windows的本机语言来显示大小。

2 个答案:

答案 0 :(得分:0)

字符串非常特定于正在使用它的应用程序。应用程序可以使用的Windows中没有通用的字符串资源。当然,您可以编写一个程序来搜索Windows文件夹中的资源,以查看哪个资源dll具有要查找的字符串,然后在应用程序中使用该资源dll,但这是不可取的。原因是,对Windows进行的任何新更新都会导致资源dll更改,从而破坏您的应用程序。

正如另一位发布者建议的那样,最好编写自己的资源dll并将其本地化为要支持应用程序的语言。

答案 1 :(得分:0)

这是可以使用的磁盘配额库(自Windows XP开始可用的):

function FindStringResourceEx(AInstance: HINST; AStringID: UINT; ALangID: UINT): PWideChar;
var
  Res: HRSRC;
  LoadedRes: HGLOBAL;
  I: Integer;
begin
  Result := nil;
  Res := FindResourceEx(AInstance, RT_STRING, MAKEINTRESOURCE(AStringID div 16 + 1), ALangID);
  if Res <> 0 then begin
    LoadedRes := LoadResource(AInstance, Res);
    if LoadedRes <> 0 then
    try
      Result := PChar(LockResource(LoadedRes));
      if Assigned(Result) then
      try
        for I := 0 to (AStringID and 15) - 1 do
          Inc(Result, PWord(Result)^ + 1);
      finally
        UnlockResource(THandle(Result));
      end;
    finally
      FreeResource(LoadedRes);
    end;
  end;
end;

function GetSizeStrings(out sBytes, sKB, sMB, sGB, sTB, sPB, sEB: string): Boolean;
var
  hLib: HMODULE;
  sRes: string;
  I: Integer;
  SL: TStringList;
begin
  Result := False;
  hLib := LoadLibrary('dskquoui.dll');
  if hLib > 0 then
  try
    SL := TStringList.Create;
    try
      sRes := FindStringResourceEx(hLib, 14472, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
      Result := sRes <> '';
      if Result then begin
        sRes := sRes.Remove(0, 1);
        I := sRes.IndexOf(#$B);
        if I > -1 then
          sRes := sRes.Remove(I);
        SL.Delimiter := #2;
        SL.DelimitedText := sRes;
        sBytes := SL[0]; // bytes
        sKB    := SL[1]; // KB
        sMB    := SL[2]; // MB
        sGB    := SL[3]; // GB
        sTB    := SL[4]; // TB
        sPB    := SL[5]; // PB
        sEB    := SL[6]; // EB
      end;
    finally
      SL.Free;
    end;
  finally
    FreeLibrary(hLib);
  end;
  if not Result then begin
    sBytes := 'bytes';
    sKB    := 'KB';
    sMB    := 'MB';
    sGB    := 'GB';
    sTB    := 'TB';
    sPB    := 'PB';
    sEB    := 'EB';
  end;
end;