c# - Yes / No value of System
Is there a way I can get the Yes / No value of the System Language in the .Net framework?
I don´t want to make lan开发者_StackOverflow社区guage files for each language when I only need Yes & no...
You can indeed use the windows resources.
I once made an example (unfortunately in Delphi), but you can surely do it in Dotnet as well. It can be really useful, you are not limited to "Yes" and "No", but can use phrases like "do you want to continue...".
http://www.martinstoeckli.ch/delphi/delphi.html#StringWindowsRes
Sorry that i can't provide an example in C#.
Edit: Well, now i found the time to write a small class in 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);
}
I´ve found a solution:
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;
}
You could take a Universal Approach and use pictures.
You could make your own, ignoring the use of the words shown in two of the images above and go with the Check and X images. I use this for our factory workers who are not only mostly illiterate but sometimes non-English speaking.
You could do something like this:
public static class YesNo{
public static string GetYesOrNo(this bool boolean)
{
var dictionary = boolean ? _yesDictionary : _noDictionary;
if(dictionary.ContainsKey(CultureInfo.CurrentUICulture.TwoLetterISOLanguageName))
{
return dictionary[CultureInfo.CurrentUICulture.TwoLetterISOLanguageName];
}
return boolean ? DEFAULT_YES : DEFAULT_NO;
}
const string DEFAULT_YES = "yes";
const string DEFAULT_NO = "no";
private static readonly Dictionary<string, string> _yesDictionary = new Dictionary<string, string>
{
{"en","yes"},
{"de", "ja"},
{"es", "si"}
};
private static readonly Dictionary<string, string> _noDictionary = new Dictionary<string, string>
{
{"en", "no"},
{"de", "nein"},
{"es", "no"}
};
}
This could also be a case for using localized resource files for looking up translated values.
精彩评论