Как встраивать ссылки в локализованный текст - PullRequest
16 голосов
/ 17 ноября 2009

Я интернационализирую приложение ASP.NET MVC, но не знаю, как обрабатывать связанный текст. В качестве примера возьмем следующее:

  • Английский: "Пожалуйста, , войдите , чтобы продолжить."
  • Português: " Entre por fav непрерывный."

Поскольку «логин» связан с гиперссылкой, я должен иметь отметку переводчика, на какое соответствующее слово или фразу следует ссылаться при локализации текста, например, Entre.

Какое лучшее стратегическое решение?

Существует ли стандартный способ маркировки специального текста (и стандартный способ использования переведенных результатов) ... или я пошёл по неверному пути, ожидая, что мой контент и презентационная информация будут настолько тесно связаны (хотя я могу в этом случае не подумайте, как снять муфту).

Текущая реализация:

В настоящее время я использую локальные файлы ресурсов для Views и метод расширения для HtmlHelper , чтобы получить локализованную строку:

<%= Html.Resource("LoginMessage")%>

Обновление: См. Ответ Кита .

Я нашел это наиболее полезным, но система выбрала автоматически еще один.

Ответы [ 6 ]

14 голосов
/ 27 ноября 2009

Я думаю, что это сводится к 4 вариантам:

  1. Поставьте ссылку в вашей локализации: «Пожалуйста, , войдите , чтобы продолжить»
  2. Несколько локализаций - либо:
    1. «Пожалуйста, {0} для продолжения» и «логин», или
    2. «Пожалуйста», «войдите» и «продолжить»
  3. Разметка внутри вашей локализации, например:
    1. «Пожалуйста, {0}, войдите {1}, чтобы продолжить»
    2. «Пожалуйста, {start-login}, войдите {end-login}, чтобы продолжить»
    3. "Пожалуйста, , войдите , чтобы продолжить"
  4. Только не поддерживайте это - сделайте предложение полностью ссылкой

Я думаю, что есть главная причина, по которой следует избегать 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") %>
4 голосов
/ 19 ноября 2009

В настоящее время я использую следующие настройки:

У меня есть глобальный файл ресурсов, содержащий мои основные тексты, с именем Strings.resx (Strings.NL-nl.resx и т. Д.). Рядом с этим у меня есть глобальный файл, содержащий все локализации моих ссылок действий. То есть: ActionLinks.resx и местные жители.

Теперь, что я делаю, в моем 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()

Использование ключей - это мое собственное соглашение, позволяющее понять, где используется основной текст (на какой странице). Так как мои основные мотивы очень специфичны. Конечно, ключи можно сделать самостоятельно.

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


Редактировать

Конечно, вы можете использовать локальные файлы вместо глобальных, но мне слишком сильно нравятся мои строго типизированные ресурсы:).

2 голосов
/ 23 ноября 2009

Я должен согласиться с другими ответами - отдельно в 2.

Тем не менее, я бы добавил, что не считайте 2 слова разделенными / не связанными. Придерживайтесь простого соглашения, такого как: LoginMessage & LoginMessageLink, соответствующего всему тексту предложения и тексту ссылки.

Это нейтрально, и если это то, что нужно для языка, переводчик может иметь целое предложение в качестве ссылки.

Если вам понадобится несколько раз ссылаться на одну и ту же страницу, вместо этого используйте для этого маркеры. Как:

English: "Please ##login## to continue."
Português: "##Entre## por favor para continuar."
1 голос
/ 24 апреля 2019

Я знаю, что это старый вопрос, но я подумал, что это может помочь.

В 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>

Не нужно ничего кодировать или декодировать, просто предоставьте параметры Локализатору.

1 голос
/ 26 ноября 2009

Я бы просто искал пользовательские заполнители, которые индексируют ссылку, которую вы хотите разместить вокруг текста. Например,

"Please #123#login#123# to continue"

Если вы обнаружите # n # в вашей строке, вы знаете, что строка, которая ее окружает, должна быть ссылкой на URL, указанный индексом n в вашем файле поиска (дБ или чем-то еще).

1 голос
/ 19 ноября 2009

Я бы предложил разделить ресурс на два значения, как это
- 1: Пожалуйста, {0}, чтобы продолжить.
- 2: логин

или для португальских
- 1: {0} в пользу продолжения.
- 2: Entre

А затем объедините их, чтобы создать ссылку и сообщение. {0} заменяется ссылкой / actionlink / всем, что вам нужно.

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