feat: init i18n features

This commit is contained in:
草师傅 2025-07-20 21:56:57 +08:00
parent 99a981209c
commit 7af0886d9c
Signed by: gb
GPG key ID: 43330A030E2D6478
3 changed files with 52 additions and 0 deletions

View file

@ -0,0 +1,14 @@
---
import { languages } from '../../../i18n/ui';
import { getLangFromUrl, useTranslatedPath } from '../../../i18n/utils';
const lang = getLangFromUrl(Astro.url);
const translatePath = useTranslatedPath(lang);
---
<ul>
{Object.entries(languages).map(([lang, label]) => (
<li>
<a href={translatePath('/', lang)}>{label}</a>
</li>
))}
</ul>

19
src/i18n/ui.ts Normal file
View file

@ -0,0 +1,19 @@
export const languages = {
en: 'English',
zh_hans: '中文(简体)',
};
export const defaultLang = 'en';
export const showDefaultLang = false;
export const ui = {
en: {
'nav.home': 'Home',
'nav.about': 'About',
'nav.twitter': 'Twitter',
},
zh_hans: {
'nav.home': '首页',
'nav.about': '关于',
},
} as const;

19
src/i18n/utils.ts Normal file
View file

@ -0,0 +1,19 @@
import {ui, defaultLang, showDefaultLang} from './ui';
export function getLangFromUrl(url: URL) {
const [, lang] = url.pathname.split('/');
if (lang in ui) return lang as keyof typeof ui;
return defaultLang;
}
export function useTranslations(lang: keyof typeof ui) {
return function t(key: keyof typeof ui[typeof defaultLang]) {
return ui[lang][key] || ui[defaultLang][key];
}
}
export function useTranslatedPath(lang: keyof typeof ui) {
return function translatePath(path: string, l: string = lang) {
return !showDefaultLang && l === defaultLang ? path : `/${l}${path}`
}
}