Как перевести, добавив языковой стандарт в URL.I18next

#reactjs

Вопрос:

Нужна помощь. Я вроде как застрял в процессе перевода. Я пытаюсь перевести свою страницу на арабский, английский и испанский языки. Переводы работают. Языки по умолчанию — «английский». При переключении языка URL-адрес должен содержать языковой стандарт, основанный на переведенном языке. URL-адреса должны быть переписаны с помощью /en , /es или /ar.

Как сказано в документации i18n, уже созданы общедоступные файлы с именами локализаций, которые содержат все необходимые переводы.Затем создается файл i18n.

Это мой код:

 import i18n from "i18next"; 

import { initReactI18next } from 'react-i18next';

import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';

const languages = ["en",  "es", "ar"]

const options = {
    order: ['localStorage', 'querystring',  'navigator',],

    lookupQuerystring: 'lng',
    lookupCookie: 'i18next',
    lookupLocalStorage: 'i18nextLng',
    lookupSessionStorage: 'i18nextLng',
    lookupFromPathIndex: 0,
    lookupFromSubdomainIndex: 0,

    caches: [ 'localStorage', 'cookie', ],
    excludeCacheFor: ['cimode'],

    cookieMinutes: 10,
    cookieDomain: 'myDomain',

    htmlTag: document.documentElement,

    cookieOptions: { path: '/', sameSite: 'strict' }
}

i18n
    .use(Backend)
    .use(LanguageDetector)
    .use(initReactI18next)
    .init({
        fallbackLng: "ar",
        lng: 'en',
        debug: true,
        whitelist: languages,
        checkWhitelist: true ,
        detection: options,

        interpolation: {
            escapeValue: false,
        }
    });

export default i18n;
 

В Router.js Файл

 <Route
        exact
        path="/services/edit/:lng"
        render={(routeProps) => {
          return (
            <MainLayout   >
              <ServicesEdit {...routeProps} isEdit />
            </MainLayout>
          );
        }}
      />
 

в файле MenuContent.jsx

 
<Menu.Item key="2" icon={<UserOutlined />}>
        <Link to={`/services/edit/${lng}`}>{props.t("SERVICES_EDIT_PAGE")}</Link>
 </Menu.Item>
 

Выпадающее меню.jsx.Функция handleClick, передаваемая через реквизит, является

   let handleClick = (lng) => {

    i18n.changeLanguage(lng)

  }

 <Menu>
            <Menu.Item>
                <a onClick={() => props.handleClick("en")} >
                    <div>
                        <span className="flag-icon flag-icon-us"></span>
                        English
                    </div>
                </a>
            </Menu.Item>
            <Menu.Item >
                <a onClick={() => props.handleClick("es")} >
                    <div>

                        <span className="flag-icon flag-icon-es"></span>

                        Spanish
                    </div>
                </a>
            </Menu.Item>
            
            <Menu.Item>
                <a onClick={() => props.handleClick("ar")} >

                    <div>

                        <span className="flag-icon flag-icon-ae"></span>

                        العربية
                   </div>

                </a>
            </Menu.Item>
        </Menu>
 

Ответ №1:

Когда речь /en идет о , /es и /fr , вы на самом деле говорите о path . Однако path обнаружение не настроено в настройках вашего языкового детектора.

Измените конфигурацию следующим образом:

 // add 'path' to the order Array
order: ['localStorage', 'querystring',  'navigator', 'path'],

// change 'lookupFromPathIndex' to -1 so the last element is used
lookupFromPathIndex: -1,
 

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

Похоже, ты не можешь настроиться lookupFromPathIndex на -1 это . Это использует простой поиск по массиву и даст undefined результат . Если вы действительно хотите использовать индекс последнего пути для локали, вам придется добавить пользовательский детектор.

Добавьте следующий пользовательский детектор:

src/i18n/customPath.js

 export default {
  name: 'customPath',

  lookup() {
    let found;
    if (typeof window !== 'undefined') {
      const language = window.location.pathname.match(//([a-zA-Z-]*)/g);
      if (language instanceof Array amp;amp; language.length) {
        found = language[language.length - 1].replace('/', '');
      }
    }
    return found;
  },
};
 

Зарегистрируйте детектор:

 import customPath from './customPath.js';

const languageDetector = new LanguageDetector();

languageDetector.addDetector(customPath);

const options = {
    order: ['customPath', 'localStorage', 'querystring',  'navigator'],
    // reset of options
};

i18n
    .use(Backend)
    .use(languageDetector) // <-- point to the variable 
 

Комментарии:

1. Определитель языка.Определитель адреса(myDetector). Извините , в приведенном выше примере mydetector не определен. Где я должен импортировать пользовательский путь?

2. Обновлен ответ

3. Поступил так же, как сказано. Когда язык переключается на другой язык, путь автоматически не меняется на «/ar»…

4. Это всего лишь сценарий «обнаружения», если вы хотите обновить URL-адрес, вам придется прослушать languageChanged событие и соответствующим образом обновить URL-адрес.