How to: Create Custom Cultures

The predefined cultures provided with the .NET Framework and the Windows operating system provide information such as the language and calendar used in a country/region, and the text conventions used to format, parse, and compare strings, dates, and numbers. However, your application can create a custom culture if the predefined cultures do not provide the required information.

To define and create a custom culture

  1. The application should use a CultureAndRegionInfoBuilder object to define and name the custom culture. The custom culture can be an entirely new culture, or can be a culture that replaces an existing .NET Framework culture or Windows locale.

    For new cultures, your application can populate the CultureAndRegionInfoBuilder object properties with an existing CultureInfo object and the LoadDataFromCultureInfo method, and an existing RegionInfo object and the LoadDataFromRegionInfo method. For replacement cultures, the CultureAndRegionInfoBuilder object properties are automatically populated from the properties of the culture being replaced.

  2. The application modifies the properties of the CultureAndRegionInfoBuilder object to satisfy requirements.

  3. The application calls the Register method to register the custom culture. The registration process performs these tasks:

    • Create an .nlp file that contains the information defined in the CultureAndRegionInfoBuilder object.

    • Store the .nlp file in the %WINDIR%\Globalization system directory on your computer, causing the culture information to persist on the computer even if the computer is turned off. You must have administrative privileges on the computer on which the custom culture is registered because the .nlp file is stored in a system directory.

    • Prepare the .NET Framework to search the %WINDIR%\Globalization system directory instead of an internal cache the next time there is a request to create your new custom culture.

    Your custom culture now has the same status as any predefined .NET Framework culture or Windows locale on your computer. The custom culture is available until your application removes the corresponding .nlp file from your computer with the Unregister method.

  4. The application specifies the name of the custom culture in a CultureInfo class constructor.

Example

The following code example uses the CultureAndRegionInfoBuilder class to define and register a custom culture named "x-en-US-sample", and then constructs a CultureInfo object for the custom culture. The example also shows some corresponding properties of the CultureAndRegionInfoBuilder and CultureInfo objects.

' This example demonstrates the System.Globalization.Culture- 
' AndRegionInfoBuilder Register method. 
' Compile this code example with a reference to sysglobl.dll. 

Imports System
Imports System.Globalization

Class Sample
    Public Shared Sub Main() 
        Dim cib As CultureAndRegionInfoBuilder = Nothing 
        Try 
            ' Create a CultureAndRegionInfoBuilder object named "x-en-US-sample".
            Console.WriteLine("Create and explore the CultureAndRegionInfoBuilder..." & vbCrLf)
            cib = New CultureAndRegionInfoBuilder("x-en-US-sample", CultureAndRegionModifiers.None)

            ' Populate the new CultureAndRegionInfoBuilder object with culture information. 
            Dim ci As New CultureInfo("en-US")
            cib.LoadDataFromCultureInfo(ci)

            ' Populate the new CultureAndRegionInfoBuilder object with region information. 
            Dim ri As New RegionInfo("US")
            cib.LoadDataFromRegionInfo(ri)

            ' Display some of the properties of the CultureAndRegionInfoBuilder object.
            Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName)
            Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName)
            Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName)
            Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId)
            Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric)
            Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol)
            Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName)
            Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName)
            Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName)
            Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName)
            Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName)
            Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName)
            Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName)
            Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName)
            Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName)
            Console.WriteLine()

            ' Register the custom culture.
            Console.WriteLine("Register the custom culture...")
            cib.Register()

            ' Display some of the properties of the custom culture.
            Console.WriteLine("Create and explore the custom culture..." & vbCrLf)
            ci = New CultureInfo("x-en-US-sample")

            Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name)
            Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName)
            Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName)
            Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName)
            Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName)
            Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName)

            Console.WriteLine(vbCrLf & "Note:" & vbCrLf & "Use the example in the " & _
                              "Unregister method topic to remove the custom culture.")
        Catch e As Exception
            Console.WriteLine(e)
        End Try 

    End Sub 'Main
End Class 'Sample

'This code example produces the following results: 
' 
'Create and explore the CultureAndRegionInfoBuilder... 
' 
'CultureName:. . . . . . . . . . x-en-US-sample 
'CultureEnglishName: . . . . . . English (United States) 
'CultureNativeName:. . . . . . . English (United States) 
'GeoId:. . . . . . . . . . . . . 244 
'IsMetric: . . . . . . . . . . . False 
'ISOCurrencySymbol:. . . . . . . USD 
'RegionEnglishName:. . . . . . . United States 
'RegionName: . . . . . . . . . . x-en-US-sample 
'RegionNativeName: . . . . . . . United States 
'ThreeLetterISOLanguageName: . . eng 
'ThreeLetterISORegionName: . . . USA 
'ThreeLetterWindowsLanguageName: ENU 
'ThreeLetterWindowsRegionName: . USA 
'TwoLetterISOLanguageName: . . . en 
'TwoLetterISORegionName: . . . . US 
' 
'Register the custom culture... 
'Create and explore the custom culture... 
' 
'Name: . . . . . . . . . . . . . x-en-US-sample 
'EnglishName:. . . . . . . . . . English (United States) 
'NativeName: . . . . . . . . . . English (United States) 
'TwoLetterISOLanguageName: . . . en 
'ThreeLetterISOLanguageName: . . eng 
'ThreeLetterWindowsLanguageName: ENU 
' 
'Note: 
'Use the example in the Unregister method topic to remove the custom culture. 
'
// This example demonstrates the System.Globalization.Culture- 
// AndRegionInfoBuilder Register method. 
// Compile this code example with a reference to sysglobl.dll. 

using System;
using System.Globalization;

class Sample 
{
    public static void Main() 
    {
    CultureAndRegionInfoBuilder cib = null;
    try 
    {
// Create a CultureAndRegionInfoBuilder object named "x-en-US-sample".
    Console.WriteLine("Create and explore the CultureAndRegionInfoBuilder...\n");
    cib = new CultureAndRegionInfoBuilder(
                         "x-en-US-sample", CultureAndRegionModifiers.None);

// Populate the new CultureAndRegionInfoBuilder object with culture information.
    CultureInfo ci = new CultureInfo("en-US");
    cib.LoadDataFromCultureInfo(ci);

// Populate the new CultureAndRegionInfoBuilder object with region information.
    RegionInfo  ri = new RegionInfo("US");
    cib.LoadDataFromRegionInfo(ri);

// Display some of the properties of the CultureAndRegionInfoBuilder object.
    Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName);
    Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName);
    Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName);
    Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId);
    Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric);
    Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol);
    Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName);
    Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName);
    Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName);
    Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName);
    Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName);
    Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName);
    Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName);
    Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName);
    Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName);
    Console.WriteLine();

// Register the custom culture.
    Console.WriteLine("Register the custom culture...");
    cib.Register();

// Display some of the properties of the custom culture.
    Console.WriteLine("Create and explore the custom culture...\n");
    ci = new CultureInfo("x-en-US-sample");

    Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name);
    Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName);
    Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName);
    Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName);
    Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName);
    Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName);

    Console.WriteLine("\nNote:\n" +
        "Use the example in the Unregister method topic to remove the custom culture.");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
    }
}
/*
This code example produces the following results:

Create and explore the CultureAndRegionInfoBuilder...

CultureName:. . . . . . . . . . x-en-US-sample
CultureEnglishName: . . . . . . English (United States)
CultureNativeName:. . . . . . . English (United States)
GeoId:. . . . . . . . . . . . . 244
IsMetric: . . . . . . . . . . . False
ISOCurrencySymbol:. . . . . . . USD
RegionEnglishName:. . . . . . . United States
RegionName: . . . . . . . . . . x-en-US-sample
RegionNativeName: . . . . . . . United States
ThreeLetterISOLanguageName: . . eng
ThreeLetterISORegionName: . . . USA
ThreeLetterWindowsLanguageName: ENU
ThreeLetterWindowsRegionName: . USA
TwoLetterISOLanguageName: . . . en
TwoLetterISORegionName: . . . . US

Register the custom culture...
Create and explore the custom culture...

Name: . . . . . . . . . . . . . x-en-US-sample
EnglishName:. . . . . . . . . . English (United States)
NativeName: . . . . . . . . . . English (United States)
TwoLetterISOLanguageName: . . . en
ThreeLetterISOLanguageName: . . eng
ThreeLetterWindowsLanguageName: ENU

Note:
Use the example in the Unregister method topic to remove the custom culture.

*/

See Also

Reference

CultureInfo

CultureAndRegionInfoBuilder

CultureAndRegionModifiers

Other Resources

Encoding and Localization