c# - 是/否系统值

Van*_*ing 7 c#

有没有办法在.Net框架中获得系统语言的是/否值?

当我只需要是和否时,我不想为每种语言制作语言文件...

mar*_*kli 10

您确实可以使用Windows资源.

我曾经做过一个例子(不幸的是在Delphi中),但你也可以在Dotnet中做到这一点.它可能非常有用,你不仅限于"是"和"否",但可以使用"你想继续......"之类的短语.

http://www.martinstoeckli.ch/delphi/delphi.html#StringWindowsRes

抱歉,我无法在C#中提供示例.

编辑:好吧,现在我找到了在C#写一个小班的时间:

internal static class StoWindowsString
{
  /// <summary>
  ///   Searches for a text resource in a Windows library.
  ///   Sometimes, using the existing Windows resources, you can
  ///   make your code language independent and you don't have to
  ///   care about translation problems.
  /// </summary>
  /// <example>
  ///   btnCancel.Text = StoWindowsString.Load("user32.dll", 801, "Cancel");
  ///   btnYes.Text = StoWindowsString.Load("user32.dll", 805, "Yes");
  /// </example>
  /// <param name="LibraryName">Name of the windows library like
  ///   "user32.dll" or "shell32.dll"</param>
  /// <param name="Ident">Id of the string resource.</param>
  /// <param name="DefaultText">Return this text, if the resource
  ///   string could not be found.</param>
  /// <returns>Desired string if the resource was found, otherwise
  ///   the DefaultText</returns>
  public static string Load(string libraryName, uint Ident, string DefaultText)
  {
    IntPtr libraryHandle = GetModuleHandle(libraryName);
    if (libraryHandle != IntPtr.Zero)
    {
      StringBuilder sb = new StringBuilder(1024);
      int size = LoadString(libraryHandle, Ident, sb, 1024);
      if (size > 0)
        return sb.ToString();
      else
        return DefaultText;
    }
    else
    {
      return DefaultText;
    }
  }

  [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
  private static extern IntPtr GetModuleHandle(string lpModuleName);

  [DllImport("user32.dll", CharSet = CharSet.Auto)]
  private static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
}
Run Code Online (Sandbox Code Playgroud)


Van*_*ing 6

我找到了解决方案:

class Program {
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
    [DllImport("kernel32")]
    static extern IntPtr LoadLibrary(string lpFileName);
    static void Main(string[] args) {
        StringBuilder sb = new StringBuilder(256);    
        IntPtr user32 = LoadLibrary(Environment.SystemDirectory + "\\User32.dll");
        LoadString(user32, 805, sb, sb.Capacity);
        YES = sb.ToString().Replace("&","");
        LoadString(user32, 806, sb, sb.Capacity);
        NO = sb.ToString().Replace("&","");
    }            
    public static string YES;
    public static string NO;
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到,你可以解决你的问题.请注意,函数`GetModuleHandle`比`LoadLibrary`便宜,但我不确定你可以在Dotnet中使用它.无论如何,与`GetModuleHandle`相比,`LoadLibrary`之后需要一个`FreeLibrary`. (2认同)