为不同的 ccTLD 构建相同的网站
Build same same web for different ccTLD
我正在使用 Meteor 构建一个网络应用程序。
我的网络应用程序将具有不同语言的相同 UI(和页面)。它将在不同的 ccTLD(.cz、.sk、.hu、.tr、... .com)上进行本地化和部署。
这是我想要的类似案例。是一个czech parfums eshop。当您向下滚动底部时,会有指向不同域的标志(链接)。
我的 webapp 可以分解成这些部分:
- [DB] 多种语言的数据库可以相同。
- [通用代码] 大部分代码在不同语言之间是相同的
- [路由和国际化] 每种语言的不同部分是路由文件和国际化文件
应该有一些方法可以 build/run/debug 具有不同路由文件和 i18n 文件的应用程序。
我不想拥有一个 .com 域并能够切换语言。 Why?
考虑将一个代码库与国际化文件一起使用。您可以使用 tap-i18n 包 (https://github.com/TAPevents/tap-i18n) for this along with iron-router and the iron-router-i18n package (https://github.com/yoolab/iron-router-i18n)。例如:
meteor create intl
meteor add tap:i18n
meteor add iron:router
meteor add martino:iron-router-i18n
这将创建一个用于演示目的的基本项目,并添加 tap-i18n、iron-router 和 iron-router-i18n 包。
假设我们要支持英语、西班牙语和法语。创建一个 i18n 目录来存储您的国际化文件。这些文件包含为网站的各种版本翻译的文本字符串(抱歉,如果我的翻译不完美):
i18n/en.i18n.json:
{
"settings": "settings",
"home": "home",
"welcome text": "Welcome to Meteor!",
"home text": "This is the home page.",
"settings text": "On this page you can modify settings."
}
i18n/es.i18n.json:
{
"settings": "configuracion",
"home": "inicial",
"welcome text": "Bienvenido a Meteoro!",
"home text": "Esta es la pagina de inicio.",
"settings text": "En esta pagina usted puede modificar la configuracion."
}
i18n/fr.i18n.json:
{
"settings": "parametres",
"home": "premiere",
"welcome text": "Bienvenue au Meteor!",
"home text": "Cette page est la page d'accueil.",
"settings text": "Sur cette page vous pouvez modifier les parametres."
}
请注意,文件名以语言代码(en、es、fr)开头。我正在使用 http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry 中的代码列表,但代码并不重要,因为您稍后会在 iron-router-i18n 配置中正确引用它。
现在为您的应用程序创建一个 settings.json 文件以指定您希望用于当前部署的语言。在这里,我使用 'es' 表示西班牙语(同样,这必须与上面用于 i18n 文件的前缀匹配):
settings.json:
{
"public": {
"i18nLanguageCode": "es"
}
}
这是唯一一个每次部署都需要修改的文件。
在应用程序启动时,我们调用 TAPi18n setLanguage 函数,从 settings.json 文件中传入值,我将注册一个全局模板助手来获取当前语言:
intl.js:
if (Meteor.isClient) {
TAPi18n.setLanguage(Meteor.settings.public.i18nLanguageCode);
Template.registerHelper("getCurrentLanguage", function(){
return Meteor.settings.public.i18nLanguageCode;
});
}
这是 intl.html 文件:
<template name="layout">
<h1>{{_ "welcome text"}}</h1>
{{> yield}}
</template>
<template name="home">
<p>{{_ "home text"}}</p>
<p><a href="{{pathFor route='settings' lang=getCurrentLanguage}}">{{_ "settings"}}</a></p>
</template>
<template name="settings">
<p>{{_ "settings text"}}</p>
<p><a href="{{pathFor route='home' lang='en'}}">{{_ "home"}}</a></p>
</template>
注意 tap-i18n 包提供的助手(下划线后跟引号中的字符串)。这些占位符("welcome text"、"home text"、"settings text"、"settings"、"home")被我们创建的 i18n 文件中的正确翻译文本替换。 getCurrentLanguage
函数将当前语言代码传递给 iron-router-i18n pathFor 助手。
现在让我们创建路由器配置。
router.js:
I18NConf.configure({
defaultLanguage: 'en',
languages: [Meteor.settings.public.i18nLanguageCode],
autoConfLanguage: true
});
Router.configure({
layoutTemplate: 'layout',
i18n: {
compulsoryLangCode: false,
langCodeForDefaultLanguage: false,
addLangCode: function(url){
return url;
},
langCodeAction: function(path){
/* by default Router.setLanguage would be called and we do not want that */
}
}
});
Router.route('/', function() {
this.render('home');
}, {
name: 'home'
});
Router.route('settings', function() {
this.render('settings');
}, {
i18n: {
languages: {
es: { path: '/ajustes' },
fr: { path: '/parametres'}
}
}
});
请注意,我将 Meteor.settings.public.i18nLanguageCode
传递给 I18NConf.configure
,并且对于您想要转换路径的每个路由,您需要添加配置:
i18n: {
languages: {
es: { path: '/ajustes' },
fr: { path: '/parametres'}
}
}
当你运行流星时,运行它使用设置文件:
meteor run --settings settings.json
我在这里创建了一个示例存储库:https://github.com/markleiber/intl
我正在使用 Meteor 构建一个网络应用程序。
我的网络应用程序将具有不同语言的相同 UI(和页面)。它将在不同的 ccTLD(.cz、.sk、.hu、.tr、... .com)上进行本地化和部署。
这是我想要的类似案例。是一个czech parfums eshop。当您向下滚动底部时,会有指向不同域的标志(链接)。
我的 webapp 可以分解成这些部分:
- [DB] 多种语言的数据库可以相同。
- [通用代码] 大部分代码在不同语言之间是相同的
- [路由和国际化] 每种语言的不同部分是路由文件和国际化文件
应该有一些方法可以 build/run/debug 具有不同路由文件和 i18n 文件的应用程序。
我不想拥有一个 .com 域并能够切换语言。 Why?
考虑将一个代码库与国际化文件一起使用。您可以使用 tap-i18n 包 (https://github.com/TAPevents/tap-i18n) for this along with iron-router and the iron-router-i18n package (https://github.com/yoolab/iron-router-i18n)。例如:
meteor create intl
meteor add tap:i18n
meteor add iron:router
meteor add martino:iron-router-i18n
这将创建一个用于演示目的的基本项目,并添加 tap-i18n、iron-router 和 iron-router-i18n 包。
假设我们要支持英语、西班牙语和法语。创建一个 i18n 目录来存储您的国际化文件。这些文件包含为网站的各种版本翻译的文本字符串(抱歉,如果我的翻译不完美):
i18n/en.i18n.json:
{
"settings": "settings",
"home": "home",
"welcome text": "Welcome to Meteor!",
"home text": "This is the home page.",
"settings text": "On this page you can modify settings."
}
i18n/es.i18n.json:
{
"settings": "configuracion",
"home": "inicial",
"welcome text": "Bienvenido a Meteoro!",
"home text": "Esta es la pagina de inicio.",
"settings text": "En esta pagina usted puede modificar la configuracion."
}
i18n/fr.i18n.json:
{
"settings": "parametres",
"home": "premiere",
"welcome text": "Bienvenue au Meteor!",
"home text": "Cette page est la page d'accueil.",
"settings text": "Sur cette page vous pouvez modifier les parametres."
}
请注意,文件名以语言代码(en、es、fr)开头。我正在使用 http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry 中的代码列表,但代码并不重要,因为您稍后会在 iron-router-i18n 配置中正确引用它。
现在为您的应用程序创建一个 settings.json 文件以指定您希望用于当前部署的语言。在这里,我使用 'es' 表示西班牙语(同样,这必须与上面用于 i18n 文件的前缀匹配):
settings.json:
{
"public": {
"i18nLanguageCode": "es"
}
}
这是唯一一个每次部署都需要修改的文件。
在应用程序启动时,我们调用 TAPi18n setLanguage 函数,从 settings.json 文件中传入值,我将注册一个全局模板助手来获取当前语言:
intl.js:
if (Meteor.isClient) {
TAPi18n.setLanguage(Meteor.settings.public.i18nLanguageCode);
Template.registerHelper("getCurrentLanguage", function(){
return Meteor.settings.public.i18nLanguageCode;
});
}
这是 intl.html 文件:
<template name="layout">
<h1>{{_ "welcome text"}}</h1>
{{> yield}}
</template>
<template name="home">
<p>{{_ "home text"}}</p>
<p><a href="{{pathFor route='settings' lang=getCurrentLanguage}}">{{_ "settings"}}</a></p>
</template>
<template name="settings">
<p>{{_ "settings text"}}</p>
<p><a href="{{pathFor route='home' lang='en'}}">{{_ "home"}}</a></p>
</template>
注意 tap-i18n 包提供的助手(下划线后跟引号中的字符串)。这些占位符("welcome text"、"home text"、"settings text"、"settings"、"home")被我们创建的 i18n 文件中的正确翻译文本替换。 getCurrentLanguage
函数将当前语言代码传递给 iron-router-i18n pathFor 助手。
现在让我们创建路由器配置。
router.js:
I18NConf.configure({
defaultLanguage: 'en',
languages: [Meteor.settings.public.i18nLanguageCode],
autoConfLanguage: true
});
Router.configure({
layoutTemplate: 'layout',
i18n: {
compulsoryLangCode: false,
langCodeForDefaultLanguage: false,
addLangCode: function(url){
return url;
},
langCodeAction: function(path){
/* by default Router.setLanguage would be called and we do not want that */
}
}
});
Router.route('/', function() {
this.render('home');
}, {
name: 'home'
});
Router.route('settings', function() {
this.render('settings');
}, {
i18n: {
languages: {
es: { path: '/ajustes' },
fr: { path: '/parametres'}
}
}
});
请注意,我将 Meteor.settings.public.i18nLanguageCode
传递给 I18NConf.configure
,并且对于您想要转换路径的每个路由,您需要添加配置:
i18n: {
languages: {
es: { path: '/ajustes' },
fr: { path: '/parametres'}
}
}
当你运行流星时,运行它使用设置文件:
meteor run --settings settings.json
我在这里创建了一个示例存储库:https://github.com/markleiber/intl