Сцены
Здесь мы просто начнем нашу объяснение интернационализации с помощью страницы деталей
этоСцены, логотип должен быть интернационализирован, текст вкладки и хлебные крошки должны быть интернационализированы, детали должны быть интернационализированы, а динамические детали и текст в динамических деталях должны быть интернационализированы. Подводя итоги, можно выделить четыре типа интернационализированных данных.- Динамические данные для конфигурации фонового управления
- Статический текст, отображаемый сервером
- js отображает статический текст
- статическое изображение
Динамические данные для конфигурации фонового управления
Место действия详情
Данные управляются через фоновую систему управления, а данные управляются через языковую изоляцию.Дизайн интерфейса примерно следующийуправление языком
创建语种 [POST] /m/languages
更新语种 [PUT] /m/languages/{id}
查询语种 [GET] /c/languages/{id}
查询语种列表 [GET] /c/languages?$offset=偏移量&$limit=数量&$count=true&state=1
управление данными
创建文章 [POST] /m/languages/{language_id}/articles
更新文章 [PUT] /m/languages/articles/{article_id}
删除文章 [DELETE] /m/languages/articles/{article_id}
查询文章 [GET] /c/languages/articles/{article_id}
查询文章列表 [GET]/c/languages/{language_id}/articles?$offset=偏移量&$limit=数量&$count=true
Статический текст, отображаемый сервером
как на графике сцены面包屑
, например текст навигационной цепочки首页->详情
, Подобный фиксированный текст не подходит для фонового управления и настройки персоналом по эксплуатации и техническому обслуживанию. Более целесообразно использовать файлы для унифицированного хранения этих интернационализированных файлов. Здесь используется решение интернационализации, поставляемое с SpringMVC.Настроить ResourceBundleMessageSource
@Configuration
public class I18nConfig {
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
Реализация интернационализации на основе файлов cookie
@Bean
public CookieLocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setCookieName("lang");
return cookieLocaleResolver;
}
Существует множество распознавателей для интернационализации SpringMVC и множество способов их использования.Вы можете обратиться к этой статье.блог, колеса тут не делают(^▽^)
Международный язык перехватчик
@Component
public class I18nInterceptor extends HandlerInterceptorAdapter {
public static final String DEFAULT_PARAM_NAME = "lang";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newLocale = request.getParameter(DEFAULT_PARAM_NAME);
if (newLocale != null) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
}
localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
}
// Proceed in any case.
return true;
}
}
Здесь перехватчик показывает, что реализация многоязычной маршрутизации заключается в достижении переключения языка путем изменения параметров
http://i18n.example.com?lang=en
http://i18n.example.com?lang=cn
Приложив некоторые усилия, переписав реализацию этого перехватчика и дизайн маршрута, интернационализированный маршрут можно переписать так
http://i18n.example.com/en
http://i18n.example.com/cn
Настройте интернационализированные языковые файлы в ресурсах
i18n.properties 默认
i18n_en.properties 英文
i18n_cn.properties 中文
добавить другое выражение
public static String i18n(String key) {
RequestContext requestContext = new RequestContext(SpringUtil.getRequest());
return requestContext.getMessage(key);
}
在tld配置
<function>
<description>国际化</description>
<name>i18n</name>
<function-class>com.example.utils.ElFuncUtil
</function-class>
<function-signature>java.lang.String i18n(java.lang.String))</function-signature>
<example>${elf:i18n(key)}</example>
</function>
использовать
<span>${elf:i18n("详情")}</span>
К сожалению, собственное решение интернационализации Spring имеет недостаток: файл конфигурации встроен в код проекта и не может быть удален в фоновом режиме для унифицированного управления, таким образом, если добавляется новый язык, код проекта должен быть перемещен. Способные учащиеся могут попытаться переписать ResourceBundleMessageSource для поддержки чтения удаленных файлов конфигурации, что идеально.
js отображает статический текст
граф сцены动态推荐
Часть его рендерится с помощью js, который появится全部
Дождитесь статического текста. Эти тексты также должны быть интернационализированы. В своем проекте я использую самый популярный js framework vue.
Используйте с (vue-i18n) [http://kazupon.github.io/vue-i18n/en/started.html] для интернационализации.Представляя Vue-i18n
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from './message.json'
import { langCode } from '../lang'
Vue.use(VueI18n)
export default new VueI18n({
locale: langCode,
messages
})
message.json
"cn": {
"全部": "全部"
},
"en": {
"全部": "All"
}
использовать
vueI18n.t('全部')
// 或者,在template模板中
<p>{{ $t("全部") }}</p>
статическое изображение
на графике сценыlogo
Разные языки тоже должны быть разными.Такие картинки должны иметь прямой доступ к своим путям к картинкам.Мы согласовываем правила для путей доступа к картинкам.
<img src="/images/logo_${lang}.svg" onerror='this.src="${ctx}/images/logo_en.svg"'/>
Сценарий автоматической настройки извлечения
Интернационализированный текст находится в каждом файле кода, и его ручное копирование в файл конфигурации довольно неэффективно и чревато ошибками. Так что напишите автоматизированный сценарий, чтобы ускользнуть.
- Автоматическая реализация скрипта для извлечения интернационализированного текста в файл json
- Автоматическая реализация скрипта для извлечения интернационализированного текста в файл свойств
- Перенос файлов в свойствах в автоматизированные реализации сценариев в файле XLSX
Эпилог
По мере того, как национальная мощь нашей страны продолжает укрепляться, ее международное влияние продолжает расширяться. В мире будет появляться все больше и больше лучших продуктов, и интернационализация стала непреодолимой тенденцией.