diff --git a/frontend/components/Domain/Recipe/RecipeContextMenu.vue b/frontend/components/Domain/Recipe/RecipeContextMenu.vue index fa3aa921e..525904383 100644 --- a/frontend/components/Domain/Recipe/RecipeContextMenu.vue +++ b/frontend/components/Domain/Recipe/RecipeContextMenu.vue @@ -172,7 +172,7 @@ import RecipeDialogPrintPreferences from "./RecipeDialogPrintPreferences.vue"; import RecipeDialogShare from "./RecipeDialogShare.vue"; import { useUserApi } from "~/composables/api"; import { alert } from "~/composables/use-toast"; -import { planTypeOptions } from "~/composables/use-group-mealplan"; +import { usePlanTypeOptions } from "~/composables/use-group-mealplan"; import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe"; import { parseIngredientText } from "~/composables/recipes"; import { ShoppingListSummary } from "~/lib/api/types/group"; @@ -548,6 +548,8 @@ export default defineComponent({ state.loading = false; } + const planTypeOptions = usePlanTypeOptions(); + return { ...toRefs(state), recipeRef, diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue index b9151e2df..b7b4658dd 100644 --- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue +++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue @@ -147,7 +147,7 @@ event: 'merge-above', }, { - text: 'Upload image', + text: $tc('recipe.upload-image'), event: 'upload-image' }, { diff --git a/frontend/components/global/AppToolbar.vue b/frontend/components/global/AppToolbar.vue index cc6913838..51f8d698f 100644 --- a/frontend/components/global/AppToolbar.vue +++ b/frontend/components/global/AppToolbar.vue @@ -2,7 +2,7 @@ - Back + {{ $t('general.back') }} @@ -22,4 +22,4 @@ export default defineComponent({ \ No newline at end of file + diff --git a/frontend/composables/use-group-mealplan.ts b/frontend/composables/use-group-mealplan.ts index b3358dcd5..171450395 100644 --- a/frontend/composables/use-group-mealplan.ts +++ b/frontend/composables/use-group-mealplan.ts @@ -1,4 +1,4 @@ -import { useAsync, ref, Ref, watch } from "@nuxtjs/composition-api"; +import { useAsync, ref, Ref, watch, useContext } from "@nuxtjs/composition-api"; import { format } from "date-fns"; import { useAsyncKey } from "./use-utils"; import { useUserApi } from "~/composables/api"; @@ -8,14 +8,21 @@ type PlanOption = { text: string; value: PlanEntryType; }; +export function usePlanTypeOptions() { + const { i18n } = useContext(); -export const planTypeOptions: PlanOption[] = [ - { text: "Breakfast", value: "breakfast" }, - { text: "Lunch", value: "lunch" }, - { text: "Dinner", value: "dinner" }, - { text: "Side", value: "side" }, -]; + return [ + { text: i18n.tc("meal-plan.breakfast"), value: "breakfast" }, + { text: i18n.tc("meal-plan.lunch"), value: "lunch" }, + { text: i18n.tc("meal-plan.dinner"), value: "dinner" }, + { text: i18n.tc("meal-plan.side"), value: "side" }, + ] as PlanOption[]; +} +export function getEntryTypeText(value: PlanEntryType) { + const { i18n } = useContext(); + return i18n.tc("meal-plan." + value); +} export interface DateRange { start: Date; end: Date; diff --git a/frontend/composables/use-group-webhooks.ts b/frontend/composables/use-group-webhooks.ts index 311e26dc4..776b4341e 100644 --- a/frontend/composables/use-group-webhooks.ts +++ b/frontend/composables/use-group-webhooks.ts @@ -99,11 +99,16 @@ function pad(num: number, size: number) { return numStr; } -export function timeUTCToLocal(time: string): string { +export function timeUTC(time: string): Date { const [hours, minutes] = time.split(":"); const dt = new Date(); dt.setUTCMinutes(Number(minutes)); dt.setUTCHours(Number(hours)); + return dt; +} + +export function timeUTCToLocal(time: string): string { + const dt = timeUTC(time); return `${pad(dt.getHours(), 2)}:${pad(dt.getMinutes(), 2)}`; } diff --git a/frontend/composables/use-users/user-form.ts b/frontend/composables/use-users/user-form.ts index 317f7bfaa..10ac14461 100644 --- a/frontend/composables/use-users/user-form.ts +++ b/frontend/composables/use-users/user-form.ts @@ -1,69 +1,72 @@ +import { useContext } from "@nuxtjs/composition-api"; import { fieldTypes } from "../forms"; import { AutoFormItems } from "~/types/auto-forms"; export const useUserForm = () => { + const { i18n } = useContext(); + const userForm: AutoFormItems = [ { - section: "User Details", - label: "User Name", + section: i18n.tc("user.user-details"), + label: i18n.tc("user.user-name"), varName: "username", type: fieldTypes.TEXT, rules: ["required"], }, { - label: "Full Name", + label: i18n.tc("user.full-name"), varName: "fullName", type: fieldTypes.TEXT, rules: ["required"], }, { - label: "Email", + label: i18n.tc("user.email"), varName: "email", type: fieldTypes.TEXT, rules: ["required"], }, { - label: "Password", + label: i18n.tc("user.password"), varName: "password", disableUpdate: true, type: fieldTypes.PASSWORD, rules: ["required", "minLength:8"], }, { - label: "Authentication Method", + label: i18n.tc("user.authentication-method"), varName: "authMethod", type: fieldTypes.SELECT, - hint: "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'", + hint: i18n.tc("user.authentication-method-hint"), disableCreate: true, options: [{ text: "Mealie" }, { text: "LDAP" }], }, { - section: "Permissions", - label: "Administrator", + section: i18n.tc("user.permissions"), + label: i18n.tc("user.administrator"), varName: "admin", type: fieldTypes.BOOLEAN, rules: ["required"], }, { - label: "User can invite other to group", + label: i18n.tc("user.user-can-invite-other-to-group"), varName: "canInvite", type: fieldTypes.BOOLEAN, rules: ["required"], }, { - label: "User can manage group", + label: i18n.tc("user.user-can-manage-group"), varName: "canManage", type: fieldTypes.BOOLEAN, rules: ["required"], }, { - label: "User can organize group data", + label: i18n.tc("user.user-can-organize-group-data"), varName: "canOrganize", type: fieldTypes.BOOLEAN, rules: ["required"], }, { - label: "Enable advanced features", + label: i18n.tc("user.enable-advanced-features"), varName: "advanced", type: fieldTypes.BOOLEAN, rules: ["required"], diff --git a/frontend/lang/dateTimeFormats/en-US.json b/frontend/lang/dateTimeFormats/en-US.json index 25c6e007b..d6316dfd8 100644 --- a/frontend/lang/dateTimeFormats/en-US.json +++ b/frontend/lang/dateTimeFormats/en-US.json @@ -17,5 +17,10 @@ "weekday": "long", "hour": "numeric", "minute": "numeric" + }, + "time": { + "ampm": "short", + "hour": "numeric", + "minute": "numeric" } -} \ No newline at end of file +} diff --git a/frontend/lang/messages/en-US.json b/frontend/lang/messages/en-US.json index a4db6b14a..ba5167864 100644 --- a/frontend/lang/messages/en-US.json +++ b/frontend/lang/messages/en-US.json @@ -63,7 +63,20 @@ "scheduled": "Scheduled", "something-went-wrong": "Something Went Wrong!", "subscribed-events": "Subscribed Events", - "test-message-sent": "Test Message Sent" + "test-message-sent": "Test Message Sent", + "new-notification": "New Notification", + "event-notifiers": "Event Notifiers", + "apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)", + "enable-notifier": "Enable Notifier", + "what-events": "What events should this notifier subscribe to?", + "user-events": "User Events", + "mealplan-events": "Mealplan Events", + "when-a-user-in-your-group-creates-a-new-mealplan": "When a user in your group creates a new mealplan", + "shopping-list-events": "Shopping List Events", + "cookbook-events": "Cookbook Events", + "tag-events": "Tag Events", + "category-events": "Category Events", + "when-a-new-user-joins-your-group": "When a new user joins your group" }, "general": { "cancel": "Cancel", @@ -171,11 +184,14 @@ "this-feature-is-currently-inactive": "This feature is currently inactive", "clipboard-not-supported": "Clipboard not supported", "copied-to-clipboard": "Copied to clipboard", - "your-browser-does-not-support-clipboard": "Your browser does not support clipboard\")", + "your-browser-does-not-support-clipboard": "Your browser does not support clipboard", "copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard", "actions": "Actions", "selected-count": "Selected: {count}", - "export-all": "Export All" + "export-all": "Export All", + "refresh": "Refresh", + "upload-file": "Upload File", + "created-on-date": "Created on: {0}" }, "group": { "are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete {groupName}?", @@ -224,7 +240,11 @@ "disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields.", "general-preferences": "General Preferences", "group-recipe-preferences": "Group Recipe Preferences", - "report": "Report" + "report": "Report", + "group-management": "Group Management", + "admin-group-management": "Admin Group Management", + "admin-group-management-text": "Changes to this group will be reflected immediately.", + "group-id-value": "Group Id: {0}" }, "meal-plan": { "create-a-new-meal-plan": "Create a New Meal Plan", @@ -310,7 +330,18 @@ "mealie-pre-v1": { "description-long": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.", "title": "Mealie Pre v1.0" - } + }, + "recipe-data-migrations": "Recipe Data Migrations", + "recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.", + "choose-migration-type": "Choose Migration Type", + "tag-all-recipes": "Tag all recipes with {tag-name} tag", + "nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.", + "chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below", + "recipe-1": "Recipe 1", + "recipe-2": "Recipe 2", + "paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.", + "mealie-text": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.", + "previous-migrations": "Previous Migrations" }, "new-recipe": { "bulk-add": "Bulk Add", @@ -490,7 +521,9 @@ "recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.", "debug": "Debug", "tree-view": "Tree View", - "recipe-yield": "Recipe Yield" + "recipe-yield": "Recipe Yield", + "unit": "Unit", + "upload-image": "Upload image" }, "search": { "advanced-search": "Advanced Search", @@ -507,7 +540,8 @@ "search-placeholder": "Search...", "tag-filter": "Tag Filter", "search-hint": "Press '/'", - "advanced": "Advanced" + "advanced": "Advanced", + "auto-search": "Auto Search" }, "settings": { "add-a-new-theme": "Add a New Theme", @@ -522,7 +556,16 @@ "full-backup": "Full Backup", "import-summary": "Import Summary", "partial-backup": "Partial Backup", - "unable-to-delete-backup": "Unable to Delete Backup." + "unable-to-delete-backup": "Unable to Delete Backup.", + "experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.", + "not-crossed-version": "this backup mechanism is not cross-version and therefore cannot be used to migrate data between versions", + "backup-restore": "Backup Restore", + "back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.", + "cannot-be-undone": "This action cannot be undone - use with caution.", + "postgresql-note": "If you are using PostGreSQL, please review the {backup-restore-process} prior to restoring.", + "backup-restore-process-in-the-documentation": "backup/restore process in the documentation", + "irreversible-acknowledgment": "I understand that this action is irreversible, destructive and may cause data loss", + "restore-backup": "Restore Backup" }, "backup-and-exports": "Backups", "change-password": "Change Password", @@ -585,7 +628,9 @@ "api-tokens": "API Tokens", "copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.", "create-an-api-token": "Create an API Token", - "token-name": "Token Name" + "token-name": "Token Name", + "generate": "Generate", + "you-have-token-count": "You have no active tokens.|You have one active token.|You have {count} active tokens." }, "toolbox": { "assign-all": "Assign All", @@ -604,8 +649,39 @@ "webhook-url": "Webhook URL", "webhooks-caps": "WEBHOOKS", "webhooks": "Webhooks", - "webhook-name": "Webhook Name" - } + "webhook-name": "Webhook Name", + "description": "The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- minutes of the scheduled." + }, + "bug-report": "Bug Report", + "bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.", + "tracker": "Tracker", + "configuration": "Configuration", + "docker-volume": "Docker Volume", + "docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.", + "volumes-are-misconfigured": "Volumes are misconfigured", + "volumes-are-configured-correctly": "Volumes are configured correctly.", + "status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.", + "validate": "Validate", + "email-configuration-status": "Email Configuration Status", + "ready": "Ready", + "not-ready": "Not Ready - Check Environmental Variables", + "succeeded": "Succeeded", + "failed": "Failed", + "general-about": "General About", + "application-version": "Application Version", + "application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).", + "mealie-is-up-to-date": "Mealie is up to date", + "secure-site": "Secure Site", + "secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.", + "secure-site-success-text": "Site is accessed by localhost or https", + "server-side-base-url": "Server Side Base URL", + "server-side-base-url-error-text": "`BASE_URL` is still the default value on API Server. This will cause issues with notifications links generated on the server for emails, etc.", + "server-side-base-url-success-text": "Server Side URL does not match the default", + "ldap-ready": "LDAP Ready", + "ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.", + "ldap-ready-success-text": "Required LDAP variables are all set.", + "build": "Build", + "recipe-scraper-version": "Recipe Scraper Version" }, "shopping-list": { "all-lists": "All Lists", @@ -759,7 +835,20 @@ "good": "Good", "strong": "Strong", "very-strong": "Very Strong" - } + }, + "user-management": "User Management", + "reset-locked-users": "Reset Locked Users", + "admin-user-creation": "Admin User Creation", + "user-details": "User Details", + "user-name": "User Name", + "authentication-method": "Authentication Method", + "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie", + "permissions": "Permissions", + "administrator": "Administrator", + "user-can-invite-other-to-group": "User can invite other to group", + "user-can-manage-group": "User can manage group", + "user-can-organize-group-data": "User can organize group data", + "enable-advanced-features": "Enable advanced features" }, "language-dialog": { "translated": "translated", @@ -811,7 +900,7 @@ "confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.", "the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.", "settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.", - "selected-length-recipe-s-settings-will-be-updated": "{0} recipe(s) settings will be updated.", + "selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.", "recipe-data": "Recipe Data", "recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.", "recipe-columns": "Recipe Columns", @@ -832,7 +921,8 @@ "data-management-description": "Select which data set you want to make changes to.", "select-data": "Select Data", "select-language": "Select Language", - "columns": "Columns" + "columns": "Columns", + "combine": "Combine" }, "user-registration": { "user-registration": "User Registration", @@ -848,7 +938,8 @@ "validation": { "group-name-is-taken": "Group name is taken", "username-is-taken": "Username is taken", - "email-is-taken": "Email is taken" + "email-is-taken": "Email is taken", + "this-field-is-required": "This Field is Required" }, "export": { "export": "Export", @@ -943,7 +1034,21 @@ }, "mainentance": { "actions-title": "Actions" - } + }, + "ingredients-natural-language-processor": "Ingredients Natural Language Processor", + "ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.", + "ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.", + "nlp": "NLP", + "brute": "Brute", + "show-individual-confidence": "Show individual confidence", + "ingredient-text": "Ingredient Text", + "average-confident": "{0} Confident", + "try-an-example": "Try an example", + "parser": "Parser", + "background-tasks": "Background Tasks", + "background-tasks-description": "Here you can view all the running background tasks and their status", + "no-logs-found": "No Logs Found", + "tasks": "Tasks" }, "profile": { "welcome-user": "👋 Welcome, {0}", @@ -979,7 +1084,14 @@ "preferences": "Preferences", "show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)", "back-to-profile": "Back to Profile", - "looking-for-privacy-settings": "Looking for Privacy Settings?" + "looking-for-privacy-settings": "Looking for Privacy Settings?", + "manage-your-api-tokens": "Manage Your API Tokens", + "manage-user-profile": "Manage User Profile", + "manage-cookbooks": "Manage Cookbooks", + "manage-members": "Manage Members", + "manage-webhooks": "Manage Webhooks", + "manage-notifiers": "Manage Notifiers", + "manage-data-migrations": "Manage Data Migrations" }, "cookbook": { "cookbooks": "Cookbooks", diff --git a/frontend/pages/admin/background-tasks.vue b/frontend/pages/admin/background-tasks.vue index f73b185e5..dba14b2ad 100644 --- a/frontend/pages/admin/background-tasks.vue +++ b/frontend/pages/admin/background-tasks.vue @@ -4,17 +4,17 @@ - - Here you can view all the running background tasks and their status + + {{ $t('admin.background-tasks-description') }} - Refresh + {{ $t('general.refresh') }} - Test + {{ $t('general.test') }} @@ -32,7 +32,7 @@ {{ $d(Date.parse(task.createdAt), "short") }} - {{ task.log === "" ? "No Logs Found" : task.log }} + {{ task.log === "" ? $t('admin.no-logs-found') : task.log }} @@ -80,7 +80,7 @@ export default defineComponent({ }, head() { return { - title: "Tasks", + title: this.$t("admin.tasks"), }; }, }); diff --git a/frontend/pages/admin/backups.vue b/frontend/pages/admin/backups.vue index 82c210e65..5492e0cd3 100644 --- a/frontend/pages/admin/backups.vue +++ b/frontend/pages/admin/backups.vue @@ -16,33 +16,37 @@ - + - Restoring this backup will overwrite all the current data in your database and in the data directory and - replace them with the contents of this backup. This action cannot be undone - use with caution. If - the restoration is successful, you will be logged out. + + +

- If you are using PostGreSQL, please review the - backup/restore process in the documentation - prior to restoring. + + + + {{ $t('') }}

+
- Restore Backup + {{ $t('settings.backup.restore-backup') }}

@@ -51,16 +55,13 @@

- + - Backups a total snapshots of the database and data directory of the site. This includes all data and cannot - be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. - Currently, - - this backup mechanism is not cross-version and therefore cannot be used to migrate data between versions - - (data migrations are not done automatically). These serve as a database agnostic way to export and import - data or backup the site to an external location. + + + {{ $t("settings.backup.create-heading") }} @@ -108,7 +109,7 @@
- Looking For Migrations? + {{ $t('recipe.looking-for-migrations') }} @@ -177,7 +178,7 @@ export default defineComponent({ headers: [ { text: i18n.t("general.name"), value: "name" }, { text: i18n.t("general.created"), value: "date" }, - { text: "Size", value: "size" }, + { text: i18n.t("export.size"), value: "size" }, { text: "", value: "actions", align: "right" }, ], }); diff --git a/frontend/pages/admin/manage/groups/_id.vue b/frontend/pages/admin/manage/groups/_id.vue index ba44579f5..f41c5a9d6 100644 --- a/frontend/pages/admin/manage/groups/_id.vue +++ b/frontend/pages/admin/manage/groups/_id.vue @@ -4,15 +4,15 @@ - - Changes to this group will be reflected immediately. + + {{ $t('group.admin-group-management-text') }} - Group Id: {{ group.id }} + {{ $t('group.group-id-value', [group.id]) }} - + diff --git a/frontend/pages/admin/manage/groups/index.vue b/frontend/pages/admin/manage/groups/index.vue index 04cc7cd96..eb8d75363 100644 --- a/frontend/pages/admin/manage/groups/index.vue +++ b/frontend/pages/admin/manage/groups/index.vue @@ -25,7 +25,7 @@
- +
{{ $t("general.create") }} @@ -102,7 +102,7 @@ export default defineComponent({ createUserForm: { items: [ { - label: "Group Name", + label: i18n.t("group.group-name"), varName: "name", type: fieldTypes.TEXT, rules: ["required"], diff --git a/frontend/pages/admin/manage/users/create.vue b/frontend/pages/admin/manage/users/create.vue index 8033a4310..26a4ff768 100644 --- a/frontend/pages/admin/manage/users/create.vue +++ b/frontend/pages/admin/manage/users/create.vue @@ -4,7 +4,7 @@ - + @@ -20,7 +20,7 @@ item-value="name" :return-object="false" filled - label="User Group" + :label="$t('group.user-group')" :rules="[validators.required]" > diff --git a/frontend/pages/admin/manage/users/index.vue b/frontend/pages/admin/manage/users/index.vue index 4a26607de..d36b1e8ec 100644 --- a/frontend/pages/admin/manage/users/index.vue +++ b/frontend/pages/admin/manage/users/index.vue @@ -16,24 +16,14 @@ - +
{{ $t("general.create") }} - + $auth.user as UserOut | null); - const { i18n } = useContext(); + const { $globals, i18n } = useContext(); const router = useRouter(); @@ -97,6 +87,14 @@ export default defineComponent({ return state.deleteTargetId === user.value?.id; }); + const ACTIONS_OPTIONS = [ + { + text: i18n.t("user.reset-locked-users"), + icon: $globals.icons.lock, + event: "unlock-all-users", + }, + ]; + const state = reactive({ deleteDialog: false, deleteTargetId: "", @@ -158,6 +156,7 @@ export default defineComponent({ users, user, handleRowClick, + ACTIONS_OPTIONS, }; }, head() { diff --git a/frontend/pages/admin/parser.vue b/frontend/pages/admin/parser.vue index 9b126b49c..bb1ac20fa 100644 --- a/frontend/pages/admin/parser.vue +++ b/frontend/pages/admin/parser.vue @@ -1,31 +1,26 @@ - Try an example + {{ $t('admin.try-an-example') }} {{ text }} @@ -67,7 +62,7 @@ diff --git a/frontend/pages/group/webhooks.vue b/frontend/pages/group/webhooks.vue index 2bbf3b6b4..134541fc0 100644 --- a/frontend/pages/group/webhooks.vue +++ b/frontend/pages/group/webhooks.vue @@ -4,12 +4,9 @@ - + - The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the - webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution - is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- - minutes of the scheduled. + {{ $t('settings.webhooks.description') }} @@ -23,7 +20,7 @@ {{ $globals.icons.webhook }} - {{ webhook.name }} - {{ timeDisplay(timeUTCToLocal(webhook.scheduledTime)) }} + {{ webhook.name }} - {{ $d(timeUTC(webhook.scheduledTime), "time") }}