2012-06-30 2 views
7

매우 간단한 것이므로 작동하지 않습니다. 그래서 리소스 파일 + ResourceManager를 사용하여 내 dll을 글로벌화하고 싶습니다.CultureInfo가 지정되어 있지만 ResourceManager가 동일한 리소스를 반환합니다.

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

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

같은 문자열을 가져옵니다 그리고 4 번 같은 문자열을 반환 :

나는 ResourceManager에 다음과 같이 호출합니다. 내 파일은

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

설정이 동일한 모든 파일

이라고하지만, 언급 한 바와 같이 - 기본 파일 만 자원이 사용됩니다.

여기에서 무엇을 간과하겠습니까?

+2

실제로 위성 어셈블리로 컴파일 점점 된 .resx 파일이 있습니까? bin \ Debug 폴더를보고 이름이 en, nl 및 nl-NL 인 하위 디렉토리를 찾으십시오. –

+0

'Default.ResourceManager.GetString'을 통해 번역을 가져 오십시오. 대부분 자원 관리자가 잘못된 매개 변수를 가져옵니다. –

답변

10

리소스 파일을 사용하는 방법에는 여러 가지가 있으며 그 중 하나는 .resx 개의 파일을 사용합니다. 이러한 파일은 Thread.CurrentThread.CurrentUICulture 값에 따라 자동으로 지역화됩니다. 기본 .resx 파일은 해당 어셈블리의 일부 (예 : 주 실행 파일)로 컴파일되고 현지화 된 리소스 (Default.nl-NL.resx)는 해당 문화권 식별자 (이 경우 nl-NL)에 따라 자체 디렉터리로 컴파일되어 어셈블리로 변환됩니다. <AssemblyName>.resources.dll이라고합니다.

이러한 리소스의 주소 지정은 <ResourceName>.<KeyName>과 같이 간단합니다 (예 : Default.Greeting). 이를 테스트하려면 사용 문화를 변경 : 당신이 원 있도록 프로그램 시작에 출력

Hello 
Hallo 

이의 UI 문화가, 그것은에서 실행중인 컴퓨터의 문화로 설정됩니다

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

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

지역화 된 자원을 항상 제공하려면 언어를 직접 지정해야합니다. 따라서 .resx 개의 파일이 표시됩니다.

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());에서 ResourceManager을 사용하는 경우 .resources 개의 파일을 읽어야합니다. Appname.Default.resources 파일이 (해당 경우) 없으면 p.GetString은 실패합니다. 그래서 .resources 파일을 먼저 만들었지 만 현지화 된 .resx 파일을 .resources 개 파일로 변환하지 않았습니다. 당신이 문화를 지정 할 수 있도록 ResourceManager에 사용하려는 경우

, 당신은 사용할 수 있습니다

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

감사합니다. 왜 내가 Resources.Default를 사용하지 않았는지 모르겠다. 주말이어야합니다! –

+0

@ CodeCaster 제발 제발 제발 좀 봐주실 수 있습니다. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc