Ottieni tutte le Culture supportate da un assembly satellite
-
03-07-2019 - |
Domanda
Sto usando un assembly satellite per contenere tutte le risorse di localizzazione in un'applicazione C #.
Quello che devo fare è creare un menu nella GUI con tutte le lingue disponibili che esistono per l'applicazione. C'è un modo per ottenere informazioni in modo dinamico?
Soluzione
Questa funzione restituisce un array di tutte le culture installate nella cartella App_GlobalResources - cambia il percorso di ricerca in base alle tue esigenze. Per la cultura invariante restituisce " auto " ;.
public static string[] GetInstalledCultures()
{
List<string> cultures = new List<string>();
foreach (string file in Directory.GetFiles(HttpContext.Current.Server.MapPath("/App_GlobalResources"), \\Change folder to search in if needed.
"*.resx", SearchOption.TopDirectoryOnly))
{
string name = file.Split('\\').Last();
name = name.Split('.')[1];
cultures.Add(name != "resx" ? name : "auto"); \\Change "auto" to something else like "en-US" if needed.
}
return cultures.ToArray();
}
Puoi anche usare questo per una maggiore funzionalità ottenendo le istanze di CultureInfo complete:
public static CultureInfo[] GetInstalledCultures()
{
List<CultureInfo> cultures = new List<CultureInfo>();
foreach (string file in Directory.GetFiles(HttpContext.Current.Server.MapPath("/App_GlobalResources"), "*.resx", SearchOption.TopDirectoryOnly))
{
string name = file.Split('\\').Last();
name = name.Split('.')[1];
string culture = name != "resx" ? name : "en-US";
cultures.Add(new CultureInfo(culture));
}
return cultures.ToArray();
}
Altri suggerimenti
Ogni assembly satellite per una lingua specifica ha lo stesso nome ma si trova in una sottocartella che prende il nome dalla cultura specifica, ad es. fr o fr-CA.
Forse puoi usare questo fatto ed eseguire la scansione della gerarchia di cartelle per creare quel menu in modo dinamico.