2016-04-15 2 views
1

У нас есть странная ошибка с нашими локализованными ресурсами на китайском языке при использовании .Net 3.5. Эта проблема затрагивает консольные приложения и приложения Windows Forms, и их легко воспроизвести.Китайские ресурсы не работают с .Net 3.5

В основном китайские ресурсы не используются, но используются другие ресурсы (например, французский и английский). Кроме того, он отлично работает, если мы используем .Net 4.x.

Это не так в Windows 7 и Windows 10 (я не пробовал Windows 8.x, но я ожидаю, что это тоже пойдет не так).

Это легко воспроизвести с помощью приложения консоли:

  1. Создание .Net 3.5 Консоль приложения по умолчанию.
  2. Добавить файл в ресурс по умолчанию, «Resources.resx» и добавить к нему пару имя/значение: Test, я по-английски
  3. Добавить файл «Resources.fr.resx» и добавить к нему в имя/значение пары: Test, я французский
  4. Добавить файл «Resources.zh.resx» и добавить к нему имя/значение пары: тест, я китайский
  5. Добавьте код ниже до Main()

Код:

System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture; 
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture); 
Console.WriteLine(ConsoleApplication1.Properties.Resources.Test); 

(Первая строка просто удобство, так что мы можем проверить этот код на некитайской системе. Мы можем удалить эту строку при запуске на реальной китайской системе, потому что локаль CurrentUICulture будет уже китайской, без необходимости ее изменения, и ошибка все равно возникает.)

В панели управления | Регион, изменить Формат до English (United States) и запустить программу. Вывод будет:

en-US 
I'm English 

Теперь измените формат региона на французский (Франция) и запустить программу. Вывод будет:

fr-FR 
I'm French 

Теперь измените формат региона на Китайский (упрощенный, Китай) и запустить программу. Выходной сигнал будет:

zh-CN 
I'm English 

Обратите внимание, что он не работает.

Теперь измените свойства проекта, чтобы построить .Net 4 или более позднюю версию, не меняя ничего, и повторно запустите ее. Теперь выход:

zh-CN 
I'm Chinese 

Так оно работает с .Net 4!

Мои вопросы:

  • Может кто-нибудь воспроизвести это?
  • Это известная ошибка?
  • Есть ли обходной путь?
+1

Немного наземной мины, zh-CN и zh-CHS и zh-Hans все означает упрощенный китайский. Если вам нужен матч на zh-CN, вам нужно выбрать упрощенный китайский язык, характерный для континентального Китая. В дизайнере назвали «Китайский (упрощенный, КНР)». Если вы хотите вернуться, вы должны использовать zh-Hans для своего ресурса. Что-то вроде того. –

+0

@HansPassant Я попробую это. Кажется, это какая-то ошибка, которую они зафиксировали в .Net 4.x, потому что она должна вернуться к «Resources.zh.resx» для всех субкультур китайцев (и действительно делает это в .Net 4.x). Я обнаружил, что использование «Resources.zh-CN.resx» работает в .Net 3.5, но тогда другие диалекты не будут, я полагаю. –

+0

Я нашел этот блог, который кажется связанным: https://blogs.msdn.microsoft.com/shawnste/2007/12/13/zh-hans-zh-hant-and-the-old-zh-chs-zh- CHT /. Также в этой статье также упоминается [документация для CultureInfo] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx?f=255&MSPPError=-2147217396), поэтому похоже, что это будет ответ: используйте 'zh-Hans', как вы предложили. –

ответ

1

Благодаря комментарию Ганса (это был правильный ответ), у меня есть полный ответ.

Кажется, что в .Net 3.5 «zh» НЕ распознается как нейтральная китайская культура.

В .Net 4.x, «zh» признан нейтральной китайской культурой.

Мы можем видеть разницу, сравнивая the .Net 3.5 documentation для CultureInfo.IsNeutralCulture с .Net 4.0 documentation.

В документации .Net 3.5 перечислены следующие нейтральные и конкретные имена ресурсов:

zh-CHS Chinese (Simplified)     : neutral 
zh-TW Chinese (Taiwan)      : specific 
zh-CN Chinese (People's Republic of China) : specific 
zh-HK Chinese (Hong Kong S.A.R.)    : specific 
zh-SG Chinese (Singapore)      : specific 
zh-MO Chinese (Macao S.A.R.)     : specific 
zh-CHT Chinese (Traditional)     : neutral 

The .Net 4.0 изменения документации к:

zh-Hans Chinese (Simplified)     : neutral 
zh-TW Chinese (Traditional, Taiwan)   : specific 
zh-CN Chinese (Simplified, PRC)    : specific 
zh-HK Chinese (Traditional, Hong Kong S.A.R.) : specific 
zh-SG Chinese (Simplified, Singapore)   : specific 
zh-MO Chinese (Traditional, Macao S.A.R.)  : specific 
zh  Chinese         : neutral 
zh-Hant Chinese (Traditional)     : neutral 
zh-CHS Chinese (Simplified) Legacy    : neutral 
zh-CHT Chinese (Traditional) Legacy   : neutral 

Мы можем видеть, что .Net 4.0 получила " zh "как нейтральная китайская культура.

Так что это не ошибка в .Net 3.5, а документальная функция.

Если вам нужно быть совместимым как с .Net 3.5, так и с .Net 4.x, вам кажется, что вам нужно использовать «zh-CHS» (для упрощенного китайца), хотя неясно, продолжит ли это работать на неопределенный срок.

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