Решение для интернационализации веб-сайта

внешний интерфейс GitHub JavaScript Vue.js

Сцены

Здесь мы просто начнем нашу объяснение интернационализации с помощью страницы деталей

国际化页面布局.png
этоСцены, логотип должен быть интернационализирован, текст вкладки и хлебные крошки должны быть интернационализированы, детали должны быть интернационализированы, а динамические детали и текст в динамических деталях должны быть интернационализированы. Подводя итоги, можно выделить четыре типа интернационализированных данных.

  • Динамические данные для конфигурации фонового управления
  • Статический текст, отображаемый сервером
  • 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"'/>

Сценарий автоматической настройки извлечения

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

Эпилог

По мере того, как национальная мощь нашей страны продолжает укрепляться, ее международное влияние продолжает расширяться. В мире будет появляться все больше и больше лучших продуктов, и интернационализация стала непреодолимой тенденцией.