diff --git a/.babelize/.gitignore b/.babelize/.gitignore new file mode 100644 index 0000000..086c95e --- /dev/null +++ b/.babelize/.gitignore @@ -0,0 +1,2 @@ +# Babelize: the QA report of the last local run (the lockfile next to it is committed). +local/report.json diff --git a/.babelize/config.json b/.babelize/config.json new file mode 100644 index 0000000..54fd5d5 --- /dev/null +++ b/.babelize/config.json @@ -0,0 +1,70 @@ +{ + "sourceLocale": "en", + "targetLocales": ["es", "ja", "ar"], + "include": ["src/app/page.tsx", "src/components/landing/**"], + "glossary": { + "neverTranslate": [ + "Babelize", + "Babelize Elements", + "React", + "Tailwind CSS", + "GitHub", + "npm", + "shadcn", + "i18n", + "pull request", + "next-intl", + "react-i18next" + ], + "alwaysTranslateAs": [ + { + "term": "localization", + "translations": { + "es": "localización", + "ja": "ローカライゼーション", + "ar": "التوطين" + } + }, + { + "term": "language switcher", + "translations": { + "es": "selector de idioma", + "ja": "言語スイッチャー", + "ar": "مبدّل اللغة" + } + }, + { + "term": "locale picker", + "translations": { + "es": "selector de configuración regional", + "ja": "ロケールピッカー", + "ar": "منتقي الإعدادات المحلية" + } + }, + { + "term": "open issues", + "translations": { + "es": "issues abiertos", + "ja": "未解決のIssue", + "ar": "المشكلات المفتوحة" + } + }, + { + "term": "component", + "translations": { + "es": "componente", + "ja": "コンポーネント", + "ar": "مكوّن" + } + }, + { + "term": "components", + "translations": { + "es": "componentes", + "ja": "コンポーネント", + "ar": "مكوّنات" + } + } + ] + } +} diff --git a/.babelize/local/babelize-lock.json b/.babelize/local/babelize-lock.json new file mode 100644 index 0000000..d1cfa5a --- /dev/null +++ b/.babelize/local/babelize-lock.json @@ -0,0 +1,2058 @@ +{ + "version": "1.0", + "projectId": "local", + "updatedAt": "2026-11-01T11:47:51.760Z", + "keys": { + "community.viewOurOpenSourceCode": { + "sourceHash": "8a7bd959cf06b5e4a62336763888a47ad15dad933d882efc01ae629bceaaba5b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Ver nuestro código abierto y contribuir al proyecto", + "ja": "オープンソースコードを見て,プロジェクトに貢献してください", + "ar": "شاهد رمز المصدر المفتوح لدينا والمساهمة في المشروع" + }, + "metadata": {} + }, + "community.followUsForUpdatesAnd": { + "sourceHash": "8d049d2dde39bc3b89ff6c743744bbe5be3d6aaa731f89e622f45c0ca30507c0", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Siga con nosotros para obtener actualizaciones y anuncios sobre nuestros productos", + "ja": "商品の更新や発表については,ご連絡ください", + "ar": "اتبعنا للحصول على تحديثات وإعلانات حول منتجاتنا" + }, + "metadata": {} + }, + "community.joinOurCommunityForSupport": { + "sourceHash": "c0f2d877516009174f9df0f3db74666e921b408eb4fcc93d9c10f2ba42351369", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Únete a nuestra comunidad para apoyar y discutir", + "ja": "支援と議論のために私たちのコミュニティに参加してください", + "ar": "انضم إلى مجتمعنا للحصول على الدعم والمناقشات" + }, + "metadata": {} + }, + "community.joinOurCommunity": { + "sourceHash": "da6ac6da400ad7b2b1e247bfeff264d64d27ef526af39c9e12ad6e807717112a", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Únete a nuestra comunidad", + "ja": "私たちのコミュニティに参加してください", + "ar": "انضموا إلى مجتمعنا" + }, + "metadata": {} + }, + "community.connectWithOtherDevelopersGet": { + "sourceHash": "9dfa2a4ecce8da4092a4e9ded9c94880ed01573a382dc4d4597cc3a178b1acef", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Conectarse con otros desarrolladores, obtener ayuda y contribuir al proyecto", + "ja": "他の開発者と連携し,支援を得て,プロジェクトに貢献します", + "ar": "التواصل مع المطورين الآخرين، والحصول على المساعدة، والمساهمة في المشروع" + }, + "metadata": {} + }, + "components.english": { + "sourceHash": "ba118bf7fc9c1aedc1edb28a0aa86e0b43b681f222af6616e13c43be87815b06", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "components.français": { + "sourceHash": "e495d53b967a7b049c8a2c25baa519fe124b49c1d0cf9cd8bdffa00d2f9d8ed6", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "components.español": { + "sourceHash": "94b382b61b9dde0ff8d45a44a34b61971d98df5bd810c803a3f33ce5b115eae8", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "components.deutsch": { + "sourceHash": "801cfe0fa1182664d16f4aaf7856cc73412f79ef508a866eebc2e5ccf125ff0a", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "components.untitled": { + "sourceHash": "77710aedc74ecfa33685e33a6c7df5cc83004da1bdcef7fb280f5c2b2e97e0a5", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "日本語", + "ja": "日本語", + "ar": "日本語" + }, + "metadata": {} + }, + "components.untitled_2": { + "sourceHash": "d274159863057eb5c633116c3b54e4f8659167f0b73fabbee256e881fa1ac8c8", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "components.untitled_3": { + "sourceHash": "58f1042929c996a1eddfd683c72ec33f015549d43ae12460a0d45b8059d70d99", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Hola de regreso", + "ja": "お疲れさまでした" + }, + "metadata": {} + }, + "components.untitled_4": { + "sourceHash": "48364eeb6c608829eed78a947c44b5c20a5436e37c347c120643f32b832e27f3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Tienes tres nuevos anuncios", + "ja": "3つの新しいメッセージがあります" + }, + "metadata": {} + }, + "components.preview": { + "sourceHash": "5975cf1bba432391c94667f5886225f69377c0aa8b9fa21fddfb21c89bcf9092", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "vista previa", + "ja": "プレビュー", + "ar": "معاينة" + }, + "metadata": {} + }, + "components.babelizeConsole": { + "sourceHash": "e6b62a3c64c2eaa3f3dfc53e8a9e8c7c123ee317c8330f5d0909f6ea839235b1", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Babelize La consola", + "ja": "Babelize コンソール", + "ar": "Babelize أجهزة التحكم" + }, + "metadata": { + "es": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ja": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ar": { + "glossaryHash": "3cc4df3244b11ea0" + } + } + }, + "components.localizationWorkspace": { + "sourceHash": "15d19beb20148c0340fc202a73c3ddbc810425fc993f88232cd79d6ba23fe340", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "localización espacio de trabajo", + "ja": "ローカライゼーション 作業スペース", + "ar": "التوطين مساحة عمل" + }, + "metadata": { + "es": { + "glossaryHash": "945c20a36b316896" + }, + "ja": { + "glossaryHash": "92d6fce221cd2d0d" + }, + "ar": { + "glossaryHash": "fcd3e3436e7da2dd" + } + } + }, + "components.live": { + "sourceHash": "b64ac05f17e64d037db81a98f51e2688216e292ae9748f979f04dfbac49fd7fc", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Vivir en vivo" + }, + "metadata": {} + }, + "components.workspaceSettings": { + "sourceHash": "5ebc59145b59b496ab62a99bbc948f0b67e6beb787903a1e41c169ec29360d2d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Configuración del espacio de trabajo", + "ja": "ワークスペースの設定は", + "ar": "إعدادات مساحة العمل" + }, + "metadata": {} + }, + "components.manageYourOrganizationDefaults": { + "sourceHash": "cabfb1116bb3467461b34336da12c6e88ea5c16aa199b388ffa8bb579a598c90", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Gestionar los fallos de su organización", + "ja": "組織のデフォルトを管理する", + "ar": "إدارة التخلفات التنظيمية" + }, + "metadata": {} + }, + "components.language": { + "sourceHash": "a4fe65264ef7dbb38d104b1e81eb3350f3142f3d16f32bdec39b1d9b42c1b8d1", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Idioma", + "ja": "言語", + "ar": "اللغة" + }, + "metadata": {} + }, + "components.interfaceAndContentLocale": { + "sourceHash": "90230eecb502c77dd2d744441b2dcc45dae7fa4c287c83ef5cc331dfe08aebc3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Interfaz y contenido local", + "ja": "インターフェイスとコンテンツローカル", + "ar": "واجهة المحتوى المحلية" + }, + "metadata": {} + }, + "components.timeZone": { + "sourceHash": "b9fe1464783e1c0d3a12dbde2686e883482a4fa03f33351af3e576d7a9d32fe0", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Zona horaria", + "ja": "タイムゾーン", + "ar": "المنطقة الزمنية" + }, + "metadata": {} + }, + "components.regionAwareFormatting": { + "sourceHash": "251a68733c8cc36b76698616422f23d3b739d61b0fe6deaa42632550ccd2b400", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Formación consciente de la región", + "ja": "地域意識のある格式化", + "ar": "تشكيل المنطقة" + }, + "metadata": {} + }, + "components.utc0530Sindian": { + "sourceHash": "7a03aae039463c06de15a64f946f0bcb0b0389baa0dbc8d3545763570749fbb2", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "ja": "(UTC+05:30) シディアン", + "ar": "(UTC+05:30) سنديان" + }, + "metadata": {} + }, + "components.theme": { + "sourceHash": "efb52e7172b77731d996ff4f51cd7b3dcfd55fc6f07392994619418d58d170dd", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Tema", + "ja": "テーマ", + "ar": "المظهر" + }, + "metadata": {} + }, + "components.appearancePreference": { + "sourceHash": "c2b27c108978c111eebf0c1e85cb240154fe092b4ad1395c34b46b5f703ae7d6", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "La preferencia por la apariencia", + "ja": "外見の好み", + "ar": "تفضيلات المظهر" + }, + "metadata": {} + }, + "components.dark": { + "sourceHash": "60acc53f13a5d1bf115878c4a785e9a43e8286c4139a8402a6ac7d23966f9153", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Es oscuro" + }, + "metadata": {} + }, + "components.translations": { + "sourceHash": "266a41b90d4f831ea1626e6188606e9ba4fe3f9f72bdb65cb1626d364d212162", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Traducciones", + "ja": "翻訳", + "ar": "ترجمات" + }, + "metadata": {} + }, + "components.appDashboardEnglish": { + "sourceHash": "9c5caabf1dd7d3c96e3385b65511bf1217902d8f5e169fc421a0f15fc2553dff", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Panel de aplicaciones · Inglés → Francés", + "ja": "アプリのダッシュボード · 英語 → フランス語", + "ar": "لوحة التطبيقات · الإنجليزية → الفرنسية" + }, + "metadata": {} + }, + "components.en": { + "sourceHash": "dbd3a49d0d906b4ed9216b73330d2fb080ef2f758c12f3885068222e5e17151c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "en", + "ja": "に関する", + "ar": "في يدي" + }, + "metadata": {} + }, + "components.source": { + "sourceHash": "0e570ca6fabe24f94e52c1833f3ffd25567022beb826fa16891f3322051bc221", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Fuente:", + "ja": "情報源:", + "ar": "المصدر" + }, + "metadata": {} + }, + "components.welcomeBackSarah": { + "sourceHash": "ceff2198031fa292f1fd369210ba6ab9b3a824929d93b0be4bedd8d83d6f0816", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "¡Bienvenido de vuelta, Sarah", + "ja": "お待たせしました!", + "ar": "مرحباً بعودتكِ يا (سارة)" + }, + "metadata": {} + }, + "components.fr": { + "sourceHash": "67ad8f41a7bb0a18c45f3efd8f6a32bdcd832bcf8f3f2eb44006c03d53076e18", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "por qué no?", + "ar": "من فضلكم" + }, + "metadata": {} + }, + "components.save": { + "sourceHash": "1509f561f2416598629b886ad7d3c05a7e221e4e0675c84bbff4ee6d9e03913d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Guardar", + "ja": "保存", + "ar": "حفظ" + }, + "metadata": {} + }, + "components.edit": { + "sourceHash": "464c4ffd019e1e9691dcf0537c797353ef2b1c1d4833d3d463e5b74ae4547344", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Editar", + "ja": "編集", + "ar": "تعديل" + }, + "metadata": {} + }, + "components.bienvenueSarah": { + "sourceHash": "fe76723328e6534710514d68331df66b7503b2d93bc9bddc6b96c0c2906a7ccd", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Bienvenido, Sarah", + "ja": "お疲れさまでした!", + "ar": "(مرحباً يا (سارة" + }, + "metadata": {} + }, + "components.clickEditToTranslateInline": { + "sourceHash": "0e21571ebcd08d9df920c656ebf9728ce0193b5cb70efc94b8d7a08a8e6c269a", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Haga clic en Edit para traducir en línea", + "ja": "Edit をクリックしてインラインを翻訳します", + "ar": "انقر على Edit لترجمة في الخط" + }, + "metadata": {} + }, + "components.activity": { + "sourceHash": "38da1505ca8373288489495101b14f24ac95078f520ad64df18272aa6054f750", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Actividad", + "ja": "アクティビティ", + "ar": "النشاط" + }, + "metadata": {} + }, + "components.notifications": { + "sourceHash": "788011833a5a0f22db90c91e8eb7bd8e9f5cd423354ff5ef8c338e7895f44ba9", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Notificaciones", + "ja": "通知", + "ar": "الإشعارات" + }, + "metadata": {} + }, + "components.beautifullyCraftedLocalizationComponents": { + "sourceHash": "493a20f592c660e14a5d30d8573f84c7f15f8a5e11075ae66bc23a62e93e2e6d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "components.productionReadyReactComponentsDesignedTo": { + "sourceHash": "b289ebb2aeb4f89a71dc832bc0c60b153084e80ce9772c301e311e8e84208fe3", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Listo para la producción React componentes diseñado para caer directamente en aplicaciones modernas.", + "ja": "React コンポーネントは,現代的なアプリケーションに直接落として設計されています.", + "ar": "جاهزة للإنتاج React مكوّنات مصممة لتسقط مباشرة في التطبيقات الحديثة." + }, + "metadata": { + "es": { + "glossaryHash": "7b56361e8b40d26e" + }, + "ja": { + "glossaryHash": "8d203a76726b7d20" + }, + "ar": { + "glossaryHash": "0f1609a43b9b7163" + } + } + }, + "components.components": { + "sourceHash": "a150ce22160259313c47bc66940b905a9c2196924fd447f802cff12dbb1e9702", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "componentes", + "ja": "コンポーネント", + "ar": "مكوّنات" + }, + "metadata": { + "es": { + "glossaryHash": "3411d72da1df24d7" + }, + "ja": { + "glossaryHash": "7125193fc49bf63b" + }, + "ar": { + "glossaryHash": "ed63ca2743b2b101" + } + } + }, + "components.hideCode": { + "sourceHash": "b92c5b5b58ddfd4be11f1b818cbe62be9e25694f80e98f6ff0cb255cb3aac85d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Esconder el código", + "ja": "暗号を隠す", + "ar": "إختباء الرمز" + }, + "metadata": {} + }, + "components.viewCode": { + "sourceHash": "e8b18c6caf4b941b845ca157f39bf2c0e645bc38027def5854cf4ce2faf117d6", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código de vista", + "ja": "ビューコード", + "ar": "رمز المشاهدة" + }, + "metadata": {} + }, + "components.copied": { + "sourceHash": "8d525e5f158b9afe05f3122af363ac67763bdc4e1395b46597b320c289766ce3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Copiado", + "ja": "複製された", + "ar": "نسخة" + }, + "metadata": {} + }, + "components.copyCode": { + "sourceHash": "49a0053f3b0d5045a4ef3edfe5c39be60a7ea272cc22b7c33d646624346ccd4d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código de copia", + "ja": "コピーコード", + "ar": "نسخ الرمز" + }, + "metadata": {} + }, + "components.copied_2": { + "sourceHash": "8d525e5f158b9afe05f3122af363ac67763bdc4e1395b46597b320c289766ce3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Copiado", + "ja": "複製された", + "ar": "نسخة" + }, + "metadata": {} + }, + "components.copy": { + "sourceHash": "e21f935f11d7e966dbbae78da9daa378fe8142a14e7c0cd7434183005faa6c5c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Copiar", + "ja": "コピー", + "ar": "نسخ" + }, + "metadata": {} + }, + "components.browseAllComponents": { + "sourceHash": "623e9722c175a0b00abc724c30c3fd868e848ad85d3a76dae2471b97e287a802", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Revisar todos los componentes", + "ja": "全コンポーネントを閲覧する", + "ar": "أبحث عن كل مكوّنات" + }, + "metadata": { + "es": { + "glossaryHash": "3411d72da1df24d7" + }, + "ja": { + "glossaryHash": "7125193fc49bf63b" + }, + "ar": { + "glossaryHash": "ed63ca2743b2b101" + } + } + }, + "contribute.contribute": { + "sourceHash": "97b0c61b99f65f9eda32799cfefb51dcf1a56c172576a34ae2d00896ab8e13dd", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Contribuir", + "ja": "貢献する" + }, + "metadata": {} + }, + "contribute.builtByTheCommunityFor": { + "sourceHash": "2f6bfc0e737561cacc957abe61eb2fa36c84244f077f0db86e00414163da5572", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Construido por el community para cada aplicación localizada.", + "ja": "communityで作られています", + "ar": "تم بناؤها بواسطة community لكل تطبيق محلي" + }, + "metadata": {} + }, + "contribute.joinTheBabelizeElementsOpenSource": { + "sourceHash": "8294f1e6faa676256de4ed1a2fd0ea40fe77eb1c31d1aa066e93558a54c4f2d9", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "ar": "انضموا إلى المساهمين المفتوحين Babelize Elements، اختروا مسألة، وبنوا React i18n مكوّن، وأرسلوها إلى المطورين في جميع أنحاء العالم.", + "ja": "オープンソースの Babelize Elements への参加 問題を選択して React i18n コンポーネント を構築し,世界中の開発者に送信します" + }, + "metadata": { + "ar": { + "glossaryHash": "97e0e6bbdccbfd4f" + }, + "ja": { + "glossaryHash": "5cdd5e3658eb845e" + } + } + }, + "contribute.readTheContributionGuide": { + "sourceHash": "7891fb07a7ead3b1101699dc080cfd75ed2393ec7363acbd8986186ee90b0094", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Leer la guía de contribuciones" + }, + "metadata": {} + }, + "contribute.browseOpenIssues": { + "sourceHash": "281a9ae5b201923d8a19bdacd9561fcc9f8192864577e21ffee9cf8baa16e7a0", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Busca en el issues abiertos", + "ja": "ブラウズ 未解決のIssue", + "ar": "تفتيش المشكلات المفتوحة" + }, + "metadata": { + "es": { + "glossaryHash": "7c88d6772258d1ee" + }, + "ja": { + "glossaryHash": "4071263d0e375a46" + }, + "ar": { + "glossaryHash": "a86326af2d8055d9" + } + } + }, + "editing.save": { + "sourceHash": "1509f561f2416598629b886ad7d3c05a7e221e4e0675c84bbff4ee6d9e03913d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Guardar", + "ja": "保存", + "ar": "حفظ" + }, + "metadata": {} + }, + "editing.preview": { + "sourceHash": "5975cf1bba432391c94667f5886225f69377c0aa8b9fa21fddfb21c89bcf9092", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "vista previa", + "ja": "プレビュー", + "ar": "معاينة" + }, + "metadata": {} + }, + "editing.babelizeConsole": { + "sourceHash": "e6b62a3c64c2eaa3f3dfc53e8a9e8c7c123ee317c8330f5d0909f6ea839235b1", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Babelize La consola", + "ja": "Babelize コンソール", + "ar": "Babelize أجهزة التحكم" + }, + "metadata": { + "es": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ja": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ar": { + "glossaryHash": "3cc4df3244b11ea0" + } + } + }, + "editing.localizationWorkspace": { + "sourceHash": "15d19beb20148c0340fc202a73c3ddbc810425fc993f88232cd79d6ba23fe340", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "localización espacio de trabajo", + "ja": "ローカライゼーション 作業スペース", + "ar": "التوطين مساحة عمل" + }, + "metadata": { + "es": { + "glossaryHash": "945c20a36b316896" + }, + "ja": { + "glossaryHash": "92d6fce221cd2d0d" + }, + "ar": { + "glossaryHash": "fcd3e3436e7da2dd" + } + } + }, + "editing.saved": { + "sourceHash": "b5c120b316c237a0deab3140267aebedba61947d3ae268d708a53d5be119e9fb", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Guardado", + "ja": "保存済み", + "ar": "تم الحفظ" + }, + "metadata": {} + }, + "editing.inContextEditing": { + "sourceHash": "20fe4d23364126ea1b70bfb84343af7a4db1c6c2c3f4d98d792cce2e04f2e016", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Editación en contexto", + "ar": "في السياق التحرير" + }, + "metadata": {} + }, + "editing.editTranslationsWhereTheyLive": { + "sourceHash": "97b389aa6e6222aaf9c496d096ad0635c2e86e1dc29a230d1fdb4eb328ff9209", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Edición de traducciones donde viven.", + "ja": "翻訳を編集する 彼らが住んでいる場所.", + "ar": "تحرير الترجمات حيث يعيشون." + }, + "metadata": {} + }, + "editing.updateLocalizedContentDirectlyInside": { + "sourceHash": "79695ed4e80b59c00b19fff81a87d11f4a389a422864e42663ac7003866180a5", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Actualice el contenido localizado directamente dentro de su interfaz en lugar de buscar a través de archivos de traducción.", + "ja": "翻訳ファイルを検索する代わりに インターフェースの内部に本格的なコンテンツを更新します", + "ar": "قم بتحديث المحتوى المحلي مباشرة داخل واجهتك بدلاً من البحث عن ملفات الترجمة." + }, + "metadata": {} + }, + "editing.noContextSwitchingNoHunting": { + "sourceHash": "7d4f94a5a2bdb31beb3becd5a3732adc84220191a3153c5b8a55566b037f821e", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "No hay cambio de contexto, no hay búsqueda de archivos de traducción.", + "ar": "لا تغيير السياق. لا صيد من خلال ملفات الترجمة." + }, + "metadata": {} + }, + "faq.howDoIInstallBabelize": { + "sourceHash": "239319627db176ced09428e24793e1b529ea4e1d68d021764fb6c9c862fc675c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "¿Cómo puedo instalar el Babelize Elements?", + "ja": "どうやってBabelize Elementsを設置する?", + "ar": "كيف يمكنني تركيب Babelize Elements؟" + }, + "metadata": { + "es": { + "glossaryHash": "d24143e2142fd211" + }, + "ja": { + "glossaryHash": "d24143e2142fd211" + }, + "ar": { + "glossaryHash": "d24143e2142fd211" + } + } + }, + "faq.canICustomizeTheLanguage": { + "sourceHash": "e303e44abce63d859904f7b23b2d3371f25bcc00aafd2f0e37ad08632187a5b8", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "ar": "هل يمكنني تخصيص مبدّل اللغة و منتقي الإعدادات المحلية مكوّنات؟" + }, + "metadata": { + "ar": { + "glossaryHash": "925f9a17999b5a1d" + } + } + }, + "faq.areTheseReactI18nComponents": { + "sourceHash": "be7b1bb4331ec395771f51245eadfa5f010a5815f14452ad5da5512baa57b373", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "ja": "React i18n コンポーネントは生産準備ができているのか?", + "es": "¿Están estos React i18n componentes listos para la producción?", + "ar": "هل هذه React i18n مكوّنات جاهزة للإنتاج؟" + }, + "metadata": { + "ja": { + "glossaryHash": "51e791506e3dda36" + }, + "es": { + "glossaryHash": "051172124a3b5f2e" + }, + "ar": { + "glossaryHash": "5b12a8ea31eda7bc" + } + } + }, + "faq.isBabelizeElementsReallyFree": { + "sourceHash": "20300fbde2fc822fa8fc8bbcfdb0052abba0e17469c371f9578c8cd973cf5634", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "¿Es Babelize Elements realmente libre y de código abierto?", + "ja": "Babelize Elementsは本当に無料でオープンソースですか?", + "ar": "هل Babelize Elements مجانية حقاً ومفتوحة المصدر؟" + }, + "metadata": { + "es": { + "glossaryHash": "d24143e2142fd211" + }, + "ja": { + "glossaryHash": "d24143e2142fd211" + }, + "ar": { + "glossaryHash": "d24143e2142fd211" + } + } + }, + "faq.whichInternationalizationI18nLibrariesAre": { + "sourceHash": "dec162267c34b485787b4c7e4359ea1c0b802d09842f5ec3c04a2cce3b17fd51", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "¿Qué bibliotecas de internacionalización (i18n) son compatibles?", + "ja": "どの国際化 (i18n) 図書館がサポートされていますか?", + "ar": "أي مكتبات دولية (i18n) تدعم؟" + }, + "metadata": { + "es": { + "glossaryHash": "619b81f2b86b0ac9" + }, + "ja": { + "glossaryHash": "619b81f2b86b0ac9" + }, + "ar": { + "glossaryHash": "619b81f2b86b0ac9" + } + } + }, + "faq.howDoIContributeA": { + "sourceHash": "bc9c411fdc2a48569f2e49bb4af089ede35f647d3307c6d74682750ba3eff744", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "¿Cómo puedo contribuir con un componente a Babelize Elements?", + "ja": "コンポーネントからBabelize Elementsへの貢献は?", + "ar": "كيف أسهم بـمكوّن إلى Babelize Elements؟" + }, + "metadata": { + "es": { + "glossaryHash": "68372e35702aeb44" + }, + "ja": { + "glossaryHash": "075dc7c411ca190c" + }, + "ar": { + "glossaryHash": "3aaf6c2f8a1402dc" + } + } + }, + "faq.installTheFullLibraryWith": { + "sourceHash": "ac819cdcfdb78886c913e98227a4c048b8f0c6dc4baf3598219d3268ce5ea44d", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Instala la biblioteca completa con `npm install @babelize/elements`, o agrega componentes individual con `npx shadcn@latest add @babelize/language-switcher` (o `npx @babelize/elements add language-switcher`). Funciona con Next.js, Remix y cualquier aplicación React.", + "ar": "قم بتثبيت المكتبة الكاملة مع `npm install @babelize/elements` أو أضف مكوّنات الفردي مع `npx shadcn@latest add @babelize/language-switcher` (أو `npx @babelize/elements add language-switcher`). يعمل مع Next.js، Remix، وأي تطبيق React." + }, + "metadata": { + "es": { + "glossaryHash": "7b56361e8b40d26e" + }, + "ar": { + "glossaryHash": "0f1609a43b9b7163" + } + } + }, + "faq.absolutelySinceYouOwnThe": { + "sourceHash": "1d09b2b546a324216cd8b055c1153cc1f84393f67bd3fd15722bf4e4b9330d1a", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Desde que posees el código, cada componente es totalmente personalizable con Tailwind CSS clases y accesorios. Cambia colores, espacios, animaciones y comportamiento como quieras.", + "ja": "すべてのコンポーネントはTailwind CSSクラスと道具で完全にカスタマイズできます 好きなように色やスペース,アニメーション,行動を変更します デザイン制限はありません", + "ar": "بالتأكيد، نظرًا لأنّك تملك الرمز، كل مكوّن قابلة للتخصيص بالكامل مع Tailwind CSS فئة وأدوات. قم بتغيير الألوان، الفاصل، الرسوم المتحركة، والسلوك كما تريد. لا توجد قيود تصميم." + }, + "metadata": { + "es": { + "glossaryHash": "5a2f59a2fef9a89a" + }, + "ja": { + "glossaryHash": "64791401eab3e930" + }, + "ar": { + "glossaryHash": "a75f64b2da0b1d7b" + } + } + }, + "faq.everyMergedComponentIsReviewed": { + "sourceHash": "12afb174073f863b2c8d705f2e52d5b298d100226623e26dffb00a76a0cb18f4", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Cada componente fusionado es revisado por los mantenedores y sigue nuestra lista de verificación de accesibilidad, TypeScript y localización antes de ser documentado.", + "ja": "組み合わされたコンポーネントは メンテナンス担当者によって レビューされ 文書化される前に アクセシビリティ・タイプスクリプトとローカライゼーションのチェックリストを チェックしています", + "ar": "يتم مراجعة كل مكوّن المدمجة من قبل المراقبين وتتبع قائمة الوصول الخاصة بنا، وخطوط النموذج، و التوطين قبل أن يتم توثيقها." + }, + "metadata": { + "es": { + "glossaryHash": "be8ca5e1fc43a1e1" + }, + "ja": { + "glossaryHash": "36d4e7423bb1b518" + }, + "ar": { + "glossaryHash": "5bc856c038191b2e" + } + } + }, + "faq.yesMitLicensedAndFree": { + "sourceHash": "2fa9a4399fedd7f1b95acd65bd32529f79adf3671fa6cddd1699372902a8ae16", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Sí Licenciado por MIT y gratuito para siempre. El código vive en GitHub, las contribuciones son bienvenidas, y puede usar el componentes en cualquier proyecto, comercial o no. No se requiere atribución.", + "ja": "GitHubのコードは永久に無料です. 貢献は歓迎され,商業的であろうとあらゆるプロジェクトでコンポーネントを使用できます. アトリビューションは必要ありません.", + "ar": "نعم تم ترخيصها بواسطة MIT ومجانية إلى الأبد. الرمز يعيش على GitHub، المساهمات مرحبًا بها، ويمكنك استخدام مكوّنات في أي مشروع، سواء كان تجاريًا أو غير." + }, + "metadata": { + "es": { + "glossaryHash": "9569f47deefbec1c" + }, + "ja": { + "glossaryHash": "b35d733621cf75fe" + }, + "ar": { + "glossaryHash": "51987987af0f2f33" + } + } + }, + "faq.babelizeElementsWorksWithEvery": { + "sourceHash": "50dd466970f05506fd0e15c75809ed729b105486035031952a44f2fc506ae249", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "faq.browseTheOpenIssuesOn": { + "sourceHash": "78de48d2db4ccc22bba896d032208b74228e8bd43bef3df05bfee13699ac9c01", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Navegar por el issues abiertos en GitHub, construir el componente siguiendo la guía de contribución, y abrir un pull request.", + "ja": "未解決のIssue を GitHub で閲覧し,貢献ガイドに従って コンポーネント を作成し, pull request を開きます. メンテナントはそれをレビューし,統合します.", + "ar": "تصفح المشكلات المفتوحة على GitHub، قم بإنشاء مكوّن وفق دليل المساهمة، وفتح pull request. يقوم الحافظون بمراجعتها ودمجها، ويتم إرسالها إلى المستندات للجميع." + }, + "metadata": { + "es": { + "glossaryHash": "331e43507162e566" + }, + "ja": { + "glossaryHash": "097263677b211c96" + }, + "ar": { + "glossaryHash": "f7d0ba294050ae74" + } + } + }, + "faq.support": { + "sourceHash": "be91940b79f469101df9a50544b6873aa5509a12f1f93f1cb5e3be3990d344b3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Soporte", + "ja": "サポート", + "ar": "الدعم" + }, + "metadata": {} + }, + "faq.frequentlyAskedQuestions": { + "sourceHash": "240dc2ee5794c37460af7207df31359263b611f5c204072ebba236560fc55449", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Pregunta frecuente preguntas ", + "ar": "الأسئلة المتكررة أسئلة " + }, + "metadata": {} + }, + "faq.everythingYouNeedToKnow": { + "sourceHash": "98373d2a34e4b72a6dc3fee5723cab8e364086861052f6958a0ff592282b3ed8", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "features.languageSwitchers": { + "sourceHash": "180170814869950e24c53d81e6c0199530e3a2e1d9e4698eb48299e55c7dfaeb", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Cambiadores de lenguaje", + "ja": "言語交換器", + "ar": "متغيرات اللغة" + }, + "metadata": {} + }, + "features.localePickers": { + "sourceHash": "02bb6c0717101091212c607bc043e1cb61cb744ce5f39962a7401362e12d2d01", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Recogedores locales", + "ja": "ローカル・ピックラーズ", + "ar": "المجموعات المحلية" + }, + "metadata": {} + }, + "features.rtlLayoutSupport": { + "sourceHash": "75ac150c41a4437a34f672a9d38e6bc0acd6dd83c3764a1436233e2750317c48", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Apoyo a la configuración de RTL", + "ja": "RTL レイアウト サポート", + "ar": "دعم التخطيط RTL" + }, + "metadata": {} + }, + "features.i18nIntegration": { + "sourceHash": "2da3de97ed2a81931792254a41fb7d9410697e6495297d975a10c0d6db658fe8", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "i18n La integración", + "ar": "i18n التكامل", + "ja": "i18n 統合" + }, + "metadata": { + "es": { + "glossaryHash": "619b81f2b86b0ac9" + }, + "ja": { + "glossaryHash": "619b81f2b86b0ac9" + }, + "ar": { + "glossaryHash": "619b81f2b86b0ac9" + } + } + }, + "features.dropInSwitchersWithDropdownsPills": { + "sourceHash": "1ab663452eb2b619ba2bb3caf1a7cfd10f2fd503e46ef9e8d1d4d661960a585d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Los interruptores desplegables, las pastillas, las banderas y el soporte completo de RTL.", + "ja": "ドロップダウン,錠剤,フラッグ,および完全なRTLサポートを持つドロップインスイッチ.", + "ar": "أجهزة التبديل المقطوعة، والحبوب، والعلامات، ودعم RTL الكامل." + }, + "metadata": {} + }, + "features.searchableLocalePickersWithNative": { + "sourceHash": "b022e2d98e997430fb08d2f628c34b4c635d556259db29def78e45c510d70085", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Los seleccionadores de lugares buscables con nombres y banderas nativas.", + "ja": "地元の名前や旗を検索できる.", + "ar": "يُمكن البحث عن المواقع ذات الأسماء والعلامات الأصلية." + }, + "metadata": {} + }, + "features.automaticRtlDetectionAndLayout": { + "sourceHash": "a1c2fc8189a5cffbecae589cffa0df3a00b40cd303867900669ddc78e249c79f", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Detección automática de RTL y manejo de la dirección del diseño.", + "ja": "自動RTL検出とレイアウト方向処理", + "ar": "التشخيص التلقائي لـ RTL ومعالجة اتجاه التخطيط" + }, + "metadata": {} + }, + "features.worksWithReactIntlNextIntlI18next": { + "sourceHash": "6c9ff47dc815d4d50eb38fcece1388895879e9c5952906fed473f41b52d46e2f", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Trabaja con react litros, next-intl, i18next, LinguiJS, y más.", + "ja": "react-intl, next-intl, i18next, LinguiJSなどで動作します.", + "ar": "يعمل مع react لتر، next-intl، i18next، LinguiJS، وغيرها." + }, + "metadata": { + "es": { + "glossaryHash": "dde817ba1a6e85a1" + }, + "ja": { + "glossaryHash": "dde817ba1a6e85a1" + }, + "ar": { + "glossaryHash": "dde817ba1a6e85a1" + } + } + }, + "features.powerfulByDefault": { + "sourceHash": "164643d58df67771a02fbb12e93ecedca6762bb875a35c45727bc303e06bb824", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Poderoso por defecto", + "ar": "قوية بشكل افتراضي" + }, + "metadata": {} + }, + "features.everythingYouNeed": { + "sourceHash": "e2a24067404ef9bef612f4baf03e2e7306e9a1e13f84fdb85af04cf9eb110aeb", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Todo lo que necesitas", + "ja": "必要なものは全て", + "ar": "كل ما تحتاجه" + }, + "metadata": {} + }, + "features.toLocalize": { + "sourceHash": "392a55e1faf24f3442aa3ea11546fb8686cb36ab81a0ffe6f6934d60055297fa", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Para localizarlo.", + "ja": "地元を特定する", + "ar": "لتحديد موقعها" + }, + "metadata": {} + }, + "features.builtForModernReactApps": { + "sourceHash": "08e7c75c38a704871d1f31a4a2f2b1401ec504aad7ce92fea133303d7d630522", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Construido para React aplicaciones modernas.", + "ja": "モダンなアプリReactを インストールして グローバルに出荷します", + "ar": "بنيت من أجل React تطبيقات حديثة، قم بتثبيتها وإرسالها عالمياً." + }, + "metadata": { + "es": { + "glossaryHash": "1f22a3d95765ca21" + }, + "ja": { + "glossaryHash": "1f22a3d95765ca21" + }, + "ar": { + "glossaryHash": "1f22a3d95765ca21" + } + } + }, + "features.copy": { + "sourceHash": "e21f935f11d7e966dbbae78da9daa378fe8142a14e7c0cd7434183005faa6c5c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Copiar", + "ja": "コピー", + "ar": "نسخ" + }, + "metadata": {} + }, + "features.useClient": { + "sourceHash": "66eefa5f11f9135fcb21ad285b4fe7d8f32ff20e3f34db40e3a16276d81ba9c2", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"cliente de uso\"", + "ja": "\"利用客\"で", + "ar": "\"استعمال العميل\"" + }, + "metadata": {} + }, + "features.import": { + "sourceHash": "d942f64886578d8747312e368ed92d9f6b2a8d45556f0f924e2444fe911d15af", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "importar", + "ja": "インポート", + "ar": "استيراد" + }, + "metadata": {} + }, + "features.languageswitcher": { + "sourceHash": "41e12b13f64c34cc030cba63b186c3b930e91653a934a2febf42643c71612192", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "lenguajeSwitcher", + "ja": "言語スイッチ", + "ar": "اللغةSwitcher" + }, + "metadata": {} + }, + "features.from": { + "sourceHash": "75857a45899985be4c4d941e90b6b396d6c92a4c7437aaf0bf102089fe21379d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "de lo que es", + "ja": "イエズスから", + "ar": "من فيديو" + }, + "metadata": {} + }, + "features.babelizeElements": { + "sourceHash": "0d08fb595c2c33951d4e5427ddd0d34fe8acd89b06f798c2a76bd276773bce91", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"@babelize/elementos\"", + "ja": "\"@babelize/エレメンツ\"", + "ar": "\"@babelize/ العناصر\"" + }, + "metadata": { + "es": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ja": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ar": { + "glossaryHash": "3cc4df3244b11ea0" + } + } + }, + "features.exportDefaultFunction": { + "sourceHash": "e922f1c6f6e5fdeff2e26a3efb0a88ad144ca2803ee754cde1be8c7725c60180", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Función por defecto de exportación", + "ja": "輸出デフォルト関数", + "ar": "الوظيفة الافتراضية للتصدير" + }, + "metadata": {} + }, + "features.app": { + "sourceHash": "0d04bfeb7d64b71c74fc925cca93d683154e8cc7e6e5838faced498e34c9984d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Aplicación", + "ja": "アップは", + "ar": "التطبيق" + }, + "metadata": {} + }, + "features.return": { + "sourceHash": "7187f0675eb3827939741acf7342ba78836ecec21a31ecf3f34a55309d3bee8a", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "El regreso", + "ja": "戻る", + "ar": "العودة" + }, + "metadata": {} + }, + "features.languageswitcher_2": { + "sourceHash": "41e12b13f64c34cc030cba63b186c3b930e91653a934a2febf42643c71612192", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "lenguajeSwitcher", + "ja": "言語スイッチ", + "ar": "اللغةSwitcher" + }, + "metadata": {} + }, + "features.locales": { + "sourceHash": "62bc7cacc929f0e9ab9787b7a0703360f4ac40ac805225b83a4d8218e3e02587", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "ja": "地元", + "ar": "المحليات" + }, + "metadata": {} + }, + "features.code": { + "sourceHash": "fad97318bc5ba525525a658e20599996671570c6a642f83d0d3e1fb1f1baffcf", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código:", + "ja": "コード:", + "ar": "الرمز:" + }, + "metadata": {} + }, + "features.en": { + "sourceHash": "50eac10e7966a04e139902940a2a8e129a4597574c709cb8d01939ace56ff9c3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"en\" y \"en\"", + "ja": "\"en\"で", + "ar": "\"في\"" + }, + "metadata": {} + }, + "features.code_2": { + "sourceHash": "fad97318bc5ba525525a658e20599996671570c6a642f83d0d3e1fb1f1baffcf", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código:", + "ja": "コード:", + "ar": "الرمز:" + }, + "metadata": {} + }, + "features.fr": { + "sourceHash": "92e5a66169065f84773d2d274c0cbf31bf70b2a73e0bb398ef2c9d6236246ef2", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"fr\" en su nombre", + "ja": "\"fr\"は", + "ar": "\"fr\" في البداية" + }, + "metadata": {} + }, + "features.code_3": { + "sourceHash": "fad97318bc5ba525525a658e20599996671570c6a642f83d0d3e1fb1f1baffcf", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código:", + "ja": "コード:", + "ar": "الرمز:" + }, + "metadata": {} + }, + "features.es": { + "sourceHash": "14ba00619711fab581c110c61f07619a6df0d8c35da91f7ce7c4436d3c3531b5", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"es\" es", + "ja": "\"エス\"とは", + "ar": "\"هناك\"" + }, + "metadata": {} + }, + "features.code_4": { + "sourceHash": "fad97318bc5ba525525a658e20599996671570c6a642f83d0d3e1fb1f1baffcf", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código:", + "ja": "コード:", + "ar": "الرمز:" + }, + "metadata": {} + }, + "features.de": { + "sourceHash": "fa20977256dfdd5a59989d6975c14a6909be1e3c9cd8bcb45ce4ffc0775c52fb", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"de\" y \"de\"", + "ja": "\"de\"で", + "ar": "\"فقط\"" + }, + "metadata": {} + }, + "features.code_5": { + "sourceHash": "fad97318bc5ba525525a658e20599996671570c6a642f83d0d3e1fb1f1baffcf", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código:", + "ja": "コード:", + "ar": "الرمز:" + }, + "metadata": {} + }, + "features.ja": { + "sourceHash": "4a86a3eca47707ecbec7f6d2c910c8246361242f9db740ce8c21bb032781d1c0", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"ja\" en su nombre", + "ja": "\"ジャイ\"で", + "ar": "\"يا\"" + }, + "metadata": {} + }, + "features.code_6": { + "sourceHash": "fad97318bc5ba525525a658e20599996671570c6a642f83d0d3e1fb1f1baffcf", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código:", + "ja": "コード:", + "ar": "الرمز:" + }, + "metadata": {} + }, + "features.ar": { + "sourceHash": "8208994143fbc4fbdeab96c0ed932f9df3846568df6187e6833fb647366b1935", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"ar\" en su nombre", + "ja": "\"アール\"", + "ar": "\"أر\"" + }, + "metadata": {} + }, + "features.defaultvalue": { + "sourceHash": "b5bd866e65a9f2fc2d6a398642b8c5b6cf14df5df507ba60b65646235cf2750f", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Por defectoValue", + "ar": "ديفاولتvالوي" + }, + "metadata": {} + }, + "features.en_2": { + "sourceHash": "50eac10e7966a04e139902940a2a8e129a4597574c709cb8d01939ace56ff9c3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "\"en\" y \"en\"", + "ja": "\"en\"で", + "ar": "\"في\"" + }, + "metadata": {} + }, + "features.onvaluechange": { + "sourceHash": "779e077450a1d912854f8e116e3d576b2a18b33f46e6b427ec0ce982ef9423df", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "sobreCambio de valor", + "ar": "ونvالويcحانgي" + }, + "metadata": {} + }, + "features.code_7": { + "sourceHash": "5694d08a2e53ffcae0c3103e5ad6f6076abd960eb1f8a56577040bc1028f702b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código", + "ja": "コード", + "ar": "الرمز" + }, + "metadata": {} + }, + "features.router": { + "sourceHash": "e44a6c3c348c47df6eba5d3be20e009bb9e08916f4e76066e4c93d8d2e4c8d00", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "El enrutador.", + "ja": "ルーター", + "ar": "جهاز التوجيه" + }, + "metadata": {} + }, + "features.push": { + "sourceHash": "d107ea3629c326718876f07356a48dea26f123742f8bf44ce75f8f805cf9a37d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Empuje", + "ja": "押す", + "ar": "ادفع" + }, + "metadata": {} + }, + "features.untitled": { + "sourceHash": "3ad3a5d6b7618935915ed5247e0a59fc8bd11591dd8127d511bf5c1a61585283", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "`/$", + "ja": "`/$", + "ar": "`/$" + }, + "metadata": {} + }, + "features.code_8": { + "sourceHash": "5694d08a2e53ffcae0c3103e5ad6f6076abd960eb1f8a56577040bc1028f702b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código", + "ja": "コード", + "ar": "الرمز" + }, + "metadata": {} + }, + "features.i18n": { + "sourceHash": "3463793b7f77993a15bc376009756ba33ab65ef22a0253773e855a91de825b92", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "¿Qué es esto?", + "ja": "i18nで", + "ar": "أ18ن." + }, + "metadata": {} + }, + "features.changelanguage": { + "sourceHash": "8c279537a2a1e17f9b8e5bc547f04b28b0cfa73985895793390634ac79260f9a", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Cambio de lenguaje", + "ar": "cحانgيلانgواgي" + }, + "metadata": {} + }, + "features.code_9": { + "sourceHash": "5694d08a2e53ffcae0c3103e5ad6f6076abd960eb1f8a56577040bc1028f702b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Código", + "ja": "コード", + "ar": "الرمز" + }, + "metadata": {} + }, + "footer.babelizeElements": { + "sourceHash": "3a26f9edd5805875e65c89f33516716f5d58e15ea13eaf6d68f6898db4168867", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "footer.openSourceReactComponentsForModern": { + "sourceHash": "9d40b85122836ef0ac8d7fc9c4801d67edb7e7472bd34e1c47f2eb8be2e23658", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "React componentes de código abierto para el localización moderno y la gestión de la internacionalización.", + "ja": "ローカライゼーションと国際化管理のためのオープンソース React コンポーネント", + "ar": "المصدر المفتوح React مكوّنات للإدارة الحديثة التوطين والدولية." + }, + "metadata": { + "es": { + "glossaryHash": "587a7cb86731ed4c" + }, + "ja": { + "glossaryHash": "3c99c98b30b20f8a" + }, + "ar": { + "glossaryHash": "871c6356eaf9cf69" + } + } + }, + "footer.babelize": { + "sourceHash": "5c370ec7f6100c09227e9ba4747a1fcd2f52e76f1c551ea9152c055c19c801c8", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "footer.resources": { + "sourceHash": "e89b30aa1dc30a6ad8c34610689bede83b3ef645a24c3a84a0990826687fb735", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Los recursos", + "ja": "資源", + "ar": "الموارد" + }, + "metadata": {} + }, + "footer.community": { + "sourceHash": "bb501d7877eb7ddbd40baf7990e8058212e8140a2e6ceaaf2d54a6412b770bfd", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "La comunidad", + "ja": "地域社会", + "ar": "المجتمع" + }, + "metadata": {} + }, + "footer.babelizeElementsMadeWith": { + "sourceHash": "0addfa7450ae0f6e4583409540e9ffc89c08be9d510ffe7e91e0fc960f181c80", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Babelize Elements", + "ar": "Babelize Elements", + "ja": "Babelize Elementsで作られている" + }, + "metadata": { + "es": { + "glossaryHash": "d24143e2142fd211" + }, + "ar": { + "glossaryHash": "d24143e2142fd211" + }, + "ja": { + "glossaryHash": "d24143e2142fd211" + } + } + }, + "footer.byDevelopersAtBabelizeFor": { + "sourceHash": "c8abaf03fd1e0435656eabb9703fece1c165b968b6a54cbc42ad8f47e61cba00", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "por desarrolladores en Babelize, para desarrolladores.", + "ja": "開発者向けBabelizeで開発者向け", + "ar": "من قبل المطورين في Babelize, للمطورين." + }, + "metadata": { + "es": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ja": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ar": { + "glossaryHash": "3cc4df3244b11ea0" + } + } + }, + "getting-started.buildFaster": { + "sourceHash": "beea5d5f2c222d1c886a28b6113a97830b84239b1588115d35d3bcab081d8ea0", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Construye más rápido", + "ja": "早く作れ", + "ar": "بناء أسرع" + }, + "metadata": {} + }, + "getting-started.stayConsistent": { + "sourceHash": "8e07d71bf6fba04b218d001bd774d80216033e03d4304b1b7aa8cad9ea11a567", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Manténgase consistente", + "ja": "一貫して", + "ar": "إبقوا متواصلين" + }, + "metadata": {} + }, + "getting-started.shipGlobally": { + "sourceHash": "0eb65a6aa5f6e32f556b708c6dc5a8ebf15203c489a83369d58726d839779556", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Navegación a nivel mundial", + "ja": "船舶はグローバルに", + "ar": "سفينة عالمية" + }, + "metadata": {} + }, + "getting-started.stopRebuildingLocalizationUi": { + "sourceHash": "f2ed6eb75ea9b3fa1b5ee04e0fd286744da95b6e6ddeb1699d16ed6cec734bd8", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Deja de reconstruir localización UI.", + "ja": "ローカライゼーション UIの再構築をやめましょう", + "ar": "توقف عن إعادة بناء التوطين UI." + }, + "metadata": { + "es": { + "glossaryHash": "945c20a36b316896" + }, + "ja": { + "glossaryHash": "92d6fce221cd2d0d" + }, + "ar": { + "glossaryHash": "fcd3e3436e7da2dd" + } + } + }, + "getting-started.oneLocalizationExperienceAcrossYour": { + "sourceHash": "e5a137c51008228e9b53ceabe0eea3ff9bcee9f3c8e36129f96c08831f8b75dc", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Una experiencia de localización a través de su aplicación.", + "ja": "あなたのアプリで1つのローカライゼーションの経験があります.", + "ar": "تجربة واحدة التوطين عبر تطبيقك" + }, + "metadata": { + "es": { + "glossaryHash": "945c20a36b316896" + }, + "ja": { + "glossaryHash": "92d6fce221cd2d0d" + }, + "ar": { + "glossaryHash": "fcd3e3436e7da2dd" + } + } + }, + "getting-started.languagesLocalesAndRtl": { + "sourceHash": "eb33e99192dde1afd22b8bb7630b7e4eee79dadfb723d44e7cd17384eb4894f1", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Idiomas, locales y RTL se manejan.", + "ja": "言語,地域,およびRTL が扱われる.", + "ar": "اللغات والمناطق، و RTL معالجة." + }, + "metadata": {} + }, + "getting-started.useReadyMadeComponentsInsteadOf": { + "sourceHash": "19d9883def71408529848b2d982a2790a4e1dad313f7f6f4af13c89b19f9d664", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Utilice el componentes listo en lugar de crear repetidamente selectores de lenguaje, controles locales, interfaces de edición y comportamiento RTL desde cero.", + "ja": "言語セレクター,ローケールコントロール,エディティングインターフェイス,RTL行動をゼロから繰り返し作成する代わりに,準備済みコンポーネントを使用します.", + "ar": "استخدم مكوّنات جاهزة بدلاً من إنشاء اختيارات اللغة وتحكمات المنطقة وتحرير الواجهات والسلوك RTL من الصفر." + }, + "metadata": { + "es": { + "glossaryHash": "3411d72da1df24d7" + }, + "ja": { + "glossaryHash": "7125193fc49bf63b" + }, + "ar": { + "glossaryHash": "ed63ca2743b2b101" + } + } + }, + "getting-started.keepLanguageSwitchingAndLocalization": { + "sourceHash": "96409568c59dbde9b66e13dd27a9c2f18c55c4181aa5687541c16d3cdf1cad4a", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "ja": "製品全体で異なる実装を維持するのではなく,言語の切り替えとローカライゼーションの相互作用を視覚的に一致させてください." + }, + "metadata": { + "ja": { + "glossaryHash": "92d6fce221cd2d0d" + } + } + }, + "getting-started.buildInterfacesThatAreReady": { + "sourceHash": "299ea2d81ac77f6e42ae49751998ac8b01242ce7437ee52c28d16cbf49117b6b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Construir interfaces que estén listas para los usuarios en diferentes idiomas y escribir direcciones sin crear sistemas de interfaz separados.", + "ja": "異なる言語でユーザーに用意されたインターフェースを作成し,別々のUIシステムを作成することなく,指示を書きます.", + "ar": "بناء واجهات جاهزة للمستخدمين عبر اللغات المختلفة وكتابة الاتجاهات دون إنشاء أنظمة UI منفصلة." + }, + "metadata": {} + }, + "getting-started.buildFromScratch": { + "sourceHash": "2bb3a069cbebbb3fa551db08e18c45079f2ae453daf325a47e1af8230239ca3c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Construir desde cero", + "ja": "ゼロから作る", + "ar": "بناء من الصفر" + }, + "metadata": {} + }, + "getting-started.useBabelize": { + "sourceHash": "90174a0aec790c2a2f9b4401ec24039f3a4acbd58f61a06710c07e9680473f68", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Utilice el Babelize", + "ja": "Babelize を使用する", + "ar": "استخدم Babelize" + }, + "metadata": { + "es": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ja": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ar": { + "glossaryHash": "3cc4df3244b11ea0" + } + } + }, + "getting-started.dropdown": { + "sourceHash": "2c84dd8d59dafd71af7a7977bda7ae5ca5e6353e5d75c853ca61e4a914717999", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Descenso", + "ja": "ドロップダウン", + "ar": "النزول إلى أسفل" + }, + "metadata": {} + }, + "getting-started.pill": { + "sourceHash": "9945c78b5f893ca44dd1b2792747612d9ea8781fa0d6522b9ac3b88ca871c41b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "La píldora", + "ja": "錠剤は", + "ar": "حبوب منع الحمل" + }, + "metadata": {} + }, + "getting-started.segmented": { + "sourceHash": "d71a0c697cce8711262f690e4aa6576b6c66c65d4379010ee9c182060e4f6dc3", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Segmentado", + "ja": "割れ目", + "ar": "التقسيم" + }, + "metadata": {} + }, + "getting-started.oneLanguageswitcher": { + "sourceHash": "a52636a4e9166705f28c69b0b42d8c9ba13af4ff58bcd3bf41a4ba5bf7869ad6", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Un interruptor de lenguaje", + "ja": "1つの言語スイッチ", + "ar": "واحد لغةSwitcher" + }, + "metadata": {} + }, + "getting-started.en": { + "sourceHash": "69374b09b1681162ba2d6bba92d6a167ea5ca5921eb172eb173e999e3be5d8ba", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "el caso de los niños", + "ar": "ين" + }, + "metadata": {} + }, + "getting-started.fr": { + "sourceHash": "501c26b2571a1f7fd72df8c21593874fc874c97145717470596895d1c22203f7", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "en su lugar de residencia", + "ar": "فر" + }, + "metadata": {} + }, + "getting-started.de": { + "sourceHash": "6814ef46f686990cf4e946f966167b0507e1d642c44e51f61bffb0bba2d4672b", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "en su lugar", + "ar": "دي" + }, + "metadata": {} + }, + "getting-started.ar": { + "sourceHash": "b1b7afa76db271451a1f3fff738ff21ed53cca91f7f580bb294193e9d2da31b4", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "en la actualidad", + "ar": "ار" + }, + "metadata": {} + }, + "getting-started.rtl": { + "sourceHash": "85c7550445fe1e89afd00b8cb59edaa2086c05afbf41c277f2b60bac842408d2", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "ar": "الـ RTL ✓" + }, + "metadata": {} + }, + "getting-started.whyBabelize": { + "sourceHash": "0d56bfc751238a798f679196cfdd0a28620da40b78abbcb3f9aa18c2be0afa3b", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "¿Por qué Babelize? ¿Por qué usar Babelize?", + "ar": "لماذا بابل؟ لماذا Babelize؟", + "ja": "なぜBabelizeなのか?" + }, + "metadata": { + "es": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ar": { + "glossaryHash": "3cc4df3244b11ea0" + }, + "ja": { + "glossaryHash": "3cc4df3244b11ea0" + } + } + }, + "getting-started.localizationShouldntSlowDownYour": { + "sourceHash": "686e69a78e7c7388529c5215ce076b13c6e53d8cb8aecb5955f03477393e1769", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "ar": "التوطين لا ينبغي أن تبطئ منتجك." + }, + "metadata": { + "ar": { + "glossaryHash": "fcd3e3436e7da2dd" + } + } + }, + "getting-started.skipTheRepetitiveWorkOf": { + "sourceHash": "6060a3c36e8ea8cdfbc7bd78d81fce7724d1d23325408f3b643652107e9056e9", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Salta el trabajo repetitivo de reconstruir localización UI. El Babelize te da un componentes pulido y listo para la producción que encaja directamente en la pila que ya usas.", + "ar": "تخطي العمل المتكرر من إعادة بناء التوطين UI. Babelize يعطيك مثقلة، جاهزة للإنتاج مكوّنات التي تناسب مباشرة في كومة تستخدمها بالفعل." + }, + "metadata": { + "es": { + "glossaryHash": "4ce42e0280a62ea0" + }, + "ar": { + "glossaryHash": "3d1ed56b2cf165a8" + } + } + }, + "getting-started.explore": { + "sourceHash": "3b73900b8d29f963dece78edd4bd9529d855e50f2a3fcc39b3d66cd657630905", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "ja": "探求する" + }, + "metadata": {} + }, + "github-counter.labelFormattedcountNoun": { + "sourceHash": "a3b672e354278464bb6d5df740c1f2cbbba81911a11dff0167125938620701b0", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "github-counter.labelFormattedcountNoun_2": { + "sourceHash": "a3b672e354278464bb6d5df740c1f2cbbba81911a11dff0167125938620701b0", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "hero.openSourceMitLicensed": { + "sourceHash": "c66e4c34136e89fe4845a9dd4c701ae939103629c063c751145b2d3b4896e4cc", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Fuente abierta • MIT Licenciado", + "ja": "オープンソース • MITライセンス", + "ar": "مفتوح المصدر • رخصة MIT" + }, + "metadata": {} + }, + "hero.localizationUiComponentsForReact": { + "sourceHash": "e0b3220cc0a079e3cc50bd5e0e1b2cbe435b9165a373d3969aab41d728f78fa6", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "localización UI componentes para el React.", + "ja": "ローカライゼーション UI コンポーネント について React.", + "ar": "التوطين UI مكوّنات لـ React." + }, + "metadata": { + "es": { + "glossaryHash": "587a7cb86731ed4c" + }, + "ja": { + "glossaryHash": "3c99c98b30b20f8a" + }, + "ar": { + "glossaryHash": "871c6356eaf9cf69" + } + } + }, + "hero.openSourceReactComponentsForInternationalization": { + "sourceHash": "91ca0572d0d0287c053f07d275d7561edf460a6156b4cada3181e559ca30592e", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "React componentes de código abierto para la internacionalización (i18n).", + "ja": "オープンソース React コンポーネント インターナショナライゼーション (i18n) 言語スイッチヤー,ローケール・ピックヤー,RTLレイアウトを数分で作成する", + "ar": "المصدر المفتوح React مكوّنات للتعزيز الدولي (i18n). قم ببناء محركات تغيير اللغة ، ومحركات تحديد المواقع ، وتخطيطات RTL في دقائق" + }, + "metadata": { + "es": { + "glossaryHash": "051172124a3b5f2e" + }, + "ja": { + "glossaryHash": "51e791506e3dda36" + }, + "ar": { + "glossaryHash": "5b12a8ea31eda7bc" + } + } + }, + "hero.getStarted": { + "sourceHash": "983f311018642b0ae60c71253b5735579906d43d260ea926ebe5e815b1c97abb", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Comenzar", + "ja": "始める", + "ar": "البدء" + }, + "metadata": {} + }, + "hero.browseComponentsb": { + "sourceHash": "2108891fdd43ab8847e4997d6f4f4609add2a7b3756adda695df04c71c435dd1", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "hero.copy": { + "sourceHash": "e21f935f11d7e966dbbae78da9daa378fe8142a14e7c0cd7434183005faa6c5c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Copiar", + "ja": "コピー", + "ar": "نسخ" + }, + "metadata": {} + }, + "hero.import": { + "sourceHash": "d942f64886578d8747312e368ed92d9f6b2a8d45556f0f924e2444fe911d15af", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "importar", + "ja": "インポート", + "ar": "استيراد" + }, + "metadata": {} + }, + "hero.languageswitcher": { + "sourceHash": "41e12b13f64c34cc030cba63b186c3b930e91653a934a2febf42643c71612192", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "lenguajeSwitcher", + "ja": "言語スイッチ", + "ar": "اللغةSwitcher" + }, + "metadata": {} + }, + "hero.from": { + "sourceHash": "75857a45899985be4c4d941e90b6b396d6c92a4c7437aaf0bf102089fe21379d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "de lo que es", + "ja": "イエズスから", + "ar": "من فيديو" + }, + "metadata": {} + }, + "hero.exportDefaultFunction": { + "sourceHash": "e922f1c6f6e5fdeff2e26a3efb0a88ad144ca2803ee754cde1be8c7725c60180", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Función por defecto de exportación", + "ja": "輸出デフォルト関数", + "ar": "الوظيفة الافتراضية للتصدير" + }, + "metadata": {} + }, + "hero.app": { + "sourceHash": "0d04bfeb7d64b71c74fc925cca93d683154e8cc7e6e5838faced498e34c9984d", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Aplicación", + "ja": "アップは", + "ar": "التطبيق" + }, + "metadata": {} + }, + "hero.return": { + "sourceHash": "7187f0675eb3827939741acf7342ba78836ecec21a31ecf3f34a55309d3bee8a", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "El regreso", + "ja": "戻る", + "ar": "العودة" + }, + "metadata": {} + }, + "hero.languageswitcher_2": { + "sourceHash": "41e12b13f64c34cc030cba63b186c3b930e91653a934a2febf42643c71612192", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "lenguajeSwitcher", + "ja": "言語スイッチ", + "ar": "اللغةSwitcher" + }, + "metadata": {} + }, + "hero.variant": { + "sourceHash": "cb7bf562420b82e97ee182f019c22e010e50b29334c036a8c23b8d7e617ed23c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "La variante es", + "ja": "変異性", + "ar": "المتغيرات" + }, + "metadata": {} + }, + "hero.dropdown": { + "sourceHash": "fca124310f46f02a0558574eb4de93ad39dc1bb98347817084f39962a6b77065", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Descenso por debajo", + "ja": "ドロップダウン", + "ar": "التراجع في الأسفل" + }, + "metadata": {} + }, + "navbar.home": { + "sourceHash": "3a78695388b38b5cceefaf6796b0137877514593543b91af2752d5a17e3d736c", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Inicio", + "ja": "ホーム", + "ar": "الرئيسية" + }, + "metadata": {} + }, + "navbar.components": { + "sourceHash": "a150ce22160259313c47bc66940b905a9c2196924fd447f802cff12dbb1e9702", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "componentes", + "ja": "コンポーネント", + "ar": "مكوّنات" + }, + "metadata": { + "es": { + "glossaryHash": "3411d72da1df24d7" + }, + "ja": { + "glossaryHash": "7125193fc49bf63b" + }, + "ar": { + "glossaryHash": "ed63ca2743b2b101" + } + } + }, + "navbar.gettingStarted": { + "sourceHash": "d00eca1bae6742803906ab42a831e8b5396d15b6573ea13c139ec31631208ec1", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Comenzando", + "ja": "始めること", + "ar": "البدء في العمل" + }, + "metadata": {} + }, + "navbar.contribute": { + "sourceHash": "97b0c61b99f65f9eda32799cfefb51dcf1a56c172576a34ae2d00896ab8e13dd", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": { + "es": "Contribuir a las actividades", + "ja": "貢献する", + "ar": "المساهمة" + }, + "metadata": {} + }, + "navbar.babelizeElements": { + "sourceHash": "3a26f9edd5805875e65c89f33516716f5d58e15ea13eaf6d68f6898db4168867", + "translatedAt": "2026-11-01T11:10:51.123Z", + "languages": {}, + "metadata": {} + }, + "navbar.getStarted": { + "sourceHash": "983f311018642b0ae60c71253b5735579906d43d260ea926ebe5e815b1c97abb", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Comenzar", + "ja": "始める", + "ar": "البدء" + }, + "metadata": {} + }, + "navbar.toggleMenu": { + "sourceHash": "c02651240c87b47d3319c6878d0c2ec16eadc4d6932b9f4f35955326463d4cdb", + "translatedAt": "2026-11-01T11:47:51.756Z", + "languages": { + "es": "Cambiar el menú", + "ja": "トーグルメニュー", + "ar": "تغيير القائمة" + }, + "metadata": {} + } + } +} diff --git a/bun.lock b/bun.lock index 53871fa..76f4604 100644 --- a/bun.lock +++ b/bun.lock @@ -26,6 +26,7 @@ "fumadocs-ui": "^16.14.0", "jsdom": "^30.0.1", "next": "16.4.2", + "next-intl": "^4.0.0", "next-themes": "^0.4.6", "prettier": "^3.9.6", "react": "19.2.8", @@ -103,6 +104,12 @@ "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], + "@eloqnt/config": ["@eloqnt/config@0.1.1", "", {}, "sha512-YRDigSaiJEzKDfzTth5kG+L/PKfB3mo8h7yNzpXExPfvQmcD05WoZT57PdhJE0jI+Vva6eb0OCU8hnHHgdME3g=="], + + "@eloqnt/format-json": ["@eloqnt/format-json@0.1.0", "", { "dependencies": { "@eloqnt/config": "^0.1.0" } }, "sha512-4Pkb+HyzgWNJXoU48aJhUyNZSjZvMGooPCNG1ZFmBm55xTiNNPQCNXH66Ob6sXS6RvbWZrRpCf+Uo/Jz9K9g+A=="], + + "@eloqnt/format-po": ["@eloqnt/format-po@0.1.1", "", { "dependencies": { "@eloqnt/config": "^0.1.1", "po-parser": "^2.2.0" } }, "sha512-aLtmIoqXGEaeTT0RcsLN8sZ3aIrsT/c/dVs28zrLhDjO3+vA3KNP+r98N0xq8w/k36+/GIUt4uZNbqcA71GVWw=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], @@ -189,6 +196,14 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.7", "", {}, "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA=="], + + "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@3.5.18", "", { "dependencies": { "@formatjs/icu-skeleton-parser": "2.1.11" } }, "sha512-wX1efcL8d7K5QapOTRsP/OLTA/kpwe4LwqWyNxDNg5iRs8i9jJbCyxB5P8jc4KOW5oiLzz2DJr+BRY5xMV9+bA=="], + + "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@2.1.11", "", {}, "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA=="], + + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.14", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.7" } }, "sha512-8O7V38QmbB11+ryJ3KM/znrzXtiqgpXzqNoqDsndHZZ5/zDKTTL+cf5F0mzXkQEwhx8IlWnqYvEovf2S5EwLTw=="], + "@fuma-translate/react": ["@fuma-translate/react@1.0.2", "", { "peerDependencies": { "@types/react": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@types/react"] }, "sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw=="], "@fumadocs/tailwind": ["@fumadocs/tailwind@0.1.1", "", { "peerDependencies": { "tailwindcss": "^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw=="], @@ -305,6 +320,32 @@ "@oxc-project/types": ["@oxc-project/types@0.148.0", "", {}, "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A=="], + "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], + "@radix-ui/number": ["@radix-ui/number@1.1.3", "", {}, "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA=="], "@radix-ui/primitive": ["@radix-ui/primitive@1.1.7", "", {}, "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q=="], @@ -457,6 +498,8 @@ "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + "@schummar/icu-type-parser": ["@schummar/icu-type-parser@1.21.5", "", {}, "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw=="], + "@shikijs/core": ["@shikijs/core@4.4.3", "", { "dependencies": { "@shikijs/primitive": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg=="], "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ=="], @@ -475,8 +518,38 @@ "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@swc/core": ["@swc/core@1.16.21", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.28" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.16.21", "@swc/core-darwin-x64": "1.16.21", "@swc/core-linux-arm-gnueabihf": "1.16.21", "@swc/core-linux-arm64-gnu": "1.16.21", "@swc/core-linux-arm64-musl": "1.16.21", "@swc/core-linux-ppc64-gnu": "1.16.21", "@swc/core-linux-s390x-gnu": "1.16.21", "@swc/core-linux-x64-gnu": "1.16.21", "@swc/core-linux-x64-musl": "1.16.21", "@swc/core-win32-arm64-msvc": "1.16.21", "@swc/core-win32-ia32-msvc": "1.16.21", "@swc/core-win32-x64-msvc": "1.16.21" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-sE2asan0US6gcp11oBDFJb5+s+ltaAPBcagVQGub1+qo+8TsQET2TmXfJCw/Oy0w1eEPp1rV1wsR/Umx2KXGcw=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.16.21", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VRreJpbRygpSD1hj3HBEOIA1xjXYnhB+IfcKsxZRhCIBGRP4UkqxZH4/ipFh/heIRp7EKQ56E8ygwEftLNCWXw=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.16.21", "", { "os": "darwin", "cpu": "x64" }, "sha512-KqCJ04pMYDBUYpAOFGUFR8TEjqo4h0Vtwe/za9xNRDKsxSDnjgM7HVhfO0uNNpMMlM2ao2E6d0iLpApIRvNGnA=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.16.21", "", { "os": "linux", "cpu": "arm" }, "sha512-tLkw3uWxQj69qBRX5Xm8vbq+5iX5e/ktoPXhrDeFFa2jNMc+AWcxa0bqwatvVGK40v5mcmz6Ulu5Nk9jF8ciMA=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.16.21", "", { "os": "linux", "cpu": "arm64" }, "sha512-lFHVlHB0B5C7FwyprWJQp7b2iF/ohj2RqnMiv8uCnFJc+rYP0Py2I7ftZ+rOX4Zu7Ra9eMk7GnmuxAywCZYUJQ=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.16.21", "", { "os": "linux", "cpu": "arm64" }, "sha512-gXDgrMMDsWT7r5gZsml10snBS9yaoVYwU9vGffa+DAts4ctEMrMHv+G8AH+ZxCV9gr5MfdgtGGQKjXjLay4mXQ=="], + + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.16.21", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hZF7J2YzXiADZ4eQxTFOWJcSSy3fbUR8/DcCXqiBHh0bVyLl2Y+O5pVWxk/r/XV5tA9n7DnnLlvkPPsHoajE9w=="], + + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.16.21", "", { "os": "linux", "cpu": "s390x" }, "sha512-rmtGwkAlbl+fQMGrGUMklUmByueOmt1ju9sKsE5YWVA0KfFYM0W87WVx4lFYQXt+E4P3zkLjeqo/AUa5mFbF1A=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.16.21", "", { "os": "linux", "cpu": "x64" }, "sha512-EUJsyrFw3aNE64iQzk3bDqjADgl4l0vpxfwVMjMuZIooNg35yKqvkw3bYNEhQyrBDY0+5kKoiirGLpth3Wf3lA=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.16.21", "", { "os": "linux", "cpu": "x64" }, "sha512-ZXUnLjxTHxvNhVmQmYlb8XNKArfi/MiGoW5DmfuME8ttCLH9OJTqJVFy7g1yYxUCgw3tU6dF1uU59N8P/Yr5Pw=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.16.21", "", { "os": "win32", "cpu": "arm64" }, "sha512-jnnQpAHiWZgEobVfOPvJJzm1Jh4ZEIKh2IqcDqHv6zJcjvaEkHdkt+qdRsJ9AqvK7g18WBRHTnvKm5IxdbkagA=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.16.21", "", { "os": "win32", "cpu": "ia32" }, "sha512-TaVTnNm9c1I+VG3hJUt11uspwbTrTQ9+fUPzODlvx4tj/ChYqUm4cKTIHw3O97hILxpmhBR0hbvLEs9seOV59A=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.16.21", "", { "os": "win32", "cpu": "x64" }, "sha512-aPv58Clf6SdAQtouzDYKbEtcCETY2hOXlrHgSFnFIJQOlMWINHSGazaM1Iv63/9wOUDPq6+0ZFytMqnPtER9OQ=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + "@swc/helpers": ["@swc/helpers@0.5.23", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw=="], + "@swc/types": ["@swc/types@0.1.28", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], @@ -765,6 +838,8 @@ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + "content-type": ["content-type@2.1.0", "", {}, "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -1009,6 +1084,8 @@ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + "icu-minify": ["icu-minify@4.14.9", "", { "dependencies": { "@formatjs/icu-messageformat-parser": "^3.4.0" } }, "sha512-PmO+fNnC3K3mfPKTnm3RrPERrhQZnjm1AlpyZQ0ShbXi8Y/kYZ3YOde8TEjCLz9k3P2DmzkBn8lykGrCAi1Ajw=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -1021,6 +1098,8 @@ "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + "intl-messageformat": ["intl-messageformat@11.2.15", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.7", "@formatjs/icu-messageformat-parser": "3.5.18" } }, "sha512-W4VNytsXyWgW5lvVchmsb9xgA5rSKqoflu3/IQ9UCtB0z4R+Bx9MoEkwFT/+30RCl/KzUoH0QGGe9lppF5SuvQ=="], + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], @@ -1307,10 +1386,18 @@ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "negotiator": ["negotiator@1.1.0", "", { "dependencies": { "content-type": "^2.1.0" } }, "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg=="], + "next": ["next@16.4.2", "", { "dependencies": { "@next/env": "16.4.2", "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.5.23", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.4.2", "@next/swc-darwin-x64": "16.4.2", "@next/swc-linux-arm64-gnu": "16.4.2", "@next/swc-linux-arm64-musl": "16.4.2", "@next/swc-linux-x64-gnu": "16.4.2", "@next/swc-linux-x64-musl": "16.4.2", "@next/swc-win32-arm64-msvc": "16.4.2", "@next/swc-win32-x64-msvc": "16.4.2", "sharp": "^0.35.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-r+oBJojfefUjOiWkBhXgLS+igxX/7BWyK59uHnyOyplMSLtBZ+QLP3okrdYTbrfrbrmNTVWLBPaHDX9KRaIt3w=="], + "next-intl": ["next-intl@4.14.9", "", { "dependencies": { "@eloqnt/config": "^0.1.1", "@eloqnt/format-json": "^0.1.0", "@eloqnt/format-po": "^0.1.1", "@formatjs/intl-localematcher": "^0.8.1", "@parcel/watcher": "^2.4.1", "@swc/core": "~1.16.0", "icu-minify": "^4.14.9", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "4.14.9", "use-intl": "^4.14.9" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-uauRtUC+TrYNA1OL/QcwL9irndLrI9jK3Wdaa9W0B5AeKh9cqVdNeT0IWgLnhBqBRrVwppVdI0M+C1+JdGPQ3w=="], + + "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.14.9", "", {}, "sha512-8jAkmDwQJo6RDavBHm9QRl1YTn2WXf+rI4SVhMaZxZcxopnwZic6fKTXOoNIo3kzC+a6vJySkOkXmHTVFLAYtg=="], + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + "node-exports-info": ["node-exports-info@1.6.2", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag=="], "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], @@ -1369,6 +1456,8 @@ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "po-parser": ["po-parser@2.2.0", "", {}, "sha512-NdTrKgh0oO7+y+RFX8KKhOB438x/j94UGXEFzl/7pHH0JjWSn42iJ9tgmPksIO6n1JKDHmNDcejPJfKspljB9g=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], "postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], @@ -1629,6 +1718,8 @@ "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + "use-intl": ["use-intl@4.14.9", "", { "dependencies": { "@formatjs/fast-memoize": "^3.1.0", "@schummar/icu-type-parser": "1.21.5", "icu-minify": "^4.14.9", "intl-messageformat": "^11.1.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-37ktvdCCz+6JY2VFPl/GV69Ds4ahiUT2c2xEZZRZYxdgGLxFsUbdxzjQVRm3YMIOUU0VPs6zvlifb4Yjk4IxIg=="], + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], @@ -1697,6 +1788,8 @@ "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + "@parcel/watcher/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], + "@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], diff --git a/next.config.ts b/next.config.ts index 206c776..fba6eb8 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,5 +1,8 @@ import { createMDX } from "fumadocs-mdx/next"; import type { NextConfig } from "next"; +import createNextIntlPlugin from "next-intl/plugin"; + +const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts"); const nextConfig: NextConfig = { reactStrictMode: true, @@ -20,4 +23,4 @@ const nextConfig: NextConfig = { const withMDX = createMDX(); -export default withMDX(nextConfig); +export default withNextIntl(withMDX(nextConfig)); diff --git a/package.json b/package.json index ba0bbb4..059b8aa 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,7 @@ "fumadocs-ui": "^16.14.0", "jsdom": "^30.0.1", "next": "16.4.2", + "next-intl": "^4.0.0", "next-themes": "^0.4.6", "prettier": "^3.9.6", "react": "19.2.8", diff --git a/public/locales/ar.json b/public/locales/ar.json new file mode 100644 index 0000000..57a91db --- /dev/null +++ b/public/locales/ar.json @@ -0,0 +1,156 @@ +{ + "_meta": { + "dir": "rtl", + "language": "ar" + }, + "community": { + "connectWithOtherDevelopersGet": "التواصل مع المطورين الآخرين، والحصول على المساعدة، والمساهمة في المشروع", + "followUsForUpdatesAnd": "اتبعنا للحصول على تحديثات وإعلانات حول منتجاتنا", + "joinOurCommunity": "انضموا إلى مجتمعنا", + "joinOurCommunityForSupport": "انضم إلى مجتمعنا للحصول على الدعم والمناقشات", + "viewOurOpenSourceCode": "شاهد رمز المصدر المفتوح لدينا والمساهمة في المشروع" + }, + "components": { + "activity": "النشاط", + "appDashboardEnglish": "لوحة التطبيقات · الإنجليزية → الفرنسية", + "appearancePreference": "تفضيلات المظهر", + "babelizeConsole": "Babelize أجهزة التحكم", + "bienvenueSarah": "(مرحباً يا (سارة", + "browseAllComponents": "أبحث عن كل مكوّنات", + "clickEditToTranslateInline": "انقر على Edit لترجمة في الخط", + "components": "مكوّنات", + "copied": "نسخة", + "copied_2": "نسخة", + "copy": "نسخ", + "copyCode": "نسخ الرمز", + "deutsch": "Deutsch", + "edit": "تعديل", + "en": "في يدي", + "english": "English", + "español": "Español", + "fr": "من فضلكم", + "français": "Français", + "hideCode": "إختباء الرمز", + "interfaceAndContentLocale": "واجهة المحتوى المحلية", + "language": "اللغة", + "localizationWorkspace": "التوطين مساحة عمل", + "manageYourOrganizationDefaults": "إدارة التخلفات التنظيمية", + "notifications": "الإشعارات", + "preview": "معاينة", + "productionReadyReactComponentsDesignedTo": "جاهزة للإنتاج React مكوّنات مصممة لتسقط مباشرة في التطبيقات الحديثة.", + "regionAwareFormatting": "تشكيل المنطقة", + "save": "حفظ", + "source": "المصدر", + "theme": "المظهر", + "timeZone": "المنطقة الزمنية", + "translations": "ترجمات", + "untitled": "日本語", + "untitled_2": "العربية", + "utc0530Sindian": "(UTC+05:30) سنديان", + "viewCode": "رمز المشاهدة", + "welcomeBackSarah": "مرحباً بعودتكِ يا (سارة)", + "workspaceSettings": "إعدادات مساحة العمل" + }, + "contribute": { + "browseOpenIssues": "تفتيش المشكلات المفتوحة", + "builtByTheCommunityFor": "تم بناؤها بواسطة community لكل تطبيق محلي", + "joinTheBabelizeElementsOpenSource": "انضموا إلى المساهمين المفتوحين Babelize Elements، اختروا مسألة، وبنوا React i18n مكوّن، وأرسلوها إلى المطورين في جميع أنحاء العالم." + }, + "editing": { + "babelizeConsole": "Babelize أجهزة التحكم", + "editTranslationsWhereTheyLive": "تحرير الترجمات حيث يعيشون.", + "inContextEditing": "في السياق التحرير", + "localizationWorkspace": "التوطين مساحة عمل", + "noContextSwitchingNoHunting": "لا تغيير السياق. لا صيد من خلال ملفات الترجمة.", + "preview": "معاينة", + "save": "حفظ", + "saved": "تم الحفظ", + "updateLocalizedContentDirectlyInside": "قم بتحديث المحتوى المحلي مباشرة داخل واجهتك بدلاً من البحث عن ملفات الترجمة." + }, + "faq": { + "absolutelySinceYouOwnThe": "بالتأكيد، نظرًا لأنّك تملك الرمز، كل مكوّن قابلة للتخصيص بالكامل مع Tailwind CSS فئة وأدوات. قم بتغيير الألوان، الفاصل، الرسوم المتحركة، والسلوك كما تريد. لا توجد قيود تصميم.", + "areTheseReactI18nComponents": "هل هذه React i18n مكوّنات جاهزة للإنتاج؟", + "babelizeElementsWorksWithEvery": "يعمل Babelize Elements مع كل مكتبة i18n الرئيسية: next-intl، react-i18next، react-intl، LinguiJS، FormatJS، وغيرها.", + "browseTheOpenIssuesOn": "تصفح المشكلات المفتوحة على GitHub، قم بإنشاء مكوّن وفق دليل المساهمة، وفتح pull request. يقوم الحافظون بمراجعتها ودمجها، ويتم إرسالها إلى المستندات للجميع.", + "canICustomizeTheLanguage": "هل يمكنني تخصيص مبدّل اللغة و منتقي الإعدادات المحلية مكوّنات؟", + "everyMergedComponentIsReviewed": "يتم مراجعة كل مكوّن المدمجة من قبل المراقبين وتتبع قائمة الوصول الخاصة بنا، وخطوط النموذج، و التوطين قبل أن يتم توثيقها.", + "frequentlyAskedQuestions": "الأسئلة المتكررة أسئلة ", + "howDoIContributeA": "كيف أسهم بـمكوّن إلى Babelize Elements؟", + "howDoIInstallBabelize": "كيف يمكنني تركيب Babelize Elements؟", + "installTheFullLibraryWith": "قم بتثبيت المكتبة الكاملة مع `npm install @babelize/elements` أو أضف مكوّنات الفردي مع `npx shadcn@latest add @babelize/language-switcher` (أو `npx @babelize/elements add language-switcher`). يعمل مع Next.js، Remix، وأي تطبيق React.", + "isBabelizeElementsReallyFree": "هل Babelize Elements مجانية حقاً ومفتوحة المصدر؟", + "support": "الدعم", + "whichInternationalizationI18nLibrariesAre": "أي مكتبات دولية (i18n) تدعم؟", + "yesMitLicensedAndFree": "نعم تم ترخيصها بواسطة MIT ومجانية إلى الأبد. الرمز يعيش على GitHub، المساهمات مرحبًا بها، ويمكنك استخدام مكوّنات في أي مشروع، سواء كان تجاريًا أو غير." + }, + "features": { + "automaticRtlDetectionAndLayout": "التشخيص التلقائي لـ RTL ومعالجة اتجاه التخطيط", + "builtForModernReactApps": "بنيت من أجل React تطبيقات حديثة، قم بتثبيتها وإرسالها عالمياً.", + "copy": "نسخ", + "dropInSwitchersWithDropdownsPills": "أجهزة التبديل المقطوعة، والحبوب، والعلامات، ودعم RTL الكامل.", + "everythingYouNeed": "كل ما تحتاجه", + "i18nIntegration": "i18n التكامل", + "languageSwitchers": "متغيرات اللغة", + "localePickers": "المجموعات المحلية", + "powerfulByDefault": "قوية بشكل افتراضي", + "rtlLayoutSupport": "دعم التخطيط RTL", + "searchableLocalePickersWithNative": "يُمكن البحث عن المواقع ذات الأسماء والعلامات الأصلية.", + "toLocalize": "لتحديد موقعها", + "worksWithReactIntlNextIntlI18next": "يعمل مع react لتر، next-intl، i18next، LinguiJS، وغيرها." + }, + "footer": { + "babelize": "Babelize", + "babelizeElements": "Babelize Elements", + "babelizeElementsMadeWith": "Babelize Elements", + "byDevelopersAtBabelizeFor": "من قبل المطورين في Babelize, للمطورين.", + "community": "المجتمع", + "openSourceReactComponentsForModern": "المصدر المفتوح React مكوّنات للإدارة الحديثة التوطين والدولية.", + "resources": "الموارد" + }, + "getting-started": { + "ar": "ار", + "buildFaster": "بناء أسرع", + "buildFromScratch": "بناء من الصفر", + "buildInterfacesThatAreReady": "بناء واجهات جاهزة للمستخدمين عبر اللغات المختلفة وكتابة الاتجاهات دون إنشاء أنظمة UI منفصلة.", + "de": "دي", + "dropdown": "النزول إلى أسفل", + "en": "ين", + "fr": "فر", + "keepLanguageSwitchingAndLocalization": "الحفاظ على تغيير اللغة والتفاعلات المحلية بشكل مرئي بدلاً من الحفاظ على تنفيذات مختلفة في جميع أنحاء المنتج.", + "languagesLocalesAndRtl": "اللغات والمناطق، و RTL معالجة.", + "localizationShouldntSlowDownYour": "التوطين لا ينبغي أن تبطئ منتجك.", + "oneLanguageswitcher": "واحد لغةSwitcher", + "oneLocalizationExperienceAcrossYour": "تجربة واحدة التوطين عبر تطبيقك", + "pill": "حبوب منع الحمل", + "rtl": "الـ RTL ✓", + "segmented": "التقسيم", + "shipGlobally": "سفينة عالمية", + "skipTheRepetitiveWorkOf": "تخطي العمل المتكرر من إعادة بناء التوطين UI. Babelize يعطيك مثقلة، جاهزة للإنتاج مكوّنات التي تناسب مباشرة في كومة تستخدمها بالفعل.", + "stayConsistent": "إبقوا متواصلين", + "stopRebuildingLocalizationUi": "توقف عن إعادة بناء التوطين UI.", + "useBabelize": "استخدم Babelize", + "useReadyMadeComponentsInsteadOf": "استخدم مكوّنات جاهزة بدلاً من إنشاء اختيارات اللغة وتحكمات المنطقة وتحرير الواجهات والسلوك RTL من الصفر.", + "whyBabelize": "لماذا بابل؟ لماذا Babelize؟" + }, + "github-counter": { + "labelFormattedcountNoun": "{label} ({formattedCount} {noun})", + "labelFormattedcountNoun_2": "{label} ({formattedCount} {noun})" + }, + "hero": { + "browseComponentsb": "تصفح المكونات B", + "copy": "نسخ", + "getStarted": "البدء", + "localizationUiComponentsForReact": "التوطين UI مكوّنات لـ React.", + "openSourceMitLicensed": "مفتوح المصدر • رخصة MIT", + "openSourceReactComponentsForInternationalization": "المصدر المفتوح React مكوّنات للتعزيز الدولي (i18n). قم ببناء محركات تغيير اللغة ، ومحركات تحديد المواقع ، وتخطيطات RTL في دقائق" + }, + "navbar": { + "babelizeElements": "Babelize Elements", + "components": "مكوّنات", + "contribute": "المساهمة", + "getStarted": "البدء", + "gettingStarted": "البدء في العمل", + "home": "الرئيسية", + "toggleMenu": "تغيير القائمة" + } +} diff --git a/public/locales/en.json b/public/locales/en.json new file mode 100644 index 0000000..3f0deda --- /dev/null +++ b/public/locales/en.json @@ -0,0 +1,165 @@ +{ + "_meta": { + "dir": "ltr", + "language": "en" + }, + "community": { + "connectWithOtherDevelopersGet": "Connect with other developers, get help, and contribute to the project", + "followUsForUpdatesAnd": "Follow us for updates and announcements on our products", + "joinOurCommunity": "Join our community", + "joinOurCommunityForSupport": "Join our community for support and discussions", + "viewOurOpenSourceCode": "View our open source code and contribute to the project" + }, + "components": { + "activity": "Activity", + "appDashboardEnglish": "app dashboard · English → French", + "appearancePreference": "Appearance preference", + "babelizeConsole": "Babelize Console", + "beautifullyCraftedLocalizationComponents": "Beautifully crafted localization components", + "bienvenueSarah": "Bienvenue, Sarah !", + "browseAllComponents": "Browse all components", + "clickEditToTranslateInline": "Click Edit to translate inline", + "components": "Components", + "copied": "Copied", + "copied_2": "Copied", + "copy": "Copy", + "copyCode": "Copy code", + "dark": "Dark", + "deutsch": "Deutsch", + "edit": "Edit", + "en": "en", + "english": "English", + "español": "Español", + "fr": "fr", + "français": "Français", + "hideCode": "Hide code", + "interfaceAndContentLocale": "Interface and content locale", + "language": "Language", + "live": "Live", + "localizationWorkspace": "Localization workspace", + "manageYourOrganizationDefaults": "Manage your organization defaults", + "notifications": "Notifications", + "preview": "preview", + "productionReadyReactComponentsDesignedTo": "Production-ready React components designed to drop directly into modern applications.", + "regionAwareFormatting": "Region-aware formatting", + "save": "Save", + "source": "Source", + "theme": "Theme", + "timeZone": "Time zone", + "translations": "Translations", + "untitled": "日本語", + "untitled_2": "العربية", + "untitled_3": "مرحبا بعودتك", + "untitled_4": "لديك 3 إشعارات جديدة", + "utc0530Sindian": "(UTC+05:30) Sindian", + "viewCode": "View code", + "welcomeBackSarah": "Welcome back, Sarah!", + "workspaceSettings": "Workspace settings" + }, + "contribute": { + "browseOpenIssues": "Browse open issues", + "builtByTheCommunityFor": "Built by the community, for every localized app.", + "contribute": "Contribute", + "joinTheBabelizeElementsOpenSource": "Join the Babelize Elements open-source contributors. Pick an issue, build a React i18n component, and ship it to developers worldwide.", + "readTheContributionGuide": "Read the contribution guide" + }, + "editing": { + "babelizeConsole": "Babelize Console", + "editTranslationsWhereTheyLive": "Edit translations where they live.", + "inContextEditing": "In-context editing", + "localizationWorkspace": "Localization workspace", + "noContextSwitchingNoHunting": "No context switching. No hunting through translation files.", + "preview": "preview", + "save": "Save", + "saved": "Saved", + "updateLocalizedContentDirectlyInside": "Update localized content directly inside your interface instead of hunting through translation files." + }, + "faq": { + "absolutelySinceYouOwnThe": "Absolutely. Since you own the code, every component is fully customizable with Tailwind CSS classes and props. Change colors, spacing, animations, and behavior however you like. No design constraints.", + "areTheseReactI18nComponents": "Are these React i18n components production-ready?", + "babelizeElementsWorksWithEvery": "Babelize Elements works with every major i18n library: next-intl, react-i18next, react-intl, LinguiJS, FormatJS, and more. The components are library-agnostic — pass your own locale state and callbacks.", + "browseTheOpenIssuesOn": "Browse the open issues on GitHub, build the component following the contribution guide, and open a pull request. Maintainers review and merge it, and it ships to the docs for everyone.", + "canICustomizeTheLanguage": "Can I customize the language switcher and locale picker components?", + "everyMergedComponentIsReviewed": "Every merged component is reviewed by maintainers and follows our accessibility, TypeScript, and localization checklist before it's documented. They're used in production apps worldwide.", + "everythingYouNeedToKnow": "Everything you need to know about using Babelize Elements in your React projects. Can't find what you're looking for? Check out our GitHub discussions.", + "frequentlyAskedQuestions": "Frequently asked questions", + "howDoIContributeA": "How do I contribute a component to Babelize Elements?", + "howDoIInstallBabelize": "How do I install Babelize Elements?", + "installTheFullLibraryWith": "Install the full library with `npm install @babelize/elements`, or add individual components with `npx shadcn@latest add @babelize/language-switcher` (or `npx @babelize/elements add language-switcher`). Works with Next.js, Remix, and any React app.", + "isBabelizeElementsReallyFree": "Is Babelize Elements really free and open source?", + "support": "Support", + "whichInternationalizationI18nLibrariesAre": "Which internationalization (i18n) libraries are supported?", + "yesMitLicensedAndFree": "Yes — MIT-licensed and free forever. The code lives on GitHub, contributions are welcome, and you can use the components in any project, commercial or not. No attribution required." + }, + "features": { + "automaticRtlDetectionAndLayout": "Automatic RTL detection and layout direction handling.", + "builtForModernReactApps": "Built for modern React apps. Install and ship globally.", + "copy": "Copy", + "dropInSwitchersWithDropdownsPills": "Drop-in switchers with dropdowns, pills, flags, and full RTL support.", + "everythingYouNeed": "Everything you need", + "i18nIntegration": "i18n Integration", + "languageSwitchers": "Language Switchers", + "localePickers": "Locale Pickers", + "powerfulByDefault": "Powerful by default", + "rtlLayoutSupport": "RTL Layout Support", + "searchableLocalePickersWithNative": "Searchable locale pickers with native names and flags.", + "toLocalize": "to localize.", + "worksWithReactIntlNextIntlI18next": "Works with react-intl, next-intl, i18next, LinguiJS, and more." + }, + "footer": { + "babelize": "Babelize", + "babelizeElements": "Babelize Elements", + "babelizeElementsMadeWith": "Babelize Elements. Made with", + "byDevelopersAtBabelizeFor": "by developers at Babelize, for developers.", + "community": "Community", + "openSourceReactComponentsForModern": "Open-source React components for modern localization and internationalization management.", + "resources": "Resources" + }, + "getting-started": { + "ar": "AR", + "buildFaster": "Build faster", + "buildFromScratch": "Build from scratch", + "buildInterfacesThatAreReady": "Build interfaces that are ready for users across different languages and writing directions without creating separate UI systems.", + "de": "DE", + "dropdown": "Dropdown", + "en": "EN", + "explore": "Explore", + "fr": "FR", + "keepLanguageSwitchingAndLocalization": "Keep language switching and localization interactions visually consistent instead of maintaining different implementations throughout the product.", + "languagesLocalesAndRtl": "Languages, locales, and RTL — handled.", + "localizationShouldntSlowDownYour": "Localization shouldn't slow down your product.", + "oneLanguageswitcher": "One LanguageSwitcher", + "oneLocalizationExperienceAcrossYour": "One localization experience across your app.", + "pill": "Pill", + "rtl": "RTL ✓", + "segmented": "Segmented", + "shipGlobally": "Ship globally", + "skipTheRepetitiveWorkOf": "Skip the repetitive work of rebuilding localization UI. Babelize gives you polished, production-ready components that fit directly into the stack you already use.", + "stayConsistent": "Stay consistent", + "stopRebuildingLocalizationUi": "Stop rebuilding localization UI.", + "useBabelize": "Use Babelize", + "useReadyMadeComponentsInsteadOf": "Use ready-made components instead of repeatedly creating language selectors, locale controls, editing interfaces, and RTL behavior from scratch.", + "whyBabelize": "Why Babelize?" + }, + "github-counter": { + "labelFormattedcountNoun": "{label} ({formattedCount} {noun})", + "labelFormattedcountNoun_2": "{label} ({formattedCount} {noun})" + }, + "hero": { + "browseComponentsb": "Browse ComponentsB", + "copy": "Copy", + "getStarted": "Get Started", + "localizationUiComponentsForReact": "Localization UI Components for React.", + "openSourceMitLicensed": "Open Source • MIT Licensed", + "openSourceReactComponentsForInternationalization": "Open-source React components for internationalization (i18n). Build language switchers, locale pickers, and RTL layouts in minutes — MIT licensed, community-driven." + }, + "navbar": { + "babelizeElements": "Babelize Elements", + "components": "Components", + "contribute": "Contribute", + "getStarted": "Get Started", + "gettingStarted": "Getting Started", + "home": "Home", + "toggleMenu": "Toggle menu" + } +} diff --git a/public/locales/es.json b/public/locales/es.json new file mode 100644 index 0000000..88d9132 --- /dev/null +++ b/public/locales/es.json @@ -0,0 +1,161 @@ +{ + "_meta": { + "dir": "ltr", + "language": "es" + }, + "community": { + "connectWithOtherDevelopersGet": "Conectarse con otros desarrolladores, obtener ayuda y contribuir al proyecto", + "followUsForUpdatesAnd": "Siga con nosotros para obtener actualizaciones y anuncios sobre nuestros productos", + "joinOurCommunity": "Únete a nuestra comunidad", + "joinOurCommunityForSupport": "Únete a nuestra comunidad para apoyar y discutir", + "viewOurOpenSourceCode": "Ver nuestro código abierto y contribuir al proyecto" + }, + "components": { + "activity": "Actividad", + "appDashboardEnglish": "Panel de aplicaciones · Inglés → Francés", + "appearancePreference": "La preferencia por la apariencia", + "babelizeConsole": "Babelize La consola", + "bienvenueSarah": "Bienvenido, Sarah", + "browseAllComponents": "Revisar todos los componentes", + "clickEditToTranslateInline": "Haga clic en Edit para traducir en línea", + "components": "componentes", + "copied": "Copiado", + "copied_2": "Copiado", + "copy": "Copiar", + "copyCode": "Código de copia", + "dark": "Es oscuro", + "deutsch": "Deutsch", + "edit": "Editar", + "en": "en", + "english": "English", + "español": "Español", + "fr": "por qué no?", + "français": "Français", + "hideCode": "Esconder el código", + "interfaceAndContentLocale": "Interfaz y contenido local", + "language": "Idioma", + "live": "Vivir en vivo", + "localizationWorkspace": "localización espacio de trabajo", + "manageYourOrganizationDefaults": "Gestionar los fallos de su organización", + "notifications": "Notificaciones", + "preview": "vista previa", + "productionReadyReactComponentsDesignedTo": "Listo para la producción React componentes diseñado para caer directamente en aplicaciones modernas.", + "regionAwareFormatting": "Formación consciente de la región", + "save": "Guardar", + "source": "Fuente:", + "theme": "Tema", + "timeZone": "Zona horaria", + "translations": "Traducciones", + "untitled": "日本語", + "untitled_2": "العربية", + "untitled_3": "Hola de regreso", + "untitled_4": "Tienes tres nuevos anuncios", + "utc0530Sindian": "(UTC+05:30) Sindian", + "viewCode": "Código de vista", + "welcomeBackSarah": "¡Bienvenido de vuelta, Sarah", + "workspaceSettings": "Configuración del espacio de trabajo" + }, + "contribute": { + "browseOpenIssues": "Busca en el issues abiertos", + "builtByTheCommunityFor": "Construido por el community para cada aplicación localizada.", + "contribute": "Contribuir", + "joinTheBabelizeElementsOpenSource": "Únete a los Babelize Elements colaboradores de código abierto, elige un tema, construye un componente React i18n y envíelo a los desarrolladores de todo el mundo.", + "readTheContributionGuide": "Leer la guía de contribuciones" + }, + "editing": { + "babelizeConsole": "Babelize La consola", + "editTranslationsWhereTheyLive": "Edición de traducciones donde viven.", + "inContextEditing": "Editación en contexto", + "localizationWorkspace": "localización espacio de trabajo", + "noContextSwitchingNoHunting": "No hay cambio de contexto, no hay búsqueda de archivos de traducción.", + "preview": "vista previa", + "save": "Guardar", + "saved": "Guardado", + "updateLocalizedContentDirectlyInside": "Actualice el contenido localizado directamente dentro de su interfaz en lugar de buscar a través de archivos de traducción." + }, + "faq": { + "absolutelySinceYouOwnThe": "Desde que posees el código, cada componente es totalmente personalizable con Tailwind CSS clases y accesorios. Cambia colores, espacios, animaciones y comportamiento como quieras.", + "areTheseReactI18nComponents": "¿Están estos React i18n componentes listos para la producción?", + "babelizeElementsWorksWithEvery": "Babelize Elements funciona con todas las bibliotecas principales de i18n: next-intl, react-i18next, react-intl, LinguiJS, FormatJS, y más.", + "browseTheOpenIssuesOn": "Navegar por el issues abiertos en GitHub, construir el componente siguiendo la guía de contribución, y abrir un pull request.", + "canICustomizeTheLanguage": "¿Puedo personalizar el interruptor de lenguaje y los componentes del selector local?", + "everyMergedComponentIsReviewed": "Cada componente fusionado es revisado por los mantenedores y sigue nuestra lista de verificación de accesibilidad, TypeScript y localización antes de ser documentado.", + "frequentlyAskedQuestions": "Pregunta frecuente preguntas ", + "howDoIContributeA": "¿Cómo puedo contribuir con un componente a Babelize Elements?", + "howDoIInstallBabelize": "¿Cómo puedo instalar el Babelize Elements?", + "installTheFullLibraryWith": "Instala la biblioteca completa con `npm install @babelize/elements`, o agrega componentes individual con `npx shadcn@latest add @babelize/language-switcher` (o `npx @babelize/elements add language-switcher`). Funciona con Next.js, Remix y cualquier aplicación React.", + "isBabelizeElementsReallyFree": "¿Es Babelize Elements realmente libre y de código abierto?", + "support": "Soporte", + "whichInternationalizationI18nLibrariesAre": "¿Qué bibliotecas de internacionalización (i18n) son compatibles?", + "yesMitLicensedAndFree": "Sí Licenciado por MIT y gratuito para siempre. El código vive en GitHub, las contribuciones son bienvenidas, y puede usar el componentes en cualquier proyecto, comercial o no. No se requiere atribución." + }, + "features": { + "automaticRtlDetectionAndLayout": "Detección automática de RTL y manejo de la dirección del diseño.", + "builtForModernReactApps": "Construido para React aplicaciones modernas.", + "copy": "Copiar", + "dropInSwitchersWithDropdownsPills": "Los interruptores desplegables, las pastillas, las banderas y el soporte completo de RTL.", + "everythingYouNeed": "Todo lo que necesitas", + "i18nIntegration": "i18n La integración", + "languageSwitchers": "Cambiadores de lenguaje", + "localePickers": "Recogedores locales", + "powerfulByDefault": "Poderoso por defecto", + "rtlLayoutSupport": "Apoyo a la configuración de RTL", + "searchableLocalePickersWithNative": "Los seleccionadores de lugares buscables con nombres y banderas nativas.", + "toLocalize": "Para localizarlo.", + "worksWithReactIntlNextIntlI18next": "Trabaja con react litros, next-intl, i18next, LinguiJS, y más." + }, + "footer": { + "babelize": "Babelize", + "babelizeElements": "Babelize Elements", + "babelizeElementsMadeWith": "Babelize Elements", + "byDevelopersAtBabelizeFor": "por desarrolladores en Babelize, para desarrolladores.", + "community": "La comunidad", + "openSourceReactComponentsForModern": "React componentes de código abierto para el localización moderno y la gestión de la internacionalización.", + "resources": "Los recursos" + }, + "getting-started": { + "ar": "en la actualidad", + "buildFaster": "Construye más rápido", + "buildFromScratch": "Construir desde cero", + "buildInterfacesThatAreReady": "Construir interfaces que estén listas para los usuarios en diferentes idiomas y escribir direcciones sin crear sistemas de interfaz separados.", + "de": "en su lugar", + "dropdown": "Descenso", + "en": "el caso de los niños", + "fr": "en su lugar de residencia", + "keepLanguageSwitchingAndLocalization": "Mantenga las interacciones de cambio de lenguaje y localización visualmente consistentes en lugar de mantener diferentes implementaciones en todo el producto.", + "languagesLocalesAndRtl": "Idiomas, locales y RTL se manejan.", + "oneLanguageswitcher": "Un interruptor de lenguaje", + "oneLocalizationExperienceAcrossYour": "Una experiencia de localización a través de su aplicación.", + "pill": "La píldora", + "rtl": "RTL ✓", + "segmented": "Segmentado", + "shipGlobally": "Navegación a nivel mundial", + "skipTheRepetitiveWorkOf": "Salta el trabajo repetitivo de reconstruir localización UI. El Babelize te da un componentes pulido y listo para la producción que encaja directamente en la pila que ya usas.", + "stayConsistent": "Manténgase consistente", + "stopRebuildingLocalizationUi": "Deja de reconstruir localización UI.", + "useBabelize": "Utilice el Babelize", + "useReadyMadeComponentsInsteadOf": "Utilice el componentes listo en lugar de crear repetidamente selectores de lenguaje, controles locales, interfaces de edición y comportamiento RTL desde cero.", + "whyBabelize": "¿Por qué Babelize? ¿Por qué usar Babelize?" + }, + "github-counter": { + "labelFormattedcountNoun": "{label} ({formattedCount} {noun})", + "labelFormattedcountNoun_2": "{label} ({formattedCount} {noun})" + }, + "hero": { + "browseComponentsb": "Explorar los componentes B", + "copy": "Copiar", + "getStarted": "Comenzar", + "localizationUiComponentsForReact": "localización UI componentes para el React.", + "openSourceMitLicensed": "Fuente abierta • MIT Licenciado", + "openSourceReactComponentsForInternationalization": "React componentes de código abierto para la internacionalización (i18n)." + }, + "navbar": { + "babelizeElements": "Babelize Elements", + "components": "componentes", + "contribute": "Contribuir a las actividades", + "getStarted": "Comenzar", + "gettingStarted": "Comenzando", + "home": "Inicio", + "toggleMenu": "Cambiar el menú" + } +} diff --git a/public/locales/ja.json b/public/locales/ja.json new file mode 100644 index 0000000..1ce9f1f --- /dev/null +++ b/public/locales/ja.json @@ -0,0 +1,149 @@ +{ + "_meta": { + "dir": "ltr", + "language": "ja" + }, + "community": { + "connectWithOtherDevelopersGet": "他の開発者と連携し,支援を得て,プロジェクトに貢献します", + "followUsForUpdatesAnd": "商品の更新や発表については,ご連絡ください", + "joinOurCommunity": "私たちのコミュニティに参加してください", + "joinOurCommunityForSupport": "支援と議論のために私たちのコミュニティに参加してください", + "viewOurOpenSourceCode": "オープンソースコードを見て,プロジェクトに貢献してください" + }, + "components": { + "activity": "アクティビティ", + "appDashboardEnglish": "アプリのダッシュボード · 英語 → フランス語", + "appearancePreference": "外見の好み", + "babelizeConsole": "Babelize コンソール", + "beautifullyCraftedLocalizationComponents": "精彩に作られた ローカライゼーションコンポーネント", + "bienvenueSarah": "お疲れさまでした!", + "browseAllComponents": "全コンポーネントを閲覧する", + "clickEditToTranslateInline": "Edit をクリックしてインラインを翻訳します", + "components": "コンポーネント", + "copied": "複製された", + "copied_2": "複製された", + "copy": "コピー", + "copyCode": "コピーコード", + "deutsch": "Deutsch", + "edit": "編集", + "en": "に関する", + "english": "English", + "español": "Español", + "français": "Français", + "hideCode": "暗号を隠す", + "interfaceAndContentLocale": "インターフェイスとコンテンツローカル", + "language": "言語", + "localizationWorkspace": "ローカライゼーション 作業スペース", + "manageYourOrganizationDefaults": "組織のデフォルトを管理する", + "notifications": "通知", + "preview": "プレビュー", + "productionReadyReactComponentsDesignedTo": "React コンポーネントは,現代的なアプリケーションに直接落として設計されています.", + "regionAwareFormatting": "地域意識のある格式化", + "save": "保存", + "source": "情報源:", + "theme": "テーマ", + "timeZone": "タイムゾーン", + "translations": "翻訳", + "untitled": "日本語", + "untitled_2": "العربية", + "untitled_3": "お疲れさまでした", + "untitled_4": "3つの新しいメッセージがあります", + "utc0530Sindian": "(UTC+05:30) シディアン", + "viewCode": "ビューコード", + "welcomeBackSarah": "お待たせしました!", + "workspaceSettings": "ワークスペースの設定は" + }, + "contribute": { + "browseOpenIssues": "ブラウズ 未解決のIssue", + "builtByTheCommunityFor": "communityで作られています", + "contribute": "貢献する", + "joinTheBabelizeElementsOpenSource": "オープンソースの Babelize Elements への参加 問題を選択して React i18n コンポーネント を構築し,世界中の開発者に送信します" + }, + "editing": { + "babelizeConsole": "Babelize コンソール", + "editTranslationsWhereTheyLive": "翻訳を編集する 彼らが住んでいる場所.", + "localizationWorkspace": "ローカライゼーション 作業スペース", + "preview": "プレビュー", + "save": "保存", + "saved": "保存済み", + "updateLocalizedContentDirectlyInside": "翻訳ファイルを検索する代わりに インターフェースの内部に本格的なコンテンツを更新します" + }, + "faq": { + "absolutelySinceYouOwnThe": "すべてのコンポーネントはTailwind CSSクラスと道具で完全にカスタマイズできます 好きなように色やスペース,アニメーション,行動を変更します デザイン制限はありません", + "areTheseReactI18nComponents": "React i18n コンポーネントは生産準備ができているのか?", + "babelizeElementsWorksWithEvery": "Babelize Elements はすべての主要な i18n ライブラリ: next-intl, react-i18next, react-intl, LinguiJS, FormatJSなどで動作します.", + "browseTheOpenIssuesOn": "未解決のIssue を GitHub で閲覧し,貢献ガイドに従って コンポーネント を作成し, pull request を開きます. メンテナントはそれをレビューし,統合します.", + "canICustomizeTheLanguage": "言語スイッチとローカル・ピックーのコンポーネントをカスタマイズできますか?", + "everyMergedComponentIsReviewed": "組み合わされたコンポーネントは メンテナンス担当者によって レビューされ 文書化される前に アクセシビリティ・タイプスクリプトとローカライゼーションのチェックリストを チェックしています", + "howDoIContributeA": "コンポーネントからBabelize Elementsへの貢献は?", + "howDoIInstallBabelize": "どうやってBabelize Elementsを設置する?", + "isBabelizeElementsReallyFree": "Babelize Elementsは本当に無料でオープンソースですか?", + "support": "サポート", + "whichInternationalizationI18nLibrariesAre": "どの国際化 (i18n) 図書館がサポートされていますか?", + "yesMitLicensedAndFree": "GitHubのコードは永久に無料です. 貢献は歓迎され,商業的であろうとあらゆるプロジェクトでコンポーネントを使用できます. アトリビューションは必要ありません." + }, + "features": { + "automaticRtlDetectionAndLayout": "自動RTL検出とレイアウト方向処理", + "builtForModernReactApps": "モダンなアプリReactを インストールして グローバルに出荷します", + "copy": "コピー", + "dropInSwitchersWithDropdownsPills": "ドロップダウン,錠剤,フラッグ,および完全なRTLサポートを持つドロップインスイッチ.", + "everythingYouNeed": "必要なものは全て", + "i18nIntegration": "i18n 統合", + "languageSwitchers": "言語交換器", + "localePickers": "ローカル・ピックラーズ", + "rtlLayoutSupport": "RTL レイアウト サポート", + "searchableLocalePickersWithNative": "地元の名前や旗を検索できる.", + "toLocalize": "地元を特定する", + "worksWithReactIntlNextIntlI18next": "react-intl, next-intl, i18next, LinguiJSなどで動作します." + }, + "footer": { + "babelize": "Babelize", + "babelizeElements": "Babelize Elements", + "babelizeElementsMadeWith": "Babelize Elementsで作られている", + "byDevelopersAtBabelizeFor": "開発者向けBabelizeで開発者向け", + "community": "地域社会", + "openSourceReactComponentsForModern": "ローカライゼーションと国際化管理のためのオープンソース React コンポーネント", + "resources": "資源" + }, + "getting-started": { + "buildFaster": "早く作れ", + "buildFromScratch": "ゼロから作る", + "buildInterfacesThatAreReady": "異なる言語でユーザーに用意されたインターフェースを作成し,別々のUIシステムを作成することなく,指示を書きます.", + "dropdown": "ドロップダウン", + "explore": "探求する", + "keepLanguageSwitchingAndLocalization": "製品全体で異なる実装を維持するのではなく,言語の切り替えとローカライゼーションの相互作用を視覚的に一致させてください.", + "languagesLocalesAndRtl": "言語,地域,およびRTL が扱われる.", + "oneLanguageswitcher": "1つの言語スイッチ", + "oneLocalizationExperienceAcrossYour": "あなたのアプリで1つのローカライゼーションの経験があります.", + "pill": "錠剤は", + "segmented": "割れ目", + "shipGlobally": "船舶はグローバルに", + "skipTheRepetitiveWorkOf": "Babelizeは既に使用しているスタックに直接収まる 磨練された,生産準備ができている部品を提供します.", + "stayConsistent": "一貫して", + "stopRebuildingLocalizationUi": "ローカライゼーション UIの再構築をやめましょう", + "useBabelize": "Babelize を使用する", + "useReadyMadeComponentsInsteadOf": "言語セレクター,ローケールコントロール,エディティングインターフェイス,RTL行動をゼロから繰り返し作成する代わりに,準備済みコンポーネントを使用します.", + "whyBabelize": "なぜBabelizeなのか?" + }, + "github-counter": { + "labelFormattedcountNoun": "{label} ({formattedCount} {noun})", + "labelFormattedcountNoun_2": "{label} ({formattedCount} {noun})" + }, + "hero": { + "browseComponentsb": "ブラウズ コンポーネントB", + "copy": "コピー", + "getStarted": "始める", + "localizationUiComponentsForReact": "ローカライゼーション UI コンポーネント について React.", + "openSourceMitLicensed": "オープンソース • MITライセンス", + "openSourceReactComponentsForInternationalization": "オープンソース React コンポーネント インターナショナライゼーション (i18n) 言語スイッチヤー,ローケール・ピックヤー,RTLレイアウトを数分で作成する" + }, + "navbar": { + "babelizeElements": "Babelize Elements", + "components": "コンポーネント", + "contribute": "貢献する", + "getStarted": "始める", + "gettingStarted": "始めること", + "home": "ホーム", + "toggleMenu": "トーグルメニュー" + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 189ddce..1b74bd8 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,6 +3,8 @@ import { Geist, Geist_Mono } from "next/font/google"; import { RootProvider } from "fumadocs-ui/provider/next"; import { ThemeProvider } from "next-themes"; import "./globals.css"; +import { NextIntlClientProvider, useLocale } from "next-intl"; +import { localeDirection } from "../i18n/locales"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -52,18 +54,22 @@ export const metadata: Metadata = { }; export default function RootLayout({ children }: { children: React.ReactNode }) { + const locale = useLocale(); return ( - {children} + + {children} + diff --git a/src/components/landing/community.tsx b/src/components/landing/community.tsx index f82b321..79367b0 100644 --- a/src/components/landing/community.tsx +++ b/src/components/landing/community.tsx @@ -1,3 +1,4 @@ +import { useTranslations } from "next-intl"; import { Reveal } from "./reveal"; import { GitHubCounter } from "./github-counter"; import type { GitHubStats } from "@/lib/github"; @@ -5,7 +6,7 @@ import type { GitHubStats } from "@/lib/github"; const communityLinks = [ { name: "GitHub", - description: "View our open source code and contribute to the project", + description: "community.viewOurOpenSourceCode", href: "https://github.com/babelize/babelize-elements", icon: (

- Join our community + {t("community.joinOurCommunity")}

- Connect with other developers, get help, and contribute to the project + {t("community.connectWithOtherDevelopersGet")}

@@ -96,7 +98,7 @@ export function Community({ stats }: CommunityProps = {}) {

{link.name}

- {link.description} + {t(link.description)}

diff --git a/src/components/landing/components.tsx b/src/components/landing/components.tsx index 2acea12..01310a1 100644 --- a/src/components/landing/components.tsx +++ b/src/components/landing/components.tsx @@ -1,4 +1,5 @@ "use client"; +import { useTranslations } from "next-intl"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; @@ -16,9 +17,19 @@ const languages = [ { code: "ar", label: "العربية", flag: "🇸🇦", rtl: true }, ]; +const languagesLabelKeys: Record = { + English: "components.english", + Français: "components.français", + Español: "components.español", + Deutsch: "components.deutsch", + 日本語: "components.untitled", + العربية: "components.untitled_2", +}; + /* ── Shared app window chrome for realistic previews ── */ function MiniApp({ title, children }: { title: string; children: React.ReactNode }) { + const t = useTranslations(); return (
@@ -29,7 +40,7 @@ function MiniApp({ title, children }: { title: string; children: React.ReactNode {title}
- preview + {t("components.preview")}
{children}
@@ -54,6 +65,7 @@ const pillMessages: Record
-

Babelize Console

-

Localization workspace

+

{tr("components.babelizeConsole")}

+

{tr("components.localizationWorkspace")}

@@ -110,7 +122,7 @@ function PillPreview() {
- Live + {tr("components.live")}
@@ -125,6 +137,7 @@ function PillPreview() { /* ── Dropdown Picker inside a settings screen ── */ function DropdownPreview() { + const t = useTranslations(); const [lang, setLang] = useState("en"); const [open, setOpen] = useState(false); const current = languages.find((l) => l.code === lang)!; @@ -132,15 +145,15 @@ function DropdownPreview() { return (
-

Workspace settings

-

Manage your organization defaults

+

{t("components.workspaceSettings")}

+

{t("components.manageYourOrganizationDefaults")}

-

Language

-

Interface and content locale

+

{t("components.language")}

+

{t("components.interfaceAndContentLocale")}

))} @@ -197,22 +210,22 @@ function DropdownPreview() {
-

Time zone

-

Region-aware formatting

+

{t("components.timeZone")}

+

{t("components.regionAwareFormatting")}

- (UTC+05:30) Sindian + {t("components.utc0530Sindian")}
-

Theme

-

Appearance preference

+

{t("components.theme")}

+

{t("components.appearancePreference")}

- Dark + {t("components.dark")}
@@ -223,23 +236,24 @@ function DropdownPreview() { /* ── In-context editing inside a translation editor ── */ function EditingPreview() { + const t = useTranslations(); const [editing, setEditing] = useState(false); return (
-

Translations

-

app dashboard · English → French

+

{t("components.translations")}

+

{t("components.appDashboardEnglish")}

- en + {t("components.en")} - Source + {t("components.source")}
-

Welcome back, Sarah!

+

{t("components.welcomeBackSarah")}

@@ -260,12 +274,12 @@ function EditingPreview() { className="rounded-xl border border-emerald-500/20 bg-emerald-500/5 p-5" >
- fr + {t("components.fr")}
{editing ? ( @@ -275,12 +289,14 @@ function EditingPreview() { className="mt-2 w-full bg-transparent text-base text-white outline-none" /> ) : ( -

Bienvenue, Sarah !

+

{t("components.bienvenueSarah")}

)}

- Click Edit to translate inline + {t.rich("components.clickEditToTranslateInline", { + span: (chunks) => {chunks}, + })}

@@ -290,18 +306,19 @@ function EditingPreview() { /* ── RTL native ── */ const rtlMessages = { - greeting: "مرحبا بعودتك", - desc: "لديك 3 إشعارات جديدة", + greeting: "components.untitled_3", + desc: "components.untitled_4", }; function RtlPreview() { + const t = useTranslations(); const [dir, setDir] = useState<"ltr" | "rtl">("rtl"); const isRtl = dir === "rtl"; return (
-

Activity

+

{t("components.activity")}

{(["ltr", "rtl"] as const).map((d) => (
@@ -675,7 +696,7 @@ export function ComponentShowcase() { className="flex items-center gap-1.5 rounded-md border border-white/10 bg-white/5 px-2.5 py-1 text-xs text-neutral-400 transition-colors hover:bg-white/10 hover:text-white" > {copied ? : } - {copied ? "Copied" : "Copy"} + {copied ? t("components.copied_2") : t("components.copy")}
@@ -696,7 +717,7 @@ export function ComponentShowcase() {
               href="/docs/components"
               className="group inline-flex h-11 items-center gap-2 rounded-full border border-white/[0.1] bg-white/[0.02] px-6 text-sm font-medium text-white transition-all hover:bg-white/[0.05]"
             >
-              Browse all components
+              {t("components.browseAllComponents")}
               
             
           
diff --git a/src/components/landing/contribute.tsx b/src/components/landing/contribute.tsx index 129d53b..77ebdce 100644 --- a/src/components/landing/contribute.tsx +++ b/src/components/landing/contribute.tsx @@ -1,8 +1,10 @@ +import { useTranslations } from "next-intl"; import Link from "next/link"; import { ArrowRight, Sparkles } from "lucide-react"; import { Reveal } from "./reveal"; export function Contribute() { + const t = useTranslations(); return (
@@ -11,22 +13,22 @@ export function Contribute() {
- Contribute + {t("contribute.contribute")}

- Built by the community, for every - localized app. + {t.rich("contribute.builtByTheCommunityFor", { + span: (chunks) => {chunks}, + })}

- Join the Babelize Elements open-source contributors. Pick an issue, build a React - i18n component, and ship it to developers worldwide. + {t("contribute.joinTheBabelizeElementsOpenSource")}

- Read the contribution guide + {t("contribute.readTheContributionGuide")} - Browse open issues + {t("contribute.browseOpenIssues")}
diff --git a/src/components/landing/editing.tsx b/src/components/landing/editing.tsx index 2012fbb..dedc47c 100644 --- a/src/components/landing/editing.tsx +++ b/src/components/landing/editing.tsx @@ -1,4 +1,5 @@ "use client"; +import { useTranslations } from "next-intl"; import { useEffect, useRef, useState } from "react"; import { AnimatePresence, motion } from "motion/react"; @@ -38,6 +39,7 @@ const FIELD_LABELS: Record = { /* ── Interactive console demo ── */ function EditingDemo() { + const t = useTranslations(); const [locale, setLocale] = useState("en"); const [text, setText] = useState(INITIAL); const [editing, setEditing] = useState(null); @@ -175,7 +177,7 @@ function EditingDemo() { disabled={!draft.trim()} className="rounded-lg bg-emerald-500 px-3.5 py-1.5 text-xs font-medium text-black transition-colors hover:bg-emerald-400 disabled:cursor-not-allowed disabled:opacity-40" > - Save + {t("editing.save")}
@@ -195,7 +197,7 @@ function EditingDemo() { console.tsx
- preview + {t("editing.preview")}
@@ -205,8 +207,8 @@ function EditingDemo() { B
-

Babelize Console

-

Localization workspace

+

{t("editing.babelizeConsole")}

+

{t("editing.localizationWorkspace")}

{LOCALES.find((l) => l.code === locale)?.label} @@ -258,7 +260,7 @@ function EditingDemo() { > - Saved + {t("editing.saved")} )} @@ -271,6 +273,7 @@ function EditingDemo() { /* ── Section ── */ export function InContextEditing() { + const t = useTranslations(); return (
@@ -283,21 +286,23 @@ export function InContextEditing() { - In-context editing + {t("editing.inContextEditing")}

- Edit translations{" "} - - where they live. - + {t.rich("editing.editTranslationsWhereTheyLive", { + span: (chunks) => ( + + {chunks} + + ), + })}

- Update localized content directly inside your interface instead of hunting through - translation files. + {t("editing.updateLocalizedContentDirectlyInside")}

- No context switching. No hunting through translation files. + {t("editing.noContextSwitchingNoHunting")}

diff --git a/src/components/landing/faq.tsx b/src/components/landing/faq.tsx index 50d70f6..757fd73 100644 --- a/src/components/landing/faq.tsx +++ b/src/components/landing/faq.tsx @@ -1,4 +1,5 @@ "use client"; +import { useTranslations } from "next-intl"; import { useState } from "react"; import { Plus } from "lucide-react"; @@ -7,38 +8,33 @@ import { cn } from "@/lib/utils"; const faqs = [ { - question: "How do I install Babelize Elements?", - answer: - "Install the full library with `npm install @babelize/elements`, or add individual components with `npx shadcn@latest add @babelize/language-switcher` (or `npx @babelize/elements add language-switcher`). Works with Next.js, Remix, and any React app.", + question: "faq.howDoIInstallBabelize", + answer: "faq.installTheFullLibraryWith", }, { - question: "Can I customize the language switcher and locale picker components?", - answer: - "Absolutely. Since you own the code, every component is fully customizable with Tailwind CSS classes and props. Change colors, spacing, animations, and behavior however you like. No design constraints.", + question: "faq.canICustomizeTheLanguage", + answer: "faq.absolutelySinceYouOwnThe", }, { - question: "Are these React i18n components production-ready?", - answer: - "Every merged component is reviewed by maintainers and follows our accessibility, TypeScript, and localization checklist before it's documented. They're used in production apps worldwide.", + question: "faq.areTheseReactI18nComponents", + answer: "faq.everyMergedComponentIsReviewed", }, { - question: "Is Babelize Elements really free and open source?", - answer: - "Yes — MIT-licensed and free forever. The code lives on GitHub, contributions are welcome, and you can use the components in any project, commercial or not. No attribution required.", + question: "faq.isBabelizeElementsReallyFree", + answer: "faq.yesMitLicensedAndFree", }, { - question: "Which internationalization (i18n) libraries are supported?", - answer: - "Babelize Elements works with every major i18n library: next-intl, react-i18next, react-intl, LinguiJS, FormatJS, and more. The components are library-agnostic — pass your own locale state and callbacks.", + question: "faq.whichInternationalizationI18nLibrariesAre", + answer: "faq.babelizeElementsWorksWithEvery", }, { - question: "How do I contribute a component to Babelize Elements?", - answer: - "Browse the open issues on GitHub, build the component following the contribution guide, and open a pull request. Maintainers review and merge it, and it ships to the docs for everyone.", + question: "faq.howDoIContributeA", + answer: "faq.browseTheOpenIssuesOn", }, ]; export function Faq() { + const t = useTranslations(); const [openIndex, setOpenIndex] = useState(0); return ( @@ -53,21 +49,23 @@ export function Faq() {
- Support + {t("faq.support")}

- Frequently asked{" "} - - questions - + {t.rich("faq.frequentlyAskedQuestions", { + span: (chunks) => ( + + {chunks} + + ), + })}

- Everything you need to know about using Babelize Elements in your React projects. - Can't find what you're looking for? Check out our GitHub discussions. + {t("faq.everythingYouNeedToKnow")}

@@ -97,7 +95,7 @@ export function Faq() { isOpen ? "text-emerald-400" : "text-white group-hover:text-white/80", )} > - {faq.question} + {t(faq.question)}

- {faq.answer} + {t(faq.answer)}

diff --git a/src/components/landing/features.tsx b/src/components/landing/features.tsx index 37081ea..20974e7 100644 --- a/src/components/landing/features.tsx +++ b/src/components/landing/features.tsx @@ -1,4 +1,5 @@ "use client"; +import { useTranslations } from "next-intl"; import { Globe, Flag, ArrowLeftRight, Braces, Copy } from "lucide-react"; import { Reveal } from "./reveal"; @@ -34,7 +35,26 @@ const FEATURES = [ }, ]; +const FEATURES_TITLE_KEYS: Record = { + "Language Switchers": "features.languageSwitchers", + "Locale Pickers": "features.localePickers", + "RTL Layout Support": "features.rtlLayoutSupport", + "i18n Integration": "features.i18nIntegration", +}; + +const FEATURES_DESCRIPTION_KEYS: Record = { + "Drop-in switchers with dropdowns, pills, flags, and full RTL support.": + "features.dropInSwitchersWithDropdownsPills", + "Searchable locale pickers with native names and flags.": + "features.searchableLocalePickersWithNative", + "Automatic RTL detection and layout direction handling.": + "features.automaticRtlDetectionAndLayout", + "Works with react-intl, next-intl, i18next, LinguiJS, and more.": + "features.worksWithReactIntlNextIntlI18next", +}; + export function Features() { + const t = useTranslations(); return (
@@ -46,23 +66,21 @@ export function Features() { - Powerful by default + {t("features.powerfulByDefault")}

- Everything you need + {t("features.everythingYouNeed")} - to localize. + {t("features.toLocalize")}

-

- Built for modern React apps. Install and ship globally. -

+

{t("features.builtForModernReactApps")}

@@ -84,10 +102,10 @@ export function Features() {

- {feature.title} + {t(FEATURES_TITLE_KEYS[feature.title] ?? feature.title)}

- {feature.description} + {t(FEATURES_DESCRIPTION_KEYS[feature.description] ?? feature.description)}

@@ -110,7 +128,7 @@ export function Features() { @@ -118,94 +136,94 @@ export function Features() {
                   
-                    "use client"
+                    {'"use client"'}
                     ;
                     {"\n\n"}
-                    import
+                    {"import"}
                      {"{ "}
-                    LanguageSwitcher
+                    {"LanguageSwitcher"}
                     {" } "}
-                    from
-                     "@babelize/elements"
+                    {"from"}
+                     {'"@babelize/elements"'}
                     ;
                     {"\n\n"}
-                    export default function
-                     App
+                    {"export default function"}
+                     {"App"}
                     () {"{"}
                     {"\n"}
                      
-                    return
+                    {"return"}
                      (
                     {"\n"}
                      <
-                    LanguageSwitcher
+                    {"LanguageSwitcher"}
                     {"\n"}
-                     locales
+                     {"locales"}
                     =
                     {"{["}
                     {"\n"}
                      {"{ "}
-                    code:
-                     "en"
+                    {"code:"}
+                     {'"en"'}
                     {" },"}
                     {"\n"}
                      {"{ "}
-                    code:
-                     "fr"
+                    {"code:"}
+                     {'"fr"'}
                     {" },"}
                     {"\n"}
                      {"{ "}
-                    code:
-                     "es"
+                    {"code:"}
+                     {'"es"'}
                     {" },"}
                     {"\n"}
                      {"{ "}
-                    code:
-                     "de"
+                    {"code:"}
+                     {'"de"'}
                     {" },"}
                     {"\n"}
                      {"{ "}
-                    code:
-                     "ja"
+                    {"code:"}
+                     {'"ja"'}
                     {" },"}
                     {"\n"}
                      {"{ "}
-                    code:
-                     "ar"
+                    {"code:"}
+                     {'"ar"'}
                     {" },"}
                     {"\n"}
                      {"]}"}
                     {"\n"}
-                     defaultValue
+                     {"defaultValue"}
                     =
-                    "en"
+                    {'"en"'}
                     {"\n"}
-                     onValueChange
+                     {"onValueChange"}
                     =
                     {"{("}
-                    code
+                    {"code"}
                     ) 
                     =>
                      {"{"}
                     {"\n"}
                     {"// next-intl"}
                     {"\n"}
-                     router.
-                    push
+                     {"router."}
+                    {"push"}
                     (
-                    `/$
+                    {"`/$"}
                     {"{"}
-                    code
+                    {"code"}
                     {"}"}
                     `
                     );
                     {"\n"}
                     {"// react-i18next"}
                     {"\n"}
-                     i18n.
-                    changeLanguage
+                     {"i18n."}
+                    {"changeLanguage"}
                     (
-                    code
+                    {"code"}
                     );
                     {"\n"}
                      {"}}"}
diff --git a/src/components/landing/footer.tsx b/src/components/landing/footer.tsx
index 42b6e68..9d3dd7f 100644
--- a/src/components/landing/footer.tsx
+++ b/src/components/landing/footer.tsx
@@ -1,3 +1,4 @@
+import { useTranslations } from "next-intl";
 import Link from "next/link";
 import Image from "next/image";
 
@@ -16,6 +17,7 @@ const communityLinks = [
 ];
 
 export function Footer() {
+  const t = useTranslations();
   return (
     
diff --git a/src/components/landing/github-counter.tsx b/src/components/landing/github-counter.tsx index c0a60f7..1b0ed3d 100644 --- a/src/components/landing/github-counter.tsx +++ b/src/components/landing/github-counter.tsx @@ -1,3 +1,4 @@ +import { useTranslations } from "next-intl"; import * as React from "react"; import { Star, GitFork, GitPullRequest } from "lucide-react"; import { cn } from "@/lib/utils"; @@ -68,12 +69,17 @@ export function GitHubCounter({ className, ...props }: GitHubCounterProps) { + const t = useTranslations(); const config = metricConfig[metric] ?? metricConfig.stars; const formattedCount = formatGitHubCount(count); const MetricIcon = config.icon; const ariaLabel = formattedCount - ? `${config.label} (${formattedCount} ${config.noun})` + ? t("github-counter.labelFormattedcountNoun", { + label: config.label, + formattedCount, + noun: config.noun, + }) : config.label; return ( @@ -178,6 +184,7 @@ export function RotatingGitHubCounter({ className, ...props }: RotatingGitHubCounterProps) { + const t = useTranslations(); const [currentIndex, setCurrentIndex] = React.useState(0); const [isPaused, setIsPaused] = React.useState(false); const prefersReducedMotion = React.useSyncExternalStore( @@ -227,7 +234,11 @@ export function RotatingGitHubCounter({ const MetricIcon = config.icon; const ariaLabel = formattedCount - ? `${config.label} (${formattedCount} ${config.noun})` + ? t("github-counter.labelFormattedcountNoun_2", { + label: config.label, + formattedCount, + noun: config.noun, + }) : config.label; return ( diff --git a/src/components/landing/hero.tsx b/src/components/landing/hero.tsx index e760067..ebce5b8 100644 --- a/src/components/landing/hero.tsx +++ b/src/components/landing/hero.tsx @@ -1,4 +1,5 @@ "use client"; +import { useTranslations } from "next-intl"; import { useEffect } from "react"; import Link from "next/link"; @@ -7,6 +8,7 @@ import { motion } from "motion/react"; import { Copy, CornerDownLeft } from "lucide-react"; export function Hero() { + const t = useTranslations(); const router = useRouter(); useEffect(() => { @@ -50,7 +52,7 @@ export function Hero() { - Open Source • MIT Licensed + {t("hero.openSourceMitLicensed")} {/* Heading area */} @@ -61,10 +63,13 @@ export function Hero() { transition={{ duration: 0.5, delay: 0.1 }} className="mx-auto max-w-4xl text-[2.75rem] leading-[1.1] font-bold tracking-tight text-white sm:text-6xl md:text-7xl lg:text-[5rem]" > - Localization UI Components{" "} - - for React. - + {t.rich("hero.localizationUiComponentsForReact", { + span: (chunks) => ( + + {chunks} + + ), + })} - Open-source React components for internationalization (i18n). Build language - switchers, locale pickers, and RTL layouts in minutes — MIT licensed, - community-driven. + {t("hero.openSourceReactComponentsForInternationalization")} - Get Started + {t("hero.getStarted")} @@ -97,10 +100,13 @@ export function Hero() { href="/docs/components" className="group flex h-11 items-center gap-3 rounded-xl border border-white/[0.08] bg-[#1a1a1a] px-5 font-medium text-white backdrop-blur-md transition-all hover:bg-white/[0.1]" > - Browse Components - - B - + {t.rich("hero.browseComponentsb", { + span: (chunks) => ( + + {chunks} + + ), + })} @@ -124,34 +130,34 @@ export function Hero() {
                     
-                      import
+                      {"import"}
                        {"{ "}
-                      LanguageSwitcher
+                      {"LanguageSwitcher"}
                       {" } "}
-                      from
+                      {"from"}
                        '@babelize/elements'
                       ;
                       {"\n\n"}
-                      export default function
-                       App
+                      {"export default function"}
+                       {"App"}
                       () {"{"}
                       {"\n"}
                       {"  "}
-                      return
+                      {"return"}
                        (
                       {"\n"}
                       {"    "}<
-                      LanguageSwitcher
+                      {"LanguageSwitcher"}
                        
-                      variant
+                      {"variant"}
                       ={'"'}
-                      dropdown
+                      {"dropdown"}
                       ={'"'} />
                       {"\n"}
                       {"  "});
diff --git a/src/components/landing/navbar.tsx b/src/components/landing/navbar.tsx
index d79c70d..55ed5c8 100644
--- a/src/components/landing/navbar.tsx
+++ b/src/components/landing/navbar.tsx
@@ -1,4 +1,5 @@
 "use client";
+import { useTranslations } from "next-intl";
 
 import Link from "next/link";
 import Image from "next/image";
@@ -8,10 +9,10 @@ import { GitHubCounter, RotatingGitHubCounter } from "./github-counter";
 import type { GitHubStats } from "@/lib/github";
 
 const navLinks = [
-  { label: "Home", href: "/" },
-  { label: "Components", href: "#components" },
-  { label: "Getting Started", href: "/docs/getting-started" },
-  { label: "Contribute", href: "/docs/getting-started/contributing" },
+  { label: "navbar.home", href: "/" },
+  { label: "navbar.components", href: "#components" },
+  { label: "navbar.gettingStarted", href: "/docs/getting-started" },
+  { label: "navbar.contribute", href: "/docs/getting-started/contributing" },
 ];
 
 export interface NavbarProps {
@@ -20,6 +21,7 @@ export interface NavbarProps {
 }
 
 export function Navbar({ stats, starsCount }: NavbarProps = {}) {
+  const t = useTranslations();
   const [isOpen, setIsOpen] = useState(false);
   const resolvedStats = stats ?? (starsCount !== undefined ? { stars: starsCount } : undefined);
   const resolvedStarsCount = stats?.stars ?? starsCount;
@@ -33,7 +35,7 @@ export function Navbar({ stats, starsCount }: NavbarProps = {}) {
             
Babelize Elements - Get Started + {t("navbar.getStarted")} setIsOpen(!isOpen)} - aria-label="Toggle menu" + aria-label={t("navbar.toggleMenu")} > {isOpen ? : } @@ -92,7 +94,7 @@ export function Navbar({ stats, starsCount }: NavbarProps = {}) { onClick={() => setIsOpen(false)} className="rounded-xl px-4 py-2.5 text-sm text-white/80 transition-colors hover:bg-white/5 hover:text-white" > - {link.label} + {t(link.label)} ))}
diff --git a/src/i18n/locales.ts b/src/i18n/locales.ts new file mode 100644 index 0000000..a4d35ff --- /dev/null +++ b/src/i18n/locales.ts @@ -0,0 +1,11 @@ +// @babelize-generated locale list +// Babelize regenerates this file while the line above is present. +export const sourceLocale = "en"; +export const locales = ["en", "es", "ja", "ar"] as string[]; + +const rightToLeft = ["ar"] as string[]; + +/** `dir` for : right-to-left scripts (Arabic, Hebrew, Persian, Urdu…). */ +export function localeDirection(locale: string): "rtl" | "ltr" { + return rightToLeft.includes(locale) ? "rtl" : "ltr"; +} diff --git a/src/i18n/request.ts b/src/i18n/request.ts new file mode 100644 index 0000000..00f5995 --- /dev/null +++ b/src/i18n/request.ts @@ -0,0 +1,59 @@ +// next-intl request config, generated by Babelize and taken over to fall back +// to English for strings a locale doesn't have yet (Babelize no longer +// regenerates it). +import { getRequestConfig } from "next-intl/server"; +import { cookies, headers } from "next/headers"; +import { locales, sourceLocale } from "./locales"; + +export { locales, sourceLocale }; + +type Messages = { [key: string]: string | Messages }; + +async function load(locale: string): Promise { + return (await import(`../../public/locales/${locale}.json`)).default; +} + +/** `base` with `over` on top, key by key: a missing translation shows the English text. */ +function withFallback(base: Messages, over: Messages): Messages { + const merged: Messages = { ...base }; + for (const [key, value] of Object.entries(over)) { + const fallback = base[key]; + merged[key] = + typeof value === "object" && typeof fallback === "object" + ? withFallback(fallback, value) + : value; + } + return merged; +} + +async function messagesFor(locale: string): Promise { + const source = await load(sourceLocale); + return locale === sourceLocale ? source : withFallback(source, await load(locale)); +} + +function pickLocale(candidates: Array): string { + for (const candidate of candidates) { + if (!candidate) continue; + const wanted = candidate.toLowerCase(); + const exact = locales.find((l) => l.toLowerCase() === wanted); + if (exact) return exact; + const base = locales.find((l) => l.split("-")[0].toLowerCase() === wanted.split("-")[0]); + if (base) return base; + } + return sourceLocale; +} + +export default getRequestConfig(async () => { + const requestHeaders = await headers(); + // The URL's language (/ja/…), from the locale proxy. + const routed = requestHeaders.get("x-babelize-locale"); + if (routed && locales.includes(routed)) + return { locale: routed, messages: await messagesFor(routed) }; + // Otherwise the NEXT_LOCALE cookie, then the browser's Accept-Language. + const cookieLocale = (await cookies()).get("NEXT_LOCALE")?.value; + const acceptLanguage = (requestHeaders.get("accept-language") ?? "") + .split(",") + .map((part) => part.split(";")[0].trim()); + const locale = pickLocale([cookieLocale, ...acceptLanguage]); + return { locale, messages: await messagesFor(locale) }; +}); diff --git a/src/proxy.ts b/src/proxy.ts new file mode 100644 index 0000000..20cb8e5 --- /dev/null +++ b/src/proxy.ts @@ -0,0 +1,73 @@ +// Locale routing, generated by Babelize and taken over to keep the docs +// English-only until they are translated (Babelize no longer regenerates it). +import { NextResponse, type NextRequest } from "next/server"; +import { locales, sourceLocale } from "./i18n/locales"; + +const ONE_YEAR = 60 * 60 * 24 * 365; + +/** Sections that exist in the source language only, served unprefixed. */ +const SOURCE_ONLY = ["/docs"]; + +function isSourceOnly(pathname: string) { + return SOURCE_ONLY.some((p) => pathname === p || pathname.startsWith(`${p}/`)); +} + +function localized(pathname: string, locale: string) { + if (locale === sourceLocale) return pathname; + return pathname === "/" ? `/${locale}` : `/${locale}${pathname}`; +} + +/** hreflang alternates for search engines, as an HTTP Link header. */ +function alternates(request: NextRequest, pathname: string) { + const origin = request.nextUrl.origin; + const links = locales.map( + (l) => `<${origin}${localized(pathname, l)}>; rel="alternate"; hreflang="${l}"`, + ); + links.push(`<${origin}${pathname}>; rel="alternate"; hreflang="x-default"`); + return links.join(", "); +} + +export function proxy(request: NextRequest) { + const { pathname } = request.nextUrl; + const [, first = "", ...rest] = pathname.split("/"); + const prefixed = locales.find( + (l) => l !== sourceLocale && l.toLowerCase() === first.toLowerCase(), + ); + + if (prefixed) { + const url = request.nextUrl.clone(); + url.pathname = `/${rest.join("/")}`; + // /ja/docs/… → /docs/…: there is no Japanese version yet. + if (isSourceOnly(url.pathname)) return NextResponse.redirect(url); + // /ja/pricing is app/pricing, in Japanese. + const headers = new Headers(request.headers); + headers.set("x-babelize-locale", prefixed); + const response = NextResponse.rewrite(url, { request: { headers } }); + response.cookies.set("NEXT_LOCALE", prefixed, { path: "/", maxAge: ONE_YEAR, sameSite: "lax" }); + response.headers.set("Link", alternates(request, url.pathname)); + return response; + } + + const headers = new Headers(request.headers); + headers.set("x-babelize-locale", sourceLocale); + if (isSourceOnly(pathname)) return NextResponse.next({ request: { headers } }); + + // An unprefixed URL is the source language, unless the visitor chose another. + // "/" always stays English, so English is reachable before there is a + // language switcher to change NEXT_LOCALE. + const chosen = request.cookies.get("NEXT_LOCALE")?.value; + if (pathname !== "/" && chosen && chosen !== sourceLocale && locales.includes(chosen)) { + const url = request.nextUrl.clone(); + url.pathname = localized(pathname, chosen); + return NextResponse.redirect(url); + } + + const response = NextResponse.next({ request: { headers } }); + response.headers.set("Link", alternates(request, pathname)); + return response; +} + +export const config = { + // Pages only: not API routes, Next.js internals or files (anything with a dot). + matcher: ["/((?!api|trpc|_next|_vercel|.*\\..*).*)"], +}; diff --git a/test/github-counter.test.tsx b/test/github-counter.test.tsx index f863ec7..6472ded 100644 --- a/test/github-counter.test.tsx +++ b/test/github-counter.test.tsx @@ -1,4 +1,7 @@ -import { render, screen, fireEvent, act } from "@testing-library/react"; +import { render as rtlRender, screen, fireEvent, act } from "@testing-library/react"; +import type { ReactElement } from "react"; +import { NextIntlClientProvider } from "next-intl"; +import messages from "../public/locales/en.json"; import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; import { GitHubCounter, @@ -6,6 +9,14 @@ import { formatGitHubCount, } from "../src/components/landing/github-counter"; +// The landing components translate with next-intl: render them as the app does. +const render = (ui: ReactElement) => + rtlRender( + + {ui} + , + ); + describe("formatGitHubCount", () => { it("formats counts according to friendly bucket rules", () => { // Edge cases and boundaries specified in Issue #36