{"mappings":"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","names":["React","getTalizenConfig","subscribeTalizenConfig","emptyMessages","lastSnapshot","lastSnapshotI18n","lastSnapshotMessages","readI18nRuntimeConfig","config","globalConfig","fallbackI18n","fallbackMessages","i18n","messages","normalizeLocaleRuntime","value","d","locales","l","defaultLocale","readLocaleRuntime","useLocale","snapshot","getLocale","localizedPath","path","locale","rt","target","noPrefixLocale","p","LOCALE_COOKIE","Link","props","href","onClick","rest","finalHref","event","readMessages","lookupMessage","obj","cur","seg","buildTranslator","namespace","sourceMessages","scoped","base","t","key","vars","raw","text","_","k","useTranslations","getTranslations"],"sources":["../esm/npm/talizen@0.2.55/node_modules/talizen/i18n.js"],"sourcesContent":["import * as React from \"react\";\nimport { getTalizenConfig, subscribeTalizenConfig } from \"./core.js\";\nconst emptyMessages = {};\nlet lastSnapshot = null;\nlet lastSnapshotI18n;\nlet lastSnapshotMessages;\nfunction readI18nRuntimeConfig() {\n    const config = getTalizenConfig();\n    const globalConfig = typeof globalThis !== \"undefined\" ? globalThis.TalizenConfig : undefined;\n    const fallbackI18n = typeof globalThis !== \"undefined\" ? globalThis.__TALIZEN_I18N__ : undefined;\n    const fallbackMessages = typeof globalThis !== \"undefined\" ? globalThis.__TALIZEN_MESSAGES__ : undefined;\n    const i18n = config.i18n ?? globalConfig?.i18n ?? fallbackI18n;\n    const messages = config.messages ?? globalConfig?.messages ?? fallbackMessages ?? emptyMessages;\n    if (lastSnapshot \u0026\u0026 lastSnapshotI18n === i18n \u0026\u0026 lastSnapshotMessages === messages) {\n        return lastSnapshot;\n    }\n    lastSnapshotI18n = i18n;\n    lastSnapshotMessages = messages;\n    lastSnapshot = { i18n, messages };\n    return lastSnapshot;\n}\nfunction normalizeLocaleRuntime(value) {\n    const d = value ?? {};\n    const locales = Array.isArray(d.locales) ? d.locales.filter((l) =\u003e typeof l === \"string\") : [];\n    const defaultLocale = typeof d.defaultLocale === \"string\" ? d.defaultLocale : (locales[0] ?? \"\");\n    return {\n        locale: typeof d.locale === \"string\" ? d.locale : \"\",\n        locales,\n        defaultLocale,\n        // 未配置 domains（无 routingDefaultLocale）时回退到 defaultLocale，单域名站点行为不变。\n        routingDefaultLocale: typeof d.routingDefaultLocale === \"string\" \u0026\u0026 d.routingDefaultLocale !== \"\" ? d.routingDefaultLocale : defaultLocale,\n    };\n}\nfunction readLocaleRuntime() {\n    return normalizeLocaleRuntime(readI18nRuntimeConfig().i18n);\n}\n/**\n * 读取当前语言运行时信息（当前语言 / 全部语言 / 默认语言）。SSR 与客户端返回一致。\n * 站点未开启多语言时 `locale === \"\"`。\n *\n * ```tsx\n * const { locale, locales, defaultLocale } = useLocale()\n * ```\n */\nexport function useLocale() {\n    const snapshot = React.useSyncExternalStore(subscribeTalizenConfig, readI18nRuntimeConfig, readI18nRuntimeConfig);\n    return normalizeLocaleRuntime(snapshot.i18n);\n}\n/**\n * 读取当前语言运行时信息——与 useLocale() 完全等价，但命名为 get*（**不是 hook**），\n * 用于 getServerSideProps / generateMetadata 等**服务端取数场景**（对齐 next-intl 的 getLocale）。\n * 组件渲染里用 useLocale()。SSR 与客户端返回一致。\n *\n * ```ts\n * export async function getServerSideProps(ctx) {\n *   const { locale } = getLocale()          // ✅ 服务端取数用 get*\n *   const posts = await listContents(\"blog\") // 内部按当前 locale 自动解码 CMS\n *   return { props: { posts } }\n * }\n * ```\n */\nexport function getLocale() {\n    return readLocaleRuntime();\n}\n/**\n * 给站内路径加语言前缀（默认语言不加前缀）。不传 `locale` 时使用当前语言。\n * 站外链接（协议 / 协议相对 URL）与页内锚点（`#...`）原样返回。\n *\n * ```ts\n * localizedPath(\"/blog\")        // zh 页面 → \"/zh/blog\"；默认语言 → \"/blog\"\n * localizedPath(\"/about\", \"ja\") // → \"/ja/about\"\n * ```\n */\nexport function localizedPath(path, locale) {\n    if (/^([a-z][a-z0-9+.-]*:)?\\/\\//i.test(path) || path.startsWith(\"#\"))\n        return path;\n    const rt = readLocaleRuntime();\n    const target = locale ?? rt.locale;\n    // 用「当前域名的无前缀语言」判断是否省略前缀：domain routing 下 routingDefaultLocale\n    // 可能不是站点级 defaultLocale（如 www.creght.com 上为 en，而 defaultLocale 为 zh-CN）。\n    const noPrefixLocale = rt.routingDefaultLocale || rt.defaultLocale;\n    if (!target || target === noPrefixLocale)\n        return path;\n    const p = path.startsWith(\"/\") ? path : `/${path}`;\n    return p === \"/\" ? `/${target}` : `/${target}${p}`;\n}\n/** 记住用户显式语言选择的 Cookie 名（检测优先级：Cookie \u003e Accept-Language \u003e 默认）。 */\nexport const LOCALE_COOKIE = \"CREGHT_LOCALE\";\n/**\n * 语言感知的站内链接，替代裸 `\u003ca\u003e`：自动给 `href` 补当前语言前缀（默认语言不补）。\n * 传 `locale` 表示语言切换（用该语言前缀，且点击时写 `CREGHT_LOCALE` 记住选择）。\n *\n * ```tsx\n * \u003cLink href=\"/blog\"\u003eBlog\u003c/Link\u003e            // 跟随当前语言：zh 页面 → /zh/blog\n * \u003cLink href=\"/\" locale=\"ja\"\u003e日本語\u003c/Link\u003e  // 切到日文并记住\n * ```\n */\nexport function Link(props) {\n    const { href, locale, onClick, ...rest } = props;\n    useLocale();\n    const finalHref = localizedPath(href, locale);\n    const handleClick = (event) =\u003e {\n        if (locale \u0026\u0026 typeof document !== \"undefined\") {\n            document.cookie = `${LOCALE_COOKIE}=${encodeURIComponent(locale)}; path=/; max-age=31536000; samesite=lax`;\n        }\n        onClick?.(event);\n    };\n    return React.createElement(\"a\", { ...rest, href: finalHref, onClick: handleClick });\n}\nfunction readMessages() {\n    return readI18nRuntimeConfig().messages;\n}\nfunction lookupMessage(obj, path) {\n    let cur = obj;\n    for (const seg of path.split(\".\")) {\n        if (cur == null || typeof cur !== \"object\")\n            return undefined;\n        cur = cur[seg];\n    }\n    return cur;\n}\n/**\n * 读取 UI 文案翻译器。`namespace` 可将后续 key 限定到 messages 的某个子树（对齐 next-intl）。\n *\n * ```tsx\n * const t = useTranslations(\"home\")\n * t(\"title\")                    // messages.home.title\n * t(\"greeting\", { name })       // \"你好 {name}\" -\u003e \"你好 小明\"\n * t.raw\u003cstring[]\u003e(\"tags\") ?? [] // 数组 / 对象原样取出\n * ```\n *\n * UI chrome 用 useTranslations；文章等内容用 CMS 字段级 _i18n（见 listContents/getContent）。\n */\nfunction buildTranslator(namespace, sourceMessages) {\n    const messages = sourceMessages ?? readMessages();\n    const scoped = namespace ? lookupMessage(messages, namespace) : messages;\n    const base = (scoped \u0026\u0026 typeof scoped === \"object\" ? scoped : {});\n    const t = (key, vars) =\u003e {\n        const raw = lookupMessage(base, key);\n        const text = typeof raw === \"string\" ? raw : key;\n        if (!vars)\n            return text;\n        return text.replace(/\\{(\\w+)\\}/g, (_, k) =\u003e (k in vars ? String(vars[k]) : `{${k}}`));\n    };\n    t.raw = (key) =\u003e lookupMessage(base, key);\n    return t;\n}\nexport function useTranslations(namespace) {\n    const snapshot = React.useSyncExternalStore(subscribeTalizenConfig, readI18nRuntimeConfig, readI18nRuntimeConfig);\n    return React.useMemo(() =\u003e buildTranslator(namespace, snapshot.messages), [namespace, snapshot]);\n}\n/**\n * 读取 UI 文案翻译器——与 useTranslations() 等价，但命名为 get*（**不是 hook**），\n * 用于 getServerSideProps / generateMetadata 等**服务端取数场景**（对齐 next-intl 的 getTranslations）。\n * 组件渲染里用 useTranslations()。\n *\n * ```ts\n * export async function generateMetadata() {\n *   const t = getTranslations(\"seo\")\n *   return { title: t(\"home_title\") }\n * }\n * ```\n */\nexport function getTranslations(namespace) {\n    return buildTranslator(namespace);\n}\n"],"version":3}
