2010-02-16 2 views
7

최근에 .NET을 사용하여 현지화를 시도했습니다. 본질적으로, (언어 및 지역화 가능 속성을 사용하여) 양식을 사용자 정의하고 그에 따라 문화를 변경하는 방법을 배웠습니다.로컬라이제이션 .NET. ResourceManager를 사용할 때의 대체 언어

그러나 하드 코딩 된 영어 문자열을 자동 생성 리소스 파일로 마이 그 레이션하고 .GetString ("Key")을 사용할 때 - 행복하다고 말하자 : P.

전적으로 하드 코딩 된 문자열 변환 전용 resx 파일 세트를 만들기로했습니다. 그들은 [name]. [culture-code] .resx의 규정/요구 사항을 따랐습니다. 나는 각 관련 언어를 위해 이것들을 만들었다. 예 : appstrings.de.resx (독일어) 및 appstrings.resx (불변 기준선).

이 새로운 자원을 활용하기 위해, 나는

My.Application.ChangeUICulture("de") 

를 사용하여 (예를 들어, 독일어) 현재 UI 문화가 설정된는 ResourceManager 및 자원 설정

Dim resManager As New ResourceManager("LanguageTest.appstrings", Assembly.GetExecutingAssembly) 
Dim resSet As ResourceSet = resManager.GetResourceSet(My.Application.UICulture, True, True) 

의 인스턴스를 생성 원본 호

t resSet.GetString ("Key")은 appstrings.de.resx에 명시 적으로 정의되어 있으면 빈 문자열을 반환합니다. 어쨌든 appstrings.resx ("Key"가있는 곳)으로 폴백 할 수 있나요? 기본 기준선으로 가정 했습니까? 실제 팁 자체가 작동하지 않았다 동안

업데이트

랩소디 resManager.GetString를 사용하여, 그것은에 - 사실 흥미로운 점을 촉발 않았다, 아래 제안을했다 ("키") resSet에 반대 .GetString ("Key"). 지금까지 결함없이 작동하는 것으로 보입니다. 즉, 특수 언어 파일에있는 값이 반환되는 반면 '누락'값은 단일 키로 액세스 할 때 기본 문화권으로 전환됩니다.

이후의 문제

유일하게 남아있는 문제가 될 것이다 여부가 해로운 될 것입니다 캐시 ResourceSet 반대로 ResourceManger를 사용하여 성능에 미치는 영향?

답변

2

Strings이 프로젝트의 RESX 파일의 이름입니다

Public Function GetString(ByVal Name As String) As String 
    Return My.Resources.Strings.ResourceManager.GetString(Name) 
End Function 

을보십시오. 현재 문화권에서 사용할 수없는 경우 기준 값이 자동으로 반환됩니다.

쉬운 예입니다. 더 어리석은 증거로 만들 수 있습니다.

+1

'appstrings'리소스가 My.Resources 네임 스페이스에 없습니다. 그러나 코드 솔루션은 흥미로운 점을 제기합니다 (업데이트 된 질문 참조). –

0

나는 한 번 대체 언어로 EN-US를했지만, 다른보다 구체적인 것들을 기본적으로

는 내가 XML을 설정 작업하려면 사용자의 웹 브라우저의 설정을 기반으로 .de 등처럼이 웹 응용 프로그램을 만들었 웹.config

거기에서 기본 언어와 함께 제공되는 .cs 파일에서 내부 정적 ResourceManager를 사용했습니다.

Resources.<ResourceFileName>.ItemSearchNoResultsErrorText 

와의 에서 .aspx 파일 :

<%$ Resources:<ResourceFileName>, TimeSelect %> 

내가 알고있는 것처럼 ResourceManager에 클래스 생활을 포함하여 .cs 파일의 .de 등 언어 파일 또는 뒤에 그것을 어디 다음이 중요하다 대체 언어? 그것은 별도의 위성 어셈블리로 컴파일되므로 .cs 클래스가 컴파일되는 위치와 위성 어셈블리의 일부분에 의존합니다. 그게 내가 더 특정 사람이 사용

을 찾을 수없는 경우 대체 언어로 사용할 하나이기 때문에 원칙적으로

나는 항상 뒤에 EN-US 언어의 코드와는 ResourceManager 클래스를 했어 이 설정에서는 빈 값을 얻지 못했습니다. 런타임에 위성 어셈블리를 교체하더라도 항상 대체 언어로 사용됩니다.

+0

그러나 리소스 네임 스페이스를 사용하면 오버 헤드 성능 측면에서 비용이 많이 듭니다. 문자열을 캐시하기위한 별도의 리소스 세트를 생성하여 성능을 향상시키는 것이 더 좋습니다. 랩소디는 답과 함께 올바른 길을 걷고 있습니다. 그것은 단지 해결되어야 할 최종 세부 사항입니다 (그 대답에 대한 설명 참조). –

4

당신은이 코드는 기본 문화 EN-US 함을 선언합니다

[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.Satellite)] 

다음과 같이 응용 프로그램의 기본 문화를 선언 시도 할 수 있습니다. 귀하의 사례에서 현재 문화권이 "de-DE"이면 "de-DE"의 자원을 찾은 다음 부모 "de"문화를 찾고 Ultimatly는 정의 된 문화권 (en-US) 자원 파일 . resourceManage의 대체 전략에 대해서는 see MSDN입니다. 위의 코드 normaly는 assenblyInfo.cs에 있습니다. 두 번째 매개 변수는 주 어셈블리 또는 위성에있는 리소스가있는 리소스 관리자에게 알려줍니다.

불행히도이 솔루션에서는 문화 파일 이름이 아닌 리소스 파일 이름을 사용해야합니다. 그러나 파일 이름별로 특정 리소스를 사용하도록 RM을 확장 할 수는 있지만 기본 culture를 선택하고 리소스 파일의 이름을 해당 문화권으로 변경하면 솔루션을 즉시 사용할 수 있습니다.

관련 문제