Reputation: 24534
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 language files for each language when I only need Yes & no...
Upvotes: 7
Views: 5900
Reputation: 24071
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);
}
Upvotes: 10
Reputation: 24534
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;
}
Upvotes: 6
Reputation: 853
This could also be a case for using localized resource files for looking up translated values.
Upvotes: 0
Reputation: 42246
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"}
};
}
Upvotes: 0
Reputation:
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.
Upvotes: 3