gpt4 book ai didi

javascript - 使用 expressjs 和 jade 的动态 (i18n) 链接

转载 作者:搜寻专家 更新时间:2023-10-31 23:56:05 25 4
gpt4 key购买 nike

我正在使用 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 中未指定语言,则会检查 header ,如果没有,则默认为英语。顺便说一句,我的解决方案似乎不太理想(我必须手动检查它是否不是静态内容),所以如果你们有更好的解决方案,我会洗耳恭听。

现在,我真正的问题是如何链接到内部内容。如果用户在这里:“/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>';
}
});

..但是它有很多问题:

  1. 如何获取基本 URL?因此,例如,如果站点位于“http://www.example.com/foo/bar”,并且我链接到“testLink”,link_to 将生成“http://www.example.com/foo/bar/testLink”,而不是“/testLink”或“http://www.example.com/testLink”等。
  2. 如何确定 url 是否包含本地化参数?如果不需要,我不想将本地化参数附加到链接。
  3. 功能本身不是很好;在 Jade 中,它是这样调用的::= link_to("testUrl", "some link description")。我宁愿做这样的事情:link_to(href="someUrl") div 一些 Jade 代码
  4. (minor) HTML直接用JS写

执行此操作的首选方法是什么?我一直在搜索和搜索,但无法找到好的答案..

这其实也是一个普遍性的问题;即如何链接到其他内部内容,例如 Rails 中的 link_to。简单地执行 a(href="someAction") 是不够的,因为您希望它生成绝对 URL,以便漂亮的 URL 不会破坏静态内容链接。

谢谢!

最佳答案

我使用 i18n 从自己的项目中粘贴代码,我使用一个类用于 dicto,另一个类通过 IP 搜索语言:

app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: "sessid",
key: 'uwsid',
store: sessionStore
}));
app.use(function (req,res,next) {

if (req.session.uid) {
req.lang = req.session.uid.lang;
next();
} else if (req.cookies.lang) {
req.lang = req.cookies.lang;
next();
} else {

var alang = typeof req.headers['accept-language'] != "undefined" ? req.headers['accept-language'].substr(0,2) : null;

var ipinfows = ipinfo.getInstance();

ipinfows.getInfo(req.connection.remoteAddress, function (err,data) {

if (err) {
req.lang = alang;
res.cookie('lang', alang);
} else if (data && data.error) {
req.lang = alang;
res.cookie('lang', alang);
} else {

console.log("seteando");

req.lang = data.lang.toLowerCase();

for (i in countryLangs) {
if (countryLangs[i].indexOf(data.lang) != -1) {
req.lang = i;
}
}

if (alang != req.lang) {
req.langdifference = alang;
}

res.cookie('lang', req.lang);

}

next();

});
}



});
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});

路由 app.use(app.router); 之前,您可以定义回调,在这种情况下,我搜索 lang 并将其定义在 cookie 中。在我添加一个 dynamicHelper 以将 Dicto 对象包含到模板中之后:

app.dynamicHelpers({

i18n: function (req,res) {
return new i18n({lang: req.lang});
}

});

在路由之前用语言定义。 (保存在 req.lang 中),我现在可以使用模板中的 i18n halper(使用 jade):

form.uniForm(action="/account",method="post")
fieldset.inlineLabels
.ctrlHolder
label(for="nickname") #{**i18n.getText('user:nick')**}:
input(type="text",name="nickname",value=everyauth.user.nick)
p.formHint

i18n 对象现在与动态帮助器上定义的相同。

关于javascript - 使用 expressjs 和 jade 的动态 (i18n) 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com