diff --git a/README.md b/README.md index 573ed818..ae5524c5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ -🌐 [Launch Relivator's Demo](https://relivator.bleverse.com) | ❄️ [Check Project Features](https://github.com/blefnk/relivator#project-features-checklist) +❄️ [Check Project Features](https://github.com/blefnk/relivator#project-features-checklist) | 🌐 [Launch Relivator's Demo](https://relivator.bleverse.com) Stop running from one starter to the next. With Relivator, you'll have unlimited possibilities. You can create anything you want; all the tools are already prepared, just for you. @@ -24,35 +24,6 @@ Tip! You can create a folder, for instance, `home`, within the `src` directory, **Note:** _Sometimes, we gift early access to Relivator's future plugins to three randomly selected individuals. We also give away various other interesting things. Simply `star this repository` and [let us know how to contact you](https://forms.gle/NXZ6QHpwrxh52VA36). For discussions, join [the project's Discord](https://discord.gg/Pb8uKbwpsJ)._ -
- [27.12.2023] 🎄 Relivator v1.2.0 is here! 🥳 Click to see the announcement 🎁 - ---- - -_Relivator 1.2.0 is already here! I, [@blefnk Nazarii Korniienko](https://github.com/blefnk), am thrilled to wrap up this year 2023, proudly presenting this release to the OSS community! So, the result of over two months of hard work is finally here!_ - -In this version, significant attention was focused on stability, security, performance optimization, and a substantial improvements in design—both visually, UX, and the logic of how the app works. A lot was really done, too much to list everything! Be sure to install it and check it out for yourself! - -By the way, you can now enjoy a finely-tuned ESLint Flat Config! Also, it's worth noting that Clerk, since version 1.1.0, is no longer considered deprecated in the Relivator project. Thanks to 1.2.0, Clerk now works seamlessly with an easy switch to NextAuth.js when needed, all on the fly. Plus, full support for Turbopack (next dev --turbo) is finally here, even for next-intl! - -As for next-intl, finally, we can now enjoy internationalization that works not only on the client-side but also on the server! Only the 404 page has client-side i18n messages, all other pages and components use i18n as server-first. And this is really cool! - -Many unique solutions have been implemented in this new version. Moreover, using Relivator from this version, you have the opportunity to try out the alpha version of our unique Code-First/No-Code Builder system for React pages and components (which will appear in Reliverse CMS in the future). Just visit the Admin page while in the development environment and enjoy. - -If you have already used Relivator before, please pay attention, this is very important! Be sure to check the updated .env.example file and update your .env file accordingly. - -As a small teaser/spoiler, for Relivator 1.3.0, even more improvements in visual design and UX are planned; 1.4.0 will come with a magical CLI implementation, allowing you to quickly obtain only the necessary features and dependencies for your app (even automated updates and the ability to add other functions and packages to an already installed app); 1.5.0 will undergo a full code refactoring that will meet all the best standards and practices; 1.6.0-2.0.0+ versions, apart from many other things, will receive most of the items currently unchecked in the Roadmap (located in the project's README.md). It's going to be incredible! - -So, install this new version of Relivator 1.2.0 and appreciate the multitude of incredible features, and freely use it in your own projects today. Please use your preferred feedback channels to share your thoughts on Relivator 1.2.0 and what you would like to see in future releases. - -Don't forget to also check out the significantly updated README.md, it's worth it. - -Enjoy! ❄️☃️ Merry Christmas and Happy New Year 2024! 🎇🥳 - -
- ---- - _The roadmap below outlines the key features and improvements planned for implementation in this Next.js starter. `Items not marked may already be configured` but might not have undergone extensive testing. Should you find any mistakes, please create an issue._ - [x] 1. Utilized [Next.js 14](https://nextjs.org) with **complete [Turbopack](https://turbo.build) support**, alongside [React 18](https://react.dev), [TailwindCSS](https://tailwindcss.com), and [TypeScript](https://typescriptlang.org) as the project's core technologies. @@ -64,7 +35,7 @@ _The roadmap below outlines the key features and improvements planned for implem - [x] 7. Provided exemplary VSCode settings and recommended extensions. - [x] 8. Optimized the [Next.js Metadata API](https://nextjs.org/docs/app/building-your-application/optimizing/metadata) for SEO, integrating file-system handlers. - [x] 9. Integrated a TailwindCSS screen size indicator for local project runs. -- [x] 10. Implemented extensive internationalization in 10 languages (English, German, Spanish, Persian, French, Hindi, Italian, Polish, Turkish, Ukrainian) using the [next-intl](https://next-intl-docs.vercel.app) library, which works both on server and client, and included support for `next dev --turbo`. +- [x] 10. Implemented extensive internationalization in 11 languages (English, German, Spanish, Persian, French, Hindi, Italian, Polish, Turkish, Ukrainian, Chinese) using the [next-intl](https://next-intl-docs.vercel.app) library, which works both on server and client, and included support for `next dev --turbo`. - [x] 11. Implemented authentication through **both [Clerk](https://clerk.com) and [NextAuth.js](https://authjs.dev)**. - [x] 12. Implemented [tRPC](https://trpc.io) and [TanStack Query](https://tanstack.com/query) (with [React Normy](https://github.com/klis87/normy#readme)) to have advanced server and client data fetching. - [x] 13. Established a user subscription and checkout system using [Stripe](hhttps://github.com/stripe/stripe-node#readme). @@ -300,7 +271,7 @@ So the correct version for this specific case will be: **Currently supported locales (you can add your own manually):** -de-DE, en-US, es-ES, fa-IR, fr-FR, hi-IN, it-IT, pl-PL, tr-TR, uk-UA. +de-DE, en-US, es-ES, fa-IR, fr-FR, hi-IN, it-IT, pl-PL, tr-TR, uk-UA, zh-CN. ## Principles, Design Decisions, Code Insights, Recommendations @@ -310,6 +281,7 @@ Our starter aims to be a rich resource for developers at all stages of their jou **Principles (W.I.P):** +- [ ] Prettier's principle over linters related to developer experience ([source](https://prettier.io/docs/en/integrating-with-linters.html#notes)): "You end up with a lot of red squiggly lines in your editor, which gets annoying. Prettier is supposed to make you forget about formatting – and not be in your face about it!" - [ ] Every file and component should be built consciously, by using [KISS/DRY/SOLID/YAGNI principles](https://blog.openreplay.com/applying-design-principles-in-react), with a certain sense of intelligence, with performance in mind. - [ ] We need to think of the project as if it were a planet with its own continents, countries, cities, rooms, individuals, entities etc. @@ -432,6 +404,96 @@ _A:_ Simply go to the PlanetScale dashboard and click on the `wake up` button. P _More learning resources can be found within the files of this repository._ +## Release Notes + +
+ 1.2.3 | 12.01.2024 + +Just a small hotfix to improve the developer experience. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.2.3) + +
+ +
+ 1.2.2 | 03.01.2024 + +1.2.2 brings ESLint Stylistic Plugin into your life. This will make your work with the project even more enjoyable. + +Remember, Relivator is designed to be beginner-friendly, so quite a lot of ESLint options are turned off, just turn on what you need. + +These turn-offs will be gradually eliminated as we move towards the massive 2.0.0, which will significantly raise the project's standards, being professional, will be even more convenient for beginners. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.2.2) + +
+ +
+ 1.2.1 | 02.01.2024 + +This is quite a small update compared to all the past ones, but this one also deserves your attention. Now, updates will generally be smaller but will appear more frequently. Thanks to this, it will be possible to easily update forks and independent projects that use Relivator as their base. + +Update v1.2.1 adds Chinese localization, and among other things, work has begun on the so-called token system, which will allow future versions to work with Figma design systems in an automated way. It will also help to make the styles in the project cleaner by significantly reducing the number of Tailwind classes. For this, Relivator now installs the wonderful package @tokenami, developed by @jjenzz; Jenna, thank you so much for this library! + +p.s. 1.2.1 is the first commit to the Relivator repository that no longer contains an emoji at the beginning of its name. Thanks to this, contributors to Relivator/Reliverse will no longer have to spend time inventing a suitable emoji. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.2.1) + +
+ +
+ 1.2.0 | [27.12.2023] 🎄 Relivator v1.2.0 is here! 🥳 Click to see the announcement 🎁 + +_Relivator 1.2.0 is already here! I, [@blefnk Nazarii Korniienko](https://github.com/blefnk), am thrilled to wrap up this year 2023, proudly presenting this release to the OSS community! So, the result of over two months of hard work is finally here!_ + +In this version, significant attention was focused on stability, security, performance optimization, and a substantial improvements in design—both visually, UX, and the logic of how the app works. A lot was really done, too much to list everything! Be sure to install it and check it out for yourself! + +By the way, you can now enjoy a finely-tuned ESLint Flat Config! Also, it's worth noting that Clerk, since version 1.1.0, is no longer considered deprecated in the Relivator project. Thanks to 1.2.0, Clerk now works seamlessly with an easy switch to NextAuth.js when needed, all on the fly. Plus, full support for Turbopack (next dev --turbo) is finally here, even for next-intl! + +As for next-intl, finally, we can now enjoy internationalization that works not only on the client-side but also on the server! Only the 404 page has client-side i18n messages, all other pages and components use i18n as server-first. And this is really cool! + +Many unique solutions have been implemented in this new version. Moreover, using Relivator from this version, you have the opportunity to try out the alpha version of our unique Code-First/No-Code Builder system for React pages and components (which will appear in Reliverse CMS in the future). Just visit the Admin page while in the development environment and enjoy. + +If you have already used Relivator before, please pay attention, this is very important! Be sure to check the updated .env.example file and update your .env file accordingly. + +As a small teaser/spoiler, for Relivator 1.3.0, even more improvements in visual design and UX are planned; 1.4.0 will come with a magical CLI implementation, allowing you to quickly obtain only the necessary features and dependencies for your app (even automated updates and the ability to add other functions and packages to an already installed app); 1.5.0 will undergo a full code refactoring that will meet all the best standards and practices; 1.6.0-2.0.0+ versions, apart from many other things, will receive most of the items currently unchecked in the Roadmap (located in the project's README.md). It's going to be incredible! + +So, install this new version of Relivator 1.2.0 and appreciate the multitude of incredible features, and freely use it in your own projects today. Please use your preferred feedback channels to share your thoughts on Relivator 1.2.0 and what you would like to see in future releases. + +Don't forget to also check out the significantly updated README.md, it's worth it. + +Enjoy! ❄️☃️ Merry Christmas and Happy New Year 2024! 🎇🥳 + +
+ +
+ 1.1.0 | 🔥 The Most Feature-Rich Next.js 14 Starter + +Here it is! Relivator has been updated to version 1.1.0! + +**Now it's even more feature-rich, with cleaner code, and a more stable Next.js starter.** + +Ever dreamed of having both MySQL/PostgreSQL and Clerk/NextAuth.js in one project with the ability to switch on the fly? And even if you hadn't thought about it – now it's possible. Mix and match at will – even more possibilities for on-the-fly switching are coming soon in the next releases of Relivator. + +Among many other new and fixed things, Stripe is now fully functional and comes with extensive docs in the form of comments within the relevant files. + +`Please star this repository` to show your support! Thank you to everyone who has shown interest in this project! + +Please check out the updated list of project features in the project's README. Enjoy and please share your feedback! + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.1.0) + +
+ +
+ 1.0.0 | 🎉 Relivator Release + +How to Install and Get Started? Please visit [the project's README](https://github.com/blefnk/relivator#readme), where you can always find up-to-date information about the project and how to install it easily. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.0.0) + +
+ ## Migration from Other Starters to Relivator If you've been exploring which Next.js starter to select for your next project like [create-next-app](https://vercel.com/templates/next.js/nextjs-boilerplate), [create-t3-app](https://create.t3.gg), [Next.js Commerce (Vercel Store)](https://vercel.store), [Skateshop](https://github.com/sadmann7/skateshop), [OneStopShop](https://github.com/jackblatch/OneStopShop), [Taxonomy](https://github.com/shadcn-ui/taxonomy)/[nextflix](https://github.com/Apestein/nextflix), [payload](https://github.com/payloadcms/payload), [Medusa](https://github.com/medusajs/medusa), or [any other projects](https://github.com/blefnk/relivator/wiki/Project-Credits-&-Contributors) – your search can end here. @@ -483,178 +545,3 @@ Happy coding! Embark on your coding adventure, learn, iterate, and most importan Check out [our other free Next.js 14 starter](https://github.com/blefnk/reliverse). This one, a monorepo, provides the tech used in the current starter and adds: Turborepo/Turbopack, Prisma, Valibot, Lucia, Clerk, and much more, as we experimentally attempt to combine all vital and widely-used tech. It's like thinking about: Reliverse (WordPress) + Relivator (WooCommerce) = 😍. [bleverse-discord]: https://discord.gg/Pb8uKbwpsJ - - diff --git a/biome.json b/biome.json index 50af1916..978b0fe7 100644 --- a/biome.json +++ b/biome.json @@ -1,15 +1,28 @@ { "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "organizeImports": { "enabled": false }, - "files": { "ignore": ["node_modules"] }, + "organizeImports": { + "enabled": false + }, + "files": { + "ignore": ["node_modules"] + }, "linter": { "enabled": true, "rules": { "recommended": true, - "style": { "noUselessElse": "off" }, - "suspicious": { "noExplicitAny": "off" }, - "correctness": { "useExhaustiveDependencies": "off" }, - "complexity": { "useLiteralKeys": "off" } + "style": { + "noUselessElse": "off" + }, + "suspicious": { + "noExplicitAny": "off", + "noArrayIndexKey": "off" + }, + "correctness": { + "useExhaustiveDependencies": "off" + }, + "complexity": { + "useLiteralKeys": "off" + } } } } diff --git a/changelog.md b/changelog.md index f16d9260..15c92c76 100644 --- a/changelog.md +++ b/changelog.md @@ -1,52 +1,93 @@ -# Project Changelog - -Please check the roadmap checklist on README.md instead reading this OUTDATED file. - -## v0.0.0-v1.2.0 Features - -- [x] Utilized [Next.js 14](https://nextjs.org), [React 18](https://react.dev), [TailwindCSS](https://tailwindcss.com), and [TypeScript](https://typescriptlang.org) serve as the project's core technologies. -- [x] Implemented authentication through **both [Clerk](https://clerk.com/) and [NextAuth.js](https://authjs.dev)**. -- [x] Unleashed extensive internationalization **in 10 languages** (_English, German, Spanish, Persian, French, Hindi, Italian, Polish, Turkish, Ukrainian_), using [next-intl](https://next-intl-docs.vercel.app). -- [x] Undertook [Drizzle ORM](https://orm.drizzle.team), utilizing **both MySQL and PostgreSQL** databases, and [PlanetScale](https://planetscale.com)/[Neon](https://neon.tech)/[Vercel](https://vercel.com)/[Railway](https://railway.app) services. -- [x] Successfully configured `next.config.mjs` with i18n and MDX support. -- [x] Strived for thorough documentation and a beginner-friendly approach throughout the project. -- [x] Skillfully configured and commented on `middleware.ts` for i18n and next-auth. -- [x] Set upped the Content-Security-Policy header as a security measure to prevent XSS attacks. -- [x] Provided exemplary VSCode settings and recommended extensions. -- [x] Optimized the [Next.js Metadata API](https://nextjs.org/docs/app/building-your-application/optimizing/metadata) for SEO, integrating file-system handlers. -- [x] Integrated a TailwindCSS screen size indicator for local project runs. -- [x] Established a user subscription and checkout system using [Stripe](hhttps://github.com/stripe/stripe-node#readme). -- [x] Ensured type-safety validations for project schemas and UI fields using [Zod](https://zod.dev). -- [x] Employed [EsLint](https://eslint.org) and [Prettier](https://prettier.io) to ensure the code is safe and readable. -- [x] Elegantly executed the font system, utilizing [Inter](https://rsms.me/inter) and additional typefaces. -- [x] Developed a storefront, incorporating product, category, and subcategory functionality. -- [x] Designed a modern, cleanly composed UI using [Radix](https://radix-ui.com), with attractive UI components from [shadcn/ui](https://ui.shadcn.com). -- [x] Composed a comprehensive, beginner-friendly `README.md`, including descriptions of [environment variables](https://nextjs.org/docs/basic-features/environment-variables). -- [x] Blog functionality realized through the use of MDX files. -- [x] Implemented [tRPC](https://trpc.io) and [TanStack Query](https://tanstack.com/query) for server and client data fetching. - -## v1.0.0-v1.2.0 Commits - -- 19. [🟢 feat(app): add a large number of updates](https://github.com/blefnk/relivator/commit/0bcee920b482e63c67dbe030fe12784429d6c8fc) -- 20. [🛡️ feat(app): improve stability and security](https://github.com/blefnk/relivator/releases/tag/1.2.0) - -## v0.0.0-v1.0.0 Commits - -- 1. [🌱 feat(app): initial deploy](https://github.com/blefnk/relivator/commit/4099c7c7e444b3e5782487355a508fdfdb3a14cd) -- 2. [💎 feat(app): initial update](https://github.com/blefnk/relivator/commit/67a68f4cb93f76937b307fc056ba99a9675ba700) -- 3. [🌅 upd(app): global update](https://github.com/blefnk/relivator/commit/6247d5cda5a5dc5dea19940b64b39a5ab9aa6ce7) -- 4. [🦫 feat(db): add drizzle config](https://github.com/blefnk/relivator/commit/4dbcf8d6682530955913ec088051c63798807d1e) -- 5. [✅ feat(app): configure the app](https://github.com/blefnk/relivator/commit/fc941ef5061662a0dc8052641ab010cc45e66c60) -- 6. [☘️ feat(app): improve env styling](https://github.com/blefnk/relivator/commit/e75ed0ec2413110b0fcd75f778d63eba9d88faea) -- 7. [☘️ feat(store): init app store types](https://github.com/blefnk/relivator/commit/73b00c0ce0f3656bddbe9b71c19631c352ab89b2) -- 8. [☘️ feat(store): add more store things](https://github.com/blefnk/relivator/commit/146f9c451544112a18a734b12622f913dd3c8298) -- 9. [🧹 feat(app): temporary remove image](https://github.com/blefnk/relivator/commit/f3ce181f3d9844ba718a3aef7fadcd03776fdffe) -- 10. [🌿 feat(app): improve header and footer](https://github.com/blefnk/relivator/commit/d178f653844cd259db5095022bfe4a1de9ebd070) -- 11. [🌳 feat(app): add many new store things](https://github.com/blefnk/relivator/commit/b25ea4665975d055310a5f172d658464633d451e) -- 12. [🌄 feat(app): add payments & store actions](https://github.com/blefnk/relivator/commit/639093c454bd758f0536215ce9830daabf466852) -- 13. [💳 feat(store): add checkout & some updates](https://github.com/blefnk/relivator/commit/b61217d1afede932452190dfbbadd9bd86d22260) -- 14. [✨ feat(app): improve the project file hierarchy](https://github.com/blefnk/relivator/commit/3a66fa83eede22a0a28082c37409a6546dca3a97) -- 15. [🔴 feat(auth): deprecate clerk because i18n errors](https://github.com/blefnk/relivator/commit/2d4ff94d089548a30a9e65214c7731a68b6cae65) -- 16. [📄 upd(app): upd islands, landing and other pages](https://github.com/blefnk/relivator/commit/7e5abae355cfc4790f65bce0d6d2ddbb24b2a524) -- 17. [🍭 add(analytics): integrate vercel web analytics](https://github.com/blefnk/relivator/commit/5fb132ec4be5cb2c35e168bc9f1ad9844e3b73eb) -- 18. [🎉 feat(app): release relivator 1.0.0 version](https://github.com/blefnk/relivator/commit/52dd52012441c975747b0331530428e8f7ae5825) +# Release Notes + + + +❄️ [Check Project Features](https://github.com/blefnk/relivator#project-features-checklist) | 🌐 [Launch Relivator's Demo](https://relivator.bleverse.com) + +
+ 1.2.3 | 12.01.2024 + +Just a small hotfix to improve the developer experience. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.2.3) + +
+ +
+ 1.2.2 | 03.01.2024 + +1.2.2 brings ESLint Stylistic Plugin into your life. This will make your work with the project even more enjoyable. + +Remember, Relivator is designed to be beginner-friendly, so quite a lot of ESLint options are turned off, just turn on what you need. + +These turn-offs will be gradually eliminated as we move towards the massive 2.0.0, which will significantly raise the project's standards, being professional, will be even more convenient for beginners. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.2.2) + +
+ +
+ 1.2.1 | 02.01.2024 + +This is quite a small update compared to all the past ones, but this one also deserves your attention. Now, updates will generally be smaller but will appear more frequently. Thanks to this, it will be possible to easily update forks and independent projects that use Relivator as their base. + +Update v1.2.1 adds Chinese localization, and among other things, work has begun on the so-called token system, which will allow future versions to work with Figma design systems in an automated way. It will also help to make the styles in the project cleaner by significantly reducing the number of Tailwind classes. For this, Relivator now installs the wonderful package @tokenami, developed by @jjenzz; Jenna, thank you so much for this library! + +p.s. 1.2.1 is the first commit to the Relivator repository that no longer contains an emoji at the beginning of its name. Thanks to this, contributors to Relivator/Reliverse will no longer have to spend time inventing a suitable emoji. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.2.1) + +
+ +
+ 1.2.0 | [27.12.2023] 🎄 Relivator v1.2.0 is here! 🥳 Click to see the announcement 🎁 + +_Relivator 1.2.0 is already here! I, [@blefnk Nazarii Korniienko](https://github.com/blefnk), am thrilled to wrap up this year 2023, proudly presenting this release to the OSS community! So, the result of over two months of hard work is finally here!_ + +In this version, significant attention was focused on stability, security, performance optimization, and a substantial improvements in design—both visually, UX, and the logic of how the app works. A lot was really done, too much to list everything! Be sure to install it and check it out for yourself! + +By the way, you can now enjoy a finely-tuned ESLint Flat Config! Also, it's worth noting that Clerk, since version 1.1.0, is no longer considered deprecated in the Relivator project. Thanks to 1.2.0, Clerk now works seamlessly with an easy switch to NextAuth.js when needed, all on the fly. Plus, full support for Turbopack (next dev --turbo) is finally here, even for next-intl! + +As for next-intl, finally, we can now enjoy internationalization that works not only on the client-side but also on the server! Only the 404 page has client-side i18n messages, all other pages and components use i18n as server-first. And this is really cool! + +Many unique solutions have been implemented in this new version. Moreover, using Relivator from this version, you have the opportunity to try out the alpha version of our unique Code-First/No-Code Builder system for React pages and components (which will appear in Reliverse CMS in the future). Just visit the Admin page while in the development environment and enjoy. + +If you have already used Relivator before, please pay attention, this is very important! Be sure to check the updated .env.example file and update your .env file accordingly. + +As a small teaser/spoiler, for Relivator 1.3.0, even more improvements in visual design and UX are planned; 1.4.0 will come with a magical CLI implementation, allowing you to quickly obtain only the necessary features and dependencies for your app (even automated updates and the ability to add other functions and packages to an already installed app); 1.5.0 will undergo a full code refactoring that will meet all the best standards and practices; 1.6.0-2.0.0+ versions, apart from many other things, will receive most of the items currently unchecked in the Roadmap (located in the project's README.md). It's going to be incredible! + +So, install this new version of Relivator 1.2.0 and appreciate the multitude of incredible features, and freely use it in your own projects today. Please use your preferred feedback channels to share your thoughts on Relivator 1.2.0 and what you would like to see in future releases. + +Don't forget to also check out the significantly updated README.md, it's worth it. + +Enjoy! ❄️☃️ Merry Christmas and Happy New Year 2024! 🎇🥳 + +
+ +
+ 1.1.0 | 🔥 The Most Feature-Rich Next.js 14 Starter + +Here it is! Relivator has been updated to version 1.1.0! + +**Now it's even more feature-rich, with cleaner code, and a more stable Next.js starter.** + +Ever dreamed of having both MySQL/PostgreSQL and Clerk/NextAuth.js in one project with the ability to switch on the fly? And even if you hadn't thought about it – now it's possible. Mix and match at will – even more possibilities for on-the-fly switching are coming soon in the next releases of Relivator. + +Among many other new and fixed things, Stripe is now fully functional and comes with extensive docs in the form of comments within the relevant files. + +`Please star this repository` to show your support! Thank you to everyone who has shown interest in this project! + +Please check out the updated list of project features in the project's README. Enjoy and please share your feedback! + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.1.0) + +
+ +
+ 1.0.0 | 🎉 Relivator Release + +How to Install and Get Started? Please visit [the project's README](https://github.com/blefnk/relivator#readme), where you can always find up-to-date information about the project and how to install it easily. + +[Visit release page to learn more...](https://github.com/blefnk/relivator/releases/edit/1.0.0) + +
diff --git a/cspell.json b/cspell.json index c4c5ef0a..696bfe1b 100644 --- a/cspell.json +++ b/cspell.json @@ -139,6 +139,7 @@ "İndir", "isadmin", "jdoe", + "jjenzz", "jjenzz's", "João", "Kârlı", diff --git a/eslint.config.ts b/eslint.config.ts index 4a2883bc..e75a4cc5 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -23,13 +23,8 @@ import antfu from "@antfu/eslint-config"; import { FlatCompat } from "@eslint/eslintrc"; import eslintJsPlugin from "@eslint/js"; -import importAliasPlugin from "@limegrass/eslint-plugin-import-alias"; import nextPlugin from "@next/eslint-plugin-next"; import stylisticPlugin from "@stylistic/eslint-plugin"; -import tanstackQueryPlugin from "@tanstack/eslint-plugin-query"; -import tsEslintPlugin from "@typescript-eslint/eslint-plugin"; -import tsEslintParser from "@typescript-eslint/parser"; -import { Linter } from "eslint"; import * as airbnbBestPracticesConfig from "eslint-config-airbnb-base/rules/best-practices"; import * as airbnbErrorsConfig from "eslint-config-airbnb-base/rules/errors"; import * as airbnbES6Config from "eslint-config-airbnb-base/rules/es6"; @@ -37,33 +32,21 @@ import * as airbnbNodeConfig from "eslint-config-airbnb-base/rules/node"; import * as airbnbStyleConfig from "eslint-config-airbnb-base/rules/style"; import * as airbnbVariablesConfig from "eslint-config-airbnb-base/rules/variables"; import prettierConfigPlugin from "eslint-config-prettier"; -import deprecationPlugin from "eslint-plugin-deprecation"; -import drizzlePlugin from "eslint-plugin-drizzle"; import commentsPlugin from "eslint-plugin-eslint-comments"; -import formatPlugin from "eslint-plugin-format"; import functionalPlugin from "eslint-plugin-functional"; -import importPlugin from "eslint-plugin-import"; import jestPlugin from "eslint-plugin-jest"; -import jestExtendedPlugin from "eslint-plugin-jest-extended"; -import jestFormattingPlugin from "eslint-plugin-jest-formatting"; -import jsoncPlugin from "eslint-plugin-jsonc"; import jsxA11yPlugin from "eslint-plugin-jsx-a11y"; -import nodePlugin from "eslint-plugin-n"; -import noBarrelFilesPlugin from "eslint-plugin-no-barrel-files"; import noSecretsPlugin from "eslint-plugin-no-secrets"; import promisePlugin from "eslint-plugin-promise"; import reactPlugin from "eslint-plugin-react"; import reactHooksPlugin from "eslint-plugin-react-hooks"; -import reactRefreshPlugin from "eslint-plugin-react-refresh"; import reactPluginConfigsRecommended from "eslint-plugin-react/configs/recommended"; import redundantUndefinedPlugin from "eslint-plugin-redundant-undefined"; -import sonarjsPlugin from "eslint-plugin-sonarjs"; import tailwindcssPlugin from "eslint-plugin-tailwindcss"; import tsdocPlugin from "eslint-plugin-tsdoc"; import unicornPlugin from "eslint-plugin-unicorn"; import writeGoodCommentsPlugin from "eslint-plugin-write-good-comments"; import xssPlugin from "eslint-plugin-xss"; -import jsoncParser from "jsonc-eslint-parser"; const compat = new FlatCompat(); @@ -109,98 +92,33 @@ export default antfu( ...airbnbStyleConfig.rules, ...airbnbNodeConfig.rules, ...airbnbES6Config.rules, - // https://eslint.style/packages/default#rules - "max-len": "off", - "@stylistic/max-len": [ - // https://eslint.style/rules/default/max-len - "off", - { - "code": 1000, - "ignoreComments": true, - "ignoreTrailingComments": true, - }, - ], - "@stylistic/max-statements-per-line": [ - // https://eslint.style/rules/default/max-statements-per-line - "off", - { "max": 1 }, - ], - "@stylistic/keyword-spacing": [ - // https://eslint.style/rules/default/keyword-spacing - "off", - { "before": true, "after": true }, - ], - "@stylistic/semi": "off", - "@stylistic/quotes": "off", - "@stylistic/indent": "off", - "@stylistic/quote-props": "off", - "@stylistic/operator-linebreak": "off", - "@stylistic/member-delimiter-style": "off", "@stylistic/arrow-parens": "off", "@stylistic/brace-style": "off", + "@stylistic/comma-dangle": "off", + "@stylistic/eol-last": "off", "@stylistic/indent-binary-ops": "off", + "@stylistic/indent": "off", "@stylistic/jsx-closing-tag-location": "off", "@stylistic/jsx-curly-newline": "off", + "@stylistic/jsx-indent-props": "off", "@stylistic/jsx-indent": "off", "@stylistic/jsx-one-expression-per-line": "off", "@stylistic/jsx-wrap-multilines": "off", + "@stylistic/keyword-spacing": ["off", { "before": true, "after": true }], + "@stylistic/max-statements-per-line": ["off", { "max": 1 }], + "@stylistic/member-delimiter-style": "off", "@stylistic/multiline-ternary": "off", + "@stylistic/no-multi-spaces": "off", + "@stylistic/no-multiple-empty-lines": "off", + "@stylistic/no-tabs": "off", + "@stylistic/no-trailing-spaces": "off", + "@stylistic/operator-linebreak": "off", + "@stylistic/padded-blocks": "off", + "@stylistic/quote-props": "off", + "@stylistic/quotes": "off", + "@stylistic/semi-spacing": "off", + "@stylistic/semi": "off", "@stylistic/spaced-comment": "off", - "@stylistic/eol-last": "off", - "max-lines-per-function": ["off", 437], - "max-nested-callbacks": ["off", 4], - "max-statements": ["off", 76], - "max-params": ["off", 5], - "complexity": ["off", 63], - "computed-property-spacing": [ - "off", - "never", - { "enforceForClassMembers": true }, - ], - "sort-imports": [ - "off", - { "ignoreCase": true, "ignoreDeclarationSort": false }, - ], - "space-before-function-paren": [ - "off", - { "anonymous": "always", "named": "never", "asyncArrow": "always" }, - ], - "unicorn/numeric-separators-style": [ - "off", - { "onlyIfContainsSeparator": true }, - ], - "jsdoc/require-jsdoc": [ - "off", - { - publicOnly: true, - require: { - FunctionDeclaration: true, - FunctionExpression: true, - ArrowFunctionExpression: true, - ClassDeclaration: true, - ClassExpression: true, - MethodDefinition: true, - }, - contexts: [ - "VariableDeclaration", - "TSTypeAliasDeclaration", - "TSPropertySignature", - ], - enableFixer: true, - }, - ], - "react/jsx-key": [ - "off", - { - checkFragmentShorthand: true, - checkKeyMustBeforeSpread: true, - warnOnDuplicates: true, - }, - ], - "no-multiple-empty-lines": [ - "off", - { "max": 1, "maxBOF": 0, "maxEOF": 1 }, - ], "antfu/consistent-list-newline": "off", "antfu/if-newline": "off", "antfu/top-level-function": "off", @@ -216,21 +134,14 @@ export default antfu( "comma-dangle": ["off", "only-multiline"], "comma-spacing": ["off", { "before": false, "after": true }], "comma-style": ["off", "last"], + "complexity": ["off", 63], "consistent-return": "off", - "style/quotes": "off", "curly": "off", - "style/jsx-indent-props": "off", - "@stylistic/jsx-indent-props": "off", "default-case-last": "off", "default-case": "off", - "@stylistic/no-trailing-spaces": "off", - "@stylistic/no-multiple-empty-lines": "off", "default-param-last": ["off"], "dot-location": ["off", "property"], "dot-notation": "off", - "style/semi": "off", - "style/comma-dangle": "off", - "@stylistic/comma-dangle": "off", "eol-last": ["off", "always"], "eqeqeq": ["off", "always"], "eslint-plugin-jsx-a11y/blob": "off", @@ -255,6 +166,7 @@ export default antfu( "jsdoc/check-access": "off", "jsdoc/check-alignment": "off", "jsdoc/check-indentation": "off", + "jsdoc/check-param-names": "off", "jsdoc/check-syntax": "off", "jsdoc/check-tag-names": "off", "jsdoc/no-blank-blocks": "off", @@ -280,6 +192,11 @@ export default antfu( "linebreak-style": "off", "lines-around-directive": "off", "lines-between-class-members": ["off", "always"], + "max-len": "off", + "max-lines-per-function": ["off", 437], + "max-nested-callbacks": ["off", 4], + "max-params": ["off", 5], + "max-statements": ["off", 76], "new-cap": "off", "new-parens": "off", "no-alert": "off", @@ -290,9 +207,11 @@ export default antfu( "no-confusing-arrow": "off", "no-console": "off", "no-constant-condition": "off", + "no-duplicate-selectors": "off", "no-else-return": "off", "no-eval": "off", "no-extra-semi": "off", + "no-irregular-whitespace": "warn", "no-lonely-if": "off", "no-multi-assign": "off", "no-multi-spaces": ["off", { "ignoreEOLComments": true }], @@ -329,6 +248,7 @@ export default antfu( "one-var": "off", "operator-assignment": "off", "operator-linebreak": "off", + "padded-blocks": "off", "perfectionist/sort-array-includes": "off", "perfectionist/sort-imports": "off", "perfectionist/sort-interfaces": "off", @@ -389,7 +309,7 @@ export default antfu( "rules/anchor-is-valid": "off", "semi-spacing": "off", "semi-style": ["off", "last"], - semi: "off", + "semi": "off", "sonarjs/cognitive-complexity": "off", "sonarjs/no-all-duplicated-branches": "off", "sonarjs/no-duplicate-string": "off", @@ -402,20 +322,28 @@ export default antfu( "spaced-comment": "off", "style/arrow-parens": "off", "style/brace-style": "off", + "style/comma-dangle": "off", "style/eol-last": "off", "style/indent-binary-ops": "off", "style/indent": "off", "style/jsx-closing-tag-location": "off", "style/jsx-curly-newline": "off", + "style/jsx-indent-props": "off", "style/jsx-indent": "off", "style/jsx-one-expression-per-line": "off", "style/jsx-wrap-multilines": "off", "style/member-delimiter-style": "off", "style/multiline-ternary": "off", + "style/no-multi-spaces": "off", "style/no-multiple-empty-lines": "off", + "style/no-tabs": "off", "style/no-trailing-spaces": "off", "style/operator-linebreak": "off", + "style/padded-blocks": "off", "style/quote-props": "off", + "style/quotes": "off", + "style/semi-spacing": "off", + "style/semi": "off", "style/spaced-comment": "off", "switch-colon-spacing": "off", "tailwindcss/no-custom-classname": "off", @@ -464,6 +392,63 @@ export default antfu( "xss/no-mixed-html": "off", "yaml/block-sequence": "off", "yaml/plain-scalar": "off", + "@stylistic/max-len": [ + "off", + { + "code": 1000, + "ignoreComments": true, + "ignoreTrailingComments": true, + }, + ], + "computed-property-spacing": [ + "off", + "never", + { "enforceForClassMembers": true }, + ], + "sort-imports": [ + "off", + { "ignoreCase": true, "ignoreDeclarationSort": false }, + ], + "space-before-function-paren": [ + "off", + { "anonymous": "always", "named": "never", "asyncArrow": "always" }, + ], + "unicorn/numeric-separators-style": [ + "off", + { "onlyIfContainsSeparator": true }, + ], + "jsdoc/require-jsdoc": [ + "off", + { + publicOnly: true, + require: { + FunctionDeclaration: true, + FunctionExpression: true, + ArrowFunctionExpression: true, + ClassDeclaration: true, + ClassExpression: true, + MethodDefinition: true, + }, + contexts: [ + "VariableDeclaration", + "TSTypeAliasDeclaration", + "TSPropertySignature", + ], + enableFixer: true, + }, + ], + "react/jsx-key": [ + "off", + { + checkFragmentShorthand: true, + checkKeyMustBeforeSpread: true, + warnOnDuplicates: true, + }, + ], + "no-multiple-empty-lines": [ + "off", + { "max": 1, "maxBOF": 0, "maxEOF": 1 }, + ], }, }, ...compat.config({ @@ -486,16 +471,6 @@ export default antfu( "plugin:sonarjs/recommended", ], rules: { - "prefer-arrow-functions/prefer-arrow-functions": [ - "off", - { - "allowNamedFunctions": false, - "classPropertiesAllowed": false, - "disallowPrototype": false, - "returnStyle": "unchanged", - "singleReturnOnly": false, - }, - ], "@limegrass/import-alias/import-alias": "off", "@tanstack/query/exhaustive-deps": "off", "@tanstack/query/no-rest-destructuring": "off", @@ -506,6 +481,16 @@ export default antfu( "no-barrel-files/no-barrel-files": "off", "no-secrets/no-secrets": "off", "react-refresh/only-export-components": "off", + "prefer-arrow-functions/prefer-arrow-functions": [ + "off", + { + "allowNamedFunctions": false, + "classPropertiesAllowed": false, + "disallowPrototype": false, + "returnStyle": "unchanged", + "singleReturnOnly": false, + }, + ], }, }), { @@ -515,27 +500,13 @@ export default antfu( "eslint-plugin-jest": jestPlugin, }, rules: { - "ts/space-before-function-paren": [ - "off", - { - "asyncArrow": "always", - "anonymous": "always", - "named": "never", - }, - ], - "ts/prefer-literal-enum-member": [ - "off", - { "allowBitwiseExpressions": true }, - ], - // ========= dup - "jsx-a11y/no-autofocus": "off", "jsx-a11y/heading-has-content": "off", + "jsx-a11y/no-autofocus": "off", "sonarjs/cognitive-complexity": "off", "sonarjs/no-all-duplicated-branches": "off", "sonarjs/no-duplicate-string": "off", "sonarjs/no-nested-template-literals": "off", "sonarjs/prefer-immediate-return": "off", - // ========= dup "test/consistent-test-it": "off", "ts/array-type": ["off", { "default": "array" }], "ts/ban-ts-comment": "off", @@ -616,6 +587,18 @@ export default antfu( "ts/type-annotation-spacing": ["off"], "ts/unified-signatures": ["off"], "tsdoc/syntax": "off", + "ts/space-before-function-paren": [ + "off", + { + "asyncArrow": "always", + "anonymous": "always", + "named": "never", + }, + ], + "ts/prefer-literal-enum-member": [ + "off", + { "allowBitwiseExpressions": true }, + ], }, }, ); diff --git a/package.json b/package.json index ccf32451..144dace7 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "@mdx-js/react": "^3.0.0", "@neondatabase/serverless": "^0.7.2", "@next/mdx": "^14.0.4", - "@normy/react-query": "^0.13.0", + "@normy/react-query": "^0.13.1", "@planetscale/database": "^1.13.0", "@preact/signals-core": "^1.5.1", "@preact/signals-react": "^2.0.0", @@ -135,9 +135,9 @@ "@stripe/react-stripe-js": "^2.4.0", "@stripe/stripe-js": "^2.3.0", "@t3-oss/env-nextjs": "^0.7.3", - "@tanstack/react-query": "^5.17.9", - "@tanstack/react-query-devtools": "^5.17.9", - "@tanstack/react-query-next-experimental": "^5.17.9", + "@tanstack/react-query": "^5.17.10", + "@tanstack/react-query-devtools": "^5.17.10", + "@tanstack/react-query-next-experimental": "^5.17.10", "@tanstack/react-table": "^8.11.6", "@trpc/client": "11.0.0-next-beta.193", "@trpc/react-query": "11.0.0-next-beta.193", @@ -178,6 +178,7 @@ "cropperjs": "^1.6.1", "dat.gui": "^0.7.9", "dayjs": "^1.11.10", + "deepmerge": "^4.3.1", "drizzle-orm": "^0.29.3", "drizzle-zod": "^0.5.1", "embla-carousel-react": "8.0.0-rc19", @@ -219,7 +220,7 @@ "react-hot-toast": "^2.4.1", "react-icons": "^5.0.1", "react-lag-radar": "^1.0.0", - "react-medium-image-zoom": "^5.1.9", + "react-medium-image-zoom": "^5.1.10", "react-wrap-balancer": "^1.1.0", "reflect-metadata": "^0.2.1", "remark-gfm": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d04f1a06..3dcc4cb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,8 +113,8 @@ dependencies: specifier: ^14.0.4 version: 14.0.4(@mdx-js/loader@3.0.0)(@mdx-js/react@3.0.0) '@normy/react-query': - specifier: ^0.13.0 - version: 0.13.0(@tanstack/react-query@5.17.9) + specifier: ^0.13.1 + version: 0.13.1(@tanstack/react-query@5.17.10) '@planetscale/database': specifier: ^1.13.0 version: 1.13.0 @@ -209,14 +209,14 @@ dependencies: specifier: ^0.7.3 version: 0.7.3(typescript@5.3.3)(zod@3.22.4) '@tanstack/react-query': - specifier: ^5.17.9 - version: 5.17.9(react@18.2.0) + specifier: ^5.17.10 + version: 5.17.10(react@18.2.0) '@tanstack/react-query-devtools': - specifier: ^5.17.9 - version: 5.17.9(@tanstack/react-query@5.17.9)(react@18.2.0) + specifier: ^5.17.10 + version: 5.17.10(@tanstack/react-query@5.17.10)(react@18.2.0) '@tanstack/react-query-next-experimental': - specifier: ^5.17.9 - version: 5.17.9(@tanstack/react-query@5.17.9)(next@14.0.4)(react@18.2.0) + specifier: ^5.17.10 + version: 5.17.10(@tanstack/react-query@5.17.10)(next@14.0.4)(react@18.2.0) '@tanstack/react-table': specifier: ^8.11.6 version: 8.11.6(react-dom@18.2.0)(react@18.2.0) @@ -225,7 +225,7 @@ dependencies: version: 11.0.0-next-beta.193 '@trpc/react-query': specifier: 11.0.0-next-beta.193 - version: 11.0.0-next-beta.193(@tanstack/react-query@5.17.9)(@trpc/client@11.0.0-next-beta.193)(react-dom@18.2.0)(react@18.2.0) + version: 11.0.0-next-beta.193(@tanstack/react-query@5.17.10)(@trpc/client@11.0.0-next-beta.193)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': specifier: 11.0.0-next-beta.193 version: 11.0.0-next-beta.193 @@ -337,6 +337,9 @@ dependencies: dayjs: specifier: ^1.11.10 version: 1.11.10 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 drizzle-orm: specifier: ^0.29.3 version: 0.29.3(@neondatabase/serverless@0.7.2)(@opentelemetry/api@1.7.0)(@planetscale/database@1.13.0)(@types/pg@8.10.9)(@types/react@18.2.47)(mysql2@3.7.0)(pg@8.11.3)(postgres@3.4.3)(react@18.2.0) @@ -461,8 +464,8 @@ dependencies: specifier: ^1.0.0 version: 1.0.0(react@18.2.0) react-medium-image-zoom: - specifier: ^5.1.9 - version: 5.1.9(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.1.10 + version: 5.1.10(react-dom@18.2.0)(react@18.2.0) react-wrap-balancer: specifier: ^1.1.0 version: 1.1.0(react@18.2.0) @@ -542,7 +545,7 @@ dependencies: devDependencies: '@antfu/eslint-config': specifier: ^2.6.2 - version: 2.6.2(@vue/compiler-sfc@3.4.11)(eslint-import-resolver-typescript@3.6.1)(eslint-plugin-format@0.1.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react-refresh@0.4.5)(eslint-plugin-react@7.33.2)(eslint-ts-patch@8.56.0-0)(typescript@5.3.3) + version: 2.6.2(@vue/compiler-sfc@3.4.13)(eslint-import-resolver-typescript@3.6.1)(eslint-plugin-format@0.1.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react-refresh@0.4.5)(eslint-plugin-react@7.33.2)(eslint-ts-patch@8.56.0-0)(typescript@5.3.3) '@ava/typescript': specifier: ^4.1.0 version: 4.1.0 @@ -572,7 +575,7 @@ devDependencies: version: 3.2.0(graphql@16.8.1) '@ianvs/prettier-plugin-sort-imports': specifier: ^4.1.1 - version: 4.1.1(@vue/compiler-sfc@3.4.11)(prettier@3.2.1) + version: 4.1.1(@vue/compiler-sfc@3.4.13)(prettier@3.2.1) '@limegrass/eslint-plugin-import-alias': specifier: ^1.1.0 version: 1.1.0(eslint-ts-patch@8.56.0-0) @@ -868,7 +871,7 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.21 - /@antfu/eslint-config@2.6.2(@vue/compiler-sfc@3.4.11)(eslint-import-resolver-typescript@3.6.1)(eslint-plugin-format@0.1.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react-refresh@0.4.5)(eslint-plugin-react@7.33.2)(eslint-ts-patch@8.56.0-0)(typescript@5.3.3): + /@antfu/eslint-config@2.6.2(@vue/compiler-sfc@3.4.13)(eslint-import-resolver-typescript@3.6.1)(eslint-plugin-format@0.1.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react-refresh@0.4.5)(eslint-plugin-react@7.33.2)(eslint-ts-patch@8.56.0-0)(typescript@5.3.3): resolution: {integrity: sha512-iHJtFrJLE0gc+oQGxe8I2vpXwhn2wAbz2kqunSPhiOt39yV6yuoE+NJt5nstzy0INKfjSL2teQKlr4g7E2bVhA==} hasBin: true peerDependencies: @@ -924,9 +927,9 @@ packages: eslint-plugin-unicorn: 50.0.1(eslint-ts-patch@8.56.0-0) eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.18.1)(eslint-ts-patch@8.56.0-0) eslint-plugin-vitest: 0.3.20(@typescript-eslint/eslint-plugin@6.18.1)(eslint-ts-patch@8.56.0-0)(typescript@5.3.3) - eslint-plugin-vue: 9.20.0(eslint-ts-patch@8.56.0-0) + eslint-plugin-vue: 9.20.1(eslint-ts-patch@8.56.0-0) eslint-plugin-yml: 1.11.0(eslint-ts-patch@8.56.0-0) - eslint-processor-vue-blocks: 0.1.1(@vue/compiler-sfc@3.4.11)(eslint-ts-patch@8.56.0-0) + eslint-processor-vue-blocks: 0.1.1(@vue/compiler-sfc@3.4.13)(eslint-ts-patch@8.56.0-0) globals: 13.24.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 @@ -3987,7 +3990,7 @@ packages: /@humanwhocodes/object-schema@2.0.2: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - /@ianvs/prettier-plugin-sort-imports@4.1.1(@vue/compiler-sfc@3.4.11)(prettier@3.2.1): + /@ianvs/prettier-plugin-sort-imports@4.1.1(@vue/compiler-sfc@3.4.13)(prettier@3.2.1): resolution: {integrity: sha512-kJhXq63ngpTQ2dxgf5GasbPJWsJA3LgoOdd7WGhpUSzLgLgI4IsIzYkbJf9kmpOHe7Vdm/o3PcRA3jmizXUuAQ==} peerDependencies: '@vue/compiler-sfc': '>=3.0.0' @@ -4001,7 +4004,7 @@ packages: '@babel/parser': 7.23.6 '@babel/traverse': 7.23.7 '@babel/types': 7.23.6 - '@vue/compiler-sfc': 3.4.11 + '@vue/compiler-sfc': 3.4.13 prettier: 3.2.1 semver: 7.5.4 transitivePeerDependencies: @@ -4756,20 +4759,20 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.16.0 - /@normy/core@0.9.0: - resolution: {integrity: sha512-aw4igbkL9eMwegRDvQE2QdqNKTZnFbf7Nz1PgaTwt/SVWe/dKZGuqiJFLeHfcHGDcI7vGyI8ru/BPpnIcOiHPw==} + /@normy/core@0.9.1: + resolution: {integrity: sha512-Mi3+aKFq1ykpgyP/iSz/nDZ3TaTwwM3sS5Q++GIDku3/iqCYJPC6402/D2ZT8KfFqn+nYL+N87Z7kNwTPKGEOw==} dependencies: '@babel/runtime': 7.23.8 deepmerge: 4.0.0 dev: false - /@normy/react-query@0.13.0(@tanstack/react-query@5.17.9): - resolution: {integrity: sha512-CVzEWA2FdQni0XXD2ZR5UjmQ59HQnH69Mf54nTYc9woVuExtHLJCu+Rae1ipDFOOqu/4KjQAG7v+74trg7sxKA==} + /@normy/react-query@0.13.1(@tanstack/react-query@5.17.10): + resolution: {integrity: sha512-QYXY5jeKWtaqrorq3UNbSh6hvuoQKHrKoG9bPSl7yh+wGb6svFmVRlgmxqGwwKZ2vlma8vqJeyMVL4K5LO3QJw==} peerDependencies: '@tanstack/react-query': '>=5.4.3' dependencies: - '@normy/core': 0.9.0 - '@tanstack/react-query': 5.17.9(react@18.2.0) + '@normy/core': 0.9.1 + '@tanstack/react-query': 5.17.10(react@18.2.0) dev: false /@npmcli/git@5.0.4: @@ -8650,43 +8653,43 @@ packages: - typescript dev: true - /@tanstack/query-core@5.17.9: - resolution: {integrity: sha512-8xcvpWIPaRMDNLMvG9ugcUJMgFK316ZsqkPPbsI+TMZsb10N9jk0B6XgPk4/kgWC2ziHyWR7n7wUhxmD0pChQw==} + /@tanstack/query-core@5.17.10: + resolution: {integrity: sha512-bJ2oQUDBftvHcEkLS3gyzzShSeZpJyzNNRu8oHK13iNdsofyaDXtNO/c1Zy/PZYVX+PhqOXwoT42gMiEMRSSfQ==} dev: false /@tanstack/query-devtools@5.17.7: resolution: {integrity: sha512-TfgvOqza5K7Sk6slxqkRIvXlEJoUoPSsGGwpuYSrpqgSwLSSvPPpZhq7hv7hcY5IvRoTNGoq6+MT01C/jILqoQ==} dev: false - /@tanstack/react-query-devtools@5.17.9(@tanstack/react-query@5.17.9)(react@18.2.0): - resolution: {integrity: sha512-1viWP/jlO0LaeCdtTFqtF1k2RfM3KVpvwVffWv+PMNkS2u4s8YGUM17r3p82udbF9BY1mE7aHqQ3MM1errF5lQ==} + /@tanstack/react-query-devtools@5.17.10(@tanstack/react-query@5.17.10)(react@18.2.0): + resolution: {integrity: sha512-bdH1eOTvXZj3nvdSTYMyAKSoKnoYtyV+YTuP6japifbtWlqEZvHWJ8KbazAt7rLVfyn/5OhtiHPelTU8DYWgrA==} peerDependencies: - '@tanstack/react-query': ^5.17.9 + '@tanstack/react-query': ^5.17.10 react: ^18.0.0 dependencies: '@tanstack/query-devtools': 5.17.7 - '@tanstack/react-query': 5.17.9(react@18.2.0) + '@tanstack/react-query': 5.17.10(react@18.2.0) react: 18.2.0 dev: false - /@tanstack/react-query-next-experimental@5.17.9(@tanstack/react-query@5.17.9)(next@14.0.4)(react@18.2.0): - resolution: {integrity: sha512-UN50HWPtDtaEjzoHKjFM7FvIQhRb61oXNbO+5GTEsB2BOaU5+Fb6f5gC1lMF4mFbAqJu6zlYC2IK/f+AFOz/Ow==} + /@tanstack/react-query-next-experimental@5.17.10(@tanstack/react-query@5.17.10)(next@14.0.4)(react@18.2.0): + resolution: {integrity: sha512-uKoDfYLWLaxYZ7cl4a/Iy1nmvovMz5B+Gssn6t+ItelOpLSw1/P57yY3/scjFeotbA9mNxhrw1w7B9QxvCOjqQ==} peerDependencies: - '@tanstack/react-query': ^5.17.9 + '@tanstack/react-query': ^5.17.10 next: 14.0.4 react: ^18.0.0 dependencies: - '@tanstack/react-query': 5.17.9(react@18.2.0) + '@tanstack/react-query': 5.17.10(react@18.2.0) next: 14.0.4(@babel/core@7.23.7)(@opentelemetry/api@1.7.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@tanstack/react-query@5.17.9(react@18.2.0): - resolution: {integrity: sha512-M5E9gwUq1Stby/pdlYjBlL24euIVuGbWKIFCbtnQxSdXI4PgzjTSdXdV3QE6fc+itF+TUvX/JPTKIwq8yuBXcg==} + /@tanstack/react-query@5.17.10(react@18.2.0): + resolution: {integrity: sha512-TNmJN7LkSLzmv01Jen3JbcvhXZyRhc/ETJNjssmmlyMB8IoNvicfgvDRX2gX3q1FTONq+mfsmWintwI+ejmEUw==} peerDependencies: react: ^18.0.0 dependencies: - '@tanstack/query-core': 5.17.9 + '@tanstack/query-core': 5.17.10 react: 18.2.0 dev: false @@ -8794,7 +8797,7 @@ packages: resolution: {integrity: sha512-oF/Tg6ue12v8EjtbLEjiuLddbFovdpwK1hGPgZUesX1gtRiuWoJugpo4Xn2L1ESFhn1MVCZdAgXLj3qoNpXxIg==} dev: false - /@trpc/react-query@11.0.0-next-beta.193(@tanstack/react-query@5.17.9)(@trpc/client@11.0.0-next-beta.193)(react-dom@18.2.0)(react@18.2.0): + /@trpc/react-query@11.0.0-next-beta.193(@tanstack/react-query@5.17.10)(@trpc/client@11.0.0-next-beta.193)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cC9IB8LiViqZeHGUKnmYhi5nwpUd5wC3efidAUyX2jCQdwPiThZQJWcmtXfPmb9qXvERq6E40nu7cHQXlMDzrQ==} peerDependencies: '@tanstack/react-query': ^5.0.0 @@ -8802,7 +8805,7 @@ packages: react: '>=18.2.0' react-dom: '>=18.2.0' dependencies: - '@tanstack/react-query': 5.17.9(react@18.2.0) + '@tanstack/react-query': 5.17.10(react@18.2.0) '@trpc/client': 11.0.0-next-beta.193 '@trpc/core': 11.0.0-next-beta.193 react: 18.2.0 @@ -10430,46 +10433,46 @@ packages: - supports-color dev: true - /@vue/compiler-core@3.4.11: - resolution: {integrity: sha512-xFD+p14L4J0DkzHMdgLiQBU5g861fuOTzag30GsfPXBpghLZOvmd22lKiBMTRRpQRpp7qxPnBlFMoeiGMM4MBg==} + /@vue/compiler-core@3.4.13: + resolution: {integrity: sha512-zGUdmB3j3Irn9z51GXLJ5s0EAHxmsm5/eXl0y6MBaajMeOAaiT4+zaDoxui4Ets98dwIRr8BBaqXXHtHSfm+KA==} dependencies: '@babel/parser': 7.23.6 - '@vue/shared': 3.4.11 + '@vue/shared': 3.4.13 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: true - /@vue/compiler-dom@3.4.11: - resolution: {integrity: sha512-cRVLROlY7D72WK2xS91L126Dd6xHNTWDWPUBRh1Syk7+TahCk8Eown1/fSi+VX9c76sMMqEZROQSbwV0HSJnhg==} + /@vue/compiler-dom@3.4.13: + resolution: {integrity: sha512-XSNbpr5Rs3kCfVAmBqMu/HDwOS+RL6y28ZZjDlnDUuf146pRWt2sQkwhsOYc9uu2lxjjJy2NcyOkK7MBLVEc7w==} dependencies: - '@vue/compiler-core': 3.4.11 - '@vue/shared': 3.4.11 + '@vue/compiler-core': 3.4.13 + '@vue/shared': 3.4.13 dev: true - /@vue/compiler-sfc@3.4.11: - resolution: {integrity: sha512-1y5xHAD4a/AhK5+dgsZwFg145J6/rl1c8ILC7Gokca+ql51tTpduz/njCHeNmU15XiE7O62LjJFNOtSZ9vxKOQ==} + /@vue/compiler-sfc@3.4.13: + resolution: {integrity: sha512-SkpmQN8xIFBd5onT413DFSDdjxULJf6jmJg/t3w/DZ9I8ZzyNlLIBLO0qFLewVHyHCiAgpPZlWqSRZXYrawk3Q==} dependencies: '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.4.11 - '@vue/compiler-dom': 3.4.11 - '@vue/compiler-ssr': 3.4.11 - '@vue/shared': 3.4.11 + '@vue/compiler-core': 3.4.13 + '@vue/compiler-dom': 3.4.13 + '@vue/compiler-ssr': 3.4.13 + '@vue/shared': 3.4.13 estree-walker: 2.0.2 magic-string: 0.30.5 postcss: 8.4.33 source-map-js: 1.0.2 dev: true - /@vue/compiler-ssr@3.4.11: - resolution: {integrity: sha512-cP9Z2ArRgciYmNraqE0gQkuYInfdn66+LE4pR+16uyBiQeswcU4kEzGA+mF1MdhqYXuENpyGQsTkZapq4cy9YA==} + /@vue/compiler-ssr@3.4.13: + resolution: {integrity: sha512-rwnw9SVBgD6eGKh8UucnwztieQo/R3RQrEGpE0b0cxb2xxvJeLs/fe7DoYlhEfaSyzM/qD5odkK87hl3G3oW+A==} dependencies: - '@vue/compiler-dom': 3.4.11 - '@vue/shared': 3.4.11 + '@vue/compiler-dom': 3.4.13 + '@vue/shared': 3.4.13 dev: true - /@vue/shared@3.4.11: - resolution: {integrity: sha512-BtC+vE8kHf/jZoyJnTFd0PmY8NejyUeUkshXm8LriHs8KmQUmcZXIbrifjA3WDmvzg7C8D6gBSvdl49pOfU2lQ==} + /@vue/shared@3.4.13: + resolution: {integrity: sha512-56crFKLPpzk85WXX1L1c0QzPOuoapWlPVys8eMG8kkRmqdMjWUqK8KpFdE2d7BQA4CEbXwyyHPq6MpFr8H9rcg==} dev: true /@webassemblyjs/ast@1.11.6: @@ -13128,7 +13131,7 @@ packages: dependencies: '@babel/parser': 7.23.6 '@babel/traverse': 7.23.7 - '@vue/compiler-sfc': 3.4.11 + '@vue/compiler-sfc': 3.4.13 callsite: 1.0.0 camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -15306,8 +15309,8 @@ packages: - typescript dev: true - /eslint-plugin-vue@9.20.0(eslint-ts-patch@8.56.0-0): - resolution: {integrity: sha512-9/DV5CM7ItfgWmXjL6j3zyDtVTrslYdnEm+rnYNajdElx17b3erxi/Wc6FY7t3BQ6dgo0t/UBpgiWCOKtJyN8Q==} + /eslint-plugin-vue@9.20.1(eslint-ts-patch@8.56.0-0): + resolution: {integrity: sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 @@ -15355,13 +15358,13 @@ packages: - supports-color dev: true - /eslint-processor-vue-blocks@0.1.1(@vue/compiler-sfc@3.4.11)(eslint-ts-patch@8.56.0-0): + /eslint-processor-vue-blocks@0.1.1(@vue/compiler-sfc@3.4.13)(eslint-ts-patch@8.56.0-0): resolution: {integrity: sha512-9+dU5lU881log570oBwpelaJmOfOzSniben7IWEDRYQPPWwlvaV7NhOtsTuUWDqpYT+dtKKWPsgz4OkOi+aZnA==} peerDependencies: '@vue/compiler-sfc': ^3.3.0 eslint: ^8.50.0 dependencies: - '@vue/compiler-sfc': 3.4.11 + '@vue/compiler-sfc': 3.4.13 eslint: /eslint-ts-patch@8.56.0-0 dev: true @@ -16622,8 +16625,8 @@ packages: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} dev: true - /goober@2.1.13(csstype@3.1.3): - resolution: {integrity: sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==} + /goober@2.1.14(csstype@3.1.3): + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} peerDependencies: csstype: ^3.0.10 dependencies: @@ -23140,7 +23143,7 @@ packages: prettier-plugin-twig-melody: optional: true dependencies: - '@ianvs/prettier-plugin-sort-imports': 4.1.1(@vue/compiler-sfc@3.4.11)(prettier@3.2.1) + '@ianvs/prettier-plugin-sort-imports': 4.1.1(@vue/compiler-sfc@3.4.13)(prettier@3.2.1) prettier: 3.2.1 dev: true @@ -23650,7 +23653,7 @@ packages: react: '>=16' react-dom: '>=16' dependencies: - goober: 2.1.13(csstype@3.1.3) + goober: 2.1.14(csstype@3.1.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -23739,8 +23742,8 @@ packages: - supports-color dev: false - /react-medium-image-zoom@5.1.9(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VOlqStMbztbHftQvl8wwD2oQvcNQjA9dUtNtIxZmwnP7BIcWfsDS5jRH7vJ/R94EtweiuCCAMnoTh7w5RkkJeg==} + /react-medium-image-zoom@5.1.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sgadFY5yH0sEz5lVs9NubiwbVrtUeKnH9YdzXYv+cblrP8WXj2TSyT6J3sPw0pM5dGKbpjXjePye+42yWV4OSg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 diff --git a/src/app/[locale]/(main)/(checkout)/cart/page.tsx b/src/app/[locale]/(main)/(checkout)/cart/page.tsx index 74919770..49052a92 100644 --- a/src/app/[locale]/(main)/(checkout)/cart/page.tsx +++ b/src/app/[locale]/(main)/(checkout)/cart/page.tsx @@ -1,9 +1,7 @@ import type { Metadata } from "next"; import { cn } from "~/utils"; -import { and, eq } from "drizzle-orm"; +import { getTranslations } from "next-intl/server"; -import { db } from "~/data/db"; -import { products } from "~/data/db/schema"; import { env } from "~/env.mjs"; import { Icons } from "~/islands/icons"; import { CheckoutCard } from "~/islands/modules/cards/checkout-card"; @@ -14,8 +12,9 @@ import { } from "~/islands/navigation/page-header"; import { buttonVariants } from "~/islands/primitives/button"; import { Shell } from "~/islands/wrappers/shell-variants"; -import { Link } from "~/navigation"; -import { getUniqueStoreIds } from "~/server/actions/cart"; +import { Link, redirect } from "~/navigation"; +import { getCartAction, getUniqueStoreIds } from "~/server/actions/cart"; +import { getCartId } from "~/server/cart"; export const metadata: Metadata = { metadataBase: new URL(env.NEXT_PUBLIC_APP_URL ?? "http://localhost:3000"), @@ -24,9 +23,57 @@ export const metadata: Metadata = { }; export default async function CartPage() { - // console.log("⏳ awaiting getUniqueStoreIds for uniqueStoreIds..."); + const t = await getTranslations(); + + // getUniqueStoreIds returns an array of store IDs const uniqueStoreIds = await getUniqueStoreIds(); - // console.log("...uniqueStoreIds:", uniqueStoreIds); + + // Check for a valid cartId + const cartId = await getCartId(); + if (!cartId || Number.isNaN(Number(cartId))) { + console.error("cartId is invalid or missed"); + return redirect("/"); + } + + // Map over uniqueStoreIds and fetch + // the cart line items for each store + const storeCarts = await Promise.all( + uniqueStoreIds.map(async (storeId) => { + const cartLineItems = await getCartAction(storeId); + + // Calculations for totalQuantity and + // totalPrice for each store's cart + let totalQuantity = 0; + + try { + totalQuantity = cartLineItems.reduce( + (acc, item) => acc + (item.quantity ?? 0), + 0, + ); + } catch (error) { + if (error instanceof Error) { + console.error("❌ Error calculating total quantity:", error.message); + totalQuantity = 0; // Set default variable value in case of an error + } else { + // If for any reason something else was + // thrown that wasn't an Error, handle it + console.error("❌ An unexpected error occurred:", error); + } + } + + // Return an object that contains + // the storeId and its cart data + return { + storeId, + totalQuantity, + }; + }), + ); + + // Filter out stores with no items in cart + const nonEmptyStoreCarts = storeCarts.filter( + (storeCart) => storeCart.totalQuantity > 0, + ); return ( @@ -34,14 +81,13 @@ export default async function CartPage() { aria-labelledby="cart-page-header-heading" id="cart-page-header" > - Checkout + {t("checkout.Title")} - Checkout with your cart items + {t("checkout.Description")} - - {uniqueStoreIds.length > 0 ? - uniqueStoreIds.map((storeId) => ( + {nonEmptyStoreCarts.length > 0 ? + nonEmptyStoreCarts.map(({ storeId }) => ( )) : } diff --git a/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/page.tsx b/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/page.tsx index b84401a8..5f8716e3 100644 --- a/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/page.tsx +++ b/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/page.tsx @@ -3,6 +3,7 @@ import { notFound } from "next/navigation"; import { ArrowLeftIcon } from "@radix-ui/react-icons"; import { cn, formatPrice } from "~/utils"; import { eq } from "drizzle-orm"; +import { getTranslations } from "next-intl/server"; import { siteConfig } from "~/app"; import { @@ -39,6 +40,8 @@ interface CheckoutPageProperties { } export default async function CheckoutPage({ params }: CheckoutPageProperties) { + const t = await getTranslations(); + const appName = siteConfig.name; const storeId = Number(params.storeId); @@ -62,7 +65,6 @@ export default async function CheckoutPage({ params }: CheckoutPageProperties) { storeId, }); - // console.log("CheckoutPage's await getCartAction"); const cartLineItems = await getCartAction(storeId); const paymentIntent = createPaymentIntentAction({ @@ -73,8 +75,8 @@ export default async function CheckoutPage({ params }: CheckoutPageProperties) { let total = 0; let totalQuantity = 0; - // Calculation of total price try { + // Calculation of total price total = cartLineItems.reduce( (total, item) => total + (item.quantity ?? 0) * Number(item.price ?? 0), 0, @@ -119,14 +121,13 @@ export default async function CheckoutPage({ params }: CheckoutPageProperties) { >
- Store is not connected to Stripe + {t("checkout.notConnectedHeading")}
- Store owner needs to connect their store to Stripe to accept - payments + {t("checkout.notConnectedDescription")}
- Back to cart + {t("checkout.backToCart")}
@@ -147,7 +148,7 @@ export default async function CheckoutPage({ params }: CheckoutPageProperties) {
@@ -159,13 +160,13 @@ export default async function CheckoutPage({ params }: CheckoutPageProperties) { {appName}
- Back + {t("checkout.backToCartSingle")}
@@ -185,11 +186,10 @@ export default async function CheckoutPage({ params }: CheckoutPageProperties) {
- {env.DEV_DEMO_NOTES === "true" && - "Test data can be used: 4242424242424242 | 12/34 | 567"} + {env.DEV_DEMO_NOTES === "true" && t("checkout.Demo")}
- Pay {store.name} + {t("checkout.Pay")} {store.name}
{formatPrice(total)}
diff --git a/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/success/loading.tsx b/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/success/loading.tsx index 3c558a1d..1a15ab39 100644 --- a/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/success/loading.tsx +++ b/src/app/[locale]/(main)/(checkout)/checkout/[storeId]/success/loading.tsx @@ -22,7 +22,6 @@ export default function OrderSuccessLoading() {
{Array.from({ length: 4 }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey:
diff --git a/src/app/[locale]/(store)/categories/[category]/[subcategory]/page.tsx b/src/app/[locale]/(store)/categories/[category]/[subcategory]/page.tsx index bbeb5a1b..8d0a6cbd 100644 --- a/src/app/[locale]/(store)/categories/[category]/[subcategory]/page.tsx +++ b/src/app/[locale]/(store)/categories/[category]/[subcategory]/page.tsx @@ -12,7 +12,6 @@ import { titleCase } from "string-ts"; import { type Product } from "~/data/db/schema"; import { env } from "~/env.mjs"; -import { IntlMessage } from "~/islands/message"; import { PageHeader, PageHeaderDescription, diff --git a/src/app/[locale]/(store)/custom/clothing/page.tsx b/src/app/[locale]/(store)/custom/clothing/page.tsx index 8dd7560f..e9261a5d 100644 --- a/src/app/[locale]/(store)/custom/clothing/page.tsx +++ b/src/app/[locale]/(store)/custom/clothing/page.tsx @@ -4,7 +4,6 @@ import { cn } from "~/utils"; import { getTranslations } from "next-intl/server"; import { fullURL } from "~/data/meta/builder"; -import { env } from "~/env.mjs"; import { PageHeader, PageHeaderDescription, @@ -51,10 +50,7 @@ export default async function CustomClothesPage({ const pageCount = Math.ceil(productsTransaction.count / limit); - // Get cart items - // console.log("⏳ awaiting getCartId for CustomClothesPage..."); const cartId = await getCartId(); - // console.log("get custom clothing's `cartId`:", cartId); const cartItems = await getCartItemsAction({ cartId: Number(cartId) }); return ( diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx index ae1de300..69741917 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/page.tsx @@ -5,6 +5,7 @@ import { ArrowRight, Download, ShoppingCart, Store } from "lucide-react"; import { useTranslations } from "next-intl"; +import { getTranslations } from "next-intl/server"; import { Balancer } from "react-wrap-balancer"; import { REPOSITORY_URL, siteConfig } from "~/app"; @@ -21,7 +22,13 @@ import { Link as NavLink } from "~/navigation"; import { Features, GithubStarsPlugin } from "~/plugins/islands/github/stars"; import { productCategories } from "~/server/config/products"; -export const metadata = seo({ title: `Home – ${siteConfig.name}` }); +export async function generateMetadata({ params }) { + const t = await getTranslations(); + const metadata = seo({ + title: `${t("metadata.title.home")} – ${siteConfig.name}`, + }); + return metadata; +} export default function HomePage() { // useTranslations works both on the server and client @@ -57,11 +64,11 @@ export default function HomePage() { variant="secondary" > - Download Starter + {t("landing.main-cta")} : - Buy Now + {t("landing.buy-now")} } @@ -72,7 +79,9 @@ export default function HomePage() { variant="outline" > - {env.DEV_DEMO_NOTES === "true" ? "Launch Demo" : "Sell Now"} + {env.DEV_DEMO_NOTES === "true" ? + `${t("demo.launch")}` + : `${t("landing.sell-now")}`}
@@ -87,7 +96,7 @@ export default function HomePage() {
{productCategories.map((category) => ( @@ -109,10 +118,10 @@ export default function HomePage() { id="create-a-store-banner" >
- Do you want to sell your products? + {t("landing.footer-cta")}
- Get Started + {t("landing.get-started-btn")} diff --git a/src/core/stripe/actions.ts b/src/core/stripe/actions.ts index 8a8abb8a..4cdcce73 100644 --- a/src/core/stripe/actions.ts +++ b/src/core/stripe/actions.ts @@ -48,7 +48,6 @@ export async function getSubscriptionPlanAction( .select() .from(users) .where(eq(users.id, userId)) - // .where(eq(users.id, session.user.id)) .then((res: User[]) => res[0] ?? null); userPrivateMetadata = userPrivateMetadataSchema.parse(user); @@ -335,9 +334,7 @@ export async function createCheckoutSessionAction( return { error: "Stripe account not found." }; } - // console.log("⏳ awaiting getCartId for createCheckoutSessionAction..."); const cartId = await getCartId(); - // console.log("get stripe(1) `cartId`:", cartId); const checkoutItems: CheckoutItem[] = input.items.map((item) => ({ productId: item.id, @@ -408,9 +405,7 @@ export async function createPaymentIntentAction( return { error: "Stripe account not found.", clientSecret: null }; } - // console.log("⏳ awaiting getCartId for createPaymentIntentAction..."); const cartId = await getCartId(); - // console.log("get stripe(2) `cartId`:", cartId); const checkoutItems: CheckoutItem[] = input.items.map((item) => ({ productId: item.id, @@ -421,7 +416,6 @@ export async function createPaymentIntentAction( })); const metadata = { - // cartId: Number.isNaN(cartId) ? "" : cartId, cartId: Number(cartId) ?? null, items: JSON.stringify(checkoutItems), }; @@ -505,9 +499,7 @@ export async function getPaymentIntentAction( input: z.infer, ) { try { - // console.log("⏳ awaiting getCartId for getPaymentIntentAction..."); const cartId = await getCartId(); - // console.log("get stripe(3) `cartId`:", cartId); const { isConnected, payment } = await getStripeAccountAction({ storeId: input.storeId, @@ -533,9 +525,6 @@ export async function getPaymentIntentAction( throw new Error("Payment intent not succeeded."); } - // console.log("cartId:", cartId); - // console.log("paymentIntent.metadata.cartId", paymentIntent.metadata.cartId); - if ( paymentIntent.metadata.cartId !== cartId // && paymentIntent.shipping?.address?.postal_code?.split(" ").join("") !== input.deliveryPostalCode diff --git a/src/data/i18n/de-de.json b/src/data/i18n/de-de.json index 4d24a7ee..8eb8b2d4 100644 --- a/src/data/i18n/de-de.json +++ b/src/data/i18n/de-de.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "Bleiben Sie mit Drizzle ORM auf dem Laufenden. Eingesetzt auf Vercel, Railway, Neon usw.", - "title": "Datenbank" + "title": "Datenbank", + "description-v2": "Sorgen Sie mit Drizzle ORM für Spitzenleistung, indem Sie MySQL und Postgres im laufenden Betrieb wechseln. \nProfitieren Sie von flexiblen Bereitstellungsoptionen, darunter Planetscale, Vercel, Railway, Neon und mehr.", + "title-v2": "Datenbankintegration: Robust und vielseitig" }, "cryptography": { "description": "Nutzen Sie App-Verzeichnis, Routing, Layouts, Lade-UI, API-Routen und mehr.", - "title": "Next.js 14" + "title": "Next.js 14", + "description-v2": "Erleben Sie nahtlose Navigation mit erweiterten Funktionen wie App Router, Layouts und Loading UI. \nNutzen Sie leistungsstarke API-Routen und erkunden Sie innovative Funktionen, die über die Grundlagen hinausgehen.", + "title-v2": "Next.js 14: Verbesserte Benutzererfahrung" }, "currency": { "description": "UI-Komponenten, die mit Radix UI erstellt und mit Tailwind CSS gestaltet wurden.", - "title": "Komponenten" + "title": "Komponenten", + "description-v2": "Erstellen Sie eine atemberaubende Benutzeroberfläche mit Komponenten, die auf der Benutzeroberfläche von Radix und Shadcn basieren und mit Tailwind CSS für eine moderne Ästhetik wunderschön gestaltet sind. \nVSCode wird für ein umfassendes Immersionserlebnis empfohlen.", + "title-v2": "Komponenten: Elegant" }, "devtools": { "description": "Kostenlose und kostenpflichtige Abonnements mit Stripe.", "title": "Abonnements", - "ambitions-description": "Hören Sie auf, von einem Anlasser zum nächsten zu rennen. Mit Relivator haben Sie unbegrenzte Möglichkeiten. Sie können alles erstellen, was Sie wollen; Alle Werkzeuge sind bereits für Sie vorbereitet." + "ambitions-description": "Hören Sie auf, von einem Anlasser zum nächsten zu rennen. Mit Relivator haben Sie unbegrenzte Möglichkeiten. Sie können alles erstellen, was Sie wollen; Alle Werkzeuge sind bereits für Sie vorbereitet.", + "description-v2": "Implementierung eines robusten Abonnementsystems, das sowohl kostenlose als auch kostenpflichtige Pläne unterstützt und auf Effizienz und Skalierbarkeit optimiert ist. \nLesen Sie README.md des Projekts, um mehr zu erfahren.", + "title-v2": "Stripe-Abonnements: Leistungsstark" }, "files": { "description": "Middleware-Authentifizierung mit NextAuth.js.", "title": "Authentifizierung", "on-the-fly": "Vollständige On-the-Fly-Anpassung", "on-the-fly-description": "Tauchen Sie ein in eine umfangreiche Liste von Funktionen in unserem Projekt-Repository. Wechseln Sie mühelos zwischen Clerk/NextAuth.js und MySQL/PostgreSQL, um Ihren Projektanforderungen gerecht zu werden.", - "roadmap": "Große Ambitionen: Grenzenlose Möglichkeiten" + "roadmap": "Große Ambitionen: Grenzenlose Möglichkeiten", + "description-v2": "Stellen Sie mit NextAuth.js und Clerk ein vielseitiges Authentifizierungssystem bereit, das auf die Anforderungen Ihrer Anwendung zugeschnitten ist. \nErfahren Sie mehr in der Datei .env.example, und schon kann es losgehen.", + "title-v2": "Benutzerauthentifizierung: Sicher" }, "subtitle": "Vom Code bis zum Design verfügt Relivator über Funktionen, die Ihre Webprojekte auf ein neues Niveau bringen.", "text": { "description": "Bearbeiten Sie die App mühelos mit Server- und Client-Komponenten. Haken verwenden. Und mehr.", - "title": "Reaktion 18" + "title": "Reaktion 18", + "description-v2": "Bearbeiten Sie Ihre App mühelos mit Server- und Client-Komponenten. \nNutzen Sie erweiterte Hooks und erkunden Sie eine Reihe zusätzlicher Funktionen für eine reibungslosere Entwicklungserfahrung.", + "title-v2": "Reaktion 18: Optimierte moderne Entwicklung" }, "title": "Funktionen" }, @@ -215,7 +227,12 @@ "things": { "linkText": "Zur Liste gehen" }, - "title": "Entdecken Sie die wichtigsten tools für React, Next.js und mehr. Speziell auf Sie zugeschnitten." + "title": "Entdecken Sie die wichtigsten tools für React, Next.js und mehr. Speziell auf Sie zugeschnitten.", + "buy-now": "Kaufe jetzt", + "footer-cta": "Möchten Sie Ihre Produkte verkaufen?", + "get-started-btn": "Loslegen", + "main-cta": "Laden Sie Starter herunter", + "sell-now": "Jetzt verkaufen" }, "LanguageSwitch": { "choose-language": "Sprache" @@ -727,5 +744,41 @@ }, "contact": { "submit": "Einreichen" + }, + "faq": { + "1": { + "details": "Bitte besuchen Sie die Datei README.md im GitHub-Repository von Relivator. Dort finden Sie immer die aktuellsten Informationen zum Projekt sowie einfache Installationsanweisungen.", + "summary": "Wie kann ich alles installieren und sofort loslegen?" + }, + "2": { + "details": "Die Antwort ist einfach: um zu verhindern, dass Sie zwischen verschiedenen Startern wechseln. \nTatsächlich können Sie jetzt mit der Suche aufhören. \nMit Relivator stehen Ihnen unbegrenzte Möglichkeiten zur Verfügung. \nSie können alles erstellen, was Sie möchten; \nAlle notwendigen Werkzeuge sind bereits für Sie vorbereitet.", + "summary": "Warum sollte ich Relivator als Starter für Next.js 14 wählen?" + }, + "3": { + "details": "Etwas so Ehrgeiziges wie Relivator zu entwickeln nimmt natürlich viel Zeit in Anspruch, zumal das Projekt in erster Linie von nur einer Person entwickelt wird. \nDurch die Einstellung zusätzlicher Entwickler könnte die Entwicklung deutlich beschleunigt werden. \nDaher wäre ich, @blefnk Nazarii Korniienko, jedem, der in beliebiger Höhe für das Projekt spenden könnte, außerordentlich dankbar. \nWeitere Informationen zu Patreon und anderen Plattformen finden Sie auf der Repository-Seite. \nEin großes Dankeschön an alle im Voraus!", + "summary": "Ist es möglich, die Veröffentlichung von Relivator v2.0 zu beschleunigen?" + } + }, + "demo": { + "aria-label-goto": "Gehe zu", + "launch": "Demo starten" + }, + "metadata": { + "title": { + "home": "Heim" + } + }, + "checkout": { + "CartDetails": "Einzelheiten", + "Demo": "Testdaten können verwendet werden: 4242424242424242 | \n12/34 | \n567", + "Description": "Bezahlen Sie mit Ihren Warenkorbartikeln", + "EmptyCartDescription": "Fügen Sie Artikel zu Ihrem Warenkorb hinzu, um zur Kasse zu gehen", + "EmptyCartHeading": "Ihr Warenkorb ist leer", + "Pay": "Zahlen", + "Title": "Kasse", + "backToCart": "Zurück zum Warenkorb", + "backToCartSingle": "Zurück", + "notConnectedDescription": "Der Ladenbesitzer muss seinen Laden mit Stripe verbinden, um Zahlungen zu akzeptieren", + "notConnectedHeading": "Der Store ist nicht mit Stripe verbunden" } } diff --git a/src/data/i18n/en-us.json b/src/data/i18n/en-us.json index a1411370..cfae3d88 100644 --- a/src/data/i18n/en-us.json +++ b/src/data/i18n/en-us.json @@ -184,32 +184,44 @@ "features": { "clock": { "description": "Maintain peak performance with Drizzle ORM, by switching MySQL and Postgres on-the-fly. Enjoy flexible deployment options, including Planetscale, Vercel, Railway, Neon, and more.", - "title": "Database Integration: Robust and Versatile" + "title": "Database Integration: Robust and Versatile", + "title-v2": "Database Integration: Robust and Versatile", + "description-v2": "Maintain peak performance with Drizzle ORM, by switching MySQL and Postgres on-the-fly. Enjoy flexible deployment options, including Planetscale, Vercel, Railway, Neon, and more." }, "cryptography": { "description": "Experience seamless navigation with advanced features like App Router, Layouts, and Loading UI. Leverage powerful API routes and explore innovative capabilities beyond the basics.", - "title": "Next.js 14: Enhanced User Experience & DX" + "title": "Next.js 14: Enhanced User Experience & DX", + "title-v2": "Next.js 14: Enhanced User Experience & DX", + "description-v2": "Experience seamless navigation with advanced features like App Router, Layouts, and Loading UI. Leverage powerful API routes and explore innovative capabilities beyond the basics." }, "currency": { "description": "Craft stunning UI with components built on top of Radix and Shadcn UI, beautifully styled with Tailwind CSS for a modern aesthetic. VSCode is recommended for a full immersion experience.", - "title": "Components: Elegant & Functional" + "title": "Components: Elegant & Functional", + "title-v2": "Components: Elegant & Functional", + "description-v2": "Craft stunning UI with components built on top of Flowbite and Shadcn UI, styled with Radix and Tailwind CSS for a modern aesthetic. VSCode is recommended for a full immersion experience." }, "devtools": { "description": "Implemented a robust subscription system, both free and paid plans are supported, optimized for efficiency and scalability. Learn README.md of the project to learn more.", "title": "Stripe Subscriptions: Powerful & Flexible", - "ambitions-description": "Stop running from one starter to the next. With Relivator, you'll have unlimited possibilities. You can create anything you want; all the tools are already prepared, just for you." + "ambitions-description": "Stop running from one starter to the next. With Relivator, you'll have unlimited possibilities. You can create anything you want; all the tools are already prepared, just for you.", + "title-v2": "Stripe Subscriptions: Powerful & Flexible", + "description-v2": "Implemented a robust subscription system, both free and paid plans are supported, optimized for efficiency and scalability. Learn README.md of the project to learn more." }, "files": { "description": "Deploy a versatile authentication system using NextAuth.js and Clerk, tailored for your application’s needs. Learn more in .env.example file, and you're ready to go.", "title": "User Authentication: Secure & Conditional", "on-the-fly": "Full On The Fly Customization", "roadmap": "Huge Ambitions: Limitless Possibilities", - "on-the-fly-description": "Dive into an extensive list of features in our project repository. Effortlessly switch between Clerk/NextAuth.js and MySQL/PostgreSQL to suit your project requirements." + "on-the-fly-description": "Dive into an extensive list of features in our project repository. Effortlessly switch between Clerk/NextAuth.js and MySQL/PostgreSQL to suit your project requirements.", + "title-v2": "User Authentication: Secure & Conditional", + "description-v2": "Deploy a versatile authentication system using NextAuth.js and Clerk, tailored for your application’s needs. Learn more in .env.example file, and you're ready to go." }, "subtitle": "From code to design, Relivator has functionalities that supercharge your web projects.", "text": { "description": "Effortlessly manipulate your app with both Server and Client Components. Utilize advanced hooks and explore a range of additional features for a smoother development experience.", - "title": "React 18: Streamlined Modern Development" + "title": "React 18: Streamlined Modern Development", + "title-v2": "React 18: Streamlined Modern Development\t", + "description-v2": "Effortlessly manipulate your app with both Server and Client Components. Utilize advanced hooks and explore a range of additional features for a smoother development experience." }, "title": "Features" }, @@ -234,7 +246,12 @@ "things": { "linkText": "Go to list" }, - "title": "Discover the paramount tools for React, Next.js, and beyond. Tailored especially for you." + "title": "Discover the paramount tools for React, Next.js, and beyond. Tailored especially for you.", + "footer-cta": "Do you want to sell your products?", + "get-started-btn": "Get Started", + "sell-now": "Sell Now", + "buy-now": "Buy Now", + "main-cta": "Download Starter" }, "LanguageSwitch": { "choose-language": "Language" @@ -741,5 +758,27 @@ "summary": "Is it possible to speed up the release of Relivator v2.0?", "details": "Developing something as ambitious as Relivator obviously takes a lot of time, especially since the project is primarily developed by just one person. The development could be significantly accelerated by hiring additional developers. Therefore, I, @blefnk Nazarii Korniienko, would be immensely grateful to anyone who could donate to the project in any amount. Please refer to the repository page to see Patreon and other platforms as well. A big thank you to everyone in advance!" } + }, + "demo": { + "launch": "Launch Demo", + "aria-label-goto": "Go to" + }, + "metadata": { + "title": { + "home": "Home" + } + }, + "checkout": { + "backToCart": "Back to cart", + "notConnectedHeading": "Store is not connected to Stripe", + "notConnectedDescription": "Store owner needs to connect their store to Stripe to accept payments", + "Pay": "Pay", + "Demo": "Test data can be used: 4242424242424242 | 12/34 | 567", + "Title": "Checkout", + "Description": "Checkout with your cart items", + "EmptyCartHeading": "Your cart is empty", + "EmptyCartDescription": "Add items to your cart to checkout", + "CartDetails": "Details", + "backToCartSingle": "Back" } } diff --git a/src/data/i18n/es-es.json b/src/data/i18n/es-es.json index b0137ae9..d5bbcc08 100644 --- a/src/data/i18n/es-es.json +++ b/src/data/i18n/es-es.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "Manténgase encaminado con Drizzle ORM. Implementado en Vercel, Railway, Neon, etc.", - "title": "Base de datos" + "title": "Base de datos", + "description-v2": "Mantenga el máximo rendimiento con Drizzle ORM, cambiando MySQL y Postgres sobre la marcha. \nDisfrute de opciones de implementación flexibles, incluidas Planetscale, Vercel, Railway, Neon y más.", + "title-v2": "Integración de bases de datos: robusta y versátil" }, "cryptography": { "description": "Interactúe con el directorio de aplicaciones, el enriamiento, los diseños, la carga de la interfaz de usuario, las rutas API y más.", - "title": "Siguiente.js 14" + "title": "Siguiente.js 14", + "description-v2": "Experimente una navegación fluida con funciones avanzadas como App Router, diseños y carga de interfaz de usuario. \nAproveche potentes rutas API y explore capacidades innovadoras más allá de lo básico.", + "title-v2": "Next.js 14: experiencia de usuario mejorada" }, "currency": { "description": "Componentes de interfaz de usuario creados con Radix UI y diseñados con Tailwind CSS.", - "title": "Componentes" + "title": "Componentes", + "description-v2": "Cree una interfaz de usuario impresionante con componentes creados sobre Radix y Shadcn UI, bellamente diseñados con Tailwind CSS para una estética moderna. \nSe recomienda VSCode para una experiencia de inmersión total.", + "title-v2": "Componentes: Elegante" }, "devtools": { "description": "Suscripciones gratuitas y de pago con Stripe.", "title": "Suscripciones", - "ambitions-description": "Deja de correr de un titular a otro. Con Relivator tendrás posibilidades ilimitadas. Puedes crear lo que quieras; Todas las herramientas ya están preparadas, solo para ti." + "ambitions-description": "Deja de correr de un titular a otro. Con Relivator tendrás posibilidades ilimitadas. Puedes crear lo que quieras; Todas las herramientas ya están preparadas, solo para ti.", + "description-v2": "Se implementó un sólido sistema de suscripción, se admiten planes gratuitos y de pago, optimizados para lograr eficiencia y escalabilidad. \nAprenda README.md del proyecto para obtener más información.", + "title-v2": "Suscripciones de Stripe: potentes" }, "files": { "description": "Autenticación de middleware mediante NextAuth.js.", "title": "Autenticación", "on-the-fly": "Personalización completa sobre la marcha", "on-the-fly-description": "Sumérgete en una extensa lista de características en nuestro repositorio de proyectos. Cambie sin esfuerzo entre Clerk/NextAuth.js y MySQL/PostgreSQL para adaptarse a los requisitos de su proyecto.", - "roadmap": "Grandes ambiciones: posibilidades ilimitadas" + "roadmap": "Grandes ambiciones: posibilidades ilimitadas", + "description-v2": "Implemente un sistema de autenticación versátil utilizando NextAuth.js y Clerk, adaptado a las necesidades de su aplicación. \nObtenga más información en el archivo .env.example y estará listo para comenzar.", + "title-v2": "Autenticación de usuario: segura" }, "subtitle": "Desde el código hasta el diseño, Relivator tiene funcionalidades que potencian tus proyectos web.", "text": { "description": "Manipule la aplicación sin esfuerzo con componentes de servidor y cliente. Utilice gancho. Y más.", - "title": "Reaccionar 18" + "title": "Reaccionar 18", + "description-v2": "Manipule su aplicación sin esfuerzo con componentes de servidor y cliente. \nUtilice enlaces avanzados y explore una variedad de funciones adicionales para una experiencia de desarrollo más fluida.", + "title-v2": "React 18: Desarrollo moderno simplificado" }, "title": "Características" }, @@ -215,7 +227,12 @@ "things": { "linkText": "Ir a la lista" }, - "title": "Descubra las herramientas fundamentales para React, Next.js y más. Diseñado especialmente para ti." + "title": "Descubra las herramientas fundamentales para React, Next.js y más. Diseñado especialmente para ti.", + "buy-now": "Comprar ahora", + "footer-cta": "¿Quieres vender tus productos?", + "get-started-btn": "Empezar", + "main-cta": "Descargar Iniciador", + "sell-now": "Vende ahora" }, "LanguageSwitch": { "choose-language": "Idioma" @@ -727,5 +744,41 @@ }, "contact": { "submit": "Entregar" + }, + "faq": { + "1": { + "details": "Visite el archivo README.md en el repositorio de Relivator GitHub, donde siempre encontrará la información más actualizada sobre el proyecto junto con sencillas instrucciones de instalación.", + "summary": "¿Cómo puedo instalar todo y comenzar de inmediato?" + }, + "2": { + "details": "La respuesta es simple: para evitar que saltes entre diferentes entrantes. \nDe hecho, puedes dejar de buscar ahora. \nCon Relivator, se te presentan posibilidades ilimitadas. \nPuedes crear cualquier cosa que desees; \nTodas las herramientas necesarias ya están preparadas, solo para usted.", + "summary": "¿Por qué debería elegir Relivator como mi iniciador de Next.js 14?" + }, + "3": { + "details": "Desarrollar algo tan ambicioso como Relivator obviamente lleva mucho tiempo, especialmente porque el proyecto lo desarrolla principalmente una sola persona. \nEl desarrollo podría acelerarse significativamente mediante la contratación de desarrolladores adicionales. \nPor lo tanto, yo, @blefnk Nazarii Korniienko, estaría inmensamente agradecido a cualquiera que pudiera donar cualquier cantidad al proyecto. \nConsulte la página del repositorio para ver Patreon y otras plataformas también. \n¡Muchas gracias a todos de antemano!", + "summary": "¿Es posible acelerar el lanzamiento de Relivator v2.0?" + } + }, + "demo": { + "aria-label-goto": "Ir a", + "launch": "Iniciar demostración" + }, + "metadata": { + "title": { + "home": "Hogar" + } + }, + "checkout": { + "CartDetails": "Detalles", + "Demo": "Se pueden utilizar datos de prueba: 4242424242424242 | \n12/34 | \n567", + "Description": "Pagar con los artículos de su carrito", + "EmptyCartDescription": "Agregue artículos a su carrito para pagar", + "EmptyCartHeading": "Tu carrito esta vacío", + "Pay": "Pagar", + "Title": "Verificar", + "backToCart": "Volver al carrito", + "backToCartSingle": "Atrás", + "notConnectedDescription": "El propietario de la tienda debe conectar su tienda a Stripe para aceptar pagos", + "notConnectedHeading": "La tienda no está conectada a Stripe" } } diff --git a/src/data/i18n/fa-ir.json b/src/data/i18n/fa-ir.json index 447381fc..e4bdbb2a 100644 --- a/src/data/i18n/fa-ir.json +++ b/src/data/i18n/fa-ir.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "با Drizzle ORM در مسیر خود بمانید. ", - "title": "پایگاه داده" + "title": "پایگاه داده", + "description-v2": "با استفاده از Drizzle ORM، با تعویض MySQL و Postgres، عملکرد اوج خود را حفظ کنید. \nاز گزینه‌های استقرار انعطاف‌پذیر، از جمله Planetscale، Vercel، Railway، Neon و غیره لذت ببرید.", + "title-v2": "یکپارچه سازی پایگاه داده: قوی و همه کاره" }, "cryptography": { "description": "با App dir، Routing، Layouts، Loading UI، مسیرهای API و موارد دیگر درگیر شوید.", - "title": "Next.js 14" + "title": "Next.js 14", + "description-v2": "با ویژگی‌های پیشرفته مانند App Router، Layouts و Loading UI، ناوبری یکپارچه را تجربه کنید. \nاز مسیرهای قدرتمند API استفاده کنید و قابلیت‌های نوآورانه را فراتر از اصول اولیه کشف کنید.", + "title-v2": "Next.js 14: تجربه کاربری پیشرفته" }, "currency": { "description": "اجزای UI با استفاده از Radix UI ساخته شده و با Tailwind CSS استیل داده شده است.", - "title": "اجزاء" + "title": "اجزاء", + "description-v2": "UI خیره کننده با اجزای ساخته شده بر روی رابط کاربری Radix و Shadcn، به زیبایی با Tailwind CSS برای زیبایی مدرن طراحی شده است. \nVSCode برای تجربه غوطه وری کامل توصیه می شود.", + "title-v2": "اجزای سازنده: شیک" }, "devtools": { "description": "اشتراک های رایگان و پولی با استفاده از Stripe.", "title": "اشتراک ها", - "ambitions-description": "دویدن را از یک استارت به دیگری متوقف کنید. با Relivator، امکانات نامحدودی خواهید داشت. شما می توانید هر چیزی را که می خواهید ایجاد کنید. همه ابزارها از قبل آماده شده اند، فقط برای شما." + "ambitions-description": "دویدن را از یک استارت به دیگری متوقف کنید. با Relivator، امکانات نامحدودی خواهید داشت. شما می توانید هر چیزی را که می خواهید ایجاد کنید. همه ابزارها از قبل آماده شده اند، فقط برای شما.", + "description-v2": "با پیاده‌سازی یک سیستم اشتراک قوی، برنامه‌های رایگان و پولی پشتیبانی می‌شوند و برای کارایی و مقیاس‌پذیری بهینه‌سازی شده‌اند. \nبرای کسب اطلاعات بیشتر با README.md پروژه آشنا شوید.", + "title-v2": "اشتراک های Stripe: قدرتمند" }, "files": { "description": "احراز هویت میان افزار با استفاده از NextAuth.js.", "title": "احراز هویت", "on-the-fly": "سفارشی سازی کامل در پرواز", "on-the-fly-description": "به فهرست گسترده ای از ویژگی های موجود در مخزن پروژه ما شیرجه بزنید. بدون زحمت بین Clerk/NextAuth.js و MySQL/PostgreSQL جابجا شوید تا مطابق با نیازهای پروژه شما باشد.", - "roadmap": "جاه طلبی های بزرگ: امکانات بی حد و حصر" + "roadmap": "جاه طلبی های بزرگ: امکانات بی حد و حصر", + "description-v2": "یک سیستم احراز هویت همه کاره را با استفاده از NextAuth.js و Clerk که برای نیازهای برنامه شما طراحی شده است، مستقر کنید. \nدر فایل .env.example بیشتر بیاموزید، و آماده رفتن هستید.", + "title-v2": "احراز هویت کاربر: ایمن" }, "subtitle": "از کد تا طراحی، Relivator دارای قابلیت هایی است که پروژه های وب شما را شارژ می کند.", "text": { "description": "برنامه را بدون زحمت با مولفه های سرور و مشتری دستکاری کنید. ", - "title": "واکنش 18" + "title": "واکنش 18", + "description-v2": "به راحتی برنامه خود را با اجزای سرور و مشتری دستکاری کنید. \nاز قلاب‌های پیشرفته استفاده کنید و طیف وسیعی از ویژگی‌های اضافی را برای تجربه توسعه روان‌تر کشف کنید.", + "title-v2": "واکنش 18: توسعه مدرن کارآمد" }, "title": "امکانات" }, @@ -215,7 +227,12 @@ "things": { "linkText": "به لیست بروید" }, - "title": "ابزارهای مهم برای React، Next.js و موارد دیگر را کشف کنید. " + "title": "ابزارهای مهم برای React، Next.js و موارد دیگر را کشف کنید. ", + "buy-now": "هم اکنون خریداری کنید", + "footer-cta": "آیا می خواهید محصولات خود را بفروشید؟", + "get-started-btn": "شروع کنید", + "main-cta": "دانلود Starter", + "sell-now": "اکنون بفروش" }, "LanguageSwitch": { "choose-language": "زبان" @@ -727,5 +744,41 @@ }, "contact": { "submit": "ارسال" + }, + "demo": { + "aria-label-goto": "رفتن به", + "launch": "نسخه ی نمایشی را راه اندازی کنید" + }, + "faq": { + "1": { + "details": "لطفاً از فایل README.md در مخزن Relivator GitHub دیدن کنید، جایی که همیشه جدیدترین اطلاعات مربوط به پروژه را به همراه دستورالعمل های نصب آسان پیدا خواهید کرد.", + "summary": "چگونه می توانم همه چیز را نصب کنم و بلافاصله شروع کنم؟" + }, + "2": { + "details": "پاسخ ساده است: برای جلوگیری از پرش شما بین استارترهای مختلف. \nدر واقع، اکنون می توانید جستجو را متوقف کنید. \nبا Relivator، امکانات نامحدودی به شما ارائه می شود. \nشما می توانید هر چیزی را که می خواهید بسازید. \nتمام ابزارهای لازم از قبل آماده شده اند، فقط برای شما.", + "summary": "چرا باید Relivator را به عنوان شروع کننده Next.js 14 انتخاب کنم؟" + }, + "3": { + "details": "بدیهی است که توسعه چیزی به جاه‌طلبی Relivator زمان زیادی می‌برد، به‌ویژه که این پروژه عمدتاً توسط یک نفر توسعه می‌یابد. \nتوسعه را می توان با استخدام توسعه دهندگان اضافی به طور قابل توجهی تسریع کرد. \nبنابراین، من، @blefnk Nazarii Korniienko، از هر کسی که بتواند به هر مبلغی به پروژه کمک کند، بی نهایت سپاسگزار خواهم بود. \nلطفاً برای مشاهده Patreon و سایر پلتفرم‌ها به صفحه مخزن مراجعه کنید. \nپیشاپیش از همه تشکر می کنم!", + "summary": "آیا می توان سرعت انتشار Relivator v2.0 را افزایش داد؟" + } + }, + "metadata": { + "title": { + "home": "صفحه اصلی" + } + }, + "checkout": { + "CartDetails": "جزئیات", + "Demo": "داده های تست قابل استفاده است: 4242424242424242 | \n12/34 | \n567", + "Description": "با اقلام سبد خرید خود را بررسی کنید", + "EmptyCartDescription": "موارد را به سبد خرید خود برای پرداخت اضافه کنید", + "EmptyCartHeading": "سبد خرید شما خالی است", + "Pay": "پرداخت", + "Title": "وارسی", + "backToCart": "بازگشت به سبد خرید", + "backToCartSingle": "بازگشت", + "notConnectedDescription": "مالک فروشگاه باید فروشگاه خود را به Stripe متصل کند تا پرداخت‌ها را بپذیرد", + "notConnectedHeading": "فروشگاه به Stripe متصل نیست" } } diff --git a/src/data/i18n/fr-fr.json b/src/data/i18n/fr-fr.json index c1442804..2c8a29bf 100644 --- a/src/data/i18n/fr-fr.json +++ b/src/data/i18n/fr-fr.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "Restez sur la bonne voie avec Drizzle ORM. Déployé sur Vercel, Railway, Neon, etc.", - "title": "Base de données" + "title": "Base de données", + "description-v2": "Maintenez des performances optimales avec Drizzle ORM, en basculant MySQL et Postgres à la volée. \nProfitez d'options de déploiement flexibles, notamment Planetscale, Vercel, Railway, Neon, et bien plus encore.", + "title-v2": "Intégration de base de données: robuste et polyvalente" }, "cryptography": { "description": "Interagissez avec le répertoire d'application, le routage, les mises en page, le chargement utilisateur, les itinéraires API et au-delà.", - "title": "Next.js 14" + "title": "Next.js 14", + "description-v2": "Bénéficiez d'une navigation transparente avec des fonctionnalités avancées telles que le routeur d'applications, les mises en page et l'interface utilisateur de chargement. \nTirez parti de puissantes routes API et explorez des capacités innovantes au-delà des bases.", + "title-v2": "Next.js 14: expérience utilisateur améliorée" }, "currency": { "description": "Composant utilisateur créés à l'aide de Radix UI et stylisés avec Tailwind CSS.", - "title": "Composants" + "title": "Composants", + "description-v2": "Créez une interface utilisateur époustouflante avec des composants construits sur l'interface utilisateur Radix et Shadcn, magnifiquement stylisés avec Tailwind CSS pour une esthétique moderne. \nVSCode est recommandé pour une expérience d’immersion totale.", + "title-v2": "Composants: Élégant" }, "devtools": { "description": "Abonnements gratuits et payants via Stripe.", "title": "Abonnements", - "ambitions-description": "Arrêtez de courir d’un démarreur à l’autre. Avec Relivator, vous aurez des possibilités illimitées. Vous pouvez créer tout ce que vous voulez; tous les outils sont déjà préparés, rien que pour vous." + "ambitions-description": "Arrêtez de courir d’un démarreur à l’autre. Avec Relivator, vous aurez des possibilités illimitées. Vous pouvez créer tout ce que vous voulez; tous les outils sont déjà préparés, rien que pour vous.", + "description-v2": "Mise en œuvre d'un système d'abonnement robuste, les forfaits gratuits et payants sont pris en charge, optimisés pour l'efficacité et l'évolutivité. \nApprenez le fichier README.md du projet pour en savoir plus.", + "title-v2": "Abonnements Stripe: puissants" }, "files": { "description": "Authentification middleware à l'aide de NextAuth.js.", "title": "Authentification", "on-the-fly": "Personnalisation complète à la volée", "on-the-fly-description": "Plongez dans une liste complète de fonctionnalités dans notre référentiel de projets. Basculez sans effort entre Clerk/NextAuth.js et MySQL/PostgreSQL pour répondre aux exigences de votre projet.", - "roadmap": "De grandes ambitions: des possibilités illimitées" + "roadmap": "De grandes ambitions: des possibilités illimitées", + "description-v2": "Déployez un système d'authentification polyvalent à l'aide de NextAuth.js et Clerk, adapté aux besoins de votre application. \nApprenez-en plus dans le fichier .env.example et vous êtes prêt à partir.", + "title-v2": "Authentification utilisateur: sécurisée" }, "subtitle": "Du code à la conception, Relivator possède des fonctionnalités qui dynamisent vos projets Web.", "text": { "description": "Manipulez l'application sans effort avec les composants serveur et client. Utilisez un crochet. Et plus.", - "title": "Réagir 18" + "title": "Réagir 18", + "description-v2": "Manipulez sans effort votre application avec les composants serveur et client. \nUtilisez des hooks avancés et explorez une gamme de fonctionnalités supplémentaires pour une expérience de développement plus fluide.", + "title-v2": "React 18: Développement moderne rationalisé" }, "title": "Caractéristiques du démarreur Relivator" }, @@ -215,7 +227,12 @@ "things": { "linkText": "Accéder à la liste" }, - "title": "Découvrez les outils primordiaux pour React, Next.js et au-delà. Conçu spécialement pour vous." + "title": "Découvrez les outils primordiaux pour React, Next.js et au-delà. Conçu spécialement pour vous.", + "buy-now": "Acheter maintenant", + "footer-cta": "Vous souhaitez vendre vos produits ?", + "get-started-btn": "Commencer", + "main-cta": "Télécharger le démarreur", + "sell-now": "Vendre maintenant" }, "LanguageSwitch": { "choose-language": "Langue" @@ -727,5 +744,41 @@ }, "contact": { "submit": "Soumettre" + }, + "demo": { + "aria-label-goto": "Aller à", + "launch": "Lancer la démo" + }, + "faq": { + "1": { + "details": "Veuillez visiter le fichier README.md dans le référentiel Relivator GitHub, où vous trouverez toujours les informations les plus récentes sur le projet ainsi que des instructions d'installation simples.", + "summary": "Comment puis-je tout installer et commencer immédiatement ?" + }, + "2": { + "details": "La réponse est simple : pour vous éviter de sauter entre les différents starters. \nEn fait, vous pouvez arrêter de chercher maintenant. \nAvec Relivator, des possibilités illimitées vous sont présentées. \nVous pouvez créer tout ce que vous désirez; \ntous les outils nécessaires sont déjà préparés, rien que pour vous.", + "summary": "Pourquoi devrais-je choisir Relivator comme démarreur Next.js 14?" + }, + "3": { + "details": "Développer quelque chose d'aussi ambitieux que Relivator prend évidemment beaucoup de temps, d'autant plus que le projet est avant tout développé par une seule personne. \nLe développement pourrait être considérablement accéléré en embauchant des développeurs supplémentaires. \nPar conséquent, moi, @blefnk Nazarii Korniienko, serais immensément reconnaissant à tous ceux qui pourraient faire un don au projet, quel qu'en soit le montant. \nVeuillez vous référer à la page du référentiel pour voir également Patreon et d'autres plates-formes. \nUn grand merci à tous par avance !", + "summary": "Est-il possible d'accélérer la sortie de Relivator v2.0 ?" + } + }, + "metadata": { + "title": { + "home": "Maison" + } + }, + "checkout": { + "CartDetails": "Détails", + "Demo": "Les données de test peuvent être utilisées: 4242424242424242 | \n12/34 | \n567", + "Description": "Payer avec les articles de votre panier", + "EmptyCartDescription": "Ajoutez des articles à votre panier pour passer à la caisse", + "EmptyCartHeading": "Votre panier est vide", + "Pay": "Payer", + "Title": "Vérifier", + "backToCart": "Retour au panier", + "backToCartSingle": "Dos", + "notConnectedDescription": "Le propriétaire du magasin doit connecter son magasin à Stripe pour accepter les paiements", + "notConnectedHeading": "Le magasin n'est pas connecté à Stripe" } } diff --git a/src/data/i18n/hi-in.json b/src/data/i18n/hi-in.json index 7b079c95..ea94e406 100644 --- a/src/data/i18n/hi-in.json +++ b/src/data/i18n/hi-in.json @@ -184,32 +184,44 @@ "features": { "clock": { "description": "Drizzle ORM के साथ पथ पर बने रहें। Vercel, Railway, Neon, आदि पर तैनात करें।", - "title": "डेटाबेस" + "title": "डेटाबेस", + "description-v2": "MySQL और Postgres को ऑन-द-फ्लाई स्विच करके, Drizzle ORM के साथ चरम प्रदर्शन बनाए रखें। \nप्लैनेटस्केल, वर्सेल, रेलवे, नियॉन और अन्य सहित लचीले परिनियोजन विकल्पों का आनंद लें।", + "title-v2": "डेटाबेस एकीकरण: मजबूत और बहुमुखी" }, "cryptography": { "description": "App dir, Routing, Layouts, Loading UI, API routes, और उससे परे के साथ मिलें।", - "title": "Next.js 14" + "title": "Next.js 14", + "description-v2": "ऐप राउटर, लेआउट और लोडिंग यूआई जैसी उन्नत सुविधाओं के साथ सहज नेविगेशन का अनुभव करें। \nशक्तिशाली एपीआई मार्गों का लाभ उठाएं और बुनियादी बातों से परे नवीन क्षमताओं का पता लगाएं।", + "title-v2": "Next.js 14: उन्नत उपयोगकर्ता अनुभव" }, "currency": { "description": "UI कंपोनेंट्स Radix UI का उपयोग करके बनाए गए और Tailwind CSS के साथ स्टाइल किए गए।", - "title": "कंपोनेंट्स" + "title": "कंपोनेंट्स", + "description-v2": "रेडिक्स और शैडकन यूआई के शीर्ष पर निर्मित घटकों के साथ शानदार यूआई तैयार करें, आधुनिक सौंदर्य के लिए टेलविंड सीएसएस के साथ खूबसूरती से स्टाइल किया गया। \nपूर्ण विसर्जन अनुभव के लिए VSCode की अनुशंसा की जाती है।", + "title-v2": "अवयव: सुंदर" }, "devtools": { "description": "Stripe का उपयोग करके मुफ्त और पेड सब्सक्रिप्शन्स।", "title": "सब्सक्रिप्शन्स", - "ambitions-description": "एक स्टार्टर से दूसरे स्टार्टर तक दौड़ना बंद करें। रिलीवेटर के साथ, आपके पास असीमित संभावनाएँ होंगी। आप अपनी इच्छानुसार कुछ भी बना सकते हैं; सभी उपकरण पहले से ही तैयार हैं, केवल आपके लिए।" + "ambitions-description": "एक स्टार्टर से दूसरे स्टार्टर तक दौड़ना बंद करें। रिलीवेटर के साथ, आपके पास असीमित संभावनाएँ होंगी। आप अपनी इच्छानुसार कुछ भी बना सकते हैं; सभी उपकरण पहले से ही तैयार हैं, केवल आपके लिए।", + "description-v2": "एक मजबूत सदस्यता प्रणाली लागू की गई है, मुफ़्त और सशुल्क दोनों योजनाएं समर्थित हैं, दक्षता और स्केलेबिलिटी के लिए अनुकूलित हैं। \nअधिक जानने के लिए प्रोजेक्ट का README.md जानें।", + "title-v2": "स्ट्राइप सब्सक्रिप्शन: शक्तिशाली" }, "files": { "description": "NextAuth.js का उपयोग करके मिडलवेयर प्रमाणीकरण।", "title": "प्रमाणीकरण", "on-the-fly": "पूर्ण ऑन द फ्लाई अनुकूलन", "on-the-fly-description": "हमारे प्रोजेक्ट रिपॉजिटरी में सुविधाओं की एक विस्तृत सूची पर गौर करें। अपनी परियोजना आवश्यकताओं के अनुरूप आसानी से क्लर्क/नेक्स्टऑथ.जेएस और MySQL/पोस्टग्रेएसक्यूएल के बीच स्विच करें।", - "roadmap": "विशाल महत्वाकांक्षाएँ: असीमित संभावनाएँ" + "roadmap": "विशाल महत्वाकांक्षाएँ: असीमित संभावनाएँ", + "description-v2": "NextAuth.js और क्लर्क का उपयोग करके एक बहुमुखी प्रमाणीकरण प्रणाली तैनात करें, जो आपके एप्लिकेशन की आवश्यकताओं के अनुरूप हो। \n.env.example फ़ाइल में और जानें, और आप जाने के लिए तैयार हैं।", + "title-v2": "उपयोगकर्ता प्रमाणीकरण: सुरक्षित" }, "subtitle": "कोड से लेकर डिजाइन तक, Relivator में आपके वेब परियोजनाओं को सुपरचार्ज करने वाले कार्यक्षमता हैं।", "text": { "description": "सर्वर और क्लाइंट कंपोनेंट्स के साथ ऐप को आसानी से हेरफेर करें। हुक का उपयोग करें। और अधिक।", - "title": "React 18" + "title": "React 18", + "description-v2": "सर्वर और क्लाइंट दोनों घटकों के साथ अपने ऐप में आसानी से हेरफेर करें। \nबेहतर विकास अनुभव के लिए उन्नत हुक का उपयोग करें और अतिरिक्त सुविधाओं की एक श्रृंखला का पता लगाएं।", + "title-v2": "प्रतिक्रिया 18: सुव्यवस्थित आधुनिक विकास" }, "title": "Relivator स्टार्टर विशेषताएं" }, @@ -234,7 +246,12 @@ "things": { "linkText": "सूची पर जाएं" }, - "title": "React, Next.js, और उससे परे के लिए सर्वोत्तम उपकरणों की खोज करें। विशेष रूप से आपके लिए तैयार किया गया।" + "title": "React, Next.js, और उससे परे के लिए सर्वोत्तम उपकरणों की खोज करें। विशेष रूप से आपके लिए तैयार किया गया।", + "buy-now": "अभी खरीदें", + "footer-cta": "क्या आप अपने उत्पाद बेचना चाहते हैं?", + "get-started-btn": "शुरू हो जाओ", + "main-cta": "स्टार्टर डाउनलोड करें", + "sell-now": "अभी बेचें" }, "LanguageSwitch": { "choose-language": "भाषा चुनें" @@ -727,5 +744,41 @@ }, "contact": { "submit": "जमा करना" + }, + "demo": { + "aria-label-goto": "जाओ", + "launch": "डेमो लॉन्च करें" + }, + "faq": { + "1": { + "details": "कृपया रिलिवेटर गिटहब रिपॉजिटरी में README.md फ़ाइल पर जाएँ, जहाँ आपको आसान इंस्टॉलेशन निर्देशों के साथ प्रोजेक्ट के बारे में हमेशा नवीनतम जानकारी मिलेगी।", + "summary": "मैं सब कुछ कैसे स्थापित कर सकता हूँ और तुरंत आरंभ कर सकता हूँ?" + }, + "2": { + "details": "उत्तर सरल है: आपको विभिन्न स्टार्टर्स के बीच कूदने से रोकने के लिए। \nवास्तव में, अब आप खोजना बंद कर सकते हैं। \nरिलीवेटर के साथ, आपको असीमित संभावनाएं प्रस्तुत की जाती हैं। \nआप अपनी इच्छानुसार कुछ भी बना सकते हैं; \nसभी आवश्यक उपकरण केवल आपके लिए पहले से ही तैयार हैं।", + "summary": "मुझे अपने नेक्स्ट.जेएस 14 स्टार्टर के रूप में रिलीवेटर क्यों चुनना चाहिए?" + }, + "3": { + "details": "रिलीवेटर जैसी महत्वाकांक्षी चीज़ को विकसित करने में स्पष्ट रूप से बहुत समय लगता है, खासकर जब परियोजना मुख्य रूप से केवल एक व्यक्ति द्वारा विकसित की जाती है। \nअतिरिक्त डेवलपर्स को काम पर रखकर विकास में काफी तेजी लाई जा सकती है। \nइसलिए, मैं, @blefnk Nazarii Korniienko, किसी भी व्यक्ति का बहुत आभारी रहूंगा जो इस परियोजना के लिए किसी भी राशि में दान कर सकता है। \nपैट्रियन और अन्य प्लेटफार्मों को भी देखने के लिए कृपया रिपॉजिटरी पेज देखें। \nसभी को अग्रिम धन्यवाद!", + "summary": "क्या रिलिवेटर v2.0 की रिलीज़ को तेज़ करना संभव है?" + } + }, + "metadata": { + "title": { + "home": "घर" + } + }, + "checkout": { + "CartDetails": "विवरण", + "Demo": "परीक्षण डेटा का उपयोग किया जा सकता है: 4242424242424242 | \n12/34 | \n567", + "Description": "अपने कार्ट आइटम से चेकआउट करें", + "EmptyCartDescription": "चेकआउट करने के लिए अपने कार्ट में आइटम जोड़ें", + "EmptyCartHeading": "आपकी गाड़ी खाली है", + "Pay": "वेतन", + "Title": "चेक आउट", + "backToCart": "कार्ट पर वापस जाएँ", + "backToCartSingle": "पीछे", + "notConnectedDescription": "भुगतान स्वीकार करने के लिए स्टोर मालिक को अपने स्टोर को स्ट्राइप से कनेक्ट करना होगा", + "notConnectedHeading": "स्टोर स्ट्राइप से कनेक्ट नहीं है" } } diff --git a/src/data/i18n/it-it.json b/src/data/i18n/it-it.json index 35981e32..43ad73a6 100644 --- a/src/data/i18n/it-it.json +++ b/src/data/i18n/it-it.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "Rimani in pista con Drizzle ORM. Distribuito su Vercel, Railway, Neon, ecc.", - "title": "Banca dati" + "title": "Banca dati", + "description-v2": "Mantieni le massime prestazioni con Drizzle ORM, cambiando MySQL e Postgres al volo. \nGoditi opzioni di distribuzione flessibili, tra cui Planetscale, Vercel, Railway, Neon e altro ancora.", + "title-v2": "Integrazione del database: robusta e versatile" }, "cryptography": { "description": "Interagisci con directory app, routing, layout, interfaccia utente di caricamento, percorsi API e altro ancora.", - "title": "Next.js 14" + "title": "Next.js 14", + "description-v2": "Sperimenta una navigazione fluida con funzionalità avanzate come App Router, layout e interfaccia utente di caricamento. \nSfrutta potenti percorsi API ed esplora funzionalità innovative oltre le nozioni di base.", + "title-v2": "Next.js 14: Esperienza utente migliorata" }, "currency": { "description": "Componenti dell'interfaccia utente creati utilizzando Radix UI e stilizzati con Tailwind CSS.", - "title": "Componenti" + "title": "Componenti", + "description-v2": "Crea un'interfaccia utente straordinaria con componenti basati sull'interfaccia utente Radix e Shadcn, splendidamente stilizzati con Tailwind CSS per un'estetica moderna. \nVSCode è consigliato per un'esperienza full immersion.", + "title-v2": "Componenti: Elegante" }, "devtools": { "description": "Abbonamenti gratuiti e a pagamento utilizzando Stripe.", "title": "Abbonamenti", - "ambitions-description": "Smettere di correre da un antipasto all'altro. Con Relivator avrai possibilità illimitate. Puoi creare tutto ciò che vuoi; tutti gli strumenti sono già pronti, solo per te." + "ambitions-description": "Smettere di correre da un antipasto all'altro. Con Relivator avrai possibilità illimitate. Puoi creare tutto ciò che vuoi; tutti gli strumenti sono già pronti, solo per te.", + "description-v2": "Implementato un solido sistema di abbonamento, sono supportati sia i piani gratuiti che quelli a pagamento, ottimizzati per efficienza e scalabilità. \nScopri README.md del progetto per saperne di più.", + "title-v2": "Abbonamenti Stripe: potenti" }, "files": { "description": "Autenticazione middleware utilizzando NextAuth.js.", "title": "Autenticazione", "on-the-fly": "Personalizzazione completa al volo", "on-the-fly-description": "Esplora l'ampio elenco di funzionalità nel nostro repository di progetti. Passa facilmente da Clerk/NextAuth.js a MySQL/PostgreSQL per soddisfare i requisiti del tuo progetto.", - "roadmap": "Enormi ambizioni: possibilità illimitate" + "roadmap": "Enormi ambizioni: possibilità illimitate", + "description-v2": "Distribuisci un sistema di autenticazione versatile utilizzando NextAuth.js e Clerk, su misura per le esigenze della tua applicazione. \nScopri di più nel file .env.example e sei pronto per partire.", + "title-v2": "Autenticazione utente: sicura" }, "subtitle": "Dal codice alla progettazione, Relivator ha funzionalità che potenziano i tuoi progetti web.", "text": { "description": "Manipola l'app senza sforzo con i componenti server e client. Usa il gancio. E altro ancora.", - "title": "Reagire 18" + "title": "Reagire 18", + "description-v2": "Manipola facilmente la tua app con i componenti server e client. \nUtilizza hook avanzati ed esplora una gamma di funzionalità aggiuntive per un'esperienza di sviluppo più fluida.", + "title-v2": "React 18: sviluppo moderno semplificato" }, "title": "Funzionalità" }, @@ -215,7 +227,12 @@ "things": { "linkText": "Vai alla lista" }, - "title": "Scopri gli strumenti fondamentali per React, Next.js e oltre. Su misura per te." + "title": "Scopri gli strumenti fondamentali per React, Next.js e oltre. Su misura per te.", + "buy-now": "Acquista ora", + "footer-cta": "Vuoi vendere i tuoi prodotti?", + "get-started-btn": "Iniziare", + "main-cta": "Scarica Starter", + "sell-now": "Vendi adesso" }, "LanguageSwitch": { "choose-language": "Lingua" @@ -727,5 +744,41 @@ }, "contact": { "submit": "Invia" + }, + "demo": { + "aria-label-goto": "Vai a", + "launch": "Avvia la demo" + }, + "faq": { + "1": { + "details": "Visita il file README.md nel repository GitHub di Relivator, dove troverai sempre le informazioni più aggiornate sul progetto insieme a semplici istruzioni di installazione.", + "summary": "Come posso installare tutto e iniziare subito?" + }, + "2": { + "details": "La risposta è semplice: per evitare di saltare tra diversi antipasti. \nIn effetti, puoi interrompere la ricerca ora. \nCon Relivator ti vengono presentate possibilità illimitate. \nPuoi creare tutto ciò che desideri; \ntutti gli strumenti necessari sono già pronti, solo per te.", + "summary": "Perché dovrei scegliere Relivator come antipasto per Next.js 14?" + }, + "3": { + "details": "Sviluppare qualcosa di così ambizioso come Relivator richiede ovviamente molto tempo, soprattutto perché il progetto è sviluppato principalmente da una sola persona. \nLo sviluppo potrebbe essere notevolmente accelerato assumendo ulteriori sviluppatori. \nPertanto, io, @blefnk Nazarii Korniienko, sarei immensamente grato a chiunque potesse donare al progetto di qualsiasi importo. \nFare riferimento alla pagina del repository per vedere anche Patreon e altre piattaforme. \nUn grande grazie a tutti in anticipo!", + "summary": "È possibile accelerare il rilascio di Relivator v2.0?" + } + }, + "metadata": { + "title": { + "home": "Casa" + } + }, + "checkout": { + "CartDetails": "Dettagli", + "Demo": "È possibile utilizzare i dati del test: 4242424242424242 | \n34/12 | \n567", + "Description": "Acquista con gli articoli del tuo carrello", + "EmptyCartDescription": "Aggiungi articoli al carrello alla cassa", + "EmptyCartHeading": "il tuo carrello è vuoto", + "Pay": "Paga", + "Title": "Guardare", + "backToCart": "Torna al carrello", + "backToCartSingle": "Indietro", + "notConnectedDescription": "Il proprietario del negozio deve connettere il proprio negozio a Stripe per accettare pagamenti", + "notConnectedHeading": "Il negozio non è connesso a Stripe" } } diff --git a/src/data/i18n/pl-pl.json b/src/data/i18n/pl-pl.json index 17c4809b..fc5ac4f5 100644 --- a/src/data/i18n/pl-pl.json +++ b/src/data/i18n/pl-pl.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "Bądź na bieżąco dzięki Drizzle ORM oraz PostgreSQL. Deploy na Vercel, Neon, itp.", - "title": "Baza danych" + "title": "Baza danych", + "description-v2": "Utrzymuj najwyższą wydajność dzięki Drizzle ORM, przełączając MySQL i Postgres w locie. \nKorzystaj z elastycznych opcji wdrażania, w tym Planetscale, Vercel, Railway, Neon i innych.", + "title-v2": "Integracja z bazą danych: solidna i wszechstronna" }, "cryptography": { "description": "Korzystaj z katalogu aplikacji, układów, ładowania interfejsu użytkownika, ścieżek API i nie tylko.", - "title": "Następny.js 14" + "title": "Następny.js 14", + "description-v2": "Doświadcz płynnej nawigacji dzięki zaawansowanym funkcjom, takim jak router aplikacji, układy i interfejs użytkownika ładowania. \nWykorzystaj zaawansowane ścieżki API i odkryj innowacyjne możliwości wykraczające poza podstawy.", + "title-v2": "Next.js 14: Lepsze doświadczenie użytkownika" }, "currency": { "description": "Komponenty interfejsu użytkownika zbudowane przy Radix i Tailwind.", - "title": "Składniki" + "title": "Składniki", + "description-v2": "Twórz oszałamiający interfejs użytkownika z komponentami opartymi na interfejsie Radix i Shadcn, pięknie stylizowanymi za pomocą CSS Tailwind, aby uzyskać nowoczesną estetykę. \nDo pełnego zanurzenia zaleca się VSCode.", + "title-v2": "Komponenty: Elegancki" }, "devtools": { "description": "Bezpłatne i płatne subskrypcje za pomocą Stripe.", "title": "Subskrypcje", - "ambitions-description": "Przestań biegać od jednego startera do drugiego. Dzięki Relivator będziesz mieć nieograniczone możliwości. Możesz stworzyć wszystko, co chcesz; wszystkie narzędzia są już przygotowane, specjalnie dla Ciebie." + "ambitions-description": "Przestań biegać od jednego startera do drugiego. Dzięki Relivator będziesz mieć nieograniczone możliwości. Możesz stworzyć wszystko, co chcesz; wszystkie narzędzia są już przygotowane, specjalnie dla Ciebie.", + "description-v2": "Wdrożono solidny system subskrypcji, obsługiwane są zarówno plany bezpłatne, jak i płatne, zoptymalizowane pod kątem wydajności i skalowalności. \nAby dowiedzieć się więcej, zapoznaj się z plikiem README.md projektu.", + "title-v2": "Subskrypcje Stripe: potężne" }, "files": { "description": "Uwierzytelnianie oprogramowania pośredniczącego przy użyciu NextAuth.js.", "title": "Uwierzytelnianie", "on-the-fly": "Pełna personalizacja projektu on-the-fly", "on-the-fly-description": "Zapoznaj się z obszerną listą funkcji w repozytorium Relivator. Bezproblemowo przełączaj się między Clerk/NextAuth.js i MySQL/PostgreSQL, aby dostosować się do wymagań Twojego projektu.", - "roadmap": "Ogromne ambicje: nieograniczone możliwości" + "roadmap": "Ogromne ambicje: nieograniczone możliwości", + "description-v2": "Wdróż wszechstronny system uwierzytelniania przy użyciu NextAuth.js i Clerk, dostosowany do potrzeb Twojej aplikacji. \nDowiedz się więcej w pliku .env.example i gotowe.", + "title-v2": "Uwierzytelnianie użytkownika: bezpieczne" }, "subtitle": "Od kodu po projekt, Relivator oferuje funkcje, które usprawnią Twoje projekty internetowe.", "text": { "description": "Manipuluj aplikacją bez wysiłku za pomocą komponentów serwera i klienta.", - "title": "Reakcja 18" + "title": "Reakcja 18", + "description-v2": "Z łatwością manipuluj swoją aplikacją zarówno za pomocą komponentów serwera, jak i klienta. \nWykorzystaj zaawansowane zaczepy i poznaj szereg dodatkowych funkcji, aby zapewnić płynniejsze środowisko programistyczne.", + "title-v2": "Reakcja 18: Usprawniony nowoczesny rozwój" }, "title": "Możliwości" }, @@ -215,7 +227,12 @@ "things": { "linkText": "Przejdź do listy" }, - "title": "Odkryj najważniejsze narzędzia dla React, Next.js i nie tylko. Specjalnie dla Ciebie." + "title": "Odkryj najważniejsze narzędzia dla React, Next.js i nie tylko. Specjalnie dla Ciebie.", + "buy-now": "Kup Teraz", + "footer-cta": "Chcesz sprzedawać swoje produkty?", + "get-started-btn": "Zaczynaj", + "main-cta": "Pobierz Relivator", + "sell-now": "Sprzedaj teraz" }, "LanguageSwitch": { "choose-language": "Język" @@ -727,5 +744,41 @@ }, "contact": { "submit": "Składać" + }, + "faq": { + "1": { + "details": "Zapraszamy do odwiedzenia pliku README.md w repozytorium Relivator GitHub, gdzie zawsze znajdziesz najbardziej aktualne informacje o projekcie wraz z łatwą instrukcją instalacji.", + "summary": "Jak mogę wszystko zainstalować i od razu zacząć?" + }, + "2": { + "details": "Odpowiedź jest prosta: aby zapobiec Twojemu przeskakiwaniu pomiędzy różnymi starterami. \nWłaściwie możesz już przestać szukać jakieś inne startery. \nDzięki Relivator masz nieograniczone możliwości. \nMożesz stworzyć wszystko, czego pragniesz; \nwszystkie niezbędne narzędzia są już przygotowane, specjalnie dla Ciebie.", + "summary": "Dlaczego powinienem wybrać Relivator jako starter Next.js 14?" + }, + "3": { + "details": "Tworzenie czegoś tak ambitnego jak Relivator zajmuje oczywiście dużo czasu, zwłaszcza że projekt jest tworzony głównie przez jedną osobę. \nRozwój można znacznie przyspieszyć poprzez zatrudnienie dodatkowych programistów. \nDlatego ja, @blefnk Nazarii Korniienko, byłbym niezmiernie wdzięczny każdemu, kto mógłby przekazać na rzecz projektu dowolną kwotę. \nAby zobaczyć Patreon i inne platformy, zachęcam do odwiedzania strony repozytorium. \nZ góry najbardziej mocne wyrażenia podziękowania wszystkim!", + "summary": "Czy można przyspieszyć wydanie Relivator v2.0?" + } + }, + "demo": { + "aria-label-goto": "Iść do", + "launch": "Uruchom demo" + }, + "metadata": { + "title": { + "home": "Główna" + } + }, + "checkout": { + "CartDetails": "Detale", + "Demo": "Można wykorzystać dane testowe: 4242424242424242 | \n12/34 | \n567", + "Description": "Dokonaj transakcji z elementami koszyka", + "EmptyCartDescription": "Dodaj produkty do koszyka, aby dokonać płatności", + "EmptyCartHeading": "Twój koszyk jest pusty", + "Pay": "Płacić", + "Title": "Checkout", + "backToCart": "Powrót do koszyka", + "backToCartSingle": "Z powrotem", + "notConnectedDescription": "Właściciel sklepu musi połączyć swój sklep ze Stripe, aby akceptować płatności", + "notConnectedHeading": "Sklep nie jest połączony ze Stripe" } } diff --git a/src/data/i18n/tr-tr.json b/src/data/i18n/tr-tr.json index db9ed356..23fb2e25 100644 --- a/src/data/i18n/tr-tr.json +++ b/src/data/i18n/tr-tr.json @@ -165,32 +165,44 @@ "features": { "clock": { "description": "Drizzle ORM ile yolunda kalın. Vercel, Neon vb. üzerinde konuşlandırılmıştır.", - "title": "Veri tabanı" + "title": "Veri tabanı", + "description-v2": "MySQL ve Postgres'i anında değiştirerek Drizzle ORM ile en yüksek performansı koruyun. \nPlanetscale, Vercel, Demiryolu, Neon ve daha fazlasını içeren esnek dağıtım seçeneklerinin keyfini çıkarın.", + "title-v2": "Veritabanı Entegrasyonu: Sağlam ve Çok Yönlü" }, "cryptography": { "description": "Uygulama dizini, Yönlendirme, Düzenler, Yükleme Kullanıcı Arayüzü, API rotaları ve daha fazlasıyla etkileşime geçin.", - "title": "Sonraki.js 14" + "title": "Sonraki.js 14", + "description-v2": "Uygulama Yönlendiricisi, Düzenler ve Yükleme Kullanıcı Arayüzü gibi gelişmiş özelliklerle kusursuz gezinmeyi deneyimleyin. \nGüçlü API yollarından yararlanın ve temel bilgilerin ötesindeki yenilikçi yetenekleri keşfedin.", + "title-v2": "Next.js 14: Gelişmiş Kullanıcı Deneyimi" }, "currency": { "description": "Radix UI kullanılarak oluşturulmuş ve Tailwind CSS ile sislendirilmiş UI bileşenleri.", - "title": "Bileşenler" + "title": "Bileşenler", + "description-v2": "Modern bir estetik için Tailwind CSS ile güzel bir şekilde tasarlanmış, Radix ve Shadcn UI üzerine inşa edilmiş bileşenlerle çarpıcı UI oluşturun. \nTam bir sarmal deneyim için VSCode önerilir.", + "title-v2": "Bileşenler: Zarif" }, "devtools": { "description": "Stripe kullanarak ücretsiz ve ücretli abonelikler.", "title": "Abonelikler", - "ambitions-description": "Bir başlangıçtan diğerine koşmayı bırakın. Relivator ile sınırsız olanaklara sahip olacaksınız. Istediğiniz her şeyi yaratabilirsiniz; tüm araçlar zaten sizin için hazırlandı." + "ambitions-description": "Bir başlangıçtan diğerine koşmayı bırakın. Relivator ile sınırsız olanaklara sahip olacaksınız. Istediğiniz her şeyi yaratabilirsiniz; tüm araçlar zaten sizin için hazırlandı.", + "description-v2": "Güçlü bir abonelik sistemi uygulandı; hem ücretsiz hem de ücretli planlar destekleniyor, verimlilik ve ölçeklenebilirlik için optimize ediliyor. \nDaha fazla bilgi edinmek için projenin README.md dosyasını öğrenin.", + "title-v2": "Stripe Abonelikleri: Güçlü" }, "files": { "description": "NextAuth.js kullanarak ara yazılım kimlik doğrulaması.", "title": "Kimlik doğrulama", "on-the-fly": "Tam Anında Özelleştirme", "on-the-fly-description": "Proje havuzumuzdaki kapsamlı özellikler listesine göz atın. Proje gereksinimlerinize uyacak şekilde Clerk/NextAuth.js ve MySQL/PostgreSQL arasında zahmetsizce geçiş yapın.", - "roadmap": "Büyük Hırslar: Sınırsız Olasılıklar" + "roadmap": "Büyük Hırslar: Sınırsız Olasılıklar", + "description-v2": "NextAuth.js ve Clerk'i kullanarak uygulamanızın ihtiyaçlarına göre uyarlanmış çok yönlü bir kimlik doğrulama sistemi dağıtın. \n.env.example dosyasında daha fazla bilgi edindiğinizde artık hazırsınız.", + "title-v2": "Kullanıcı Kimlik Doğrulaması: Güvenli" }, "subtitle": "Relivator, koddan tasarıma kadar web projelerinizi güçlendiren işlevlere sahiptir.", "text": { "description": "Sunucu ve Istemci Bileşenleri ile uygulamayı zahmetsizce yönetin. Kanca kullanın. Ve dahası.", - "title": "React 18" + "title": "React 18", + "description-v2": "Uygulamanızı hem Sunucu hem de İstemci Bileşenleriyle zahmetsizce yönetin. \nDaha sorunsuz bir geliştirme deneyimi için gelişmiş kancalardan yararlanın ve çeşitli ek özellikleri keşfedin.", + "title-v2": "React 18: Kolaylaştırılmış Modern Geliştirme" }, "title": "Özellikleri" }, @@ -215,7 +227,12 @@ "things": { "linkText": "Listeye Git" }, - "title": "React, Next.js ve ötesine yönelik en önemli araçları keşfedin. Size özel olarak tasarlandı." + "title": "React, Next.js ve ötesine yönelik en önemli araçları keşfedin. Size özel olarak tasarlandı.", + "buy-now": "Şimdi al", + "footer-cta": "Ürünlerinizi satmak mı istiyorsunuz?", + "get-started-btn": "Başlamak", + "main-cta": "Başlatıcıyı İndir", + "sell-now": "Şimdi sat" }, "LanguageSwitch": { "choose-language": "Dil" @@ -727,5 +744,41 @@ }, "contact": { "submit": "Göndermek" + }, + "faq": { + "1": { + "details": "Lütfen Relivator GitHub deposundaki README.md dosyasını ziyaret edin; burada proje hakkında her zaman en güncel bilgileri ve kolay kurulum talimatlarını bulacaksınız.", + "summary": "Her şeyi nasıl yükleyebilirim ve hemen başlayabilirim?" + }, + "2": { + "details": "Cevap basit: Farklı başlangıçlar arasında atlamanızı önlemek için. \nAslında artık aramayı bırakabilirsiniz. \nRelivator ile size sınırsız olanaklar sunulur. \nArzu ettiğiniz her şeyi yaratabilirsiniz; \ngerekli tüm araçlar zaten sizin için hazırlandı.", + "summary": "Next.js 14 başlatıcım olarak neden Relivator'ı seçmeliyim?" + }, + "3": { + "details": "Relivator kadar iddialı bir şeyi geliştirmek, özellikle de proje öncelikle tek bir kişi tarafından geliştirildiğinden, açıkçası çok zaman alıyor. \nEk geliştiricilerin işe alınmasıyla geliştirme önemli ölçüde hızlandırılabilir. \nBu nedenle ben, @blefnk Nazarii Korniienko, projeye herhangi bir miktarda bağışta bulunabilecek herkese son derece minnettar olurum. \nPatreon ve diğer platformları da görmek için lütfen depo sayfasına bakın. \nŞimdiden herkese büyük bir teşekkür ederiz!", + "summary": "Relivator v2.0'ın çıkışını hızlandırmak mümkün mü?" + } + }, + "demo": { + "aria-label-goto": "Git", + "launch": "Demoyu Başlat" + }, + "metadata": { + "title": { + "home": "Ev" + } + }, + "checkout": { + "CartDetails": "Detaylar", + "Demo": "Test verileri kullanılabilir: 4242424242424242 | \n12/34 | \n567", + "Description": "Sepetinizdeki öğelerle ödeme yapın", + "EmptyCartDescription": "Ödeme yapmak için sepetinize ürün ekleyin", + "EmptyCartHeading": "Sepetiniz boş", + "Pay": "Ödemek", + "Title": "Çıkış yapmak", + "backToCart": "Sepete geri dön", + "backToCartSingle": "Geri", + "notConnectedDescription": "Ödemeleri kabul etmek için mağaza sahibinin mağazasını Stripe'a bağlaması gerekiyor", + "notConnectedHeading": "Mağaza Stripe'a bağlı değil" } } diff --git a/src/data/i18n/uk-ua.json b/src/data/i18n/uk-ua.json index c34a565b..1f1665e0 100644 --- a/src/data/i18n/uk-ua.json +++ b/src/data/i18n/uk-ua.json @@ -306,32 +306,44 @@ "features": { "clock": { "description": "Будьте на шляху з Drizzle ORM. Завантажуйте БД на Vercel, Railway, Neon тощо.", - "title": "База даних" + "title": "База даних", + "description-v2": "Підтримуйте максимальну продуктивність за допомогою Drizzle ORM, перемикаючи MySQL і Postgres на льоту. \nНасолоджуйтесь гнучкими варіантами розгортання, зокрема Planetscale, Vercel, Railway, Neon тощо.", + "title-v2": "Інтеграція бази даних: надійна та універсальна" }, "cryptography": { "description": "Взаємодія з App каталогом, маршрутизацією, макетами, завантаженням інтерфейсу користувача, маршрутами API тощо.", - "title": "Next.js 14" + "title": "Next.js 14", + "description-v2": "Відчуйте безперебійну навігацію завдяки таким розширеним функціям, як App Router, Layouts та Loading UI. \nВикористовуйте потужні маршрути API та досліджуйте інноваційні можливості, що виходять за межі базових.", + "title-v2": "Next.js 14: покращена взаємодія з користувачем" }, "currency": { "description": "Компоненти інтерфейсу користувача, створені за допомогою Radix UI та стилізовані за допомогою Tailwind CSS.", - "title": "Компоненти" + "title": "Компоненти", + "description-v2": "Створюйте приголомшливий UI з компонентами Flowbite та Shadcn UI, красиво оформлених за допомогою Radix з Tailwind CSS для сучасної естетики. \nVSCode рекомендується для повного занурення.", + "title-v2": "Компоненти: елегантні, зручні, масштабовані" }, "devtools": { "description": "Безкоштовні та платні підписки за допомогою Stripe.", "title": "Підписки", - "ambitions-description": "Перестаньте бігати від одного стартера до іншого. З Relivator ви матимете необмежені можливості. Ви можете створити все, що завгодно; всі інструменти вже підготовлені, це все для вас." + "ambitions-description": "Перестаньте бігати від одного стартера до іншого. З Relivator ви матимете необмежені можливості. Ви можете створити все, що завгодно; всі інструменти вже підготовлені, це все для вас.", + "description-v2": "Впроваджено надійну систему підписки, підтримуються безкоштовні та платні плани, оптимізовані для ефективності та масштабованості. \nОзнайомтесь з README.md проєкту, щоб дізнатися більше.", + "title-v2": "Підписки на Stripe: потужні для будь-якого бізнесу" }, "files": { "description": "Аутентифікація проміжного програмного забезпечення за допомогою NextAuth.js.", "title": "Аутентифікація", "on-the-fly": "Повне налаштування додатку на льоту", "on-the-fly-description": "Ознайомтеся з широким списком функцій у репозиторії Relivator. Легко перемикайтеся між Clerk/NextAuth.js і MySQL/PostgreSQL відповідно до вимог вашого проєкту.", - "roadmap": "Величезні амбіції та безмежні можливості" + "roadmap": "Величезні амбіції та безмежні можливості", + "description-v2": "Розгорніть універсальну систему автентифікації за допомогою NextAuth.js і Clerk, адаптовану до потреб вашої програми. \nДізнайтеся більше у файлі .env.example, і все готово.", + "title-v2": "Безпечна автентифікація кожного користувача" }, "subtitle": "Від коду до дизайну, Relivator має функціональність, яка надихає ваші веб-проєкти.", "text": { "description": "Легко керуйте програмою за допомогою серверних і клієнтських компонентів, та багато більшого.", - "title": "React 18" + "title": "React 18", + "description-v2": "Легко керуйте своєю програмою за допомогою серверних і клієнтських компонентів. \nВикористовуйте передові хуки та досліджуйте низку додаткових функцій для більш плавної розробки.", + "title-v2": "React 18: оптимізований сучасний розвиток" }, "title": "Функціонал" }, @@ -356,7 +368,12 @@ "things": { "linkText": "Перейти до списку" }, - "title": "Відкрийте для себе найважливіше з React, Next.js тощо. Спеціально для вас." + "title": "Відкрийте для себе найважливіше з React, Next.js тощо. Спеціально для вас.", + "buy-now": "Купити зараз", + "footer-cta": "Бажаєте продавати свої продукти?", + "get-started-btn": "Почати", + "main-cta": "Завантажити Relivator", + "sell-now": "Продати зараз" }, "meta": { "description": "Next.js 14 Starter", @@ -727,5 +744,41 @@ }, "contact": { "submit": "Надіслати" + }, + "faq": { + "1": { + "details": "Відвідайте файл README.md у репозиторії Relivator GitHub, де ви завжди знайдете найновішу інформацію про проєкт разом із простими інструкціями щодо встановлення.", + "summary": "Як я можу це все встановити та швиденько почати створювати?" + }, + "2": { + "details": "Відповідь проста: щоб врятувати ваш час, щоб ви перестали бігати від одного стартеру до іншого. \nФактично, ви можете припинити пошук ідеального стартеру прямо зараз. \nЗ Relivator ви відкриваєте необмежені можливості. \nВи можете створити все, що забажаєте; \nвсі необхідні інструменти вже підготовлені, саме для вас.", + "summary": "Чому я повинен вибрати Relivator як свій Next.js 14 стартер?" + }, + "3": { + "details": "Розробка чогось такого амбітного, як Relivator, очевидно, потребує багато часу, особливо тому, що проєкт розробляє лише одна людина. \nРозробку можна значно прискорити, найнявши додаткових розробників. \nТому я, @blefnk Nazarii Korniienko, буду безмежно вдячний кожному, хто зможе пожертвувати на проєкт будь-яку суму. \nБудь ласка, зверніться до сторінки репозиторію, щоб побачити Patreon та інші платформи. \nНаперед всім велике дякую!", + "summary": "Чи можливо якось прискорити випуск Relivator v2.0?" + } + }, + "demo": { + "aria-label-goto": "Йти до", + "launch": "Запустити демо" + }, + "metadata": { + "title": { + "home": "Головна" + } + }, + "checkout": { + "CartDetails": "Подробиці", + "Demo": "Можна використовувати дані тесту: 4242424242424242 | \n12/34 | \n567", + "Description": "Оформіть замовлення з елементами кошика", + "EmptyCartDescription": "Додайте товари в кошик для оплати", + "EmptyCartHeading": "Ваш кошик порожній", + "Pay": "Заплатити", + "Title": "Checkout", + "backToCart": "Назад до кошика", + "backToCartSingle": "Назад", + "notConnectedDescription": "Власник магазину повинен підключити свій магазин до Stripe, щоб приймати платежі", + "notConnectedHeading": "Магазин не підключений до Stripe" } } diff --git a/src/data/i18n/zh-cn.json b/src/data/i18n/zh-cn.json index 00a2f767..a3e466f2 100644 --- a/src/data/i18n/zh-cn.json +++ b/src/data/i18n/zh-cn.json @@ -9,32 +9,44 @@ "features": { "clock": { "description": "通过即时切换 MySQL 和 Postgres, 使用 Drizzle ORM 保持最佳性能。\n享受灵活的部署选项, 包括 Planetscale、Vercel、Railway、Neon 等。", - "title": "数据库集成: 强大且多功能" + "title": "数据库集成: 强大且多功能", + "description-v2": "通过即时切换 MySQL 和 Postgres,使用 Drizzle ORM 保持最佳性能。\n享受灵活的部署选项,包括 Planetscale、Vercel、Railway、Neon 等。", + "title-v2": "数据库集成:强大且多功能" }, "cryptography": { "description": "通过 App Router、布局和加载 UI 等高级功能体验无缝导航。\n利用强大的 API 路线并探索基础之外的创新功能。", - "title": "Next.js 14: 增强的用户体验" + "title": "Next.js 14: 增强的用户体验", + "description-v2": "通过 App Router、布局和加载 UI 等高级功能体验无缝导航。\n利用强大的 API 路线并探索基础之外的创新功能。", + "title-v2": "Next.js 14:增强的用户体验" }, "currency": { "description": "使用基于 Radix 和 Shadcn UI 的组件制作令人惊叹的 UI, 并使用 Tailwind CSS 进行精美的设计, 以实现现代美学。\n建议使用 VSCode 以获得完整的沉浸式体验。", - "title": "组成部分: 优雅" + "title": "组成部分: 优雅", + "description-v2": "使用基于 Radix 和 Shadcn UI 的组件制作令人惊叹的 UI,并使用 Tailwind CSS 进行精美的设计,以实现现代美学。\n建议使用 VSCode 以获得完整的沉浸式体验。", + "title-v2": "组成部分:优雅" }, "devtools": { "ambitions-description": "停止从一个启动器运行到下一个启动器。\n有了 Relivator, 您将拥有无限的可能性。\n你可以创造任何你想要的东西;\n所有的工具都已经为您准备好了。", "description": "实施了强大的订阅系统, 支持免费和付费计划, 并针对效率和可扩展性进行了优化。\n学习该项目的 README.md 以了解更多信息。", - "title": "Stripe 订阅: 功能强大" + "title": "Stripe 订阅: 功能强大", + "description-v2": "实施了强大的订阅系统,支持免费和付费计划,并针对效率和可扩展性进行了优化。\n学习该项目的 README.md 以了解更多信息。", + "title-v2": "Stripe 订阅:功能强大" }, "files": { "description": "使用 NextAuth.js 和 Clerk 部署多功能身份验证系统, 根据您的应用程序需求量身定制。\n在 .env.example 文件中了解更多信息, 然后您就可以开始了。", "on-the-fly": "完全动态定制", "on-the-fly-description": "深入了解我们项目存储库中的广泛功能列表。\n轻松在 Clerk/NextAuth.js 和 MySQL/PostgreSQL 之间切换, 以满足您的项目需求。", "roadmap": "远大的抱负: 无限的可能性", - "title": "用户身份验证: 安全" + "title": "用户身份验证: 安全", + "description-v2": "使用 NextAuth.js 和 Clerk 部署多功能身份验证系统,根据您的应用程序需求量身定制。\n在 .env.example 文件中了解更多信息,然后您就可以开始了。", + "title-v2": "用户身份验证:安全" }, "subtitle": "从代码到设计, Relivator 的功能可以增强您的 Web 项目。", "text": { "description": "使用服务器和客户端组件轻松操作您的应用程序。\n利用高级挂钩并探索一系列附加功能, 以获得更流畅的开发体验。", - "title": "React 18: 简化的现代开发" + "title": "React 18: 简化的现代开发", + "description-v2": "使用服务器和客户端组件轻松操作您的应用程序。\n利用高级挂钩并探索一系列附加功能,以获得更流畅的开发体验。", + "title-v2": "React 18:简化的现代开发" }, "title": "特征" }, @@ -58,7 +70,12 @@ "things": { "linkText": "前往列表" }, - "title": "探索 React、Next.js 等的重要工具。\n专为您量身定制。" + "title": "探索 React、Next.js 等的重要工具。\n专为您量身定制。", + "buy-now": "立即购买", + "footer-cta": "您想出售您的产品吗?", + "get-started-btn": "开始使用", + "main-cta": "下载入门版", + "sell-now": "立即出售" }, "DataTable": { "block": "堵塞", @@ -727,5 +744,41 @@ }, "contact": { "submit": "提交" + }, + "faq": { + "1": { + "details": "请访问 Relivator GitHub 存储库中的 README.md 文件,您始终可以在其中找到有关该项目的最新信息以及简单的安装说明。", + "summary": "如何安装所有内容并立即开始?" + }, + "2": { + "details": "答案很简单:防止你在不同的首发之间跳来跳去。\n事实上,您现在可以停止搜索。\n有了 Relivator,您将拥有无限的可能性。\n你可以创造任何你想要的东西;\n所有必要的工具都已经为您准备好了。", + "summary": "为什么我应该选择 Relivator 作为我的 Next.js 14 入门版?" + }, + "3": { + "details": "开发像 Relivator 这样雄心勃勃的项目显然需要花费大量时间,特别是因为该项目主要由一个人开发。\n通过雇用更多的开发人员可以显着加快开发速度。\n因此,我,@blefnk Nazarii Korniienko,将非常感谢任何能够为该项目捐赠任何金额的人。\n请参阅存储库页面以查看 Patreon 和其他平台。\n提前向大家表示衷心的感谢!", + "summary": "是否可以加快 Relivator v2.0 的发布速度?" + } + }, + "demo": { + "aria-label-goto": "去", + "launch": "启动演示" + }, + "metadata": { + "title": { + "home": "家" + } + }, + "checkout": { + "CartDetails": "细节", + "Demo": "可用测试数据:4242424242424242 | \n12/34 | 12/34\n第567章", + "Description": "结帐您的购物车商品", + "EmptyCartDescription": "将商品添加到购物车以结账", + "EmptyCartHeading": "您的购物车是空的", + "Pay": "支付", + "Title": "查看", + "backToCart": "返回购物车", + "backToCartSingle": "后退", + "notConnectedDescription": "店主需要将他们的商店连接到 Stripe 才能接受付款", + "notConnectedHeading": "商店未连接到 Stripe" } } diff --git a/src/forms/add-product-form.tsx b/src/forms/add-product-form.tsx index 6d947465..db36bc15 100644 --- a/src/forms/add-product-form.tsx +++ b/src/forms/add-product-form.tsx @@ -292,7 +292,6 @@ export function AddProductForm({ storeId }: AddProductFormProps) { {files?.length ?
{files.map((file, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: {files.map((file, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: { + // Load messages for the current locale + const primaryMessages: AbstractIntlMessages = + localeMessages[locale] || localeMessages["en-us"]; + + // Load messages for the fallback locale + const fallbackMessages: AbstractIntlMessages = localeMessages["en-us"]; + + // Merge primary locale messages with fallback locale messages + const messages = deepmerge(fallbackMessages, primaryMessages); + // When using Turbopack we enable HMR for locale // This approach also works fine without --turbo - const messages: AbstractIntlMessages = - localeMessages[locale] || localeMessages["en-us"]; return { messages }; }); diff --git a/src/indicators-error.tsx b/src/indicators-error.tsx index 9ea7c528..bad41cae 100644 --- a/src/indicators-error.tsx +++ b/src/indicators-error.tsx @@ -154,7 +154,6 @@ export function ShowInfo({ {" "} {isImportantVarsWithoutKeys.map((varName, index) => ( key={index} className="text-sm text-red-900 dark:text-red-400" > diff --git a/src/islands/commerce/pricing-modules.tsx b/src/islands/commerce/pricing-modules.tsx index 289f9cb9..6ebda71d 100644 --- a/src/islands/commerce/pricing-modules.tsx +++ b/src/islands/commerce/pricing-modules.tsx @@ -51,7 +51,6 @@ export const Pricing = ({
    {features.map((feature, index) => ( - // biome-ignore lint/suspicious/noArrayIndexKey:
  • diff --git a/src/islands/file-dialog.tsx b/src/islands/file-dialog.tsx index 40476e44..ac5ccf7c 100644 --- a/src/islands/file-dialog.tsx +++ b/src/islands/file-dialog.tsx @@ -180,7 +180,6 @@ export function FileDialog({

    {files?.map((file, i) => ( key={i} i={i} files={files} diff --git a/src/islands/message.tsx b/src/islands/message.tsx index aecfc92d..d69a949b 100644 --- a/src/islands/message.tsx +++ b/src/islands/message.tsx @@ -1,4 +1,3 @@ -/* eslint-disable jsdoc/check-param-names */ "use client"; import type { ReactElement } from "react"; @@ -28,7 +27,7 @@ export function IntlMessage({ variables, }: IntlMessageProps): ReactElement | null { const t = useTranslations(); - let translation; + let translation: string; // Trying to translate by // using the provided id. try { diff --git a/src/islands/modules/cards/checkout-card.tsx b/src/islands/modules/cards/checkout-card.tsx index 9f1e7bb2..bc77abfd 100644 --- a/src/islands/modules/cards/checkout-card.tsx +++ b/src/islands/modules/cards/checkout-card.tsx @@ -13,12 +13,11 @@ import { Separator } from "~/islands/primitives/separator"; import { Link } from "~/navigation"; import { getCartAction } from "~/server/actions/cart"; -interface CheckoutCardProperties { +type CheckoutCardProperties = { storeId: number; -} +}; export async function CheckoutCard({ storeId }: CheckoutCardProperties) { - // console.log("CheckoutCard's await getCartAction"); const cartLineItems = await getCartAction(storeId); let totalQuantity = 0; @@ -56,8 +55,10 @@ export async function CheckoutCard({ storeId }: CheckoutCardProperties) { } } - // console.log("totalQuantity:", totalQuantity); - // console.log("totalPrice:", totalPrice); + // If totalQuantity is 0, don't render the card + if (totalQuantity === 0) { + return null; + } return ( {Array.from({ length: 1 }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: {Array.from({ length: columnCount }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: @@ -54,10 +52,8 @@ export function DataTableLoading({ {Array.from({ length: rowCount }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: {Array.from({ length: columnCount }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: diff --git a/src/islands/navigation/carousel-cards.tsx b/src/islands/navigation/carousel-cards.tsx index 3fbaac1e..46a26044 100644 --- a/src/islands/navigation/carousel-cards.tsx +++ b/src/islands/navigation/carousel-cards.tsx @@ -14,7 +14,6 @@ export function CarouselCards() { {Array.from({ length: 5 }).map((_, index) => ( - // biome-ignore lint/suspicious/noArrayIndexKey:
    diff --git a/src/islands/navigation/main-menu.tsx b/src/islands/navigation/main-menu.tsx index 22d8c3e6..d07080f5 100644 --- a/src/islands/navigation/main-menu.tsx +++ b/src/islands/navigation/main-menu.tsx @@ -118,7 +118,6 @@ export function MainMenu({ items }: MainMenuProps) {