- Вы можете смешивать HTML с вашим ресурсом:
"This is <span class="x">my</span> test"
- Вы можете использовать
string.Format
: Ресурс: "This is {0}my{1} test"
, использовать: string.Format(Resources.TestString, "<span class=\"x\">", "</span">)
. - Вы можетеиспользуйте некоторую пользовательскую схему форматирования: например, ресурс:
"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();
}