Я использую expressjs и i18n-node (https://github.com/mashpie/i18n-node).. Это работает, за исключением элегантных ссылок. Теперь у меня есть следующее:
app.all(/^\/(\w{2}\/)+(\w*)?/, function(req, res, next) {
var lang = req.params[0];
var type = req.params[1];
req.url = req.url.replace(lang, "");
if(type !== 'javascript' && type !== 'img' && type !== 'css') {
i18n.setLocale(lang.slice(0, 2));
}
next();
});
(я хочу, чтобы / foo, а также / en / foo работали). Если язык не указан в URL, заголовки проверяются, а если нет, по умолчанию используется английский язык. Кстати, мое решение кажется далеко не идеальным (я должен сделать ручную проверку, чтобы убедиться, что оно не статичное), поэтому, если у кого-то из вас есть лучшее решение, я весь слух.
Теперь моя настоящая проблема заключается в создании ссылок на внутренний контент. Если пользователь здесь: «/ en / foo», ссылка «/ bar» должна быть на самом деле «/ en / bar». Я использую Jade (без особой причины, кроме того, что это было по умолчанию, снова открыт для предложений ..)
Я попытался добавить вспомогательную функцию в Jade:
app.helpers({
__i: i18n.__
,__n: i18n.__n
,link_to: function(link, text) {
//TODO: how to get request here?
// this should be defined to the absolute base path
var baseUrl = "/";
// only append locale if it is part of the existing url!
var locale = i18n.getLocale();
return '<a href="' + baseUrl + locale + '/' + link + '">' + text + '</a>';
}
});
.. но у него много проблем:
- Как мне получить базовый URL? Так, например, если сайт расположен по адресу "http://www.example.com/foo/bar",, и я ссылаюсь на" testLink ", link_to сгенерирует" http://www.example.com/foo/bar/testLink", вместо "/ testLink" или "http://www.example.com/testLink" и т. Д.
- Как определить, содержит ли URL-адрес параметр локализации или нет? Я не хочу добавлять к ссылке параметр локализации, если он не нужен.
- Сама функция не велика; В Jade это называется так:: = link_to ("testUrl", "некоторое описание ссылки"). Я бы предпочел сделать что-то вроде этого:
link_to (HREF = "someUrl")
еще немного нефритового кода
- (несовершеннолетний) HTML написан непосредственно в JS
Каков предпочтительный способ сделать это? Я искал и искал, но не смог найти хороший ответ ..
Это на самом деле также общий вопрос; Т.е. как вы ссылаетесь на другой внутренний контент, такой как link_to в Rails. Просто сделать (href = "someAction") недостаточно, поскольку вы хотите, чтобы он генерировал абсолютные URL-адреса, чтобы красивые URL-адреса не нарушали статические ссылки на контент.
Спасибо!