diff --git a/README.md b/README.md index d7924a8..d6136a8 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ - [x] list option: hide completed - [x] options in cookies - [ ] Empty list message -- [ ] change lang +- [x] change lang - [ ] toasts - [ ] handle errors - [ ] list per URL diff --git a/bun.lock b/bun.lock index 0a13cf2..876827d 100644 --- a/bun.lock +++ b/bun.lock @@ -9,6 +9,7 @@ "cron-parser": "^5.6.1", "date-fns": "^4.4.0", "vue": "^3.5.38", + "vue-i18n": "^11.4.6", }, "devDependencies": { "@tailwindcss/vite": "^4.3.2", @@ -134,6 +135,14 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@intlify/core-base": ["@intlify/core-base@11.4.6", "", { "dependencies": { "@intlify/devtools-types": "11.4.6", "@intlify/message-compiler": "11.4.6", "@intlify/shared": "11.4.6" } }, "sha512-EOeHO95XESK9IFHgHeZXunsM/WBAoCA0DlaWODvx14vKmetAuS97t+l6Xe9hTUqntPpF93vtVSjjUDafw3wXMw=="], + + "@intlify/devtools-types": ["@intlify/devtools-types@11.4.6", "", { "dependencies": { "@intlify/core-base": "11.4.6", "@intlify/shared": "11.4.6" } }, "sha512-wowQPpNem56b2d43IJmqbrzG2FeBKe5f/kUGlpNuBmXs6OSqncF8m1+1lxHuW8ISZJF0ma2RkW3iLkw0g0G4VA=="], + + "@intlify/message-compiler": ["@intlify/message-compiler@11.4.6", "", { "dependencies": { "@intlify/shared": "11.4.6", "source-map-js": "^1.0.2" } }, "sha512-5nj3jULqeTAC1WovwMs1LQWgatTa2pM/rXN9T3XW8rdOtXW9ZF6/GLSNFTKDQmPLwclhPdgUWLJ/4w3fMeeC/Q=="], + + "@intlify/shared": ["@intlify/shared@11.4.6", "", {}, "sha512-m1p1HHAMLhqSpTRH7VnXdrN0CQ4y+9vunFkpLkbD8soIuBsnQdawZXqMCgvwI2UVF9Ww7sVaw7g9tV2VO7shoA=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -340,6 +349,8 @@ "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.39", "", { "dependencies": { "@vue/compiler-dom": "3.5.39", "@vue/shared": "3.5.39" } }, "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw=="], + "@vue/devtools-api": ["@vue/devtools-api@6.6.4", "", {}, "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="], + "@vue/devtools-core": ["@vue/devtools-core@8.1.5", "", { "dependencies": { "@vue/devtools-kit": "^8.1.5", "@vue/devtools-shared": "^8.1.5" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-5e5jQOEssCdZA1wlFEUkIDtb+cAOWuLNWJ52fm4PBWbF7e3oTnM2fneaL42E5lJoolAaUQ678tv/XEb3h4e86Q=="], "@vue/devtools-kit": ["@vue/devtools-kit@8.1.5", "", { "dependencies": { "@vue/devtools-shared": "^8.1.5", "birpc": "^2.6.1", "hookable": "^5.5.3", "perfect-debounce": "^2.0.0" } }, "sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA=="], @@ -800,6 +811,8 @@ "vue-eslint-parser": ["vue-eslint-parser@10.4.1", "", { "dependencies": { "debug": "^4.4.0", "eslint-scope": "^8.2.0 || ^9.0.0", "eslint-visitor-keys": "^4.2.0 || ^5.0.0", "espree": "^10.3.0 || ^11.0.0", "esquery": "^1.6.0", "semver": "^7.6.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" } }, "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA=="], + "vue-i18n": ["vue-i18n@11.4.6", "", { "dependencies": { "@intlify/core-base": "11.4.6", "@intlify/devtools-types": "11.4.6", "@intlify/shared": "11.4.6", "@vue/devtools-api": "^6.5.0" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-l0gE7Rfy0phCa5ChKYkOq543Wgd39BCK6hkktfr1Ed4D99oRkgPK9ffShASZdeC8OJxGfdWmpYoAaAH6iLEuIg=="], + "vue-tsc": ["vue-tsc@3.3.6", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.6" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "bin/vue-tsc.js" } }, "sha512-ERXGgbKSBGFUkavrJ1Iwj0ZVxKqB/5UOx65IXy7fPf2UsoI21n3ssQLwdvx8xyUGgJe9PvSZTM/FYzIdwUDPFA=="], "which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], diff --git a/package.json b/package.json index a6863d2..256ebf1 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "@lucide/vue": "^1.23.0", "cron-parser": "^5.6.1", "date-fns": "^4.4.0", - "vue": "^3.5.38" + "vue": "^3.5.38", + "vue-i18n": "^11.4.6" }, "devDependencies": { "@tailwindcss/vite": "^4.3.2", diff --git a/resources/lang/en.json b/resources/lang/en.json new file mode 100644 index 0000000..e2d4761 --- /dev/null +++ b/resources/lang/en.json @@ -0,0 +1,60 @@ +{ + "cron": { + "type": { + "one_time": "One time", + "every_day": "Every day", + "every_week": "Every week", + "every_month": "Every month", + "every_year": "Every year", + "specific": "Specific" + }, + "week": [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + ], + "month": { + "st": "st", + "nd": "nd", + "rd": "rd", + "th": "th" + }, + "year": [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ] + }, + "checked": "Checked", + "resets": "Resets", + "completed": "Completed", + "new_task_hint": "New task", + "options": { + "title": "Options", + "sort_by": "Sort by", + "sort": { + "created_at": "Creation date", + "updated_at": "Creation or update date", + "check_date": "Last check date", + "reset_date": "Next reset date", + "name": "Name" + }, + "reverse_sort": "Reverse sort", + "last_checked": "Show last checked time", + "next_reset": "Show next reset time", + "separate_completed": "Separate completed tasks below" + } +} diff --git a/resources/lang/fr.json b/resources/lang/fr.json new file mode 100644 index 0000000..5e60904 --- /dev/null +++ b/resources/lang/fr.json @@ -0,0 +1,60 @@ +{ + "cron": { + "type": { + "one_time": "Une seule fois", + "every_day": "Tous les jours", + "every_week": "Toutes les semaines", + "every_month": "Tous les mois", + "every_year": "Tous les ans", + "specific": "Spécifique" + }, + "week": [ + "Lundi", + "Mardi", + "Mercredi", + "Jeudi", + "Vendredi", + "Samedi", + "Dimanche" + ], + "month": { + "st": "", + "nd": "", + "rd": "", + "th": "" + }, + "year": [ + "Janvier", + "Février", + "Mars", + "Avril", + "Mai", + "Juin", + "Juillet", + "Août", + "Septembre", + "Octobre", + "Novembre", + "Décembre" + ] + }, + "checked": "Complété", + "resets": "Reviens", + "completed": "Complété", + "new_task_hint": "Nouvelle tâche", + "options": { + "title": "Options", + "sort_by": "Trier par", + "sort": { + "created_at": "Date de création", + "updated_at": "Date de modification", + "check_date": "Dernière completion", + "reset_date": "Prochaine réinitialisation", + "name": "Nom" + }, + "reverse_sort": "Inverser le tri", + "last_checked": "Afficher la dernière completion", + "next_reset": "Afficher la prochaine réinitialisation", + "separate_completed": "Séparer les tâches complétées plus bas" + } +} diff --git a/resources/ts/App.vue b/resources/ts/App.vue index d22201b..ab07161 100644 --- a/resources/ts/App.vue +++ b/resources/ts/App.vue @@ -1,6 +1,7 @@ - - + + Tout Doux @@ -21,5 +22,6 @@ onMounted(() => { + diff --git a/resources/ts/components/CronInput.vue b/resources/ts/components/CronInput.vue index 7c78e08..66baea9 100644 --- a/resources/ts/components/CronInput.vue +++ b/resources/ts/components/CronInput.vue @@ -63,41 +63,24 @@ watch(cron, () => { - One time (do not repeat) - Every day at - Every week on - Every month on the - Every year on - Specific + {{ $t('cron.type.one_time') }} + {{ $t('cron.type.every_day') }} + {{ $t('cron.type.every_week') }} + {{ $t('cron.type.every_month') }} + {{ $t('cron.type.every_year') }} + {{ $t('cron.type.specific') }} {{ i.toFixed(0).padStart(2, '0') }}:00 - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - Sunday + {{ $t(`cron.week.${i.toFixed(0)}`) }} - {{i}}{{ i % 10 == 1 ? 'st' : (i % 10 === 2 ? 'nd': (i % 10 === 3 ? 'rd' : 'th')) }} + {{i + 1}}{{ i % 10 == 0 ? $t('cron.month.st') : (i % 10 === 1 ? $t('cron.month.nd'): (i % 10 === 2 ? $t('cron.month.rd') : $t('cron.month.th'))) }} - January - February - March - April - May - June - July - August - September - October - November - December + {{ $t(`cron.year.${i.toFixed(0)}`) }} diff --git a/resources/ts/components/LangInput.vue b/resources/ts/components/LangInput.vue new file mode 100644 index 0000000..d200a9e --- /dev/null +++ b/resources/ts/components/LangInput.vue @@ -0,0 +1,15 @@ + + + + 🇫🇷 / 🇺🇸 + diff --git a/resources/ts/components/PageFooter.vue b/resources/ts/components/PageFooter.vue new file mode 100644 index 0000000..f688191 --- /dev/null +++ b/resources/ts/components/PageFooter.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/resources/ts/components/TaskItem.vue b/resources/ts/components/TaskItem.vue index 2e9fc78..0cd6ba5 100644 --- a/resources/ts/components/TaskItem.vue +++ b/resources/ts/components/TaskItem.vue @@ -1,9 +1,9 @@