Create custom culture in ASP.NET

I want to create a resource file for Singaporean English (en-sg) named “shopping.en-sg.resx” in App_GlobalResources folder.

I get error during compilation.

Error 1 The namespace ‘Resources’
already contains a definition for
‘shopping’ c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary
ASP.NET
Filesweb2cd6afe9737b0a13App_GlobalResources.vomuzavz.1.cs 26

After searching Google, I discover that “en-sg” is not a default culture and I have to create custom culture for it. I don’t know the detailed steps of this.

What should I do to create the culture and remove the compilation error?

I follow the example in MSDN, create a file called “shopping.x-en-US-sample.resx” and put the following code into BasePage’s function (protected override void InitializeCulture()):

CultureAndRegionInfoBuilder cib = null;

cib = new CultureAndRegionInfoBuilder(
  "x-en-US-sample", CultureAndRegionModifiers.None);

CultureInfo ci = new CultureInfo("en-US");
cib.LoadDataFromCultureInfo(ci);
RegionInfo ri = new RegionInfo("US");
cib.LoadDataFromRegionInfo(ri);

cib.Register();

ci = new CultureInfo("x-en-US-sample");

However, compilation error is still exist.

UPDATED:

You can easily reproduce the problem by creating an empty website and two files “shopping.en-sg.resx” and “shopping.resx” in the app_globalresources folder.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You can create a new culture based on an existing culture:

string culture = "en-sg";
string name = "Singaporean English";

CultureInfo cultureInfo = new CultureInfo("en-GB");
RegionInfo regionInfo = new RegionInfo(cultureInfo.Name);

CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder(culture, CultureAndRegionModifiers.None);

cultureAndRegionInfoBuilder.LoadDataFromCultureInfo(cultureInfo);
cultureAndRegionInfoBuilder.LoadDataFromRegionInfo(regionInfo);

// Custom Changes
cultureAndRegionInfoBuilder.CultureEnglishName = name;
cultureAndRegionInfoBuilder.CultureNativeName = name;

cultureAndRegionInfoBuilder.Register();

Added:
Just checked the references:
I have :

using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;

Added (updated, based on comments):

With regards the error message:

The error you’re seeing is the result of some resource naming conflict. Check the resource names, these get compiled into dlls to you need to check that the namespace names dont conflict. You can check this using the reflector tool: http://www.red-gate.com/products/reflector/

Method 2

Here are the steps and code required to create the en-sg culture.

  1. Create a console app.
  2. Add a reference to sysglobl (C:WindowsMicrosoft.NETFrameworkv2.0.50727sysglobl.dll)
  3. Add the code below to it.
  4. Run it on the web server(s) and dev machine(s) as an Administrator.

It will create a culture based on what I found to be its closest match (en-au). I have then overridden names etc to make it unique.

You should only have to run this once. It removes any existing ones before creating this just in case you wish to make any modifications after running it.

public static void Main()
    {
        CultureAndRegionInfoBuilder cib = null;

        try
        {
            Console.Clear();
            Console.WriteLine("Unregister the "en-SG" " + "custom culture if it already exists...");
            CultureAndRegionInfoBuilder.Unregister("en-SG");
            Console.WriteLine("The custom culture was unregistered successfully.");
        }
        catch (Exception e)
        {
            Console.WriteLine("Error while unregistering...");
            Console.WriteLine(e);
        }

        try
        {
            cib = new CultureAndRegionInfoBuilder("en-SG", CultureAndRegionModifiers.None);

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

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

            cib.CultureEnglishName = "English (Singapore)";
            cib.CultureNativeName = "English (Singapore)";
            cib.IsMetric = true;

            // 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.
            ci = new CultureInfo("en-SG");

            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);

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        Console.ReadKey();
    }

Method 3

How to: Create Custom Cultures (from MSDN)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x