2011-02-28 6 views
2

저는 로컬 라이즈해야하는 Silverlight 4 OOB 애플리케이션이 있습니다. 과거에는 기존의 resx 경로를 사용했지만 기존 winforms 응용 프로그램의 아키텍처를 따르도록 요청 받았습니다.데이터베이스에서 Silverlight 로컬 리 제이션 (resx가 아님)

모든 문자열은 현재 데이터베이스에 저장되어 있습니다. 웹 서비스를 사용하여이 데이터를 가져와 로컬 Effiproz Isolated Storage 데이터베이스에 기록합니다. 로그인시 사용자 언어의 언어 문자열을 사용하여 Dictionary 객체를로드합니다. 이것은 잘 작동합니다.

그러나 UI 로컬 리 제이션을 자동화하고 싶습니다. (WinForms 앱은 다음과 같이합니다 : ) 페이지의 모든 컨트롤을 반복하여 TextBlock을 찾습니다. 텍스트 속성이있는 경우 현지화 된 텍스트로 바꿉니다. 번역. 텍스트를 찾을 수 없으면 문자열을 데이터베이스에 기록하여 현지화합니다.

이것은 간단한 폼에서는 작동하지만 확장기/스크롤 뷰어 및 컨텐트 컨트롤이있는 즉시 VisualTree 파서는 컨트롤의 자식을 반환하지 않습니다 (반드시 아래 코드를 참조하십시오). This is a known issue 내 자동화 시도를 방해합니다.

첫 번째 질문은입니다. 복잡한 (비 시각적 인) 요소를 반복하면서 사전에 값을 올려서 페이지로드시이를 자동화하는 방법이 있습니까?

내 두 번째 질문은입니다. 그렇다면 가장 좋은 방법은 응용 프로그램 리소스 사전에 문자열을로드하고 참조하도록 내 모든 페이지를 변경하는 것입니다. 그렇지 않으면 resx 파일을 생성해야합니다. 서버에서 (그리고 패키지 당 정상적으로 응용 프로그램과 함께) 또는 클라이언트에서 (내가 다운로드 한 문자열을 가지고 있고, resx 파일을 만들고로드 할 수 있습니까?)

어떤 포인터 주셔서 감사합니다. 여기

붕괴 요소와 복합 콘텐츠 컨트롤을 작동하지 않습니다 기존 코드입니다 : 일반 사전 객체에

1) 문자열을 저장 :

다음
public void Translate(DependencyObject dependencyObject) 
    { 
     //this uses the VisualTreeHelper which only shows controls that are actually visible (so if they are in a collapsed expander they will not be returned). You need to call it OnLoaded to make sure all controls have been added 
     foreach (var child in dependencyObject.GetAllChildren(true)) 
     { 
      TranslateTextBlock(child); 
     } 
    } 

private void TranslateTextBlock(DependencyObject child) 
{ 
    var textBlock = child as TextBlock; 
    if (textBlock == null) return; 

    var value = (string)child.GetValue(TextBlock.TextProperty); 
    if (!string.IsNullOrEmpty(value)) 
    { 
     var newValue = default(string); 
     if (!_languageMappings.TryGetValue(value, out newValue)) 
     { 
      //write the value back to the collection so it can be marked for translation 
      _languageMappings.Add(value, string.Empty); 
      newValue = "Not Translated"; 
     } 
     child.SetValue(TextBlock.TextProperty, newValue); 
    } 
} 

나는 2 개의 다른 접근 방식을 시도 2) 일반 사전 객체의 문자열을 저장하고 자원으로 응용 프로그램에 추가, 당신은

TextBlock Text="{Binding Path=[Equipment], Source={StaticResource ResourceHandler}}" 



App.GetApp.DictionaryStrings = new AmtDictionaryDAO().GetAmtDictionaryByLanguageID(App.GetApp.CurrentSession.DefaultLanguageId); 

Application.Current.Resources.Add("ResourceHandler", App.GetApp.DictionaryStrings); 
로 참조 할 수 있습니다

//http://forums.silverlight.net/forums/p/168712/383052.aspx

답변

1

좋아, 아무도 이것에 응답하지 않으며 해결책을 생각해 냈습니다.

은 기본적으로 당신이

Application.Current.Resources.Add("ResourceHandler", App.GetApp.DictionaryStrings); 

<TextBlock Text="{Binding [Equipment], Source={StaticResource ResourceHandler}}" /> 

를 사용하여 글로벌 리소스로 언어 사전을로드 한 후 정상적인 정적 리소스처럼 액세스 할 수있는 것 같다. 우리는 누락 된 모든 문자열을 번역 데이터베이스에 주목해야합니다.이 이유 때문에 내가 Localize 확장 메서드를 호출하는 Converter를 사용하기로 결정했습니다 (따라서 코드의 모든 문자열에서 수행 할 수 있습니다). 사전에있는 문자열 (리소스가 아님)이 존재하지 않으면 그걸로 뭔가를 할 수 있습니다 (로컬 DB에 쓰십시오).

Text="{Binding Source='Logged on User', Converter={StaticResource LocalizationConverter}}"/> 

이 방법은 정상적으로 작동합니다.

관련 문제