Do you know that your Windows Forms App could switch between installed languages at run-time?

An Input language is a Culture/Keyboard layout pair that determines how the physical keys on a keyboard map or plot to characters in a language (read more about Input Language in MSDN Library). Microsoft Windows allows installing more than one input language but international users usually use two: English and a national.

Since version 1.0 .NET Framework supports a special public sealed class - InputLanguage (in System.Windows.Forms namespace, assembly – System.Windows.Forms.dll). The property we are going to use today is CurrentInputLanguage of the InputLanguage type.

Enforcing to use a particular input language could be useful in many cases but please note that this function changes CurrentInputLanguage for the whole App and not just for a TextBox or any other selected control.

I created four overloaded functions that demonstrate this functionality. Actually only 4th function (the only one in VB example) does change input language, first demonstrates how to switch between languages and two others - how to create a InputLanguage class based on  string or integer language codes (please see code comments for more details).

C# code:

/// <summary>
/// Changing Current Input Language to a next installed language
/// </summary>
public void ChangeInputLanguage()
{
   // Nothing to do if there is only one Input Language supported:
    if (InputLanguage.InstalledInputLanguages.Count == 1)
       return;
   // Get index of current Input Language
    int currentLang = InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.CurrentInputLanguage);
   // Calculate next Input Language
    InputLanguage nextLang = ++currentLang == InputLanguage.InstalledInputLanguages.Count ? 
       InputLanguage.InstalledInputLanguages[0] : InputLanguage.InstalledInputLanguages[currentLang];
   // Change current Language to the calculated:
    ChangeInputLanguage(nextLang);
}
/// <summary>
/// Changing current Input Language to a new one passed in the param
/// </summary>
/// <param name="ISOLang">ISO Culture name string code e.g. "en" for English</param>
public void ChangeInputLanguage(string ISOLang)
{
   // Convert ISO Culture name to InputLanguage object. Be aware: if ISO is not supported
    // ArgumentException will be invoked here
    InputLanguage nextLang = InputLanguage.FromCulture(new System.Globalization.CultureInfo(ISOLang));
   ChangeInputLanguage(nextLang);
}
/// <summary>
/// Changing current Input Language to a new one passed in the param
/// </summary>
/// <param name="LangID">Integer Culture code e.g. 1033 for English</param>
public void ChangeInputLanguage(int LangID)
{
   // Convert Integer Culture code to InputLanguage object. Be aware: if Culture code is not supported
    // ArgumentException will be invoked here
    InputLanguage nextLang = InputLanguage.FromCulture(new System.Globalization.CultureInfo(LangID));
   ChangeInputLanguage(nextLang);
}
/// <summary>
/// Changing current Input Language to a new one passed in the param
/// </summary>
/// <param name="InputLang">New Input Language as InputLanguage object</param>
public void ChangeInputLanguage(InputLanguage InputLang)
{
   // Check is this Language really installed. Raise exception to warn if it is not:
    if (InputLanguage.InstalledInputLanguages.IndexOf(InputLang) == -1)
       throw new ArgumentOutOfRangeException();
   // InputLAnguage changes here:
    InputLanguage.CurrentInputLanguage = InputLang;
}

VB.NET code:

Public Sub ChangeInputLanguage(ByVal InputLang As InputLanguage)
   If InputLanguage.InstalledInputLanguages.IndexOf(InputLang) = -1 Then
        Throw New ArgumentOutOfRangeException()
   End If
    InputLanguage.CurrentInputLanguage = InputLang
End Sub

Happy New Year!

Technorati Tags: