0
많은 코드가 삭제되었지만이 부분 만 표시해야합니다. 주요 아이디어 : 방법 로컬 화()은 신속하게 작동해야하므로 다른 스레드가 잠글 수 없습니다. isLoaded 플래그를 사용하여 사용할 현지화 유형 (Old 또는 Current)을 감지합니다.이 코드는 안전한 스레드입니까? C#
static class Localization
{
static readonly object locker = new object();
static string LocalizationDir;
static bool isLoaded;
static Tuple<string, string> OldLanguage;
static Dictionary<string, string> OldLocalization;
static Dictionary<string, string> CurrentLocalization;
public static Tuple<string, string> CurrentLanguage {
get;
private set;
}
static Localization() {
lock (locker) {
OldLanguage = null;
CurrentLanguage = new Tuple<string, string>("en", "English");
isLoaded = true;
OldLocalization = null;
CurrentLocalization = null;
}
}
public static bool SetLanguage(string languageShortName) {
lock (locker) {
string languagePath = Path.Combine(LocalizationDir, languageShortName + ".loc");
// save localization, be ready to return it back
OldLocalization = CurrentLocalization;
OldLanguage = CurrentLanguage;
isLoaded = false;
try {
using (TextReader i = new StreamReader(languagePath)) {
/*
Parse file,
Modify CurrentLocalization, CurrentLocalization
*/
}
}
catch (Exception e) {
// Just return back our good localization data
CurrentLocalization = OldLocalization;
CurrentLanguage = OldLanguage;
isLoaded = true;
OldLocalization = null;
OldLanguage = null;
return false;
}
// everything is good
{
OldLocalization = null;
OldLanguage = null;
isLoaded = true;
UpdateControls();
}
return true;
}
}
// <summary>
// We think that there are no bugs in this method
// No locking
// </summary>
public static string Localize(this string Text) {
if (CurrentLanguage.Item2 == "English")
return Text;
Dictionary<string, string> ChoosedLocalization = null;
if (!isLoaded && OldLocalization != null)
ChoosedLocalization = OldLocalization;
else if (isLoaded && CurrentLocalization != null)
ChoosedLocalization = CurrentLocalization;
if (ChoosedLocalization != null) {
string Translate;
if (!ChoosedLocalization.TryGetValue(Text, out Translate))
return Text;
else
return Translate;
}
else
return Text;
}
}
'Localize '중에'CurrentLanguage'가 변경되는 것을 어떻게 막을 수 있습니까? –
오, 아무것도. 나는 CurrentLocalization으로 writed처럼 그것을 다시 써야만한다. –
'ChoosedLocalization = OldLocalization; ChoosedLanguage = OldLanguage;'if (! isLoaded && OldLocalization! = null)'? –