i18n basepaths
This example shows
- how to add multiple basepaths to Routify
- how to manipulate Routify’s urlIndex.js(for adding i18n to SSG)
- how to import the new URLs list in Spank
Adding language basepaths to Routify
<!-- src/App.svelte -->
<script>
  import { Router } from "@roxi/routify";
  import { routes } from "../.routify/routes";
  // accepted languages
  const langs = ["en", "de", "fr", "es"];
  // first url fragment.
  const fragment = location.pathname.split("/")[1];
  // if fragment is an accepted language, use it as a prefix.
  const lang = langs.includes(fragment) ? `/${fragment}` : "";
  const config = {
    urlTransform: {
      //add the language prefix for the browser
      apply: (url) => lang + url,
      //remove the language prefix for Routify
      remove: (url) => url.replace(lang, ""),
    },
  };
</script>
<Router {routes} {config} />Generating i18n URLs for static site generation (optional)
Routify provides a list of its routes in urlIndex.json.
For each route, we need to create an additional route for each language.
To do this we create a wrapper i18n.urls.js. For simplicity we put it in the project root.
/** i18n.urls.js */
const urls = require('./.routify/urlIndex.json')
const langs = ['/en', '/de', '/fr', '/es']
// we map each url with an array of corresponding i18n urls.
// Notice flat() at the end - we don't want an array of arrays.
module.exports = urls.map(url => langs.map(lang => lang + url)).flat()Use our new i18n.urls.js
Lastly, for static export we use Spank, which is already included in the starter template.
/** package.json */
{
  ...
  "spank": {
    "sitemap": "i18n.urls.js"
  }
}Spank uses configent, so it can also be configured through CLI, environment, spank.config.js etc.
Writing good documentation that is up-to-date is difficult. If you notice a mistake, help us out.