Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/website/public/_tyndale/es.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"0421d7c92bd287ac2a8e21e86010189de2d31c64de0e59ed45550f57c4860168": "Con IA",
"17e440c67893643336f3d1f557d9444ac428db15a432166beea379fa041aa1d5": "Escribir tu componente",
"17e440c67893643336f3d1f557d9444ac428db15a432166beea379fa041aa1d5": "Escribe tu componente",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate verifica las traducciones sin escribir archivos.",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "Cambia de idioma y mira cómo el contenido se actualiza al instante. Esto es lo que experimentan tus usuarios.",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "Cambia de idioma y observa cómo el contenido se actualiza al instante. Esto es lo que experimentan tus usuarios.",
"20672423d71690888afb7caa922ea2a23592d49346341b1eee292de65189a296": "Ver en GitHub",
"24cab632471e2475f5ce9e98a165454917efced9a13ca2c6533f157a1f07b595": "¿Listo para lanzar tu app globalmente?",
"268339482922bb3ed004fa3cf1a0df2a98550d5a212bc7ce1424b74e23e41233": "Tres pasos para ser global",
Expand Down
4 changes: 2 additions & 2 deletions apps/website/public/_tyndale/fr.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"0421d7c92bd287ac2a8e21e86010189de2d31c64de0e59ed45550f57c4860168": "Propulsé par l’IA",
"0421d7c92bd287ac2a8e21e86010189de2d31c64de0e59ed45550f57c4860168": "propulsé par l’IA",
"17e440c67893643336f3d1f557d9444ac428db15a432166beea379fa041aa1d5": "Écrire votre composant",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate vérifie les traductions sans écrire de fichiers.",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "Changez de langue et voyez le contenu se mettre à jour instantanément. C’est l’expérience de vos utilisateurs.",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "Changez de langue et voyez le contenu se mettre à jour instantanément. C’est ce que vivent vos utilisateurs.",
"20672423d71690888afb7caa922ea2a23592d49346341b1eee292de65189a296": "Voir sur GitHub",
"24cab632471e2475f5ce9e98a165454917efced9a13ca2c6533f157a1f07b595": "Prêt à passer à l’international ?",
"268339482922bb3ed004fa3cf1a0df2a98550d5a212bc7ce1424b74e23e41233": "Trois étapes pour passer à l’international",
Expand Down
20 changes: 10 additions & 10 deletions apps/website/public/_tyndale/ja.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"0421d7c92bd287ac2a8e21e86010189de2d31c64de0e59ed45550f57c4860168": "AI搭載",
"17e440c67893643336f3d1f557d9444ac428db15a432166beea379fa041aa1d5": "コンポーネントを作成",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate は、ファイルを書き込まずに翻訳を検証します。",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "ロケールを切り替えると、コンテンツが即座に更新されます。これがユーザーの体験です。",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate はファイルを書き込まずに翻訳をチェックします。",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "ロケールを切り替えると、コンテンツが即座に更新されます。これが実際のユーザー体験です。",
"20672423d71690888afb7caa922ea2a23592d49346341b1eee292de65189a296": "GitHubで見る",
"24cab632471e2475f5ce9e98a165454917efced9a13ca2c6533f157a1f07b595": "グローバル展開の準備はできていますか?",
"268339482922bb3ed004fa3cf1a0df2a98550d5a212bc7ce1424b74e23e41233": "グローバル展開まで3ステップ",
Expand All @@ -16,20 +16,20 @@
"72c1a3fcc60022a54e18695b9339cbabfd0d0c5323d67023b7ce2f33a8034ab4": "Middleware、プロバイダー、RTL、静的生成。",
"779cfd1ef832e29770721098eb3f3b5c3285cac36b48cceaff699fadf34f1b10": "キーファイル不要のワークフロー",
"7af023c43013b9a53fbff7dd4b5821588bba3319308878229740489152c43f6d": "ドキュメント",
"7e9b6873f872d858db85be10a071a8c0c7cac6e30d33e7273fd58a156a0c2ee4": "前回の実行以降に変更された部分だけを翻訳します。",
"7e9b6873f872d858db85be10a071a8c0c7cac6e30d33e7273fd58a156a0c2ee4": "前回の実行から変更された箇所だけを翻訳します。",
"8093606f5dea8770c10c7158bdc4d086f4236899c1a9d92c994941ee6db117b5": "コンポーネントを作成。CLIを実行。翻訳してリリース。",
"8261458cf5c7081cfa52fa99cd937affef77739d87f2d683ea8e6a4d84b4f76f": "キーファイルを管理せずに、JSXと文字列を翻訳。",
"848832860d55c6a64e25e21f86b910b6e6a5538aeebaf187a2ce6f504f9eaa0a": "今日からReactアプリの翻訳を始めましょう。オープンソースで、永久無料です。",
"8261458cf5c7081cfa52fa99cd937affef77739d87f2d683ea8e6a4d84b4f76f": "キーファイルを管理せずに、JSXと文字列を翻訳できます。",
"848832860d55c6a64e25e21f86b910b6e6a5538aeebaf187a2ce6f504f9eaa0a": "今すぐReactアプリの翻訳を始めましょう。オープンソースで、ずっと無料です。",
"9000a7b3a28531fc48a5eec38524ec3ce0e526c770f4c49a62c9d6bf9dd39cb4": "GitHubでスターを付ける",
"9478ae513b72a79e8af8ede569d13ca035bd620dd82d07ccb61f793be989e12d": "Next.jsファーストクラス対応",
"96ab624b80ad052cb59be429ceae9f45e5c3a1f1ab695121eadbd7c459290de6": "抽出からデプロイまで、Tyndaleが翻訳ワークフロー全体を処理します。",
"96ab624b80ad052cb59be429ceae9f45e5c3a1f1ab695121eadbd7c459290de6": "抽出からデプロイまで、Tyndaleが翻訳ワークフロー全体を担います。",
"983f311018642b0ae60c71253b5735579906d43d260ea926ebe5e815b1c97abb": "はじめる",
"a017add6bb76387e0f7562230c809a2c7e3f0103d49b40969391c293fd0fe1a4": "差分対応",
"a6ca1bf546887fea51c0ec17d6adce63ae510eb61c972d00b26d5c8a90a85e17": "独自のAIプロバイダーを使って、高品質な翻訳を実現します。",
"a017add6bb76387e0f7562230c809a2c7e3f0103d49b40969391c293fd0fe1a4": "差分翻訳",
"a6ca1bf546887fea51c0ec17d6adce63ae510eb61c972d00b26d5c8a90a85e17": "独自のAIプロバイダーを使って高品質な翻訳を実現します。",
"af2a0b929b65332983bc9ee1ab366c5ab5d5b481f6578dcfc928087cfcd340ba": "あらゆる言語に対応。",
"d3a58d3cb07abad32cc2311dabd1e68b0ab9e27dd921b398f8cf91ea7c0fdead": "アプリを1つの言語で書く。",
"d3a58d3cb07abad32cc2311dabd1e68b0ab9e27dd921b398f8cf91ea7c0fdead": "1つの言語でアプリを開発。",
"f911e414cf6bdfc595532ab166b5ba0f63d73c021452fcdacbda363dda6ad8fb": "GitHub",
"fbd47d140d266df1fd9a5a7372bcf94a16f620b632a5070b6898483cedea6dcc": "ReactとNext.js向けのAI搭載i18n。キーファイル不要。手動翻訳不要。",
"fbd47d140d266df1fd9a5a7372bcf94a16f620b632a5070b6898483cedea6dcc": "React と Next.js 向けのAI搭載i18n。キーファイルは不要。手動翻訳も不要。",
"fd9c821056de0e28597fa9be0ff16e3ba34f94f307414dc220c8fc281d1d06bb": "CLIを実行",
"fdb627efb86ba73e631686e916f746d4b946f5d2f1594109caf982ca2b694fe2": "オープンソース"
}
14 changes: 7 additions & 7 deletions apps/website/public/_tyndale/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
"0421d7c92bd287ac2a8e21e86010189de2d31c64de0e59ed45550f57c4860168": "AI 기반",
"17e440c67893643336f3d1f557d9444ac428db15a432166beea379fa041aa1d5": "컴포넌트 작성하기",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate는 파일을 쓰지 않고 번역을 검증합니다.",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "로케일을 전환하면 콘텐츠가 즉시 업데이트됩니다. 이것이 실제 사용자 경험입니다.",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "로케일을 전환하면 콘텐츠가 즉시 업데이트됩니다. 사용자는 이렇게 경험합니다.",
"20672423d71690888afb7caa922ea2a23592d49346341b1eee292de65189a296": "GitHub에서 보기",
"24cab632471e2475f5ce9e98a165454917efced9a13ca2c6533f157a1f07b595": "글로벌 출시할 준비가 되셨나요?",
"268339482922bb3ed004fa3cf1a0df2a98550d5a212bc7ce1424b74e23e41233": "글로벌까지 3단계",
"26ceae0deed7525be24452096952602462eaf982f3353af6932b77ef27af5856": "동작 모습 보기",
"28c0fe2c0fc96d3c0cbcf9eb97ef9f0cd5306151f1ae763a7af877af8421e11d": "변수, 복수형, 숫자, 통화, 날짜를 지원합니다.",
"268339482922bb3ed004fa3cf1a0df2a98550d5a212bc7ce1424b74e23e41233": "글로벌 진출까지 3단계",
"26ceae0deed7525be24452096952602462eaf982f3353af6932b77ef27af5856": "동작 확인하기",
"28c0fe2c0fc96d3c0cbcf9eb97ef9f0cd5306151f1ae763a7af877af8421e11d": "변수, 복수형, 숫자, 통화, 날짜.",
"379612d2a3fa8d73230edf55eb75bee687983cda9a9ea70f17b6b89172543dc3": "i18n에 필요한 모든 것",
"41e1bf411736680d8b4a06374bf79e157365ab4aa01c176fc63b2ae6e3794a2f": "CI 친화적",
"4b1feb84f6c8fc2586dae7d20b113ac07555b72ae9d25b75a84ddf4149bdc241": "풍부한 콘텐츠",
Expand All @@ -19,17 +19,17 @@
"7e9b6873f872d858db85be10a071a8c0c7cac6e30d33e7273fd58a156a0c2ee4": "마지막 실행 이후 변경된 내용만 번역합니다.",
"8093606f5dea8770c10c7158bdc4d086f4236899c1a9d92c994941ee6db117b5": "컴포넌트를 작성하세요. CLI를 실행하세요. 번역된 상태로 배포하세요.",
"8261458cf5c7081cfa52fa99cd937affef77739d87f2d683ea8e6a4d84b4f76f": "키 파일을 관리하지 않고 JSX와 문자열을 번역합니다.",
"848832860d55c6a64e25e21f86b910b6e6a5538aeebaf187a2ce6f504f9eaa0a": "오늘 React 앱 번역을 시작하세요. 오픈 소스이며 평생 무료입니다.",
"848832860d55c6a64e25e21f86b910b6e6a5538aeebaf187a2ce6f504f9eaa0a": "오늘 React 앱 번역을 시작하세요. 오픈 소스이며, 영구적으로 무료입니다.",
"9000a7b3a28531fc48a5eec38524ec3ce0e526c770f4c49a62c9d6bf9dd39cb4": "GitHub에서 스타 주기",
"9478ae513b72a79e8af8ede569d13ca035bd620dd82d07ccb61f793be989e12d": "Next.js 완전 지원",
"9478ae513b72a79e8af8ede569d13ca035bd620dd82d07ccb61f793be989e12d": "Next.js 우선 지원",
"96ab624b80ad052cb59be429ceae9f45e5c3a1f1ab695121eadbd7c459290de6": "추출부터 배포까지, Tyndale이 전체 번역 워크플로를 처리합니다.",
"983f311018642b0ae60c71253b5735579906d43d260ea926ebe5e815b1c97abb": "시작하기",
"a017add6bb76387e0f7562230c809a2c7e3f0103d49b40969391c293fd0fe1a4": "증분 방식",
"a6ca1bf546887fea51c0ec17d6adce63ae510eb61c972d00b26d5c8a90a85e17": "사용 중인 AI 프로바이더를 활용해 고품질 번역을 제공합니다.",
"af2a0b929b65332983bc9ee1ab366c5ab5d5b481f6578dcfc928087cfcd340ba": "모든 언어를 지원하세요.",
"d3a58d3cb07abad32cc2311dabd1e68b0ab9e27dd921b398f8cf91ea7c0fdead": "앱을 하나의 언어로 작성하세요.",
"f911e414cf6bdfc595532ab166b5ba0f63d73c021452fcdacbda363dda6ad8fb": "GitHub",
"fbd47d140d266df1fd9a5a7372bcf94a16f620b632a5070b6898483cedea6dcc": "React & Next.js를 위한 AI 기반 i18n. 키 파일이 필요 없습니다. 수동 번역도 필요 없습니다.",
"fbd47d140d266df1fd9a5a7372bcf94a16f620b632a5070b6898483cedea6dcc": "React & Next.js를 위한 AI 기반 국제화(i18n). 키 파일이 필요 없습니다. 수동 번역도 필요 없습니다.",
"fd9c821056de0e28597fa9be0ff16e3ba34f94f307414dc220c8fc281d1d06bb": "CLI 실행하기",
"fdb627efb86ba73e631686e916f746d4b946f5d2f1594109caf982ca2b694fe2": "오픈 소스"
}
24 changes: 12 additions & 12 deletions apps/website/public/_tyndale/zh.json
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
{
"0421d7c92bd287ac2a8e21e86010189de2d31c64de0e59ed45550f57c4860168": "AI 驱动",
"17e440c67893643336f3d1f557d9444ac428db15a432166beea379fa041aa1d5": "编写组件",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate 在不写入文件的情况下检查翻译。",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "切换 locales,内容会立即更新。这就是用户的真实体验。",
"1a182a7c6ac1952813b79d7120f57a1dba0936b29ccaa43866a38d0532980395": "tyndale validate 可在不写入文件的情况下检查翻译。",
"1b9e2dc0195e5f890cf7a3d74cb7455cba7d3e721ef7bd122e56069ccb8396fe": "切换 locale,内容会立即更新。这就是用户将体验到的效果。",
"20672423d71690888afb7caa922ea2a23592d49346341b1eee292de65189a296": "前往 GitHub 查看",
"24cab632471e2475f5ce9e98a165454917efced9a13ca2c6533f157a1f07b595": "准备好走向全球了吗?",
"268339482922bb3ed004fa3cf1a0df2a98550d5a212bc7ce1424b74e23e41233": "3 步走向全球",
"26ceae0deed7525be24452096952602462eaf982f3353af6932b77ef27af5856": "查看实际效果",
"28c0fe2c0fc96d3c0cbcf9eb97ef9f0cd5306151f1ae763a7af877af8421e11d": "变量、复数、数字、货币和日期。",
"379612d2a3fa8d73230edf55eb75bee687983cda9a9ea70f17b6b89172543dc3": "i18n 所需,一应俱全",
"41e1bf411736680d8b4a06374bf79e157365ab4aa01c176fc63b2ae6e3794a2f": "CI 友好",
"4b1feb84f6c8fc2586dae7d20b113ac07555b72ae9d25b75a84ddf4149bdc241": "丰富内容",
"4b1feb84f6c8fc2586dae7d20b113ac07555b72ae9d25b75a84ddf4149bdc241": "丰富内容支持",
"5a03dfaf7af7e296ecde33a3e2ca868a1aa58bc1c20a67dac8aa74f3bcf5e6c0": "查看结果",
"70a71fd48a648281f97db640cd17e911b21b7aed6c426946a6ebfca75b5370b1": "开源 AI 驱动 i18n。",
"70a71fd48a648281f97db640cd17e911b21b7aed6c426946a6ebfca75b5370b1": "开源AI 驱动的 i18n。",
"72c1a3fcc60022a54e18695b9339cbabfd0d0c5323d67023b7ce2f33a8034ab4": "中间件、providers、RTL、静态生成。",
"779cfd1ef832e29770721098eb3f3b5c3285cac36b48cceaff699fadf34f1b10": "零 key 工作流",
"7af023c43013b9a53fbff7dd4b5821588bba3319308878229740489152c43f6d": "文档",
"7e9b6873f872d858db85be10a071a8c0c7cac6e30d33e7273fd58a156a0c2ee4": "仅翻译自上次运行以来发生变化的内容。",
"7e9b6873f872d858db85be10a071a8c0c7cac6e30d33e7273fd58a156a0c2ee4": "只翻译自上次运行以来发生变化的内容。",
"8093606f5dea8770c10c7158bdc4d086f4236899c1a9d92c994941ee6db117b5": "编写组件。运行 CLI。发布多语言版本。",
"8261458cf5c7081cfa52fa99cd937affef77739d87f2d683ea8e6a4d84b4f76f": "无需维护 key 文件,即可翻译 JSX 和字符串。",
"848832860d55c6a64e25e21f86b910b6e6a5538aeebaf187a2ce6f504f9eaa0a": "今天就开始翻译你的 React 应用。开源,永久免费。",
"848832860d55c6a64e25e21f86b910b6e6a5538aeebaf187a2ce6f504f9eaa0a": "今天就开始为 React 应用做翻译。开源,永久免费。",
"9000a7b3a28531fc48a5eec38524ec3ce0e526c770f4c49a62c9d6bf9dd39cb4": "在 GitHub 上 Star",
"9478ae513b72a79e8af8ede569d13ca035bd620dd82d07ccb61f793be989e12d": "Next.js 一等支持",
"9478ae513b72a79e8af8ede569d13ca035bd620dd82d07ccb61f793be989e12d": "Next.js 原生级支持",
"96ab624b80ad052cb59be429ceae9f45e5c3a1f1ab695121eadbd7c459290de6": "从提取到部署,Tyndale 处理整个翻译工作流。",
"983f311018642b0ae60c71253b5735579906d43d260ea926ebe5e815b1c97abb": "开始使用",
"a017add6bb76387e0f7562230c809a2c7e3f0103d49b40969391c293fd0fe1a4": "增量",
"a6ca1bf546887fea51c0ec17d6adce63ae510eb61c972d00b26d5c8a90a85e17": "使用你自己的 AI 提供商,实现高质量翻译。",
"af2a0b929b65332983bc9ee1ab366c5ab5d5b481f6578dcfc928087cfcd340ba": "覆盖所有语言。",
"d3a58d3cb07abad32cc2311dabd1e68b0ab9e27dd921b398f8cf91ea7c0fdead": "用一种语言编写应用。",
"a017add6bb76387e0f7562230c809a2c7e3f0103d49b40969391c293fd0fe1a4": "增量翻译",
"a6ca1bf546887fea51c0ec17d6adce63ae510eb61c972d00b26d5c8a90a85e17": "使用你自己的 AI 提供商,获得高质量翻译。",
"af2a0b929b65332983bc9ee1ab366c5ab5d5b481f6578dcfc928087cfcd340ba": "获得所有语言版本。",
"d3a58d3cb07abad32cc2311dabd1e68b0ab9e27dd921b398f8cf91ea7c0fdead": "只用一种语言编写应用。",
"f911e414cf6bdfc595532ab166b5ba0f63d73c021452fcdacbda363dda6ad8fb": "GitHub",
"fbd47d140d266df1fd9a5a7372bcf94a16f620b632a5070b6898483cedea6dcc": "面向 React 与 Next.js 的 AI 驱动 i18n。无需 key 文件。无需手动翻译。",
"fbd47d140d266df1fd9a5a7372bcf94a16f620b632a5070b6898483cedea6dcc": "面向 React 与 Next.js 的 AI 驱动 i18n(国际化)。无需 key 文件。无需手动翻译。",
"fd9c821056de0e28597fa9be0ff16e3ba34f94f307414dc220c8fc281d1d06bb": "运行 CLI",
"fdb627efb86ba73e631686e916f746d4b946f5d2f1594109caf982ca2b694fe2": "开源"
}
41 changes: 38 additions & 3 deletions apps/website/src/content/docs/reference/react-api.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,11 @@ function Greeting({ name }: { name: string }) {
Signature:

```ts
(source: string, vars?: Record<string, string | number>) => string
type TranslationFn = (source: string, vars?: Record<string, string | number>) => string;
```

`TranslationFn` is exported from `tyndale-react` and is also the return type of `getTranslation()`.

### `useLocale()`

Returns the current locale string.
Expand Down Expand Up @@ -128,9 +130,9 @@ The hook looks up manifest entries with `type: 'dictionary'` and falls back to t

### `getTranslation(options)`

Async server helper that loads a locale file from disk and returns a translation function.
Async server helper that loads a locale file from disk and returns a `TranslationFn`.

Available from both `tyndale-react` and the server-only subpath:
Import it from the server-only subpath so client bundles never include Node filesystem code:

```ts
import { getTranslation } from 'tyndale-react/server';
Expand Down Expand Up @@ -178,6 +180,39 @@ export const copy = {

Use `msgString()` in non-React contexts such as plain TypeScript modules, Astro frontmatter, or server utilities.

### Pure shared helpers

For helpers imported by both Server and Client Components, pass a `TranslationFn` into the helper instead of reading translation state globally. Mark module-scope label maps with `msgString()` so the CLI extracts them.

```ts
import { msgString, type TranslationFn } from 'tyndale-react';

type Status = 'valid' | 'expired';

const STATUS_LABELS = {
valid: msgString('Compliant'),
expired: msgString('Expired'),
} satisfies Record<Status, string>;

const STATUS_FILTER_LABEL = msgString('Status: {status}');

export function statusLabel(status: Status, t: TranslationFn): string {
return t(STATUS_LABELS[status]);
}

export function activeFilterLabels(status: Status | undefined, t: TranslationFn): string[] {
const labels: string[] = [];

if (status) {
labels.push(t(STATUS_FILTER_LABEL, { status: statusLabel(status, t) }));
}

return labels;
}
```

Client components pass `useTranslation()`. Server components pass `await getTranslation(...)`. Translate composed labels with placeholders instead of template literals so word order can change by locale.

## Translation and formatting components

### `<T>`
Expand Down
Loading
Loading