为不同的 ccTLD 构建相同的网站

Build same same web for different ccTLD

我正在使用 Meteor 构建一个网络应用程序。

我的网络应用程序将具有不同语言的相同 UI(和页面)。它将在不同的 ccTLD(.cz、.sk、.hu、.tr、... .com)上进行本地化和部署。

这是我想要的类似案例。是一个czech parfums eshop。当您向下滚动底部时,会有指向不同域的标志(链接)。

我的 webapp 可以分解成这些部分:

应该有一些方法可以 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