Как вставлять ссылки в локализованный текст
Я интернационализирую приложение ASP.NET MVC, но не знаю, как обрабатывать связанный текст. Возьмите следующее в качестве примера:
- Русский: "Пожалуйста, войдите, чтобы продолжить."
- Português: " Entre por favour Continue".
Так как "логин" связан с гиперссылкой, я должен иметь отметку переводчика, на какое соответствующее слово или фразу следует ссылаться при локализации текста, например, Entre.
Какое лучшее стратегическое решение?
Есть ли стандартный способ пометить специальный текст (и стандартный способ использования переведенных результатов)... или я пошёл по неверному пути, ожидая, что мой контент и презентационная информация будут настолько тесно связаны (хотя я не могу думать, любого способа снять муфту в этом случае).
Текущая реализация:
В настоящее время я использую локальные файлы ресурсов для Views и метод расширения для HtmlHelper, чтобы получить локализованную строку:
<%= Html.Resource("LoginMessage")%>
Обновление: смотрите ответ Кит.
Я нашел это наиболее полезным, но система автоматически выбрала другой.
Ответы
Ответ 1
В настоящее время я использую его после установки:
У меня есть файл глобальных ресурсов, содержащий мои первичные тексты с именем Strings.resx(Strings.NL-nl.resx и т.д.). Рядом с этим у меня есть мой глобальный файл, содержащий все локализации моих actionlinks. Это: ActionLinks.resx и locals.
Теперь, что я делаю, в моем Strings.resx у меня есть что-то вроде:
Strings.resx
Пожалуйста, {0}, чтобы продолжить
Локальный язык Strings.NL-nl.resx
{0} om verder te gaan
Теперь трюк должен сделать что-то вроде:
<%= Html.Encode(string.Format(Resources.Strings.ControllernameViewnameKey,
Html.ActionLink(Resources.ActionLinks.login, "Account", "LogOn")))
Если вам нужна более одной переменной в вашей ссылке, вы можете указать массив объектов
string.Format()
Ключевое слово - это мое собственное соглашение, чтобы понять, где используется основной текст (какая страница). Поскольку мои основные тексты очень специфичны. Конечно, ключи можно сделать сами.
Для получения дополнительной информации о том, как я это делаю, вы можете взглянуть на мой ответ по моему собственному вопросу:
здесь
Edit
Конечно, вы можете использовать локальные файлы вместо глобальных файлов, но мне очень нравятся мои сильно типизированные ресурсы:).
Ответ 2
Я думаю, что это сводится к 4 вариантам:
- Поместите ссылку в свою локализацию: "Пожалуйста, < a href=" # " > login </a> для продолжения"
- Несколько локализаций: либо:
- "Пожалуйста, {0} продолжить" и "войти", или
- "Пожалуйста", "Войти" и "продолжить"
- Разметка внутри ваших локализаций, например:
- "Пожалуйста, {0} войдите {1}, чтобы продолжить"
- "Пожалуйста, {login} login {end-login}, чтобы продолжить"
- "Пожалуйста, < a href=" {0} " > login </a> для продолжения"
- Просто не поддерживайте его - сделайте все предложение ссылкой
Я думаю, что есть основная причина, чтобы избежать 1 - вы смешиваете локализацию и навигацию приложений.
Вариант 2 заканчивается несколькими ресурсами для каждого блока текста, но пока у вас есть хорошие способы управления всеми вашими локализациями, это не должно быть проблемой. Это может быть боль для сторонних переводчиков, хотя - вам нужно каким-то образом рассказать им контекст, или вы получите очень странные переводы отдельных слов.
Вариант 3 - мое предпочтительное решение. Тем не менее, вы по-прежнему создаете проблемы для своих переводчиков - большинство из них не поймут ваши токены/HTML/разметку в тексте. У нас уже есть какой-то HTML, поэтому для нас работала 3,3.
Вариант 4, возможно, стоит рассмотреть - вы получаете достаточное количество встроенной ссылки для того, чтобы сделать ее необходимой дополнительной работой и обслуживанием? Это важный вопрос, характерный для вашего приложения: если все предложение является ссылкой (а не только активным глаголом), что является лучшей практикой ссылок, действительно ли вы теряете достаточно, чтобы сделать вариант 2 или 3 дополнительным усилием?
Я думаю, что это может быть, почему нет более стандартизированных способов сделать это, как для большинства проектов (может быть, 9 раз из 10) вариант 4 достаточен, так что это только заканчивается как проблема для некоторых особых случаев. У нас есть сложное приложение с около 11 000 фрагментов локализованного текста и 4 раза в год, и у нас есть только 4 или 5 мест, где нам нужно было идти с 3.3
Наша техническая реализация похожа на вашу:
<%= Html.Localise("Controller/Action/KeyOfTextOnPage") %>
Для ссылок у нас есть конкретный помощник:
<%= Html.LocaliseLink("Controller/Action/KeyOfTextOnPage", "~/link.aspx") %>
<%= Html.LocaliseAction("Controller/Action/KeyOfTextOnPage", "action", "controller") %>
Ответ 3
Я должен согласиться с другими ответами - разделить на 2.
Я бы добавил, что не считаю, что 2 слова разделены/не связаны. Придерживайтесь простого соглашения вокруг: LoginMessage и LoginMessageLink, соответствующие всему тексту предложения и тексту ссылки.
Это нейтрально, и если это то, что необходимо для языка, переводчик может иметь целое предложение, это ссылка.
Если вам нужно связать несколько раз с одной и той же страницей, вместо этого у вас есть несколько маркеров. Как:
English: "Please ##login## to continue."
Português: "##Entre## por favor para continuar."
Ответ 4
Я бы предложил разделить ресурс на два значения, например this
- 1: Пожалуйста, {0}, чтобы продолжить.
- 2: login
или для Português
- 1: {0} por favor para continuar.
- 2: Entre
И затем объедините их, чтобы создать ссылку и сообщение. {0} подставляется для ссылки/actionlink/все, что вам нужно.
Ответ 5
Я бы просто посмотрел на пользовательские заполнители, которые индексируют ссылку, которую вы хотите разместить вокруг текста. Например,
"Please #123#login#123# to continue"
Если вы найдете # n # в своей строке, вы знаете, что строка, которую она окружает, должна быть ссылкой на url, указанный индексом n в вашем файле поиска (db или что-то еще).
Ответ 6
Я знаю, что это старый вопрос, но я подумал, что это может помочь.
В ASP.net Core 2.2 у вас может быть файл ресурсов, содержащий:
AllText: There are 2 links and one string. Links are {0} and {1}, the string is {2}
Link1Text: link1
Link2Text: link2
String1: something special
Тогда у вас есть вид, где вы вводите локализатор:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
И, наконец, в вашем HTML:
<p>@Localizer["AllText",
@Html.ActionLink(@Localizer["Link1Text"].Value,"Action1","Controller1"),
@Html.ActionLink(@Localizer["Link2Text"].Value,"Action2","Controller2"),
@Localizer["String1"]]</p>
Не нужно ничего кодировать или декодировать, просто предоставьте параметры Локализатору.