2012-06-30 24 views
7

Una cosa muy simple, y no puedo hacer que funcione. Quiero globalizar mi DLL así que estoy usando archivos de recursos + el ResourceManager.Resourcemanager está devolviendo el mismo recurso, aunque se especifica CultureInfo

que llamo el ResourceManager así:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

obtener las cadenas como éste

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

y vuelve 4 veces la misma cadena. Mis archivos se llaman

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

Todo archivo de configuración es la misma, pero como se mencionó - se utiliza sólo el recurso en el archivo predeterminado.

¿Qué estoy pasando por alto aquí?

+2

son el archivo .resx consiguiendo realmente compilado en ensamblados satélite? Busque en la carpeta bin \ Debug y busque subdirectorios con los nombres en, nl y nl-NL. –

+0

Intenta obtener las traducciones a través de 'Default.ResourceManager.GetString'. Lo más probable es que el administrador de recursos que está creando tenga algunos parámetros incorrectos. –

Respuesta

10

Existen algunas formas de usar los archivos de recursos, uno de los cuales es el uso de los archivos .resx. Estos archivos se localizan automáticamente, según el valor de Thread.CurrentThread.CurrentUICulture. El archivo .resx predeterminado se compila en el ensamblaje del que forma parte (por ejemplo, su ejecutable principal), mientras que los recursos localizados (Default.nl-NL.resx) se compilan en su propio directorio (basado en el identificador de cultura, nl-NL en este caso) en un ensamblaje. llamado <AssemblyName>.resources.dll.

Direccionar los valores de esos recursos es tan fácil como <ResourceName>.<KeyName>, por ejemplo Default.Greeting. Para probarlo, se cambia la cultura, usando:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

Cuál será la salida

Hello 
Hallo 

En el arranque del programa, la cultura de interfaz de usuario se establece en la cultura del equipo que se está ejecutando, por lo que ganó No tiene que especificar el idioma usted mismo para presentar siempre los recursos localizados. Entonces, los archivos .resx parecen ser el camino a seguir.

Al usar ResourceManager de var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());, tendrá que leer .resources archivos. Si no hay (en su caso) archivo Appname.Default.resources, el p.GetString fallará. Supongo que ha creado un archivo .resources anteriormente, pero no ha convertido los archivos .resx localizados a los archivos .resources.

Si desea utilizar el ResourceManager a ser capaz de especificar la cultura, puede utilizar:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

Gracias - No sé por qué no usé simplemente Resources.Default. Debe ser el fin de semana! –

+0

@CodeCaster podría echar un vistazo a mi pregunta, por favor. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc

Cuestiones relacionadas