diff --git a/.vscode/settings.json b/.vscode/settings.json
index 94282cdd5..518734931 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -12,5 +12,10 @@
"python.testing.promptToConfigure": false,
"cSpell.enableFiletypes": [
"!python"
- ]
+ ],
+ "i18n-ally.localesPaths": "frontend/src/locales",
+ "i18n-ally.enabledFrameworks": [
+ "vue"
+ ],
+ "i18n-ally.keystyle": "nested"
}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index b18d4febd..4443f1f47 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1089,6 +1089,16 @@
"postcss": "^7.0.0"
}
},
+ "@intlify/vue-i18n-loader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-loader/-/vue-i18n-loader-1.0.0.tgz",
+ "integrity": "sha512-y7LlpKEQ01u7Yq14l4VNlbFYEHMmSEH1QXXASOMWspj9ZcIdCebhhvHCHqk5Oy5Epw3PtoxyRJNpb6Wle5udgA==",
+ "dev": true,
+ "requires": {
+ "js-yaml": "^3.13.1",
+ "json5": "^2.1.1"
+ }
+ },
"@mrmlnc/readdir-enhanced": {
"version": "2.2.1",
"resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz",
@@ -11028,6 +11038,39 @@
"resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1603223959931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz",
"integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM="
},
+ "vue-cli-plugin-i18n": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vue-cli-plugin-i18n/-/vue-cli-plugin-i18n-1.0.1.tgz",
+ "integrity": "sha512-sLo6YzudaWgn5dOMvrKixE5bb/onYGxcxm+0YexqoOx0QtR+7hZ/P5WPFBMM9v/2i1ec2YYe2PvKTBel7KE+tA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "deepmerge": "^4.2.0",
+ "dotenv": "^8.2.0",
+ "flat": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "vue": "^2.6.11",
+ "vue-i18n": "^8.17.0",
+ "vue-i18n-extract": "1.0.2"
+ },
+ "dependencies": {
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
"vue-cli-plugin-vuetify": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.0.8.tgz",
@@ -11107,6 +11150,11 @@
"resolved": "https://registry.npmjs.org/vue-html-to-paper/-/vue-html-to-paper-1.3.1.tgz",
"integrity": "sha512-5IdAPUgStfpVHfcG6nXD0FbUB1onWpvwVD+OZ00jJpy3qaRPkaGD7fFIvYgBB9YPkr0VK065LayEvmGmkkfhaQ=="
},
+ "vue-i18n": {
+ "version": "8.22.3",
+ "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.22.3.tgz",
+ "integrity": "sha512-Vhyx7sZEmmW/aZLkzSlXei08Rv3hTondx4J9wbOjnThocTIK1QiXV6QRdT4BTnhT24JixDSf6kGkxqCXSaJ3Jw=="
+ },
"vue-loader": {
"version": "15.9.5",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.5.tgz?cache=0&sync_timestamp=1605670886675&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.5.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 9e33391e2..d9c1bbf82 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -5,7 +5,8 @@
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
- "lint": "vue-cli-service lint"
+ "lint": "vue-cli-service lint",
+ "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'"
},
"dependencies": {
"axios": "^0.21.0",
@@ -15,11 +16,13 @@
"vue": "^2.6.11",
"vue-cookies": "^1.7.4",
"vue-html-to-paper": "^1.3.1",
+ "vue-i18n": "^8.22.3",
"vue-router": "^3.4.9",
"vuetify": "^2.3.21",
"vuex": "^3.6.0"
},
"devDependencies": {
+ "@intlify/vue-i18n-loader": "^1.0.0",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
@@ -28,6 +31,7 @@
"eslint-plugin-vue": "^6.2.2",
"sass": "^1.30.0",
"sass-loader": "^8.0.0",
+ "vue-cli-plugin-i18n": "~1.0.1",
"vue-cli-plugin-vuetify": "^2.0.8",
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.3.0"
diff --git a/frontend/src/components/AddRecipe.vue b/frontend/src/components/AddRecipe.vue
index da53c0e0a..892cf6a58 100644
--- a/frontend/src/components/AddRecipe.vue
+++ b/frontend/src/components/AddRecipe.vue
@@ -2,16 +2,15 @@
- From URL
+ {{ $t('new-recipe.from-url') }}
-
+
- Looks like there was an error parsing the URL. Check the log and
- debug/last_recipe.json to see what went wrong.
+ {{ $t('new-recipe.error-message') }}
@@ -19,7 +18,7 @@
- Submit
+ {{ $t('general.submit') }}
diff --git a/frontend/src/components/Admin/Admin.vue b/frontend/src/components/Admin/Admin.vue
index ed6948c14..dc314c046 100644
--- a/frontend/src/components/Admin/Admin.vue
+++ b/frontend/src/components/Admin/Admin.vue
@@ -1,26 +1,23 @@
-
- A New Version of Mealie is Avaiable,
-
- Visit the Repo
-
+
+
- Version: {{ version }} | Latest: {{ latestVersion }} ·
+ {{$t('settings.version-latest', {current: version, latest: latestVersion})}} ·
- Explore the Docs
+ {{$t('settings.explore-the-docs')}}
·
- Contribute
+ {{$t('settings.contribute')}}
diff --git a/frontend/src/components/Admin/Backup.vue b/frontend/src/components/Admin/Backup.vue
index e986a4385..2cbb86f0c 100644
--- a/frontend/src/components/Admin/Backup.vue
+++ b/frontend/src/components/Admin/Backup.vue
@@ -1,34 +1,29 @@
- Backup and Exports
+ {{$t('settings.backup-and-exports')}}
- Backups are exported in standard JSON format along with all the images
- stored on the file system. In your backup folder you'll find a .zip file
- that contains all of the recipe JSON and images from the database.
- Additionally, if you selected a markdown file, those will also be stored
- in the .zip file. To import a backup, it must be located in your backups
- folder. Automated backups are done each day at 3:00 AM.
+ {{$t('settings.backup-info')}}
-
+
- Backup Recipes
+ {{$t('settings.backup-recipes')}}
@@ -38,22 +33,22 @@
- Import Backup
+ {{$t('settings.import-backup')}}
- Delete Backup
+ {{$t('settings.delete-backup')}}
diff --git a/frontend/src/components/Admin/Migration.vue b/frontend/src/components/Admin/Migration.vue
index f792abcce..a21091268 100644
--- a/frontend/src/components/Admin/Migration.vue
+++ b/frontend/src/components/Admin/Migration.vue
@@ -1,26 +1,25 @@
- Recipe Migration
+ {{$t('migration.recipe-migration')}}
- Currently Chowdown via public Repo URL is the only supported type of
- migration
+ {{$t('migration.currently-chowdown-via-public-repo-url-is-the-only-supported-type-of-migration')}}
-
+
- Migrate
+ {{$t('migration.migrate')}}
- Failed Recipes
+ {{$t('migration.failed-recipes')}}
{{ fail }}
@@ -28,7 +27,7 @@
- Failed Images
+ {{$t('migration.failed-images')}}
{{ fail }}
diff --git a/frontend/src/components/Admin/SFTP.vue b/frontend/src/components/Admin/SFTP.vue
index bc90342e1..bcc23a30a 100644
--- a/frontend/src/components/Admin/SFTP.vue
+++ b/frontend/src/components/Admin/SFTP.vue
@@ -1,6 +1,6 @@
- SFTP Settings
+ {{$t('settings.sftp-settings')}}
diff --git a/frontend/src/components/Admin/Theme.vue b/frontend/src/components/Admin/Theme.vue
index 392f58a9a..80c57c33c 100644
--- a/frontend/src/components/Admin/Theme.vue
+++ b/frontend/src/components/Admin/Theme.vue
@@ -1,18 +1,16 @@
- Theme Settings
+ {{$t('settings.theme.theme-settings')}}
- Select a theme from the dropdown or create a new theme. Note that the
- default theme will be served to all users who have not set a theme
- preference.
+ {{$t('settings.theme.select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference')}}
@@ -20,14 +18,14 @@
@@ -37,33 +35,33 @@
- Delete
+ {{$t('general.delete')}}
-
+
-
+
-
+
-
+
-
+
-
+
@@ -73,7 +71,7 @@
- Save Theme
+ {{$t('settings.theme.save-theme')}}
diff --git a/frontend/src/components/Admin/ThemeUI/ColorPicker.vue b/frontend/src/components/Admin/ThemeUI/ColorPicker.vue
index 8c55774c4..6da100082 100644
--- a/frontend/src/components/Admin/ThemeUI/ColorPicker.vue
+++ b/frontend/src/components/Admin/ThemeUI/ColorPicker.vue
@@ -5,7 +5,7 @@
- {{ buttonText }} Color
+ {{ buttonText }} {{$t('settings.color')}}
@@ -26,8 +26,8 @@
- Swatches
- Select
+ {{$t('settings.swatches')}}
+ {{$t('general.select')}}
diff --git a/frontend/src/components/Admin/ThemeUI/NewTheme.vue b/frontend/src/components/Admin/ThemeUI/NewTheme.vue
index 93dba2599..cd331a63c 100644
--- a/frontend/src/components/Admin/ThemeUI/NewTheme.vue
+++ b/frontend/src/components/Admin/ThemeUI/NewTheme.vue
@@ -1,14 +1,14 @@
-
New
+
{{$t('general.new')}}
- Add a New Theme
+ {{$t('settings.add-a-new-theme')}}
- Create
+ {{$t('general.create')}}
diff --git a/frontend/src/components/Admin/Users.vue b/frontend/src/components/Admin/Users.vue
index f8d0653fe..e9f534214 100644
--- a/frontend/src/components/Admin/Users.vue
+++ b/frontend/src/components/Admin/Users.vue
@@ -1,6 +1,6 @@
- User Settings
+ {{$t('settings.user-settings')}}
diff --git a/frontend/src/components/Admin/Webhooks.vue b/frontend/src/components/Admin/Webhooks.vue
index 5f433e6a8..3ff117ae7 100644
--- a/frontend/src/components/Admin/Webhooks.vue
+++ b/frontend/src/components/Admin/Webhooks.vue
@@ -1,21 +1,17 @@
- Meal Planner Webhooks
+ {{$t('settings.webhooks.meal-planner-webhooks')}}
-
- The URLs listed below will recieve webhooks containing the recipe data
- for the meal plan on it's scheduled day. Currently Webhooks will execute
- at {{ time }}
-
+
@@ -23,7 +19,7 @@
- Test Webhooks
+ {{$t('settings.webhooks.test-webhooks')}}
@@ -36,7 +32,7 @@
@@ -51,7 +47,7 @@
- Save Webhooks
+ {{$t('settings.webhooks.save-webhooks')}}
diff --git a/frontend/src/components/Admin/Webhooks/TimePicker.vue b/frontend/src/components/Admin/Webhooks/TimePicker.vue
index 1390fb8b3..eda11de4a 100644
--- a/frontend/src/components/Admin/Webhooks/TimePicker.vue
+++ b/frontend/src/components/Admin/Webhooks/TimePicker.vue
@@ -9,7 +9,7 @@
- Cancel
- OK
+ {{$t('general.cancel')}}
+ {{$t('general.ok')}}
diff --git a/frontend/src/components/MealPlan/EditPlan.vue b/frontend/src/components/MealPlan/EditPlan.vue
index 61cb58f7e..8fd043146 100644
--- a/frontend/src/components/MealPlan/EditPlan.vue
+++ b/frontend/src/components/MealPlan/EditPlan.vue
@@ -1,13 +1,13 @@
- Edit Meal Plan
+ {{$t('meal-plan.edit-meal-plan')}}
- Update
+ {{$t('general.update')}}
diff --git a/frontend/src/components/MealPlan/MealPlanner.vue b/frontend/src/components/MealPlan/MealPlanner.vue
index 5a3ff07ff..6126864c3 100644
--- a/frontend/src/components/MealPlan/MealPlanner.vue
+++ b/frontend/src/components/MealPlan/MealPlanner.vue
@@ -8,7 +8,7 @@
- Meal Plans
+ {{$t('meal-plan.meal-plans')}}
- Edit
+ {{$t('general.edit')}}
- Delete
+ {{$t('general.delete')}}
diff --git a/frontend/src/components/MealPlan/MealSelect.vue b/frontend/src/components/MealPlan/MealSelect.vue
index d1ba90302..53beb0b96 100644
--- a/frontend/src/components/MealPlan/MealSelect.vue
+++ b/frontend/src/components/MealPlan/MealSelect.vue
@@ -2,7 +2,7 @@
- Choose a Recipe
+ {{$t('meal-plan.choose-a-recipe')}}
-
- Search for your Favorite
- Recipe
+
@@ -44,8 +42,8 @@
- Close
- Select
+ {{$t('general.close')}}
+ {{$t('general.select')}}
diff --git a/frontend/src/components/MealPlan/NewMeal.vue b/frontend/src/components/MealPlan/NewMeal.vue
index fe9f574e5..cf741697f 100644
--- a/frontend/src/components/MealPlan/NewMeal.vue
+++ b/frontend/src/components/MealPlan/NewMeal.vue
@@ -1,7 +1,7 @@
- Create a New Meal Plan
+ {{$t('meal-plan.create-a-new-meal-plan')}}
@@ -18,7 +18,7 @@
- Random
+ {{$t('general.random')}}
- Save
+ {{$t('general.save')}}
diff --git a/frontend/src/components/MealPlan/ThisWeek.vue b/frontend/src/components/MealPlan/ThisWeek.vue
index 75da6b7dd..0107d5618 100644
--- a/frontend/src/components/MealPlan/ThisWeek.vue
+++ b/frontend/src/components/MealPlan/ThisWeek.vue
@@ -21,7 +21,7 @@
text
@click="$router.push(`/recipe/${meal.slug}`)"
>
- View Recipe
+ {{$t('recipe.view-recipe')}}
diff --git a/frontend/src/components/Page404.vue b/frontend/src/components/Page404.vue
index 9f0ea5689..f36fdc917 100644
--- a/frontend/src/components/Page404.vue
+++ b/frontend/src/components/Page404.vue
@@ -5,9 +5,9 @@
- 404 No Page Found
+ {{$t('404.page-not-found')}}
- Take me Home
+ {{$t('404.take-me-home')}}
diff --git a/frontend/src/components/RecipeEditor/BulkAdd.vue b/frontend/src/components/RecipeEditor/BulkAdd.vue
index 602604ffa..72439417f 100644
--- a/frontend/src/components/RecipeEditor/BulkAdd.vue
+++ b/frontend/src/components/RecipeEditor/BulkAdd.vue
@@ -10,17 +10,16 @@
v-on="on"
@click="inputText = ''"
>
- Bulk Add
+ {{$t('new-recipe.bulk-add')}}
- Bulk Add
+ {{$t('new-recipe.bulk-add')}}
- Paste in your recipe data. Each line will be treated as an item in a
- list
+ {{$t('new-recipe.paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list')}}
@@ -29,7 +28,7 @@
- Save
+ {{$t('general.save')}}
diff --git a/frontend/src/components/RecipeEditor/DetailsView.vue b/frontend/src/components/RecipeEditor/DetailsView.vue
index 123d9dced..31ac37b5f 100644
--- a/frontend/src/components/RecipeEditor/DetailsView.vue
+++ b/frontend/src/components/RecipeEditor/DetailsView.vue
@@ -2,7 +2,7 @@
- Ingredients
+ {{$t('recipe.ingredients')}}
@@ -20,7 +20,7 @@
mdi-plus
- Categories
+ {{$t('recipe.categories')}}
- Tags
+ {{$t('recipe.tags')}}
@@ -49,7 +49,7 @@
- Instructions
+ {{$t('recipe.instructions')}}
- Step: {{ index + 1 }}
+ {{$t('recipe.step-index', { step: index + 1})}}
diff --git a/frontend/src/components/RecipeEditor/EditRecipe.vue b/frontend/src/components/RecipeEditor/EditRecipe.vue
index 83c7a00bf..52a47a1c9 100644
--- a/frontend/src/components/RecipeEditor/EditRecipe.vue
+++ b/frontend/src/components/RecipeEditor/EditRecipe.vue
@@ -6,21 +6,21 @@
-
+
-
+
-
+
@@ -34,7 +34,7 @@
- Ingredients
+ {{$t('recipe.ingredients')}}
mdi-delete
@@ -61,7 +61,7 @@
-
Categories
+
{{$t('recipe.categories')}}
-
Tags
+
{{$t('recipe.tags')}}
-
Notes
+
{{$t('recipe.notes')}}
-
+
@@ -134,7 +134,7 @@
- Instructions
+ {{$t('recipe.instructions')}}
mdi-delete Step: {{ index + 1 }}{{ $t('recipe.step-index', {step: index + 1}) }}
- Ingredients
+ {{$t('recipe.ingredients')}}
-
Categories
+
{{$t('recipe.categories')}}
-
Tags
+ {{$t('recipe.tags')}}
- Notes
+ {{$t('recipe.notes')}}
- Instructions
+ {{$t('recipe.instructions')}}
- Step: {{ index + 1 }}
+ {{ $t('recipe.step-index', {step: index + 1}) }}
{{ step.text }}
@@ -121,7 +121,7 @@
target="_blank"
class="rounded-sm mr-4"
>
- Original Recipe
+ {{$t('recipe.original-recipe')}}
diff --git a/frontend/src/components/UI/Login.vue b/frontend/src/components/UI/Login.vue
index feb09aa64..00d19b66a 100644
--- a/frontend/src/components/UI/Login.vue
+++ b/frontend/src/components/UI/Login.vue
@@ -13,20 +13,20 @@
v-model="user.name"
light="light"
prepend-icon="person"
- label="Name"
+ :label="$t('general.name')"
>
Sign in{{$t('login.sign-in')}}
Sign up{{$t('login.sign-up')}}
diff --git a/frontend/src/components/UI/Menu.vue b/frontend/src/components/UI/Menu.vue
index a03af67b1..75cb33e4a 100644
--- a/frontend/src/components/UI/Menu.vue
+++ b/frontend/src/components/UI/Menu.vue
@@ -32,26 +32,32 @@