Search code examples
c#.netlocalizationcultureinfo

Programmatic way to get all the available languages (in satellite assemblies)


I'm designing a multilingual application using .resx files.

I have a few files like GlobalStrings.resx, GlobalStrings.es.resx, GlobalStrings.en.resx, etc. When I want to use this, I just need to set Thread.CurrentThread.CurrentCulture.

The problem: I have a combobox with all the available languages, but I'm loading this manually:

comboLanguage.Items.Add(CultureInfo.GetCultureInfo("en"));
comboLanguage.Items.Add(CultureInfo.GetCultureInfo("es"));

I've tried with

cmbLanguage.Items.AddRange(CultureInfo.GetCultures(CultureTypes.UserCustomCulture));

without any success. Also tried with all the elements in CultureTypes, but I'm only getting a big list with a lot more languages that I'm not using, or an empty list.

Is there any way to get only the supported languages?


Solution

  • Using what Rune Grimstad said I end up with this:

    string executablePath = Path.GetDirectoryName(Application.ExecutablePath);
    string[] directories = Directory.GetDirectories(executablePath);
    foreach (string s in directories)
    {
        try
        {
            DirectoryInfo langDirectory = new DirectoryInfo(s);
            cmbLanguage.Items.Add(CultureInfo.GetCultureInfo(langDirectory.Name));
        }
        catch (Exception)
        {
    
        }
    }
    

    or another way

    int pathLenght = executablePath.Length + 1;
    foreach (string s in directories)
    {
        try
        {
            cmbLanguage.Items.Add(CultureInfo.GetCultureInfo(s.Remove(0, pathLenght)));
        }
        catch (Exception)
        {
    
        }
    }
    

    I still don't think that this is a good idea ...