From b7ce5b7f20bb5db3ed78a3db80839b945ffaeea3 Mon Sep 17 00:00:00 2001 From: nico Date: Sat, 28 Dec 2024 11:52:32 +0100 Subject: [PATCH] astro native i18n + i18n utils --- .astro-i18n/generated.d.ts | 52 ---------- .prettierignore | 2 + .prettierrc.mjs | 34 ++++++ .vscode/launch.json | 11 -- .vscode/settings.json | 22 ++-- astro.config.mjs | 4 + astro.i18n.config.ts | 20 ---- bun.lockb | Bin 210419 -> 221901 bytes package.json | 10 +- src/components/LangSwitcher.astro | 34 +----- src/i18n/ui.ts | 150 +++++++++++++++++++++++++++ src/layouts/BaseLayout.astro | 5 +- src/layouts/MarkdownPostLayout.astro | 32 +++--- src/pages/index.astro | 5 +- src/utils/i18n.ts | 28 +++++ tsconfig.json | 20 +++- 16 files changed, 266 insertions(+), 163 deletions(-) delete mode 100755 .astro-i18n/generated.d.ts create mode 100644 .prettierignore create mode 100644 .prettierrc.mjs delete mode 100755 .vscode/launch.json delete mode 100755 astro.i18n.config.ts create mode 100644 src/i18n/ui.ts create mode 100644 src/utils/i18n.ts diff --git a/.astro-i18n/generated.d.ts b/.astro-i18n/generated.d.ts deleted file mode 100755 index 1750f79..0000000 --- a/.astro-i18n/generated.d.ts +++ /dev/null @@ -1,52 +0,0 @@ -type DefaultLangCode = "fr" -type SupportedLangCode = "en" -type LangCode = DefaultLangCode | SupportedLangCode -type RouteUri = | "/articles/[slug]" | "/articles" | "/agments/[slug]" | "/agments" | "/references" | "/veille" | "/" | "/plan-du-site" -type RouteParams = {"/articles/[slug]": { "slug": string; }; "/articles": undefined; "/agments/[slug]": { "slug": string; }; "/agments": undefined; "/references": undefined; "/veille": undefined; "/": undefined; "/plan-du-site": undefined; } -type TranslationPath = "accueil" | "tagline" | "copyright" | "contact.title" | "contact.email" | "contact.tel" | "contenuVide" | "header.skipLink" | "header.mainNav" | "header.homeLink" | "sitemap" | "prevNext.contenus" | "prevNext.precedent" | "prevNext.suivant" | "article.titre" | "article.tagline" | "article.published" | "meta.publication" | "meta.modification" | "meta.credit" | "fragments.titre" | "fragments.tagline" | "references.titre" | "references.slug" | "references.cta" | "references.tagline" | "veille.titre" | "veille.tagline" | "erreur.introuvable" | "erreur.autre" | "erreur.lienRetour" | "seo.meta.description" | "seo.article.title" | "seo.article.description" | "seo.code.title" | "seo.code.description" | "seo.references.title" | "seo.references.description" | "index.articles.pageName" | "index.articles.subtitle" | "index.fragments.pageName" | "index.fragments.subtitle" | "index.references.pageName" | "index.references.subtitle" | "index.veille.pageName" | "index.veille.subtitle" | "index.title" | "index.subtitle" | "index.quoi" | "index.comment" | "index.opensource" | "index.writing" | "index.latestProjects" | "index.latestArticles" | "index.allProjects" | "index.allArticles" | "index.latestSnippets" | "index.allSnippets" | "index.toc" | "contact.contenuVide" -type TranslationOptions = { "accueil": {} | undefined; "tagline": {} | undefined; "copyright": {} | undefined; "contact.title": {} | undefined; "contact.email": {} | undefined; "contact.tel": {} | undefined; "contenuVide": {} | undefined; "header.skipLink": {} | undefined; "header.mainNav": {} | undefined; "header.homeLink": {} | undefined; "sitemap": {} | undefined; "prevNext.contenus": {} | undefined; "prevNext.precedent": {} | undefined; "prevNext.suivant": {} | undefined; "article.titre": {} | undefined; "article.tagline": {} | undefined; "article.published": { datetime: unknown; options: unknown; }; "meta.publication": {} | undefined; "meta.modification": {} | undefined; "meta.credit": {} | undefined; "fragments.titre": {} | undefined; "fragments.tagline": {} | undefined; "references.titre": {} | undefined; "references.slug": {} | undefined; "references.cta": {} | undefined; "references.tagline": {} | undefined; "veille.titre": {} | undefined; "veille.tagline": {} | undefined; "erreur.introuvable": {} | undefined; "erreur.autre": {} | undefined; "erreur.lienRetour": {} | undefined; "seo.meta.description": {} | undefined; "seo.article.title": {} | undefined; "seo.article.description": {} | undefined; "seo.code.title": {} | undefined; "seo.code.description": {} | undefined; "seo.references.title": {} | undefined; "seo.references.description": {} | undefined; "index.articles.pageName": {} | undefined; "index.articles.subtitle": {} | undefined; "index.fragments.pageName": {} | undefined; "index.fragments.subtitle": {} | undefined; "index.references.pageName": {} | undefined; "index.references.subtitle": {} | undefined; "index.veille.pageName": {} | undefined; "index.veille.subtitle": {} | undefined; "index.title": {} | undefined; "index.subtitle": {} | undefined; "index.quoi": {} | undefined; "index.comment": {} | undefined; "index.opensource": {} | undefined; "index.writing": {} | undefined; "index.latestProjects": {} | undefined; "index.latestArticles": {} | undefined; "index.allProjects": {} | undefined; "index.allArticles": {} | undefined; "index.latestSnippets": {} | undefined; "index.allSnippets": {} | undefined; "index.toc": {} | undefined; "contact.contenuVide": {} | undefined; } - -declare module "astro-i18n" { - export * from "astro-i18n/" - - export function l( - route: Uri | string & {}, - ...args: Uri extends keyof RouteParams - ? undefined extends RouteParams[Uri] - ? [params?: Record, targetLangCode?: LangCode, routeLangCode?: LangCode] - : [params: RouteParams[Uri], targetLangCode?: LangCode, routeLangCode?: LangCode] - : [params?: Record, targetLangCode?: LangCode, routeLangCode?: LangCode] - ): string - - export function t( - path: Path | string & {}, - ...args: undefined extends TranslationOptions[Path] - ? [options?: keyof TranslationOptions extends Path ? Record : TranslationOptions[Path], langCode?: LangCode] - : [options: TranslationOptions[Path], langCode?: LangCode] - ): string - - export function extractRouteLangCode(route: string): LangCode | undefined - - type Translation = string | { [translationKey: string]: string | Translation } - type Translations = { [langCode: string]: Record } - type RouteTranslations = { [langCode: string]: Record } - type InterpolationFormatter = (value: unknown, ...args: unknown[]) => string - class AstroI18n { - defaultLangCode: DefaultLangCode - supportedLangCodes: SupportedLangCode[] - showDefaultLangCode: boolean - translations: Translations - routeTranslations: RouteTranslations - get langCodes(): LangCode[] - get langCode(): LangCode - set langCode(langCode: LangCode) - get formatters(): Record - init(Astro: { url: URL }, formatters?: Record): void - addTranslations(translations: Translations): void - addRouteTranslations(routeTranslations: RouteTranslations): void - getFormatter(name: string): InterpolationFormatter | undefined - setFormatter(name: string, formatter: InterpolationFormatter): void - deleteFormatter(name: string): void - } - export const astroI18n: AstroI18n -} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..3947946 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +**/*.d.ts +eslintrc-auto-import.mjs diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 0000000..18563a5 --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,34 @@ +/** @type {import("prettier").Config} */ + +const config = { + arrowParens: 'always', + bracketSameLine: false, + bracketSpacing: true, + embeddedLanguageFormatting: 'auto', + endOfLine: 'lf', + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + jsxSingleQuote: true, + printWidth: 80, + proseWrap: 'preserve', + quoteProps: 'as-needed', + requirePragma: false, + semi: false, + singleAttributePerLine: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + useTabs: true, + vueIndentScriptAndStyle: false, + plugins: ['prettier-plugin-organize-imports', 'prettier-plugin-astro'], + overrides: [ + { + files: '*.astro', + options: { + parser: 'astro' + } + } + ] +} + +export default config diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100755 index d642209..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "command": "./node_modules/.bin/astro dev", - "name": "Development server", - "request": "launch", - "type": "node-terminal" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 91789b7..28ac688 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,7 @@ { - "cssvar.files": [ - "./node_modules/open-props/open-props.min.css", - // if you have an alternative path to where your styles are located - // you can add it in this array of files - "assets/styles/variables.css" - ], - - // Do not ignore node_modules css files, which is ignored by default - "cssvar.ignore": [], - - // add support for autocomplete in JS or JS like files - "cssvar.extensions": [ - "css", "jsx", "tsx" - ], - "editor.formatOnSave": true -} \ No newline at end of file + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.insertSpaces": false, + "editor.detectIndentation": false, + "editor.tabSize": 2 +} diff --git a/astro.config.mjs b/astro.config.mjs index f3c1ce1..8bb12a7 100755 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -9,6 +9,10 @@ export default defineConfig({ site: "https://www.nardu.in", build: { format: "directory", + }, + i18n: { + locales: ["fr", "en"], + defaultLocale: "fr", }, image: { domains: ["assets.nardu.in"], diff --git a/astro.i18n.config.ts b/astro.i18n.config.ts deleted file mode 100755 index f349767..0000000 --- a/astro.i18n.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { defineAstroI18nConfig } from "astro-i18n"; - -export default defineAstroI18nConfig({ - defaultLangCode: "fr", - supportedLangCodes: ["en"], - showDefaultLangCode: false, - trailingSlash: "never", - translations: { - fr: "src/i18n/fr.json", - en: "src/i18n/en.json", - }, - routeTranslations: { - en: { - "sci-hub-blocage": "sci-hub-unblock", - fragments: "snippets", - "plan-du-site": "sitemap", - references: "work", - }, - }, -}); diff --git a/bun.lockb b/bun.lockb index 6519f634b8c3ee17add6c61fbf601145b8299768..44152a49937e42750d551455e4844b246724d021 100755 GIT binary patch delta 48579 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 Ro*l5(>bV#iw^+6Ae*w1l7&rg` delta 42112 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 locale !== astroI18n.langCode -); -// current path -const currentRoute = Astro.url.pathname; - -function localeName(locale) { - let localeName = ""; - switch (locale) { - case "fr": - localeName = "Français"; - break; - case "en": - localeName = "English"; - break; - } - return localeName; -} +import { languages } from '../i18n/ui' --- -
    +
      { - // create a list of available alternative locale - availableLocales.map((locale) => ( + Object.entries(languages).map(([lang, label]) => (
    • - - {localeName(locale)} - + {label}
    • )) } diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts new file mode 100644 index 0000000..e83786c --- /dev/null +++ b/src/i18n/ui.ts @@ -0,0 +1,150 @@ +export const languages = { + en: 'English', + fr: 'Français' +} + +export const defaultLang = 'fr' + +export const ui = { + en: { + accueil: 'home', + tagline: 'Freelance web developer specialized in accessibility.', + copyright: '(re)Made with Astro', + contact: { + title: 'contact', + email: 'Send me an email (open in application).', + tel: 'Call or text me (open in application).', + contenuVide: 'Soon: really nice content.' + }, + header: { + skipLink: 'Skip to content', + mainNav: 'Main menu', + homeLink: 'Back to homepage' + }, + sitemap: 'Site map', + prevNext: { + contenus: 'Similar content', + precedent: 'Previous', + suivant: 'Next' + }, + article: { + titre: 'articles', + tagline: 'I blog, sometimes.', + published: 'Published on {datetime|date(options)}' + }, + meta: { + publication: 'Published on', + modification: 'Last updated on', + credit: 'Image by' + }, + fragments: { + titre: 'snippets', + tagline: 'School with Nicool.' + }, + references: { + titre: 'work', + slug: 'work', + cta: 'Visit website', + tagline: 'Some work.' + }, + veille: { + titre: 'Around the web', + tagline: 'Some links that interested me.' + }, + erreur: { + introuvable: 'Sorry, page not found.', + autre: 'Oups… sorry about that.', + lienRetour: 'Back to the home page' + }, + seo: { + meta: { + description: + 'Web developer specialized in accessibility and eco-design in Toulouse, France. Development of custom websites, RGAA compliance, maintenance, etc.' + }, + article: { + title: 'Articles', + description: + 'A few articles about graphic design and front-end development.' + }, + code: { + title: 'Snippets', + description: 'Snippets of fresh, easy and accessible code.' + }, + references: { + title: 'Work', + description: 'A few case studies I worked on as a front-end developer.' + } + } + }, + fr: { + accueil: 'accueil', + tagline: 'Développeur web spécialisé en accessibilité.', + copyright: '(re)Fait avec Astro', + contact: { + title: 'contact', + email: 'Envoyez-moi un mail (ouverture du logiciel automatique).', + tel: 'Contactez-moi par téléphone (ouverture du logiciel automatique).' + }, + contenuVide: 'Bientôt ici : du contenu de qualité', + header: { + skipLink: 'Accéder au contenu', + mainNav: 'Menu principal', + homeLink: 'Accueil du site' + }, + sitemap: 'Plan du site', + prevNext: { + contenus: 'Contenus similaires', + precedent: 'Précédent', + suivant: 'Suivant' + }, + article: { + titre: 'articles', + tagline: 'Je blog, un peu.', + published: 'Publié le {datetime|date(options)}' + }, + meta: { + publication: 'Publié le', + modification: 'Mis à jour le', + credit: 'Image par' + }, + fragments: { + titre: 'fragments', + tagline: 'Les tutos de Nico mdr.' + }, + references: { + titre: 'références', + slug: 'references', + cta: 'Consulter le site', + tagline: 'Quelques références.' + }, + veille: { + titre: 'veille', + tagline: 'Des liens, en vrac.' + }, + erreur: { + introuvable: 'Page introuvable', + autre: 'Oups… désolé pour cette erreur.', + lienRetour: 'Retour à l’accueil' + }, + seo: { + meta: { + description: + 'Développeur web spécialisé en accessibilité numérique et éco-conception à Toulouse. Création de sites web sur mesure, mise en conformité RGAA, maintenance, etc.' + }, + article: { + title: 'Articles', + description: + "Quelques articles sur le développement web front-end et l'informatique à Toulouse." + }, + code: { + title: 'Fragments', + description: 'Fragments de codes stylés, faciles et accessibles.' + }, + references: { + title: 'Références', + description: + 'Quelques travaux réalisés en tant que et développeur web front-end à Toulouse.' + } + } + } +} as const diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 0fd0d5e..6ea25eb 100755 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -1,6 +1,5 @@ --- -import { astroI18n } from "astro-i18n"; -astroI18n.init(Astro); +const locale = Astro.currentLocale; import "../styles/style.css"; @@ -11,7 +10,7 @@ import Footer from "../components/Footer.astro"; const { pageTitle } = Astro.props; --- - +
      diff --git a/src/layouts/MarkdownPostLayout.astro b/src/layouts/MarkdownPostLayout.astro index eb46a29..8e747d9 100755 --- a/src/layouts/MarkdownPostLayout.astro +++ b/src/layouts/MarkdownPostLayout.astro @@ -1,33 +1,27 @@ --- -import { l, t, astroI18n } from "astro-i18n"; -// import AstroImage from "../components/AstroImage.astro"; -import BaseLayout from "../layouts/BaseLayout.astro"; +import BaseLayout from '../layouts/BaseLayout.astro' +import { getLangFromUrl, useTranslations } from '../utils/i18n' -const { frontmatter, image, title } = Astro.props; -const publishedDate = new Date(frontmatter.pubDate); -const localizedDate = new Intl.DateTimeFormat(astroI18n.langCode, { - dateStyle: "long", -}).format(publishedDate); +const locale = getLangFromUrl(Astro.url) +const t = useTranslations(locale) + +const { frontmatter, image, title } = Astro.props +const publishedDate = new Date(frontmatter.pubDate) +const localizedDate = new Intl.DateTimeFormat(locale, { + dateStyle: 'long' +}).format(publishedDate) ---

      - Publié le :

      -

      - { - t("article.published", { - datetime: frontmatter.pubDate, - options: { dateStyle: "long" }, - }) - } -

      -
      +
      { frontmatter.tags.map((tag) => ( -

      +

      {tag}

      )) diff --git a/src/pages/index.astro b/src/pages/index.astro index 7382c51..340c8b9 100755 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,8 +1,5 @@ --- -// init i18n -import { getLocale } from "astro-i18n-aut"; - -const locale = getLocale(Astro.url); +const locale = Astro.currentLocale; // import stuff import BaseLayout from "../layouts/BaseLayout.astro"; diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts new file mode 100644 index 0000000..0b3fc69 --- /dev/null +++ b/src/utils/i18n.ts @@ -0,0 +1,28 @@ +import { defaultLang, ui } from '../i18n/ui' + +export function getLangFromUrl(url: URL) { + const [, lang] = url.pathname.split('/') + if (lang in ui) return lang as keyof typeof ui + return defaultLang +} + +type NestedKeyOf = { + [K in keyof T]: T[K] extends object + ? `${K & string}.${NestedKeyOf & string}` + : K & string +}[keyof T] + +export function useTranslations(lang: keyof typeof ui) { + return function t(key: NestedKeyOf<(typeof ui)[typeof defaultLang]>) { + const keys = key.split('.') + let value = ui[lang] + let fallback = ui[defaultLang] + + for (const k of keys) { + value = value?.[k] + fallback = fallback?.[k] + } + + return value || fallback + } +} diff --git a/tsconfig.json b/tsconfig.json index e71eb5a..fb16021 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,18 @@ { - "extends": "astro/tsconfigs/base", - "include": [".astro/types.d.ts", "**/*"], + "extends": "astro/tsconfigs/base", + "include": [".astro/types.d.ts", "**/*"], "exclude": ["dist"], - "compilerOptions": { - "strictNullChecks": true - } + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@components/*": ["src/components/*"], + "@layouts/*": ["src/layouts/*"] + }, + "strictNullChecks": true, + "plugins": [ + { + "name": "@astrojs/ts-plugin" + } + ] + } }