Локализация ASP.NET MVC2: Как отформатировать текст в зависимости от языка / страны? - PullRequest
2 голосов
/ 23 ноября 2010

Я хочу создать многоязычный веб-сайт ASP.NET MVC 2.

Допустим, у меня есть следующие предложения:

MyStrings.resx:
TestString : "This is my test"

MyStrings.de.resx:
TestString : "Dies ist mein Test"

MyStrings.fr.resx:
TestString : "C'est mon test"

Теперь на моем сайте я хочу сделать словамой / майн / мон другого цвета.Например, я хочу назначить другой класс span.Какая лучшая / стандартная практика для этого?

Как я могу это сделать?

1 Ответ

4 голосов
/ 23 ноября 2010
  1. Вы можете смешивать HTML с вашим ресурсом: "This is <span class="x">my</span> test"
  2. Вы можете использовать string.Format: Ресурс: "This is {0}my{1} test", использовать: string.Format(Resources.TestString, "<span class=\"x\">", "</span">).
  3. Вы можетеиспользуйте некоторую пользовательскую схему форматирования: например, ресурс: "This is --my-- test" и напишите какой-нибудь метод расширения, принимающий строку и заменяющий все -- на правильные теги.

UPDATE
4. Вы можете использовать метод произвольного формата.Смотрите код ниже.

Ваш ресурс может выглядеть как Hello {firstname}, you still have {amount} {currency} in your bankaccount. Вы бы «потребляли» этот ресурс следующим образом:

Resources.Bla.Bla.FormatWith(new { Firstname = SomeVariable, AMOUNT = 4, currency = "USD"  });

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

public static string FormatWith(this string format, object source)
    {
        StringBuilder sbResult = new StringBuilder(format.Length);
        StringBuilder sbCurrentTerm = new StringBuilder();
        char[] formatChars = format.ToCharArray();
        bool inTerm = false;
        object currentPropValue = source;

        var sourceProps = source.GetType().GetProperties();

        for (int i = 0; i < format.Length; i++)
        {
            if (formatChars[i] == '{')
                inTerm = true;
            else if (formatChars[i] == '}')
            {
                PropertyInfo pi = sourceProps.First(sp=>sp.Name.Equals(sbCurrentTerm.ToString(), StringComparison.InvariantCultureIgnoreCase));
                sbResult.Append((string)(pi.PropertyType.GetMethod("ToString", new Type[] { }).Invoke(pi.GetValue(currentPropValue, null) ?? string.Empty, null)));
                sbCurrentTerm.Clear();
                inTerm = false;
                currentPropValue = source;
            }
            else if (inTerm)
            {
                if (formatChars[i] == '.')
                {
                    PropertyInfo pi = currentPropValue.GetType().GetProperty(sbCurrentTerm.ToString());
                    currentPropValue = pi.GetValue(source, null);
                    sbCurrentTerm.Clear();
                }
                else
                    sbCurrentTerm.Append(formatChars[i]);
            }
            else
                sbResult.Append(formatChars[i]);
        }
        return sbResult.ToString();
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...