Как реализовать локализацию сайта
Использую Express, запускаю на нем сервер.
У меня есть парочку страниц, на которых я хочу сделать локализацию.
На данный момент я это хочу сделать с помощью get параметра lang=en / lang=ru, но немного не понимаю как это реализовать в коде.
Я нашел пакет express-request-language, с помощью него, я узнаю локализацию, как я понимаю браузера:
app.use(cookieParser());
app.use(requestLanguage(
{
languages: ['en-US', 'ru-RU'],
cookie:
{
name: 'language',
options: { maxAge: 24*3600*1000 },
url: '/languages/{language}'
}
}));
... и записываю его в куки.
Дальше в нашем 'роуте', мы можем узнать локаль с помощью req.language.substr(0, 2) // -> en, но вот тут начинается интересное.
Нужно чтобы если get параметром не было передано языка (?lang=en), то он устанавливался из кукиксов в url.
Что мне нужно сделать? Redirect на ту же ссылку, но добавить get параметр lang? Или как лучше?
Так же сделать проверку на язык указанные в get параметром, разрешен ли он.
Допустим это будет массив языков const langAccess = ['en', 'ru'];.
Дополнительный вопрос по express-request-language:
Какую он локаль установит, если будет допустим de? Если я правильно понимаю, то в languages мы указали список 'разрешенных' локалей, но можно как-то установить по стандарту допустим ru? Я где-то мельком замечал, что по стандарту стоит en-US, это так? И где это можно проверить?
(Мне кажется, что в целом вопрос плохо получилось сформулировать, но надеюсь на ваше понимание.)
На данный момент я реализовал что-то вроде этого:
const langAccess = ['en', 'ru'];
// ...
// Rust gene
rustGeneRouter.use('/rust_gene', (req, res, next) =>
{
let langGet = req.query.lang; // Получаем get параметр - lang
let langCookie = req.language?.substr(0, 2); // Получаем lang из кукиксов
let lang = langAccess.find(lang => lang == langGet) || langAccess.find(lang => lang == langCookie) || 'en';
if (langGet != lang)
{
let newSeach = new URLSearchParams(req._parsedUrl.search);
newSeach.set('lang', lang);
res.redirect(`?${newSeach.toString()}`);
}
else
{
next();
}
});
rustGeneRouter.use('/rust_gene', (req, res) =>
{
res.send(`Lang 'rust gene' page: ${req.query.lang}`);
})
app.get('/rust_gene', rustGeneRouter);
// Main
app.use('/', (req, res, next) =>
{
let langGet = req.query.lang; // Получаем get параметр - lang
let langCookie = req.language?.substr(0, 2); // Получаем lang из кукиксов
let lang = langAccess.find(lang => lang == langGet) || langAccess.find(lang => lang == langCookie) || 'en';
if (langGet != lang)
{
let newSeach = new URLSearchParams(req._parsedUrl.search);
newSeach.set('lang', lang);
res.redirect(`?${newSeach.toString()}`);
}
else
{
next();
}
});
app.get('/', (req, res) =>
{
res.status(404).render(path.join(__dirname, 'renderer', 'index.ejs'), {lang: req.query.lang});
});
app.get('/pageNotFound', (req, res) =>
{
res.status(404).render(path.join(__dirname, 'renderer', 'pageNotFound.ejs'), {lang: req.query.lang});
});
// Error 404
app.use((req, res) =>
{
res.redirect('/pageNotFound')
});
... и оно вроде работает как нужно.
/?lang=de перемемещает на /?lang=en, / перемещает на /?lang=en, /?lang=ru ничего не делает.
Так же есть повторение кода, что не очень нравится, да и в целом все, не очень.
Может вообще лучше использовать для этих целей параметры, а не get параметры?
app.get("/:lang", ...)
Ответы (1 шт):
Можете попробовать спарсить request.headers['accept-language'].
И генерируйте страницу с учетом языка.