저는 로컬 라이즈해야하는 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