Как вы справляетесь с локализацией / CultureInfo - PullRequest
4 голосов
/ 28 мая 2009

Некоторые методы, такие как string.Format () или .Parse (), требуют IFormatProvider. Как вы это предоставите?

  • В приложении с закрытой средой (где вы знаете, что локализация никогда не потребуется), просто пропустите ее и вызовите методы без IFormatProvider?

  • В приложениях, которые могут быть локализованы, вы думаете о правильном значении для каждого вызова метода и просто устанавливаете его прямо там? Вероятно, это будет «CultureInfo.CurrentCulture» или «CultureInfo.CurrentUiCulture».

  • Или вы используете глобальные переменные, такие как «MyUiCultureInfo» и «MyCultureInfo», чтобы иметь возможность переключать локализацию путем изменения их значений? Как и где вы храните эти переменные?

  • Есть ли что-то, что нужно учитывать при разработке библиотек или фреймворков - как справиться с локализацией в этом случае?

Ответы [ 4 ]

6 голосов
/ 28 мая 2009

Я всегда устанавливаю для CurrentThread.Current (Ui) Culture правильное значение в наших (ASP.NET) приложениях. Обычно это делается в начале каждого запроса на основе предпочтений пользователя или значения по умолчанию, сохраненного в файле конфигурации (если пользователь не определил предпочтение).

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

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

1 голос
/ 28 мая 2009

Как вы говорите, вы можете в закрытой среде вызывать методы без какого-либо предоставленного IFormatProvider.

Когда вы пишете, вы можете предоставить объект CultureInfo следующим образом:

        Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "{0}", DateTime.Now));
        Console.WriteLine(String.Format(new CultureInfo("en-US"), "{0}", DateTime.Now));

Для меня это будет отображать дату двумя различными способами, так как моя CurrentCulture выглядит так:

2009-05-28 13: 12: 43

5/28/2009 13:12:43

CultureInfo.CurrentCulture обрабатывает форматирование дат и т. Д. И предоставляется из настроек на вашем текущем компьютере.

CurrentCulture.CurrentUiCulture имеет отношение к локализации, то есть к переводу. Значение, которое отображается в меню и т. Д. В Windows.

Я предполагаю, что поведение методов по умолчанию заключается в использовании CurrentCulture, если ни один из них не указан.

1 голос
/ 28 мая 2009

Я установил текущую культуру на американский английский, потому что в моей стране несколько «умных» людей решили, что десятичный разделитель - запятая. Иногда десятичное число с «,», а иногда с «.». Не на всех компьютерах региональные настройки настроены правильно, и вы не должны полагаться на это .

Чтобы установить эти настройки для всего приложения:

Application.CurrentCulture = new CultureInfo("en-US");
Application.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
0 голосов
/ 24 апреля 2017

Я всегда размещаю свойство Culture в начале ASPX или главной страницы, и оно выполняет все преобразования для меня. Мне никогда не нужно делать какое-либо жесткое кодирование или преобразование даты / времени в мою собственную требуемую культуру ...

.
<%@ Page Language="C#" ..etc... Culture="en-AU" %>
.

Simplez

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...