2013-03-25 8 views
1

Все, у меня есть локализованное приложение WinForms. Я создал объект, в котором пользователи могут изменить требуемую культуру/язык приложения во время выполнения. Чтобы избежать каких-либо фантазий, когда использование хочет изменить культуру, им предлагается, чтобы приложение было перезапущено, чтобы изменение в культуре вступило в силу (разумно, поскольку это не произойдет часто, если вообще). Затем я сохраняю новый язык, требуемый как строка в одном из моих файлов настроек XML («de-DE», «en-US», «en-GB» и др.). Тогда при перезапуске приложения, если требуется переключиться на требуемую культуру:Изменение культуры приложения при ошибке выполнения

// Main constructor. 
public SqlEditorForm(string[] args) 
{ 
    // Load settings. 
    username = Environment.UserName; 
    userSettings = UserSettings.Instance(); 
    advUserSettings = AdvanceUserSettings.Instance(); 
    CheckChangeCurrentCulture(); 

    isInitialising = true; 
    InitializeComponent(); 

    ... 
} 

private void CheckChangeCurrentCulture() 
{ 
    //if (!Debugger.IsAttached) 
    // Debugger.Launch(); 
    if (advUserSettings.DefaultCulture) 
     return; 
    else 
    { 
     CultureInfo culture = new CultureInfo(advUserSettings.CustomCultureString); 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 
    } 
} 

Теперь при работе в режиме отладки/выпуска от VS2012, этот механизм работает отлично. Однако, когда я устанавливаю приложение на (под управлением Windows 7 (x86/x64)) различных машин, этот механизм больше не работает, то есть культура не переключается с машин по умолчанию EVER.

Я подключил отладчик к установленному приложению, и код для изменения культуры вызывается, и логика работает, и никаких исключений не выбрасывается, но культура/язык не изменяется. У меня было много вопросов о SO, но я не могу найти применимый, который охватывает эту конкретную проблему.

Почему этот механизм работает от VS2012, но не для установленного приложения? Что мне нужно сделать, чтобы добиться желаемого поведения?

Спасибо за ваше время.

Обратите внимание, я также попытался заменить вызов CheckChangeCurrentCulture(); с:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE"); 
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE"); 

, который также работает в VS2012 (Debug и Release режимы), но не с установленным приложением. Я также изменил культуру машин Начало ->Панель управления ->Регион и язык Немецкий ("de-DE") ожидает, что приложение и платформа .NET обнаружат, что я имею эту культуру и использую ее , Это также не удалось для установленного приложения.

+0

Вы пробовали, что происходит, когда вы устанавливаете культуру "вручную", как Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("EN-US") ; ? Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture ("en-US"); Так ли это работает? – duDE

+0

Да, у меня есть. Я обновил вопрос, чтобы отразить это. Спасибо за ваше время. – MoonKnight

ответ

1

Возможно, на ваших производственных машинах сателлитовая сборка новой культуры не может быть загружена по какой-либо причине, и поэтому ваше приложение возвращается к нейтральной культуре.

Проверьте с помощью Microsoft Sysinternals Process Monitor инструмент для неудачного доступа к файлам сборок сателлитов.

Вам также проверить при помощи инструмента fuslog .NET http://msdn.microsoft.com/en-us/library/e74a18c4.aspx

+0

+1 отличный ответ. Эта утилита покажет мне, в чем была моя проблема! Большое спасибо за ваше время ... – MoonKnight

Смежные вопросы