@i18n-micro/astro 1.3.5 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("@i18n-micro/core"),j=require("node:fs"),T=require("node:path"),D=require("@i18n-micro/utils/parse-path"),M=require("@i18n-micro/utils/accept-language");class v extends w.BaseI18n{constructor(e){const o=e._storage||{translations:new Map};if(super({storage:o,plural:e.plural,missingWarn:e.missingWarn,missingHandler:e.missingHandler}),this.initialMessages={},this.storage=o,this._locale=e.locale,this._fallbackLocale=e.fallbackLocale||e.locale,this._currentRoute="index",e.messages){this.initialMessages={...e.messages};for(const[n,s]of Object.entries(e.messages))this.helper.loadTranslations(n,s)}}cloneStorage(e){const o=new Map;for(const[n,s]of e.translations)o.set(n,{...s});return{translations:o}}clone(e){const o=this.cloneStorage(this.storage);return new v({locale:e||this._locale,fallbackLocale:this._fallbackLocale,plural:this.pluralFunc,missingWarn:this.missingWarn,missingHandler:this.missingHandler,_storage:o})}get locale(){return this._locale}set locale(e){this._locale=e}get fallbackLocale(){return this._fallbackLocale}set fallbackLocale(e){this._fallbackLocale=e}setRoute(e){this._currentRoute=e}getLocale(){return this._locale}getFallbackLocale(){return this._fallbackLocale}getRoute(){return this._currentRoute}getRouteTranslations(e,o){const n=`${e}:${o}`;return this.storage.translations.get(n)??null}addTranslations(e,o,n=!0){super.loadTranslationsCore(e,o,n)}addRouteTranslations(e,o,n,s=!0){super.loadRouteTranslationsCore(e,o,n,s)}mergeTranslations(e,o,n){this.helper.mergeTranslation(e,o,n,!0)}clearCache(){const e={...this.initialMessages};if(super.clearCache(),Object.keys(e).length>0)for(const[o,n]of Object.entries(e))this.helper.loadTranslations(o,n)}}let B=null;function O(){return B}function q(t){const{locale:e,fallbackLocale:o,translationDir:n,routingStrategy:s}=t;return B=s||null,{name:"@i18n-micro/astro",hooks:{"astro:config:setup":c=>{const{updateConfig:u}=c,a="virtual:i18n-micro/config",r=`\0${a}`,i={defaultLocale:e,fallbackLocale:o||e,locales:t.locales||[],localeCodes:(t.locales||[]).map(l=>l.code),translationDir:n||null,autoDetect:t.autoDetect??!0,redirectToDefault:t.redirectToDefault??!1,localeCookie:t.localeCookie===null?null:t.localeCookie||"i18n-locale",missingWarn:t.missingWarn??!1};u({vite:{plugins:[{name:"vite-plugin-i18n-micro-config",resolveId(l){if(l===a)return r},load(l){if(l===r)return`export const config = ${JSON.stringify(i)}`}}]}})},"astro:config:done":c=>{const{injectTypes:u}=c;u({filename:"i18n-micro-env.d.ts",content:`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("@i18n-micro/core"),T=require("node:fs"),R=require("node:path"),F=require("@i18n-micro/utils/parse-path"),N=require("@i18n-micro/utils/accept-language");class v extends j.BaseI18n{constructor(e){const l=e._storage||{translations:new Map};if(super({storage:l,plural:e.plural,missingWarn:e.missingWarn,missingHandler:e.missingHandler}),this.initialMessages={},this.storage=l,this._locale=e.locale,this._fallbackLocale=e.fallbackLocale||e.locale,this._currentRoute="index",e.messages){this.initialMessages={...e.messages};for(const[r,c]of Object.entries(e.messages))this.helper.loadTranslations(r,c)}}cloneStorage(e){const l=new Map;for(const[r,c]of e.translations)l.set(r,{...c});return{translations:l}}clone(e){const l=this.cloneStorage(this.storage);return new v({locale:e||this._locale,fallbackLocale:this._fallbackLocale,plural:this.pluralFunc,missingWarn:this.missingWarn,missingHandler:this.missingHandler,_storage:l})}get locale(){return this._locale}set locale(e){this._locale=e}get fallbackLocale(){return this._fallbackLocale}set fallbackLocale(e){this._fallbackLocale=e}setRoute(e){this._currentRoute=e}getLocale(){return this._locale}getFallbackLocale(){return this._fallbackLocale}getRoute(){return this._currentRoute}getRouteTranslations(e,l){const r=`${e}:${l}`;return this.storage.translations.get(r)??null}addTranslations(e,l,r=!0){super.loadTranslationsCore(e,l,r)}addRouteTranslations(e,l,r,c=!0){super.loadRouteTranslationsCore(e,l,r,c)}mergeTranslations(e,l,r){this.helper.mergeTranslation(e,l,r,!0)}clearCache(){const e={...this.initialMessages};if(super.clearCache(),Object.keys(e).length>0)for(const[l,r]of Object.entries(e))this.helper.loadTranslations(l,r)}}let O=null;function _(){return O}function q(a){const{locale:e,fallbackLocale:l,translationDir:r,routingStrategy:c}=a;return O=c||null,{name:"@i18n-micro/astro",hooks:{"astro:config:setup":i=>{const{updateConfig:u}=i,t="virtual:i18n-micro/config",o=`\0${t}`,s={defaultLocale:e,fallbackLocale:l||e,locales:a.locales||[],localeCodes:(a.locales||[]).map(n=>n.code),translationDir:r||null,autoDetect:a.autoDetect??!0,redirectToDefault:a.redirectToDefault??!1,localeCookie:a.localeCookie===null?null:a.localeCookie||"i18n-locale",missingWarn:a.missingWarn??!1};u({vite:{plugins:[{name:"vite-plugin-i18n-micro-config",resolveId(n){if(n===t)return o},load(n){if(n===o)return`export const config = ${JSON.stringify(s)}`}}]}})},"astro:config:done":i=>{const{injectTypes:u}=i;u({filename:"i18n-micro-env.d.ts",content:`
2
2
  /// <reference types="@i18n-micro/astro/env" />
3
3
 
4
4
  declare module 'virtual:i18n-micro/config' {
@@ -14,4 +14,4 @@
14
14
  missingWarn: boolean | null;
15
15
  }
16
16
  }
17
- `})}}}}function A(t){return new v(t)}function _(t,e){if(j.existsSync(t))for(const o of j.readdirSync(t)){const n=T.join(t,o);if(j.statSync(n).isDirectory()){_(n,e);continue}o.endsWith(".json")&&e(n)}}function N(t){const{translationDir:e,rootDir:o=process.cwd(),disablePageLocales:n=!1}=t,s=T.resolve(o,e);if(!j.existsSync(s))return console.warn(`[i18n] Translation directory not found: ${s}`),{root:{},routes:{}};const c={root:{},routes:{}};return _(s,u=>{const a=T.relative(s,u).split(T.sep).join("/");try{const r=j.readFileSync(u,"utf-8"),i=JSON.parse(r);D.storeLoadedTranslationFile(c,a,i,n)}catch(r){console.error(`[i18n] Failed to load translation file: ${u}`,r)}}),c}function W(t,e){const{root:o,routes:n}=N(e);for(const[s,c]of Object.entries(o))t.addTranslations(s,c,!1);for(const[s,c]of Object.entries(n))for(const[u,a]of Object.entries(c))t.addRouteTranslations(u,s,D.mergeRouteTranslationsWithRoot(o[u],a),!1)}function H(t){const{i18n:e,defaultLocale:o,locales:n,localeObjects:s,autoDetect:c=!0,redirectToDefault:u=!1,routingStrategy:a}=t,r=a||O();return async(i,l)=>{if(i.locals.locale&&i.locals.i18n)return l();const f=i.url,d=f.pathname;if(!r){const P=e.clone(o),S=d==="/"||d===""?"index":d.split("/").filter(Boolean).join("-");return P.setRoute(S),i.locals.i18n=P,i.locals.locale=o,i.locals.defaultLocale=o,i.locals.locales=s||n.map(R=>({code:R})),i.locals.currentUrl=f,l()}const g={...r,getCurrentPath:()=>d,getRoute:()=>({fullPath:f.pathname+f.search,query:Object.fromEntries(f.searchParams)})},m=d.split("/").filter(Boolean)[0],L=m!==void 0&&n.includes(m);let y;L&&m?y=m:g.getLocaleFromPath?y=g.getLocaleFromPath(d,o,n):y=o;const h=e.clone(y),b=g.getRouteName?g.getRouteName(d,n):"index";return h.setRoute(b),i.locals.i18n=h,i.locals.locale=y,i.locals.defaultLocale=o,i.locals.locales=s||n.map(P=>({code:P})),i.locals.currentUrl=f,i.locals.routingStrategy=g,l()}}function z(t,e,o,n,s,c="i18n-locale"){const u=O();let a=n;if(u?.getLocaleFromPath)a=u.getLocaleFromPath(t,n,s);else{const i=t.split("/").filter(Boolean)[0];i&&s.includes(i)&&(a=i)}if(c!==null&&a===n&&e.get(c)){const r=e.get(c)?.value;r&&s.includes(r)&&(a=r)}if(a===n)try{const r=M.detectLocaleFromAcceptLanguage(o.get("accept-language")??void 0,s);r&&(a=r)}catch{}return a}function U(t,e,o){const n=t.map(l=>l.code),s=(l,f=[])=>{const d=l.replace(/^\//,"").replace(/\/$/,"");if(!d)return"index";const g=d.split("/").filter(Boolean),p=g[0];return p&&f.includes(p)&&g.shift(),g.length===0?"index":g.join("-")},c=(l,f="en",d=[])=>{const p=l.split("/").filter(Boolean)[0];return p&&d.includes(p)?p:f},u=(l,f,d=[],g)=>{const p=l.split("/").filter(Boolean),m=p[0];return m&&d.includes(m)&&p.shift(),(f!==g||g===void 0)&&p.unshift(f),`/${p.join("/")}`},a=(l,f,d=[],g)=>{const m=(l.replace(/^\//,"").replace(/\/$/,"")||"").split("/").filter(Boolean),L=m[0];return L&&d.includes(L)&&m.shift(),(f!==g||g===void 0)&&m.unshift(f),`/${m.join("/")}`};return{getCurrentPath:()=>o?o().pathname:typeof window<"u"?window.location.pathname:"/",getRouteName:s,getLocaleFromPath:c,switchLocalePath:u,localizePath:a,removeLocaleFromPath:(l,f=[])=>{const d=l.split("/").filter(Boolean),g=d[0];return g&&f.includes(g)&&d.shift(),`/${d.join("/")}`},resolvePath:(l,f)=>{const d=typeof l=="string"?l:l.path||"/";return a(d,f,n,e)},getRoute:()=>{if(o){const l=o();return{fullPath:l.pathname+l.search,query:Object.fromEntries(l.searchParams)}}if(typeof window<"u"){const l=new URL(window.location.href);return{fullPath:l.pathname+l.search,query:Object.fromEntries(l.searchParams)}}return{fullPath:"/",query:{}}},push:l=>{typeof window<"u"&&(window.location.href=l.path)},replace:l=>{typeof window<"u"&&window.location.replace(l.path)}}}function x(t,e=[]){const o=t.replace(/^\//,"").replace(/\/$/,"");if(!o)return"index";const n=o.split("/").filter(Boolean),s=n[0];return s&&e.includes(s)&&n.shift(),n.length===0?"index":n.join("-")}function E(t,e="en",o=[]){const s=t.split("/").filter(Boolean)[0];return s&&o.includes(s)?s:e}function J(t,e,o=[],n){const s=t.split("/").filter(Boolean),c=s[0];return c&&o.includes(c)&&s.shift(),(e!==n||n===void 0)&&s.unshift(e),`/${s.join("/")}`}function V(t,e,o=[],n){const c=(t.replace(/^\//,"").replace(/\/$/,"")||"").split("/").filter(Boolean),u=c[0];return u&&o.includes(u)&&c.shift(),(e!==n||n===void 0)&&c.unshift(e),`/${c.join("/")}`}function G(t,e=[]){const o=t.split("/").filter(Boolean),n=o[0];return n&&e.includes(n)&&o.shift(),`/${o.join("/")}`}function F(t){const e=t.locals.i18n;if(!e)throw new Error("i18n instance not found. Make sure i18n middleware is configured.");return e}function $(t){return t.locals.locale||"en"}function k(t){return t.locals.defaultLocale||"en"}function I(t){return t.locals.locales||[]}function C(t){return t.locals.routingStrategy||null}function K(t){const e=F(t),o=$(t),n=k(t),s=I(t),c=s.map(a=>a.code),u=C(t);return{locale:o,defaultLocale:n,locales:s,t:(a,r,i,l)=>e.t(a,r,i,l),ts:(a,r,i,l)=>e.ts(a,r,i,l),tc:(a,r,i)=>e.tc(a,r,i),tn:(a,r)=>e.tn(a,r),td:(a,r)=>e.td(a,r),tdr:(a,r)=>e.tdr(a,r),has:(a,r)=>e.has(a,r),getRoute:()=>e.getRoute(),getRouteName:a=>{const r=a||t.url.pathname;if(u?.getRouteName)return u.getRouteName(r,c);const i=r.replace(/^\//,"").replace(/\/$/,"");if(!i)return"index";const l=i.split("/").filter(Boolean),f=l[0];return f&&c.includes(f)&&l.shift(),l.length===0?"index":l.join("-")},getLocaleFromPath:a=>{const r=a||t.url.pathname;if(u?.getLocaleFromPath)return u.getLocaleFromPath(r,n,c);const l=r.split("/").filter(Boolean)[0];return l&&c.includes(l)?l:n},switchLocalePath:a=>{if(u?.switchLocalePath)return u.switchLocalePath(t.url.pathname,a,c,n);const r=t.url.pathname.split("/").filter(Boolean),i=r[0];return i&&c.includes(i)&&r.shift(),a!==n&&r.unshift(a),`/${r.join("/")}`},localizePath:(a,r)=>{if(u?.localizePath)return u.localizePath(a,r||o,c,n);const l=(a.replace(/^\//,"").replace(/\/$/,"")||"").split("/").filter(Boolean),f=l[0];return f&&c.includes(f)&&l.shift(),r&&r!==n&&l.unshift(r),`/${l.join("/")}`},getI18n:()=>e,getBasePath:a=>{const l=(a||t.url).pathname.split("/").filter(Boolean),f=l[0];return f&&c.includes(f)&&l.shift(),l.length>0?`/${l.join("/")}`:"/"},addTranslations:(a,r,i=!0)=>{e.addTranslations(a,r,i)},addRouteTranslations:(a,r,i,l=!0)=>{e.addRouteTranslations(a,r,i,l)},mergeTranslations:(a,r,i)=>{e.mergeTranslations(a,r,i)},clearCache:()=>{e.clearCache()}}}function Q(t,e={}){const{baseUrl:o="/",addDirAttribute:n=!0,addSeoAttributes:s=!0}=e,c=$(t),u=k(t),r=I(t).filter(h=>!h.disabled),i=r.filter(h=>h.seo!==!1),l=r.find(h=>h.code===c);if(!l)return{htmlAttrs:{},link:[],meta:[]};const f=l.iso||c,d=l.dir||"auto",g={htmlAttrs:{lang:f,...n?{dir:d}:{}},link:[],meta:[]};if(!s)return g;const p=`${o}${t.url.pathname}`;g.link.push({rel:"canonical",href:p});const m=C(t),L=r.map(h=>h.code);for(const h of i){let b=t.url.pathname;if(m?.switchLocalePath)b=m.switchLocalePath(t.url.pathname,h.code,L,u);else{const S=t.url.pathname.split("/").filter(Boolean),R=S[0];R&&L.includes(R)&&S.shift(),h.code!==u&&S.unshift(h.code),b=`/${S.join("/")}`}const P=`${o}${b}`;g.link.push({rel:"alternate",href:P,hreflang:h.code}),h.iso&&h.iso!==h.code&&g.link.push({rel:"alternate",href:P,hreflang:h.iso})}if(r.find(h=>h.code===u)?.seo!==!1){let h=t.url.pathname;if(m?.switchLocalePath)h=m.switchLocalePath(t.url.pathname,u,L,u);else{const b=t.url.pathname.split("/").filter(Boolean),P=b[0];P&&L.includes(P)&&b.shift(),h=`/${b.join("/")}`}g.link.push({rel:"alternate",href:`${o}${h}`,hreflang:"x-default"})}g.meta.push({property:"og:locale",content:f}),g.meta.push({property:"og:url",content:p});for(const h of i)h.code!==c&&g.meta.push({property:"og:locale:alternate",content:h.og||h.iso||h.code});return g}function X(t,e,o){const n=e.split(".");let s=t;for(let u=0;u<n.length-1;u++){const a=n[u];s[a]||(s[a]={}),s=s[a]}const c=n[n.length-1];c!==void 0&&(s[c]=o)}function Y(t,e){const o=F(t),n=$(t),s=k(t),c=o.getRoute(),u={};if(e&&e.length>0){const a={};for(const r of e){const i=o.t(r,void 0,void 0,c);i!=null&&i!==r&&X(a,r,i)}Object.keys(a).length>0&&(u[c]=a)}else{const a=o.getRouteTranslations(n,c);a&&(u[c]=a)}return{locale:n,fallbackLocale:s,currentRoute:c,translations:u}}Object.defineProperty(exports,"FormatService",{enumerable:!0,get:()=>w.FormatService});Object.defineProperty(exports,"defaultPlural",{enumerable:!0,get:()=>w.defaultPlural});Object.defineProperty(exports,"interpolate",{enumerable:!0,get:()=>w.interpolate});exports.AstroI18n=v;exports.createAstroRouterAdapter=U;exports.createI18n=A;exports.createI18nMiddleware=H;exports.detectLocale=z;exports.getDefaultLocale=k;exports.getI18n=F;exports.getI18nProps=Y;exports.getLocale=$;exports.getLocaleFromPath=E;exports.getLocales=I;exports.getRouteName=x;exports.i18nIntegration=q;exports.loadTranslationsFromDir=N;exports.loadTranslationsIntoI18n=W;exports.localizePath=V;exports.removeLocaleFromPath=G;exports.switchLocalePath=J;exports.useI18n=K;exports.useLocaleHead=Q;
17
+ `})}}}}function A(a){return new v(a)}function B(a,e){if(T.existsSync(a))for(const l of T.readdirSync(a)){const r=R.join(a,l);if(T.statSync(r).isDirectory()){B(r,e);continue}l.endsWith(".json")&&e(r)}}function C(a){const{translationDir:e,rootDir:l=process.cwd(),disablePageLocales:r=!1}=a,c=R.resolve(l,e);if(!T.existsSync(c))return console.warn(`[i18n] Translation directory not found: ${c}`),{root:{},routes:{}};const i={root:{},routes:{}};return B(c,u=>{const t=R.relative(c,u).split(R.sep).join("/");try{const o=T.readFileSync(u,"utf-8"),s=JSON.parse(o);F.storeLoadedTranslationFile(i,t,s,r)}catch(o){console.error(`[i18n] Failed to load translation file: ${u}`,o)}}),i}function W(a,e){const{root:l,routes:r}=C(e);for(const[c,i]of Object.entries(l))a.addTranslations(c,i,!1);for(const[c,i]of Object.entries(r))for(const[u,t]of Object.entries(i))a.addRouteTranslations(u,c,F.mergeRouteTranslationsWithRoot(l[u],t),!1)}function H(a){const{i18n:e,defaultLocale:l,locales:r,localeObjects:c,autoDetect:i=!0,redirectToDefault:u=!1,routingStrategy:t}=a,o=t||_();return async(s,n)=>{if(s.locals.locale&&s.locals.i18n)return n();const f=s.url,h=f.pathname;if(!o){const P=e.clone(l),S=h==="/"||h===""?"index":h.split("/").filter(Boolean).join("-");return P.setRoute(S),s.locals.i18n=P,s.locals.locale=l,s.locals.defaultLocale=l,s.locals.locales=c||r.map(w=>({code:w})),s.locals.currentUrl=f,n()}const g={...o,getCurrentPath:()=>h,getRoute:()=>({fullPath:f.pathname+f.search,query:Object.fromEntries(f.searchParams)})},m=h.split("/").filter(Boolean)[0],L=m!==void 0&&r.includes(m);let y;L&&m?y=m:g.getLocaleFromPath?y=g.getLocaleFromPath(h,l,r):y=l;const d=e.clone(y),b=g.getRouteName?g.getRouteName(h,r):"index";return d.setRoute(b),s.locals.i18n=d,s.locals.locale=y,s.locals.defaultLocale=l,s.locals.locales=c||r.map(P=>({code:P})),s.locals.currentUrl=f,s.locals.routingStrategy=g,n()}}function U(a,e,l,r,c,i="i18n-locale"){const u=_();let t=r;if(u?.getLocaleFromPath)t=u.getLocaleFromPath(a,r,c);else{const s=a.split("/").filter(Boolean)[0];s&&c.includes(s)&&(t=s)}if(i!==null&&t===r&&e.get(i)){const o=e.get(i)?.value;o&&c.includes(o)&&(t=o)}if(t===r)try{const o=N.detectLocaleFromAcceptLanguage(l.get("accept-language")??void 0,c);o&&(t=o)}catch{}return t}function z(a,e,l){const r=a.map(n=>n.code),c=(n,f=[])=>{const h=n.replace(/^\//,"").replace(/\/$/,"");if(!h)return"index";const g=h.split("/").filter(Boolean),p=g[0];return p&&f.includes(p)&&g.shift(),g.length===0?"index":g.join("-")},i=(n,f="en",h=[])=>{const p=n.split("/").filter(Boolean)[0];return p&&h.includes(p)?p:f},u=(n,f,h=[],g)=>{const p=n.split("/").filter(Boolean),m=p[0];return m&&h.includes(m)&&p.shift(),(f!==g||g===void 0)&&p.unshift(f),`/${p.join("/")}`},t=(n,f,h=[],g)=>{const m=(n.replace(/^\//,"").replace(/\/$/,"")||"").split("/").filter(Boolean),L=m[0];return L&&h.includes(L)&&m.shift(),(f!==g||g===void 0)&&m.unshift(f),`/${m.join("/")}`};return{getCurrentPath:()=>l?l().pathname:typeof window<"u"?window.location.pathname:"/",getRouteName:c,getLocaleFromPath:i,switchLocalePath:u,localizePath:t,removeLocaleFromPath:(n,f=[])=>{const h=n.split("/").filter(Boolean),g=h[0];return g&&f.includes(g)&&h.shift(),`/${h.join("/")}`},resolvePath:(n,f)=>{const h=typeof n=="string"?n:n.path||"/";return t(h,f,r,e)},getRoute:()=>{if(l){const n=l();return{fullPath:n.pathname+n.search,query:Object.fromEntries(n.searchParams)}}if(typeof window<"u"){const n=new URL(window.location.href);return{fullPath:n.pathname+n.search,query:Object.fromEntries(n.searchParams)}}return{fullPath:"/",query:{}}},push:n=>{typeof window<"u"&&(window.location.href=n.path)},replace:n=>{typeof window<"u"&&window.location.replace(n.path)}}}function D(a){const e=a.locals.i18n;if(!e)throw new Error("i18n instance not found. Make sure i18n middleware is configured.");return e}function k(a){return a.locals.locale||"en"}function I(a){return a.locals.defaultLocale||"en"}function $(a){return a.locals.locales||[]}function M(a){return a.locals.routingStrategy||null}function E(a){const e=D(a),l=k(a),r=I(a),c=$(a),i=c.map(t=>t.code),u=M(a);return{locale:l,defaultLocale:r,locales:c,t:(t,o,s,n)=>e.t(t,o,s,n),ts:(t,o,s,n)=>e.ts(t,o,s,n),tc:(t,o,s)=>e.tc(t,o,s),tn:(t,o)=>e.tn(t,o),td:(t,o)=>e.td(t,o),tdr:(t,o)=>e.tdr(t,o),has:(t,o)=>e.has(t,o),getRoute:()=>e.getRoute(),getRouteName:t=>{const o=t||a.url.pathname;if(u?.getRouteName)return u.getRouteName(o,i);const s=o.replace(/^\//,"").replace(/\/$/,"");if(!s)return"index";const n=s.split("/").filter(Boolean),f=n[0];return f&&i.includes(f)&&n.shift(),n.length===0?"index":n.join("-")},getLocaleFromPath:t=>{const o=t||a.url.pathname;if(u?.getLocaleFromPath)return u.getLocaleFromPath(o,r,i);const n=o.split("/").filter(Boolean)[0];return n&&i.includes(n)?n:r},switchLocalePath:t=>{if(u?.switchLocalePath)return u.switchLocalePath(a.url.pathname,t,i,r);const o=a.url.pathname.split("/").filter(Boolean),s=o[0];return s&&i.includes(s)&&o.shift(),t!==r&&o.unshift(t),`/${o.join("/")}`},localizePath:(t,o)=>{if(u?.localizePath)return u.localizePath(t,o||l,i,r);const n=(t.replace(/^\//,"").replace(/\/$/,"")||"").split("/").filter(Boolean),f=n[0];return f&&i.includes(f)&&n.shift(),o&&o!==r&&n.unshift(o),`/${n.join("/")}`},getI18n:()=>e,getBasePath:t=>{const n=(t||a.url).pathname.split("/").filter(Boolean),f=n[0];return f&&i.includes(f)&&n.shift(),n.length>0?`/${n.join("/")}`:"/"},addTranslations:(t,o,s=!0)=>{e.addTranslations(t,o,s)},addRouteTranslations:(t,o,s,n=!0)=>{e.addRouteTranslations(t,o,s,n)},mergeTranslations:(t,o,s)=>{e.mergeTranslations(t,o,s)},clearCache:()=>{e.clearCache()}}}function x(a,e={}){const{baseUrl:l="/",addDirAttribute:r=!0,addSeoAttributes:c=!0}=e,i=k(a),u=I(a),o=$(a).filter(d=>!d.disabled),s=o.filter(d=>d.seo!==!1),n=o.find(d=>d.code===i);if(!n)return{htmlAttrs:{},link:[],meta:[]};const f=n.iso||i,h=n.dir||"auto",g={htmlAttrs:{lang:f,...r?{dir:h}:{}},link:[],meta:[]};if(!c)return g;const p=`${l}${a.url.pathname}`;g.link.push({rel:"canonical",href:p});const m=M(a),L=o.map(d=>d.code);for(const d of s){let b=a.url.pathname;if(m?.switchLocalePath)b=m.switchLocalePath(a.url.pathname,d.code,L,u);else{const S=a.url.pathname.split("/").filter(Boolean),w=S[0];w&&L.includes(w)&&S.shift(),d.code!==u&&S.unshift(d.code),b=`/${S.join("/")}`}const P=`${l}${b}`;g.link.push({rel:"alternate",href:P,hreflang:d.code}),d.iso&&d.iso!==d.code&&g.link.push({rel:"alternate",href:P,hreflang:d.iso})}if(o.find(d=>d.code===u)?.seo!==!1){let d=a.url.pathname;if(m?.switchLocalePath)d=m.switchLocalePath(a.url.pathname,u,L,u);else{const b=a.url.pathname.split("/").filter(Boolean),P=b[0];P&&L.includes(P)&&b.shift(),d=`/${b.join("/")}`}g.link.push({rel:"alternate",href:`${l}${d}`,hreflang:"x-default"})}g.meta.push({property:"og:locale",content:f}),g.meta.push({property:"og:url",content:p});for(const d of s)d.code!==i&&g.meta.push({property:"og:locale:alternate",content:d.og||d.iso||d.code});return g}function J(a,e,l){const r=e.split(".");let c=a;for(let u=0;u<r.length-1;u++){const t=r[u];c[t]||(c[t]={}),c=c[t]}const i=r[r.length-1];i!==void 0&&(c[i]=l)}function V(a,e){const l=D(a),r=k(a),c=I(a),i=l.getRoute(),u={};if(e&&e.length>0){const t={};for(const o of e){const s=l.t(o,void 0,void 0,i);s!=null&&s!==o&&J(t,o,s)}Object.keys(t).length>0&&(u[i]=t)}else{const t=l.getRouteTranslations(r,i);t&&(u[i]=t)}return{locale:r,fallbackLocale:c,currentRoute:i,translations:u}}Object.defineProperty(exports,"FormatService",{enumerable:!0,get:()=>j.FormatService});Object.defineProperty(exports,"defaultPlural",{enumerable:!0,get:()=>j.defaultPlural});Object.defineProperty(exports,"interpolate",{enumerable:!0,get:()=>j.interpolate});exports.AstroI18n=v;exports.createAstroRouterAdapter=z;exports.createI18n=A;exports.createI18nMiddleware=H;exports.detectLocale=U;exports.getDefaultLocale=I;exports.getI18n=D;exports.getI18nProps=V;exports.getLocale=k;exports.getLocales=$;exports.i18nIntegration=q;exports.loadTranslationsFromDir=C;exports.loadTranslationsIntoI18n=W;exports.useI18n=E;exports.useLocaleHead=x;
package/dist/index.d.cts CHANGED
@@ -1,14 +1,13 @@
1
1
  export { defaultPlural, FormatService, interpolate } from '@i18n-micro/core';
2
- export type { CleanTranslation, Getter, Locale, LocaleCode, Params, PluralFunc, Translations, } from '@i18n-micro/types';
2
+ export type { CleanTranslation, Getter, Locale, LocaleCode, Params, PluralFunc, Translations } from '@i18n-micro/types';
3
3
  export { AstroI18n, type AstroI18nOptions } from './composer';
4
4
  export type { I18nIntegrationOptions } from './integration';
5
5
  export { createI18n, i18nIntegration } from './integration';
6
6
  export type { LoadedTranslations, LoadTranslationsOptions } from './load-translations';
7
- export { loadTranslationsFromDir, loadTranslationsIntoI18n, } from './load-translations';
7
+ export { loadTranslationsFromDir, loadTranslationsIntoI18n } from './load-translations';
8
8
  export type { I18nMiddlewareOptions } from './middleware';
9
9
  export { createI18nMiddleware, detectLocale } from './middleware';
10
10
  export { createAstroRouterAdapter } from './router/adapter';
11
11
  export type { I18nRoutingStrategy } from './router/types';
12
- export { getLocaleFromPath, getRouteName, localizePath, removeLocaleFromPath, switchLocalePath, } from './routing';
13
12
  export type { I18nClientProps, LocaleHeadOptions, LocaleHeadResult } from './utils';
14
- export { getDefaultLocale, getI18n, getI18nProps, getLocale, getLocales, useI18n, useLocaleHead, } from './utils';
13
+ export { getDefaultLocale, getI18n, getI18nProps, getLocale, getLocales, useI18n, useLocaleHead } from './utils';
package/dist/index.d.ts CHANGED
@@ -1,14 +1,13 @@
1
1
  export { defaultPlural, FormatService, interpolate } from '@i18n-micro/core';
2
- export type { CleanTranslation, Getter, Locale, LocaleCode, Params, PluralFunc, Translations, } from '@i18n-micro/types';
2
+ export type { CleanTranslation, Getter, Locale, LocaleCode, Params, PluralFunc, Translations } from '@i18n-micro/types';
3
3
  export { AstroI18n, type AstroI18nOptions } from './composer';
4
4
  export type { I18nIntegrationOptions } from './integration';
5
5
  export { createI18n, i18nIntegration } from './integration';
6
6
  export type { LoadedTranslations, LoadTranslationsOptions } from './load-translations';
7
- export { loadTranslationsFromDir, loadTranslationsIntoI18n, } from './load-translations';
7
+ export { loadTranslationsFromDir, loadTranslationsIntoI18n } from './load-translations';
8
8
  export type { I18nMiddlewareOptions } from './middleware';
9
9
  export { createI18nMiddleware, detectLocale } from './middleware';
10
10
  export { createAstroRouterAdapter } from './router/adapter';
11
11
  export type { I18nRoutingStrategy } from './router/types';
12
- export { getLocaleFromPath, getRouteName, localizePath, removeLocaleFromPath, switchLocalePath, } from './routing';
13
12
  export type { I18nClientProps, LocaleHeadOptions, LocaleHeadResult } from './utils';
14
- export { getDefaultLocale, getI18n, getI18nProps, getLocale, getLocales, useI18n, useLocaleHead, } from './utils';
13
+ export { getDefaultLocale, getI18n, getI18nProps, getLocale, getLocales, useI18n, useLocaleHead } from './utils';
package/dist/index.mjs CHANGED
@@ -1,40 +1,40 @@
1
1
  import { BaseI18n as O } from "@i18n-micro/core";
2
- import { FormatService as he, defaultPlural as de, interpolate as me } from "@i18n-micro/core";
3
- import { existsSync as v, readdirSync as _, statSync as C, readFileSync as N } from "node:fs";
2
+ import { FormatService as ie, defaultPlural as ce, interpolate as ue } from "@i18n-micro/core";
3
+ import { existsSync as k, readdirSync as _, statSync as C, readFileSync as N } from "node:fs";
4
4
  import { resolve as M, join as W, relative as A, sep as q } from "node:path";
5
- import { mergeRouteTranslationsWithRoot as H, storeLoadedTranslationFile as x } from "@i18n-micro/utils/parse-path";
5
+ import { mergeRouteTranslationsWithRoot as H, storeLoadedTranslationFile as U } from "@i18n-micro/utils/parse-path";
6
6
  import { detectLocaleFromAcceptLanguage as z } from "@i18n-micro/utils/accept-language";
7
- class j extends O {
7
+ class R extends O {
8
8
  constructor(e) {
9
- const o = e._storage || {
9
+ const l = e._storage || {
10
10
  translations: /* @__PURE__ */ new Map()
11
11
  };
12
12
  if (super({
13
- storage: o,
13
+ storage: l,
14
14
  plural: e.plural,
15
15
  missingWarn: e.missingWarn,
16
16
  missingHandler: e.missingHandler
17
- }), this.initialMessages = {}, this.storage = o, this._locale = e.locale, this._fallbackLocale = e.fallbackLocale || e.locale, this._currentRoute = "index", e.messages) {
17
+ }), this.initialMessages = {}, this.storage = l, this._locale = e.locale, this._fallbackLocale = e.fallbackLocale || e.locale, this._currentRoute = "index", e.messages) {
18
18
  this.initialMessages = { ...e.messages };
19
- for (const [n, r] of Object.entries(e.messages))
20
- this.helper.loadTranslations(n, r);
19
+ for (const [r, i] of Object.entries(e.messages))
20
+ this.helper.loadTranslations(r, i);
21
21
  }
22
22
  }
23
23
  cloneStorage(e) {
24
- const o = /* @__PURE__ */ new Map();
25
- for (const [n, r] of e.translations)
26
- o.set(n, { ...r });
27
- return { translations: o };
24
+ const l = /* @__PURE__ */ new Map();
25
+ for (const [r, i] of e.translations)
26
+ l.set(r, { ...i });
27
+ return { translations: l };
28
28
  }
29
29
  clone(e) {
30
- const o = this.cloneStorage(this.storage);
31
- return new j({
30
+ const l = this.cloneStorage(this.storage);
31
+ return new R({
32
32
  locale: e || this._locale,
33
33
  fallbackLocale: this._fallbackLocale,
34
34
  plural: this.pluralFunc,
35
35
  missingWarn: this.missingWarn,
36
36
  missingHandler: this.missingHandler,
37
- _storage: o
37
+ _storage: l
38
38
  });
39
39
  }
40
40
  get locale() {
@@ -61,60 +61,60 @@ class j extends O {
61
61
  getRoute() {
62
62
  return this._currentRoute;
63
63
  }
64
- getRouteTranslations(e, o) {
65
- const n = `${e}:${o}`;
66
- return this.storage.translations.get(n) ?? null;
64
+ getRouteTranslations(e, l) {
65
+ const r = `${e}:${l}`;
66
+ return this.storage.translations.get(r) ?? null;
67
67
  }
68
- addTranslations(e, o, n = !0) {
69
- super.loadTranslationsCore(e, o, n);
68
+ addTranslations(e, l, r = !0) {
69
+ super.loadTranslationsCore(e, l, r);
70
70
  }
71
- addRouteTranslations(e, o, n, r = !0) {
72
- super.loadRouteTranslationsCore(e, o, n, r);
71
+ addRouteTranslations(e, l, r, i = !0) {
72
+ super.loadRouteTranslationsCore(e, l, r, i);
73
73
  }
74
- mergeTranslations(e, o, n) {
75
- this.helper.mergeTranslation(e, o, n, !0);
74
+ mergeTranslations(e, l, r) {
75
+ this.helper.mergeTranslation(e, l, r, !0);
76
76
  }
77
77
  clearCache() {
78
78
  const e = { ...this.initialMessages };
79
79
  if (super.clearCache(), Object.keys(e).length > 0)
80
- for (const [o, n] of Object.entries(e))
81
- this.helper.loadTranslations(o, n);
80
+ for (const [l, r] of Object.entries(e))
81
+ this.helper.loadTranslations(l, r);
82
82
  }
83
83
  }
84
- let $ = null;
85
- function k() {
86
- return $;
84
+ let v = null;
85
+ function $() {
86
+ return v;
87
87
  }
88
- function X(t) {
89
- const { locale: e, fallbackLocale: o, translationDir: n, routingStrategy: r } = t;
90
- return $ = r || null, {
88
+ function X(o) {
89
+ const { locale: e, fallbackLocale: l, translationDir: r, routingStrategy: i } = o;
90
+ return v = i || null, {
91
91
  name: "@i18n-micro/astro",
92
92
  hooks: {
93
93
  // 1. Vite setup (virtual module) happens here
94
94
  "astro:config:setup": (c) => {
95
- const { updateConfig: u } = c, a = "virtual:i18n-micro/config", s = `\0${a}`, i = {
95
+ const { updateConfig: u } = c, t = "virtual:i18n-micro/config", a = `\0${t}`, s = {
96
96
  defaultLocale: e,
97
- fallbackLocale: o || e,
98
- locales: t.locales || [],
99
- localeCodes: (t.locales || []).map((l) => l.code),
100
- translationDir: n || null,
101
- autoDetect: t.autoDetect ?? !0,
102
- redirectToDefault: t.redirectToDefault ?? !1,
103
- localeCookie: t.localeCookie === null ? null : t.localeCookie || "i18n-locale",
104
- missingWarn: t.missingWarn ?? !1
97
+ fallbackLocale: l || e,
98
+ locales: o.locales || [],
99
+ localeCodes: (o.locales || []).map((n) => n.code),
100
+ translationDir: r || null,
101
+ autoDetect: o.autoDetect ?? !0,
102
+ redirectToDefault: o.redirectToDefault ?? !1,
103
+ localeCookie: o.localeCookie === null ? null : o.localeCookie || "i18n-locale",
104
+ missingWarn: o.missingWarn ?? !1
105
105
  };
106
106
  u({
107
107
  vite: {
108
108
  plugins: [
109
109
  {
110
110
  name: "vite-plugin-i18n-micro-config",
111
- resolveId(l) {
112
- if (l === a)
113
- return s;
111
+ resolveId(n) {
112
+ if (n === t)
113
+ return a;
114
114
  },
115
- load(l) {
116
- if (l === s)
117
- return `export const config = ${JSON.stringify(i)}`;
115
+ load(n) {
116
+ if (n === a)
117
+ return `export const config = ${JSON.stringify(s)}`;
118
118
  }
119
119
  }
120
120
  ]
@@ -148,141 +148,141 @@ function X(t) {
148
148
  }
149
149
  };
150
150
  }
151
- function Y(t) {
152
- return new j(t);
151
+ function Y(o) {
152
+ return new R(o);
153
153
  }
154
- function D(t, e) {
155
- if (v(t))
156
- for (const o of _(t)) {
157
- const n = W(t, o);
158
- if (C(n).isDirectory()) {
159
- D(n, e);
154
+ function D(o, e) {
155
+ if (k(o))
156
+ for (const l of _(o)) {
157
+ const r = W(o, l);
158
+ if (C(r).isDirectory()) {
159
+ D(r, e);
160
160
  continue;
161
161
  }
162
- o.endsWith(".json") && e(n);
162
+ l.endsWith(".json") && e(r);
163
163
  }
164
164
  }
165
- function U(t) {
166
- const { translationDir: e, rootDir: o = process.cwd(), disablePageLocales: n = !1 } = t, r = M(o, e);
167
- if (!v(r))
168
- return console.warn(`[i18n] Translation directory not found: ${r}`), { root: {}, routes: {} };
165
+ function E(o) {
166
+ const { translationDir: e, rootDir: l = process.cwd(), disablePageLocales: r = !1 } = o, i = M(l, e);
167
+ if (!k(i))
168
+ return console.warn(`[i18n] Translation directory not found: ${i}`), { root: {}, routes: {} };
169
169
  const c = { root: {}, routes: {} };
170
- return D(r, (u) => {
171
- const a = A(r, u).split(q).join("/");
170
+ return D(i, (u) => {
171
+ const t = A(i, u).split(q).join("/");
172
172
  try {
173
- const s = N(u, "utf-8"), i = JSON.parse(s);
174
- x(c, a, i, n);
175
- } catch (s) {
176
- console.error(`[i18n] Failed to load translation file: ${u}`, s);
173
+ const a = N(u, "utf-8"), s = JSON.parse(a);
174
+ U(c, t, s, r);
175
+ } catch (a) {
176
+ console.error(`[i18n] Failed to load translation file: ${u}`, a);
177
177
  }
178
178
  }), c;
179
179
  }
180
- function Z(t, e) {
181
- const { root: o, routes: n } = U(e);
182
- for (const [r, c] of Object.entries(o))
183
- t.addTranslations(r, c, !1);
184
- for (const [r, c] of Object.entries(n))
185
- for (const [u, a] of Object.entries(c))
186
- t.addRouteTranslations(u, r, H(o[u], a), !1);
180
+ function Z(o, e) {
181
+ const { root: l, routes: r } = E(e);
182
+ for (const [i, c] of Object.entries(l))
183
+ o.addTranslations(i, c, !1);
184
+ for (const [i, c] of Object.entries(r))
185
+ for (const [u, t] of Object.entries(c))
186
+ o.addRouteTranslations(u, i, H(l[u], t), !1);
187
187
  }
188
- function ee(t) {
188
+ function ee(o) {
189
189
  const {
190
190
  i18n: e,
191
191
  // This is the global singleton with cache
192
- defaultLocale: o,
193
- locales: n,
194
- localeObjects: r,
192
+ defaultLocale: l,
193
+ locales: r,
194
+ localeObjects: i,
195
195
  autoDetect: c = !0,
196
196
  redirectToDefault: u = !1,
197
- routingStrategy: a
198
- } = t, s = a || k();
199
- return async (i, l) => {
200
- if (i.locals.locale && i.locals.i18n)
201
- return l();
202
- const f = i.url, d = f.pathname;
203
- if (!s) {
204
- const P = e.clone(o), y = d === "/" || d === "" ? "index" : d.split("/").filter(Boolean).join("-");
205
- return P.setRoute(y), i.locals.i18n = P, i.locals.locale = o, i.locals.defaultLocale = o, i.locals.locales = r || n.map((R) => ({ code: R })), i.locals.currentUrl = f, l();
197
+ routingStrategy: t
198
+ } = o, a = t || $();
199
+ return async (s, n) => {
200
+ if (s.locals.locale && s.locals.i18n)
201
+ return n();
202
+ const f = s.url, d = f.pathname;
203
+ if (!a) {
204
+ const L = e.clone(l), S = d === "/" || d === "" ? "index" : d.split("/").filter(Boolean).join("-");
205
+ return L.setRoute(S), s.locals.i18n = L, s.locals.locale = l, s.locals.defaultLocale = l, s.locals.locales = i || r.map((w) => ({ code: w })), s.locals.currentUrl = f, n();
206
206
  }
207
207
  const g = {
208
- ...s,
208
+ ...a,
209
209
  getCurrentPath: () => d,
210
210
  getRoute: () => ({
211
211
  fullPath: f.pathname + f.search,
212
212
  query: Object.fromEntries(f.searchParams)
213
213
  })
214
- }, m = d.split("/").filter(Boolean)[0], L = m !== void 0 && n.includes(m);
215
- let b;
216
- L && m ? b = m : g.getLocaleFromPath ? b = g.getLocaleFromPath(d, o, n) : b = o;
217
- const h = e.clone(b), S = g.getRouteName ? g.getRouteName(d, n) : "index";
218
- return h.setRoute(S), i.locals.i18n = h, i.locals.locale = b, i.locals.defaultLocale = o, i.locals.locales = r || n.map((P) => ({ code: P })), i.locals.currentUrl = f, i.locals.routingStrategy = g, l();
214
+ }, m = d.split("/").filter(Boolean)[0], P = m !== void 0 && r.includes(m);
215
+ let y;
216
+ P && m ? y = m : g.getLocaleFromPath ? y = g.getLocaleFromPath(d, l, r) : y = l;
217
+ const h = e.clone(y), b = g.getRouteName ? g.getRouteName(d, r) : "index";
218
+ return h.setRoute(b), s.locals.i18n = h, s.locals.locale = y, s.locals.defaultLocale = l, s.locals.locales = i || r.map((L) => ({ code: L })), s.locals.currentUrl = f, s.locals.routingStrategy = g, n();
219
219
  };
220
220
  }
221
- function te(t, e, o, n, r, c = "i18n-locale") {
222
- const u = k();
223
- let a = n;
221
+ function te(o, e, l, r, i, c = "i18n-locale") {
222
+ const u = $();
223
+ let t = r;
224
224
  if (u?.getLocaleFromPath)
225
- a = u.getLocaleFromPath(t, n, r);
225
+ t = u.getLocaleFromPath(o, r, i);
226
226
  else {
227
- const i = t.split("/").filter(Boolean)[0];
228
- i && r.includes(i) && (a = i);
227
+ const s = o.split("/").filter(Boolean)[0];
228
+ s && i.includes(s) && (t = s);
229
229
  }
230
- if (c !== null && a === n && e.get(c)) {
231
- const s = e.get(c)?.value;
232
- s && r.includes(s) && (a = s);
230
+ if (c !== null && t === r && e.get(c)) {
231
+ const a = e.get(c)?.value;
232
+ a && i.includes(a) && (t = a);
233
233
  }
234
- if (a === n)
234
+ if (t === r)
235
235
  try {
236
- const s = z(o.get("accept-language") ?? void 0, r);
237
- s && (a = s);
236
+ const a = z(l.get("accept-language") ?? void 0, i);
237
+ a && (t = a);
238
238
  } catch {
239
239
  }
240
- return a;
240
+ return t;
241
241
  }
242
- function ne(t, e, o) {
243
- const n = t.map((l) => l.code), r = (l, f = []) => {
244
- const d = l.replace(/^\//, "").replace(/\/$/, "");
242
+ function ne(o, e, l) {
243
+ const r = o.map((n) => n.code), i = (n, f = []) => {
244
+ const d = n.replace(/^\//, "").replace(/\/$/, "");
245
245
  if (!d)
246
246
  return "index";
247
247
  const g = d.split("/").filter(Boolean), p = g[0];
248
248
  return p && f.includes(p) && g.shift(), g.length === 0 ? "index" : g.join("-");
249
- }, c = (l, f = "en", d = []) => {
250
- const p = l.split("/").filter(Boolean)[0];
249
+ }, c = (n, f = "en", d = []) => {
250
+ const p = n.split("/").filter(Boolean)[0];
251
251
  return p && d.includes(p) ? p : f;
252
- }, u = (l, f, d = [], g) => {
253
- const p = l.split("/").filter(Boolean), m = p[0];
252
+ }, u = (n, f, d = [], g) => {
253
+ const p = n.split("/").filter(Boolean), m = p[0];
254
254
  return m && d.includes(m) && p.shift(), (f !== g || g === void 0) && p.unshift(f), `/${p.join("/")}`;
255
- }, a = (l, f, d = [], g) => {
256
- const m = (l.replace(/^\//, "").replace(/\/$/, "") || "").split("/").filter(Boolean), L = m[0];
257
- return L && d.includes(L) && m.shift(), (f !== g || g === void 0) && m.unshift(f), `/${m.join("/")}`;
255
+ }, t = (n, f, d = [], g) => {
256
+ const m = (n.replace(/^\//, "").replace(/\/$/, "") || "").split("/").filter(Boolean), P = m[0];
257
+ return P && d.includes(P) && m.shift(), (f !== g || g === void 0) && m.unshift(f), `/${m.join("/")}`;
258
258
  };
259
259
  return {
260
- getCurrentPath: () => o ? o().pathname : typeof window < "u" ? window.location.pathname : "/",
261
- getRouteName: r,
260
+ getCurrentPath: () => l ? l().pathname : typeof window < "u" ? window.location.pathname : "/",
261
+ getRouteName: i,
262
262
  getLocaleFromPath: c,
263
263
  switchLocalePath: u,
264
- localizePath: a,
265
- removeLocaleFromPath: (l, f = []) => {
266
- const d = l.split("/").filter(Boolean), g = d[0];
264
+ localizePath: t,
265
+ removeLocaleFromPath: (n, f = []) => {
266
+ const d = n.split("/").filter(Boolean), g = d[0];
267
267
  return g && f.includes(g) && d.shift(), `/${d.join("/")}`;
268
268
  },
269
- resolvePath: (l, f) => {
270
- const d = typeof l == "string" ? l : l.path || "/";
271
- return a(d, f, n, e);
269
+ resolvePath: (n, f) => {
270
+ const d = typeof n == "string" ? n : n.path || "/";
271
+ return t(d, f, r, e);
272
272
  },
273
273
  getRoute: () => {
274
- if (o) {
275
- const l = o();
274
+ if (l) {
275
+ const n = l();
276
276
  return {
277
- fullPath: l.pathname + l.search,
278
- query: Object.fromEntries(l.searchParams)
277
+ fullPath: n.pathname + n.search,
278
+ query: Object.fromEntries(n.searchParams)
279
279
  };
280
280
  }
281
281
  if (typeof window < "u") {
282
- const l = new URL(window.location.href);
282
+ const n = new URL(window.location.href);
283
283
  return {
284
- fullPath: l.pathname + l.search,
285
- query: Object.fromEntries(l.searchParams)
284
+ fullPath: n.pathname + n.search,
285
+ query: Object.fromEntries(n.searchParams)
286
286
  };
287
287
  }
288
288
  return {
@@ -291,173 +291,150 @@ function ne(t, e, o) {
291
291
  };
292
292
  },
293
293
  // Optional: client-side navigation for islands
294
- push: (l) => {
295
- typeof window < "u" && (window.location.href = l.path);
294
+ push: (n) => {
295
+ typeof window < "u" && (window.location.href = n.path);
296
296
  },
297
- replace: (l) => {
298
- typeof window < "u" && window.location.replace(l.path);
297
+ replace: (n) => {
298
+ typeof window < "u" && window.location.replace(n.path);
299
299
  }
300
300
  };
301
301
  }
302
- function oe(t, e = []) {
303
- const o = t.replace(/^\//, "").replace(/\/$/, "");
304
- if (!o)
305
- return "index";
306
- const n = o.split("/").filter(Boolean), r = n[0];
307
- return r && e.includes(r) && n.shift(), n.length === 0 ? "index" : n.join("-");
308
- }
309
- function ae(t, e = "en", o = []) {
310
- const r = t.split("/").filter(Boolean)[0];
311
- return r && o.includes(r) ? r : e;
312
- }
313
- function le(t, e, o = [], n) {
314
- const r = t.split("/").filter(Boolean), c = r[0];
315
- return c && o.includes(c) && r.shift(), (e !== n || n === void 0) && r.unshift(e), `/${r.join("/")}`;
316
- }
317
- function se(t, e, o = [], n) {
318
- const c = (t.replace(/^\//, "").replace(/\/$/, "") || "").split("/").filter(Boolean), u = c[0];
319
- return u && o.includes(u) && c.shift(), (e !== n || n === void 0) && c.unshift(e), `/${c.join("/")}`;
320
- }
321
- function re(t, e = []) {
322
- const o = t.split("/").filter(Boolean), n = o[0];
323
- return n && e.includes(n) && o.shift(), `/${o.join("/")}`;
324
- }
325
- function B(t) {
326
- const e = t.locals.i18n;
302
+ function F(o) {
303
+ const e = o.locals.i18n;
327
304
  if (!e)
328
305
  throw new Error("i18n instance not found. Make sure i18n middleware is configured.");
329
306
  return e;
330
307
  }
331
- function w(t) {
332
- return t.locals.locale || "en";
308
+ function T(o) {
309
+ return o.locals.locale || "en";
333
310
  }
334
- function T(t) {
335
- return t.locals.defaultLocale || "en";
311
+ function j(o) {
312
+ return o.locals.defaultLocale || "en";
336
313
  }
337
- function F(t) {
338
- return t.locals.locales || [];
314
+ function B(o) {
315
+ return o.locals.locales || [];
339
316
  }
340
- function I(t) {
341
- return t.locals.routingStrategy || null;
317
+ function I(o) {
318
+ return o.locals.routingStrategy || null;
342
319
  }
343
- function ie(t) {
344
- const e = B(t), o = w(t), n = T(t), r = F(t), c = r.map((a) => a.code), u = I(t);
320
+ function oe(o) {
321
+ const e = F(o), l = T(o), r = j(o), i = B(o), c = i.map((t) => t.code), u = I(o);
345
322
  return {
346
323
  // Current locale
347
- locale: o,
348
- defaultLocale: n,
349
- locales: r,
324
+ locale: l,
325
+ defaultLocale: r,
326
+ locales: i,
350
327
  // Translation methods
351
- t: (a, s, i, l) => e.t(a, s, i, l),
352
- ts: (a, s, i, l) => e.ts(a, s, i, l),
353
- tc: (a, s, i) => e.tc(a, s, i),
354
- tn: (a, s) => e.tn(a, s),
355
- td: (a, s) => e.td(a, s),
356
- tdr: (a, s) => e.tdr(a, s),
357
- has: (a, s) => e.has(a, s),
328
+ t: (t, a, s, n) => e.t(t, a, s, n),
329
+ ts: (t, a, s, n) => e.ts(t, a, s, n),
330
+ tc: (t, a, s) => e.tc(t, a, s),
331
+ tn: (t, a) => e.tn(t, a),
332
+ td: (t, a) => e.td(t, a),
333
+ tdr: (t, a) => e.tdr(t, a),
334
+ has: (t, a) => e.has(t, a),
358
335
  // Route management
359
336
  getRoute: () => e.getRoute(),
360
- getRouteName: (a) => {
361
- const s = a || t.url.pathname;
337
+ getRouteName: (t) => {
338
+ const a = t || o.url.pathname;
362
339
  if (u?.getRouteName)
363
- return u.getRouteName(s, c);
364
- const i = s.replace(/^\//, "").replace(/\/$/, "");
365
- if (!i) return "index";
366
- const l = i.split("/").filter(Boolean), f = l[0];
367
- return f && c.includes(f) && l.shift(), l.length === 0 ? "index" : l.join("-");
340
+ return u.getRouteName(a, c);
341
+ const s = a.replace(/^\//, "").replace(/\/$/, "");
342
+ if (!s) return "index";
343
+ const n = s.split("/").filter(Boolean), f = n[0];
344
+ return f && c.includes(f) && n.shift(), n.length === 0 ? "index" : n.join("-");
368
345
  },
369
- getLocaleFromPath: (a) => {
370
- const s = a || t.url.pathname;
346
+ getLocaleFromPath: (t) => {
347
+ const a = t || o.url.pathname;
371
348
  if (u?.getLocaleFromPath)
372
- return u.getLocaleFromPath(s, n, c);
373
- const l = s.split("/").filter(Boolean)[0];
374
- return l && c.includes(l) ? l : n;
349
+ return u.getLocaleFromPath(a, r, c);
350
+ const n = a.split("/").filter(Boolean)[0];
351
+ return n && c.includes(n) ? n : r;
375
352
  },
376
353
  // Path utilities
377
- switchLocalePath: (a) => {
354
+ switchLocalePath: (t) => {
378
355
  if (u?.switchLocalePath)
379
- return u.switchLocalePath(t.url.pathname, a, c, n);
380
- const s = t.url.pathname.split("/").filter(Boolean), i = s[0];
381
- return i && c.includes(i) && s.shift(), a !== n && s.unshift(a), `/${s.join("/")}`;
356
+ return u.switchLocalePath(o.url.pathname, t, c, r);
357
+ const a = o.url.pathname.split("/").filter(Boolean), s = a[0];
358
+ return s && c.includes(s) && a.shift(), t !== r && a.unshift(t), `/${a.join("/")}`;
382
359
  },
383
- localizePath: (a, s) => {
360
+ localizePath: (t, a) => {
384
361
  if (u?.localizePath)
385
- return u.localizePath(a, s || o, c, n);
386
- const l = (a.replace(/^\//, "").replace(/\/$/, "") || "").split("/").filter(Boolean), f = l[0];
387
- return f && c.includes(f) && l.shift(), s && s !== n && l.unshift(s), `/${l.join("/")}`;
362
+ return u.localizePath(t, a || l, c, r);
363
+ const n = (t.replace(/^\//, "").replace(/\/$/, "") || "").split("/").filter(Boolean), f = n[0];
364
+ return f && c.includes(f) && n.shift(), a && a !== r && n.unshift(a), `/${n.join("/")}`;
388
365
  },
389
366
  // Get i18n instance
390
367
  getI18n: () => e,
391
368
  // Get base path without locale (for rewrite)
392
- getBasePath: (a) => {
393
- const l = (a || t.url).pathname.split("/").filter(Boolean), f = l[0];
394
- return f && c.includes(f) && l.shift(), l.length > 0 ? `/${l.join("/")}` : "/";
369
+ getBasePath: (t) => {
370
+ const n = (t || o.url).pathname.split("/").filter(Boolean), f = n[0];
371
+ return f && c.includes(f) && n.shift(), n.length > 0 ? `/${n.join("/")}` : "/";
395
372
  },
396
373
  // Translation management
397
- addTranslations: (a, s, i = !0) => {
398
- e.addTranslations(a, s, i);
374
+ addTranslations: (t, a, s = !0) => {
375
+ e.addTranslations(t, a, s);
399
376
  },
400
- addRouteTranslations: (a, s, i, l = !0) => {
401
- e.addRouteTranslations(a, s, i, l);
377
+ addRouteTranslations: (t, a, s, n = !0) => {
378
+ e.addRouteTranslations(t, a, s, n);
402
379
  },
403
- mergeTranslations: (a, s, i) => {
404
- e.mergeTranslations(a, s, i);
380
+ mergeTranslations: (t, a, s) => {
381
+ e.mergeTranslations(t, a, s);
405
382
  },
406
383
  clearCache: () => {
407
384
  e.clearCache();
408
385
  }
409
386
  };
410
387
  }
411
- function ce(t, e = {}) {
412
- const { baseUrl: o = "/", addDirAttribute: n = !0, addSeoAttributes: r = !0 } = e, c = w(t), u = T(t), s = F(t).filter((h) => !h.disabled), i = s.filter((h) => h.seo !== !1), l = s.find((h) => h.code === c);
413
- if (!l)
388
+ function ae(o, e = {}) {
389
+ const { baseUrl: l = "/", addDirAttribute: r = !0, addSeoAttributes: i = !0 } = e, c = T(o), u = j(o), a = B(o).filter((h) => !h.disabled), s = a.filter((h) => h.seo !== !1), n = a.find((h) => h.code === c);
390
+ if (!n)
414
391
  return { htmlAttrs: {}, link: [], meta: [] };
415
- const f = l.iso || c, d = l.dir || "auto", g = {
392
+ const f = n.iso || c, d = n.dir || "auto", g = {
416
393
  htmlAttrs: {
417
394
  lang: f,
418
- ...n ? { dir: d } : {}
395
+ ...r ? { dir: d } : {}
419
396
  },
420
397
  link: [],
421
398
  meta: []
422
399
  };
423
- if (!r)
400
+ if (!i)
424
401
  return g;
425
- const p = `${o}${t.url.pathname}`;
402
+ const p = `${l}${o.url.pathname}`;
426
403
  g.link.push({
427
404
  rel: "canonical",
428
405
  href: p
429
406
  });
430
- const m = I(t), L = s.map((h) => h.code);
431
- for (const h of i) {
432
- let S = t.url.pathname;
407
+ const m = I(o), P = a.map((h) => h.code);
408
+ for (const h of s) {
409
+ let b = o.url.pathname;
433
410
  if (m?.switchLocalePath)
434
- S = m.switchLocalePath(t.url.pathname, h.code, L, u);
411
+ b = m.switchLocalePath(o.url.pathname, h.code, P, u);
435
412
  else {
436
- const y = t.url.pathname.split("/").filter(Boolean), R = y[0];
437
- R && L.includes(R) && y.shift(), h.code !== u && y.unshift(h.code), S = `/${y.join("/")}`;
413
+ const S = o.url.pathname.split("/").filter(Boolean), w = S[0];
414
+ w && P.includes(w) && S.shift(), h.code !== u && S.unshift(h.code), b = `/${S.join("/")}`;
438
415
  }
439
- const P = `${o}${S}`;
416
+ const L = `${l}${b}`;
440
417
  g.link.push({
441
418
  rel: "alternate",
442
- href: P,
419
+ href: L,
443
420
  hreflang: h.code
444
421
  }), h.iso && h.iso !== h.code && g.link.push({
445
422
  rel: "alternate",
446
- href: P,
423
+ href: L,
447
424
  hreflang: h.iso
448
425
  });
449
426
  }
450
- if (s.find((h) => h.code === u)?.seo !== !1) {
451
- let h = t.url.pathname;
427
+ if (a.find((h) => h.code === u)?.seo !== !1) {
428
+ let h = o.url.pathname;
452
429
  if (m?.switchLocalePath)
453
- h = m.switchLocalePath(t.url.pathname, u, L, u);
430
+ h = m.switchLocalePath(o.url.pathname, u, P, u);
454
431
  else {
455
- const S = t.url.pathname.split("/").filter(Boolean), P = S[0];
456
- P && L.includes(P) && S.shift(), h = `/${S.join("/")}`;
432
+ const b = o.url.pathname.split("/").filter(Boolean), L = b[0];
433
+ L && P.includes(L) && b.shift(), h = `/${b.join("/")}`;
457
434
  }
458
435
  g.link.push({
459
436
  rel: "alternate",
460
- href: `${o}${h}`,
437
+ href: `${l}${h}`,
461
438
  hreflang: "x-default"
462
439
  });
463
440
  }
@@ -468,65 +445,60 @@ function ce(t, e = {}) {
468
445
  property: "og:url",
469
446
  content: p
470
447
  });
471
- for (const h of i)
448
+ for (const h of s)
472
449
  h.code !== c && g.meta.push({
473
450
  property: "og:locale:alternate",
474
451
  content: h.og || h.iso || h.code
475
452
  });
476
453
  return g;
477
454
  }
478
- function E(t, e, o) {
479
- const n = e.split(".");
480
- let r = t;
481
- for (let u = 0; u < n.length - 1; u++) {
482
- const a = n[u];
483
- r[a] || (r[a] = {}), r = r[a];
455
+ function x(o, e, l) {
456
+ const r = e.split(".");
457
+ let i = o;
458
+ for (let u = 0; u < r.length - 1; u++) {
459
+ const t = r[u];
460
+ i[t] || (i[t] = {}), i = i[t];
484
461
  }
485
- const c = n[n.length - 1];
486
- c !== void 0 && (r[c] = o);
462
+ const c = r[r.length - 1];
463
+ c !== void 0 && (i[c] = l);
487
464
  }
488
- function ue(t, e) {
489
- const o = B(t), n = w(t), r = T(t), c = o.getRoute(), u = {};
465
+ function le(o, e) {
466
+ const l = F(o), r = T(o), i = j(o), c = l.getRoute(), u = {};
490
467
  if (e && e.length > 0) {
491
- const a = {};
492
- for (const s of e) {
493
- const i = o.t(s, void 0, void 0, c);
494
- i != null && i !== s && E(a, s, i);
468
+ const t = {};
469
+ for (const a of e) {
470
+ const s = l.t(a, void 0, void 0, c);
471
+ s != null && s !== a && x(t, a, s);
495
472
  }
496
- Object.keys(a).length > 0 && (u[c] = a);
473
+ Object.keys(t).length > 0 && (u[c] = t);
497
474
  } else {
498
- const a = o.getRouteTranslations(n, c);
499
- a && (u[c] = a);
475
+ const t = l.getRouteTranslations(r, c);
476
+ t && (u[c] = t);
500
477
  }
501
478
  return {
502
- locale: n,
503
- fallbackLocale: r,
479
+ locale: r,
480
+ fallbackLocale: i,
504
481
  currentRoute: c,
505
482
  translations: u
506
483
  };
507
484
  }
508
485
  export {
509
- j as AstroI18n,
510
- he as FormatService,
486
+ R as AstroI18n,
487
+ ie as FormatService,
511
488
  ne as createAstroRouterAdapter,
512
489
  Y as createI18n,
513
490
  ee as createI18nMiddleware,
514
- de as defaultPlural,
491
+ ce as defaultPlural,
515
492
  te as detectLocale,
516
- T as getDefaultLocale,
517
- B as getI18n,
518
- ue as getI18nProps,
519
- w as getLocale,
520
- ae as getLocaleFromPath,
521
- F as getLocales,
522
- oe as getRouteName,
493
+ j as getDefaultLocale,
494
+ F as getI18n,
495
+ le as getI18nProps,
496
+ T as getLocale,
497
+ B as getLocales,
523
498
  X as i18nIntegration,
524
- me as interpolate,
525
- U as loadTranslationsFromDir,
499
+ ue as interpolate,
500
+ E as loadTranslationsFromDir,
526
501
  Z as loadTranslationsIntoI18n,
527
- se as localizePath,
528
- re as removeLocaleFromPath,
529
- le as switchLocalePath,
530
- ie as useI18n,
531
- ce as useLocaleHead
502
+ oe as useI18n,
503
+ ae as useLocaleHead
532
504
  };
package/package.json CHANGED
@@ -1,22 +1,31 @@
1
1
  {
2
2
  "name": "@i18n-micro/astro",
3
- "version": "1.3.5",
3
+ "version": "1.3.6",
4
4
  "description": "Astro integration for i18n-micro — translations, routing, and islands.",
5
- "type": "module",
5
+ "keywords": [
6
+ "astro",
7
+ "i18n",
8
+ "internationalization",
9
+ "translations"
10
+ ],
11
+ "homepage": "https://github.com/s00d/nuxt-i18n-micro/tree/main/packages/astro#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/s00d/nuxt-i18n-micro/issues"
14
+ },
6
15
  "license": "MIT",
7
- "sideEffects": false,
8
16
  "repository": {
9
17
  "type": "git",
10
18
  "url": "git+https://github.com/s00d/nuxt-i18n-micro.git",
11
19
  "directory": "packages/astro"
12
20
  },
13
- "homepage": "https://github.com/s00d/nuxt-i18n-micro/tree/main/packages/astro#readme",
14
- "bugs": {
15
- "url": "https://github.com/s00d/nuxt-i18n-micro/issues"
16
- },
17
- "engines": {
18
- "node": ">=18"
19
- },
21
+ "files": [
22
+ "dist",
23
+ "src",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "type": "module",
28
+ "sideEffects": false,
20
29
  "main": "./dist/index.cjs",
21
30
  "types": "./dist/index.d.ts",
22
31
  "exports": {
@@ -64,33 +73,35 @@
64
73
  },
65
74
  "./package.json": "./package.json"
66
75
  },
67
- "files": [
68
- "dist",
69
- "src",
70
- "README.md",
71
- "LICENSE"
72
- ],
73
76
  "publishConfig": {
74
77
  "access": "public"
75
78
  },
76
- "keywords": [
77
- "astro",
78
- "i18n",
79
- "internationalization",
80
- "translations"
81
- ],
82
79
  "dependencies": {
83
- "@i18n-micro/types": "1.2.3",
84
- "@i18n-micro/core": "1.3.1",
85
- "@i18n-micro/utils": "1.0.0",
86
- "@i18n-micro/node": "1.2.2"
80
+ "@i18n-micro/utils": "1.0.1",
81
+ "@i18n-micro/core": "1.3.2",
82
+ "@i18n-micro/node": "1.2.3",
83
+ "@i18n-micro/types": "1.2.4"
87
84
  },
88
- "peerDependencies": {
85
+ "devDependencies": {
86
+ "@types/jest": "^29.5.14",
89
87
  "astro": "^5.16.5",
88
+ "jest": "^29.7.0",
89
+ "preact": "^10.0.0",
90
+ "publint": "^0.3.17",
91
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
90
92
  "svelte": "^4.0.0 || ^5.0.0",
91
- "vue": "^3.5.25",
93
+ "ts-jest": "^29.4.6",
94
+ "vite": "^7.3.1",
95
+ "vite-plugin-dts": "^4.5.4",
96
+ "vitest": "^3.2.4",
97
+ "vue": "^3.5.25"
98
+ },
99
+ "peerDependencies": {
100
+ "astro": "^5.16.5",
101
+ "preact": "^10.0.0",
92
102
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
93
- "preact": "^10.0.0"
103
+ "svelte": "^4.0.0 || ^5.0.0",
104
+ "vue": "^3.5.25"
94
105
  },
95
106
  "peerDependenciesMeta": {
96
107
  "svelte": {
@@ -106,19 +117,8 @@
106
117
  "optional": true
107
118
  }
108
119
  },
109
- "devDependencies": {
110
- "astro": "^5.16.5",
111
- "vite": "^7.3.1",
112
- "vite-plugin-dts": "^4.5.4",
113
- "jest": "^29.7.0",
114
- "ts-jest": "^29.4.6",
115
- "@types/jest": "^29.5.14",
116
- "svelte": "^4.0.0 || ^5.0.0",
117
- "vue": "^3.5.25",
118
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
119
- "preact": "^10.0.0",
120
- "publint": "^0.3.17",
121
- "vitest": "^3.2.4"
120
+ "engines": {
121
+ "node": ">=18"
122
122
  },
123
123
  "scripts": {
124
124
  "build": "vite build",
package/src/index.ts CHANGED
@@ -4,15 +4,7 @@ import './env.d'
4
4
  // Re-export utilities from core
5
5
  export { defaultPlural, FormatService, interpolate } from '@i18n-micro/core'
6
6
  // Re-export types from @i18n-micro/types
7
- export type {
8
- CleanTranslation,
9
- Getter,
10
- Locale,
11
- LocaleCode,
12
- Params,
13
- PluralFunc,
14
- Translations,
15
- } from '@i18n-micro/types'
7
+ export type { CleanTranslation, Getter, Locale, LocaleCode, Params, PluralFunc, Translations } from '@i18n-micro/types'
16
8
  export { AstroI18n, type AstroI18nOptions } from './composer'
17
9
  // Export integration options type
18
10
  export type { I18nIntegrationOptions } from './integration'
@@ -20,33 +12,13 @@ export type { I18nIntegrationOptions } from './integration'
20
12
  export { createI18n, i18nIntegration } from './integration'
21
13
  export type { LoadedTranslations, LoadTranslationsOptions } from './load-translations'
22
14
  // Export translation loading utilities
23
- export {
24
- loadTranslationsFromDir,
25
- loadTranslationsIntoI18n,
26
- } from './load-translations'
15
+ export { loadTranslationsFromDir, loadTranslationsIntoI18n } from './load-translations'
27
16
  export type { I18nMiddlewareOptions } from './middleware'
28
17
  export { createI18nMiddleware, detectLocale } from './middleware'
29
18
  export { createAstroRouterAdapter } from './router/adapter'
30
19
  // Router abstraction
31
20
  export type { I18nRoutingStrategy } from './router/types'
32
- // Legacy routing utilities (deprecated, use routingStrategy instead)
33
- // Kept for backward compatibility
34
- export {
35
- getLocaleFromPath,
36
- getRouteName,
37
- localizePath,
38
- removeLocaleFromPath,
39
- switchLocalePath,
40
- } from './routing'
41
21
  export type { I18nClientProps, LocaleHeadOptions, LocaleHeadResult } from './utils'
42
22
  // Utilities
43
- export {
44
- getDefaultLocale,
45
- getI18n,
46
- getI18nProps,
47
- getLocale,
48
- getLocales,
49
- useI18n,
50
- useLocaleHead,
51
- } from './utils'
23
+ export { getDefaultLocale, getI18n, getI18nProps, getLocale, getLocales, useI18n, useLocaleHead } from './utils'
52
24
  // It's loaded directly by Astro via entrypoint in integration config
package/dist/routing.d.ts DELETED
@@ -1,23 +0,0 @@
1
- /**
2
- * Get route name from Astro path
3
- * Extracts route name from path (e.g., /en/about -> about)
4
- */
5
- export declare function getRouteName(path: string, locales?: string[]): string;
6
- /**
7
- * Get locale from path
8
- * Checks if first segment is a locale code
9
- */
10
- export declare function getLocaleFromPath(path: string, defaultLocale?: string, locales?: string[]): string;
11
- /**
12
- * Switch locale in path
13
- * Replaces or adds locale prefix to path
14
- */
15
- export declare function switchLocalePath(path: string, newLocale: string, locales?: string[], defaultLocale?: string): string;
16
- /**
17
- * Localize path with locale prefix
18
- */
19
- export declare function localizePath(path: string, locale: string, locales?: string[], defaultLocale?: string): string;
20
- /**
21
- * Remove locale from path
22
- */
23
- export declare function removeLocaleFromPath(path: string, locales?: string[]): string;
package/src/routing.ts DELETED
@@ -1,94 +0,0 @@
1
- /**
2
- * Get route name from Astro path
3
- * Extracts route name from path (e.g., /en/about -> about)
4
- */
5
- export function getRouteName(path: string, locales: string[] = []): string {
6
- // Normalize the path
7
- const cleanPath = path.replace(/^\//, '').replace(/\/$/, '')
8
-
9
- if (!cleanPath) {
10
- return 'index'
11
- }
12
-
13
- const segments = cleanPath.split('/').filter(Boolean)
14
-
15
- // Remove locale from path if present
16
- const firstSegment = segments[0]
17
- if (firstSegment && locales.includes(firstSegment)) {
18
- segments.shift()
19
- }
20
-
21
- if (segments.length === 0) {
22
- return 'index'
23
- }
24
-
25
- return segments.join('-')
26
- }
27
-
28
- /**
29
- * Get locale from path
30
- * Checks if first segment is a locale code
31
- */
32
- export function getLocaleFromPath(path: string, defaultLocale: string = 'en', locales: string[] = []): string {
33
- const segments = path.split('/').filter(Boolean)
34
- const firstSegment = segments[0]
35
- if (firstSegment && locales.includes(firstSegment)) {
36
- return firstSegment
37
- }
38
-
39
- return defaultLocale
40
- }
41
-
42
- /**
43
- * Switch locale in path
44
- * Replaces or adds locale prefix to path
45
- */
46
- export function switchLocalePath(path: string, newLocale: string, locales: string[] = [], defaultLocale?: string): string {
47
- const segments = path.split('/').filter(Boolean)
48
-
49
- // Remove existing locale if present
50
- const firstSegment = segments[0]
51
- if (firstSegment && locales.includes(firstSegment)) {
52
- segments.shift()
53
- }
54
-
55
- // Add new locale if not default or if default should be included
56
- if (newLocale !== defaultLocale || defaultLocale === undefined) {
57
- segments.unshift(newLocale)
58
- }
59
-
60
- return `/${segments.join('/')}`
61
- }
62
-
63
- /**
64
- * Localize path with locale prefix
65
- */
66
- export function localizePath(path: string, locale: string, locales: string[] = [], defaultLocale?: string): string {
67
- const cleanPath = path.replace(/^\//, '').replace(/\/$/, '') || ''
68
- const segments = cleanPath.split('/').filter(Boolean)
69
-
70
- // Remove existing locale if present
71
- const firstSegment = segments[0]
72
- if (firstSegment && locales.includes(firstSegment)) {
73
- segments.shift()
74
- }
75
-
76
- // Add locale if not default or if default should be included
77
- if (locale !== defaultLocale || defaultLocale === undefined) {
78
- segments.unshift(locale)
79
- }
80
-
81
- return `/${segments.join('/')}`
82
- }
83
-
84
- /**
85
- * Remove locale from path
86
- */
87
- export function removeLocaleFromPath(path: string, locales: string[] = []): string {
88
- const segments = path.split('/').filter(Boolean)
89
- const firstSegment = segments[0]
90
- if (firstSegment && locales.includes(firstSegment)) {
91
- segments.shift()
92
- }
93
- return `/${segments.join('/')}`
94
- }