From 16eeaea5e88af4b64d9ee55eb83803b59bebc651 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 22 Apr 2026 15:44:01 +0200 Subject: [PATCH 1/4] Refactor IDs to use strings (uuids) for categories and entries --- .../Components/CalendarComponent.test.tsx | 8 +++- .../Screens/MeasurementCategoryDetail.tsx | 6 +-- .../Measurements/models/Category.ts | 2 +- src/components/Measurements/models/Entry.ts | 4 +- src/components/Measurements/queries/index.ts | 10 ++--- .../widgets/CategoryDetailDataGrid.tsx | 2 +- .../widgets/CategoryForm.test.tsx | 2 +- .../Measurements/widgets/CategoryForm.tsx | 2 +- .../Measurements/widgets/EntryForm.test.tsx | 16 +++---- .../Measurements/widgets/EntryForm.tsx | 2 +- src/components/Measurements/widgets/fab.tsx | 2 +- .../WorkoutRoutines/models/WorkoutLog.ts | 8 ++-- .../WorkoutRoutines/models/WorkoutSession.ts | 6 +-- .../WorkoutRoutines/queries/logs.ts | 2 +- .../WorkoutRoutines/queries/sessions.ts | 2 +- .../widgets/LogWidgets.test.tsx | 2 +- .../WorkoutRoutines/widgets/LogWidgets.tsx | 2 +- .../widgets/forms/SessionForm.test.tsx | 4 +- src/services/measurements.test.ts | 28 ++++++------ src/services/measurements.ts | 16 +++---- src/services/routine.test.ts | 4 +- src/services/workoutLogs.test.ts | 8 ++-- src/services/workoutLogs.ts | 2 +- src/tests/measurementsTestData.ts | 43 +++++++++++-------- src/tests/workoutLogsRoutinesTestData.ts | 10 ++--- src/tests/workoutRoutinesTestData.ts | 6 +-- src/utils/url.ts | 4 +- 27 files changed, 108 insertions(+), 95 deletions(-) diff --git a/src/components/Calendar/Components/CalendarComponent.test.tsx b/src/components/Calendar/Components/CalendarComponent.test.tsx index 60c3a3956..e5c86938b 100644 --- a/src/components/Calendar/Components/CalendarComponent.test.tsx +++ b/src/components/Calendar/Components/CalendarComponent.test.tsx @@ -45,10 +45,14 @@ describe('CalendarComponent', () => { (getMeasurementCategories as jest.Mock).mockImplementation(() => Promise.resolve([ new MeasurementCategory( - 1, + 'cccccccc-cccc-cccc-cccc-000000000001', "Body Fat", "%", - [new MeasurementEntry(1, 1, new Date(currentYear, currentMonth, 1, 12, 0), 20, "Normal")] + [new MeasurementEntry( + 'dddddddd-dddd-dddd-dddd-000000000001', + 'cccccccc-cccc-cccc-cccc-000000000001', + new Date(currentYear, currentMonth, 1, 12, 0), 20, "Normal" + )] ), ])); diff --git a/src/components/Measurements/Screens/MeasurementCategoryDetail.tsx b/src/components/Measurements/Screens/MeasurementCategoryDetail.tsx index bbf16f161..35f8ecd70 100644 --- a/src/components/Measurements/Screens/MeasurementCategoryDetail.tsx +++ b/src/components/Measurements/Screens/MeasurementCategoryDetail.tsx @@ -11,9 +11,9 @@ import { useParams } from "react-router-dom"; export const MeasurementCategoryDetail = () => { const params = useParams<{ categoryId: string }>(); - const categoryId = parseInt(params.categoryId ?? ''); - if (Number.isNaN(categoryId)) { - return

Please pass an integer as the category id.

; + const categoryId = params.categoryId ?? ''; + if (!categoryId) { + return

Please pass a category id.

; } // eslint-disable-next-line react-hooks/rules-of-hooks diff --git a/src/components/Measurements/models/Category.ts b/src/components/Measurements/models/Category.ts index 9dd532f57..d6630dde3 100644 --- a/src/components/Measurements/models/Category.ts +++ b/src/components/Measurements/models/Category.ts @@ -6,7 +6,7 @@ export class MeasurementCategory { entries: MeasurementEntry[] = []; constructor( - public id: number, + public id: string, public name: string, public unit: string, entries?: MeasurementEntry[] diff --git a/src/components/Measurements/models/Entry.ts b/src/components/Measurements/models/Entry.ts index 1fc97eedd..ab30e4f98 100644 --- a/src/components/Measurements/models/Entry.ts +++ b/src/components/Measurements/models/Entry.ts @@ -3,8 +3,8 @@ import { Adapter } from "utils/Adapter"; export class MeasurementEntry { constructor( - public id: number | null, - public category: number, + public id: string | null, + public category: string, public date: Date, public value: number, public notes: string diff --git a/src/components/Measurements/queries/index.ts b/src/components/Measurements/queries/index.ts index c440a87fb..e8f40bd82 100644 --- a/src/components/Measurements/queries/index.ts +++ b/src/components/Measurements/queries/index.ts @@ -37,7 +37,7 @@ export const useAddMeasurementCategoryQuery = () => { }); }; -export const useEditMeasurementCategoryQuery = (id: number) => { +export const useEditMeasurementCategoryQuery = (id: string) => { const queryClient = useQueryClient(); return useMutation({ @@ -53,11 +53,11 @@ export const useEditMeasurementCategoryQuery = (id: number) => { }); }; -export const useDeleteMeasurementCategoryQuery = (id: number) => { +export const useDeleteMeasurementCategoryQuery = (id: string) => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: number) => deleteMeasurementCategory(id), + mutationFn: (id: string) => deleteMeasurementCategory(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QUERY_MEASUREMENTS, id] @@ -70,7 +70,7 @@ export const useDeleteMeasurementCategoryQuery = (id: number) => { }; -export function useMeasurementsQuery(id: number) { +export function useMeasurementsQuery(id: string) { return useQuery({ queryKey: [QUERY_MEASUREMENTS, id], queryFn: () => getMeasurementCategory(id) @@ -113,7 +113,7 @@ export const useDeleteMeasurementsQuery = (/*id: number*/) => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: number) => deleteMeasurementEntry(id), + mutationFn: (id: string) => deleteMeasurementEntry(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: [QUERY_MEASUREMENTS,] }) diff --git a/src/components/Measurements/widgets/CategoryDetailDataGrid.tsx b/src/components/Measurements/widgets/CategoryDetailDataGrid.tsx index f362c156e..db4c8f90c 100644 --- a/src/components/Measurements/widgets/CategoryDetailDataGrid.tsx +++ b/src/components/Measurements/widgets/CategoryDetailDataGrid.tsx @@ -63,7 +63,7 @@ export const CategoryDetailDataGrid = (props: { category: MeasurementCategory }) const handleDeleteClick = (id: GridRowId) => async () => { console.log('deleting entry', id); - deleteEntryQuery.mutate(parseInt(id.toString())); + deleteEntryQuery.mutate(id.toString()); setRows(rows.filter((row) => row.id !== id)); }; diff --git a/src/components/Measurements/widgets/CategoryForm.test.tsx b/src/components/Measurements/widgets/CategoryForm.test.tsx index 0c6abc52e..c9ba02046 100644 --- a/src/components/Measurements/widgets/CategoryForm.test.tsx +++ b/src/components/Measurements/widgets/CategoryForm.test.tsx @@ -64,7 +64,7 @@ describe("Test the CategoryForm component", () => { // Assert await user.click(submitButton); expect(mutate).toHaveBeenCalledWith({ - id: 2, + id: 'cccccccc-cccc-cccc-cccc-000000000002', name: "a better name", unit: 'K/m2', }); diff --git a/src/components/Measurements/widgets/CategoryForm.tsx b/src/components/Measurements/widgets/CategoryForm.tsx index 0ddb2f7b8..32ddc7a6b 100644 --- a/src/components/Measurements/widgets/CategoryForm.tsx +++ b/src/components/Measurements/widgets/CategoryForm.tsx @@ -15,7 +15,7 @@ export const CategoryForm = ({ category, closeFn }: CategoryFormProps) => { const [t] = useTranslation(); const useAddCategoryQuery = useAddMeasurementCategoryQuery(); - const useEditCategoryQuery = useEditMeasurementCategoryQuery(category?.id || 0); + const useEditCategoryQuery = useEditMeasurementCategoryQuery(category?.id || ''); const validationSchema = yup.object({ name: yup .string() diff --git a/src/components/Measurements/widgets/EntryForm.test.tsx b/src/components/Measurements/widgets/EntryForm.test.tsx index 285d829ed..6c11f64e7 100644 --- a/src/components/Measurements/widgets/EntryForm.test.tsx +++ b/src/components/Measurements/widgets/EntryForm.test.tsx @@ -20,7 +20,7 @@ describe("Test the EntryForm component", () => { const queryClient = new QueryClient(); let mutate = jest.fn(); - const renderComponent = (props: { entry?: MeasurementEntry, categoryId: number }) => { + const renderComponent = (props: { entry?: MeasurementEntry, categoryId: string }) => { return render( @@ -51,7 +51,7 @@ describe("Test the EntryForm component", () => { const entry = TEST_MEASUREMENT_ENTRIES_1[0]; // Act - renderComponent({ entry, categoryId: 1 }); + renderComponent({ entry, categoryId: 'cccccccc-cccc-cccc-cccc-000000000001' }); // Assert expect(screen.getByDisplayValue('10')).toBeInTheDocument(); @@ -69,7 +69,7 @@ describe("Test the EntryForm component", () => { const user = userEvent.setup(); // Act - renderComponent({ entry, categoryId: 1 }); + renderComponent({ entry, categoryId: 'cccccccc-cccc-cccc-cccc-000000000001' }); const submitButton = screen.getByRole('button', { name: 'submit' }); await user.clear(screen.getByLabelText('value')); await user.type(screen.getByLabelText('value'), '25'); @@ -79,7 +79,7 @@ describe("Test the EntryForm component", () => { await user.click(submitButton); expect(mutate).toHaveBeenCalledWith({ date: expect.anything(), - id: 1, + id: 'dddddddd-dddd-dddd-dddd-000000000001', notes: "test note", value: 25, }); @@ -92,7 +92,7 @@ describe("Test the EntryForm component", () => { const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); // Act - renderComponent({ categoryId: 11 }); + renderComponent({ categoryId: 'cccccccc-cccc-cccc-cccc-000000000011' }); const valueInput = await screen.findByLabelText('value'); const notesInput = await screen.findByLabelText('notes'); const submitButton = screen.getByRole('button', { name: 'submit' }); @@ -106,7 +106,7 @@ describe("Test the EntryForm component", () => { expect(submitButton).toBeInTheDocument(); await user.click(submitButton); expect(mutate).toHaveBeenCalledWith({ - categoryId: 11, + categoryId: 'cccccccc-cccc-cccc-cccc-000000000011', date: fakeNow, notes: 'The Shiba Inu is a breed of hunting dog from Japan.', value: 42.42, @@ -124,7 +124,7 @@ describe("Test the EntryForm component", () => { i18n.changeLanguage('en'); const entry = TEST_MEASUREMENT_ENTRIES_1[0]; - const { container } = renderComponent({ entry, categoryId: 1 }); + const { container } = renderComponent({ entry, categoryId: 'cccccccc-cccc-cccc-cccc-000000000001' }); const picker = container.querySelector('.MuiPickersInputBase-root'); expect(picker?.textContent).toContain('02/01/2023'); @@ -135,7 +135,7 @@ describe("Test the EntryForm component", () => { i18n.changeLanguage('de'); const entry = TEST_MEASUREMENT_ENTRIES_1[0]; - const { container } = renderComponent({ entry, categoryId: 1 }); + const { container } = renderComponent({ entry, categoryId: 'cccccccc-cccc-cccc-cccc-000000000001' }); const picker = container.querySelector('.MuiPickersInputBase-root'); expect(picker?.textContent).toContain('01.02.2023'); diff --git a/src/components/Measurements/widgets/EntryForm.tsx b/src/components/Measurements/widgets/EntryForm.tsx index 7d8cb3967..e931855ec 100644 --- a/src/components/Measurements/widgets/EntryForm.tsx +++ b/src/components/Measurements/widgets/EntryForm.tsx @@ -20,7 +20,7 @@ Settings.defaultZone = TIMEZONE; interface EntryFormProps { entry?: MeasurementEntry, closeFn?: () => void, - categoryId: number, + categoryId: string, } export const EntryForm = ({ entry, closeFn, categoryId }: EntryFormProps) => { diff --git a/src/components/Measurements/widgets/fab.tsx b/src/components/Measurements/widgets/fab.tsx index 166b2ac68..f8abb77f2 100644 --- a/src/components/Measurements/widgets/fab.tsx +++ b/src/components/Measurements/widgets/fab.tsx @@ -42,7 +42,7 @@ export const AddMeasurementEntryFab = () => { const handleCloseModal = () => setOpenModal(false); const params = useParams<{ categoryId: string }>(); - const categoryId = parseInt(params.categoryId!); + const categoryId = params.categoryId!; return (<> diff --git a/src/components/WorkoutRoutines/models/WorkoutLog.ts b/src/components/WorkoutRoutines/models/WorkoutLog.ts index 360432bf8..68d8ea699 100644 --- a/src/components/WorkoutRoutines/models/WorkoutLog.ts +++ b/src/components/WorkoutRoutines/models/WorkoutLog.ts @@ -20,12 +20,12 @@ export interface LogEntryForm { export class WorkoutLog { - public id: number; + public id: string; public date: Date; public iteration: number | null; public exerciseId: number; public slotEntryId: number | null; - public sessionId: number | null; + public sessionId: string | null; public routineId: number | null; public repetitionUnitObj: RepetitionUnit | null; @@ -48,11 +48,11 @@ export class WorkoutLog { public exerciseObj?: Exercise; constructor(data: { - id: number; + id: string; date: Date | string; iteration: number | null; slotEntryId: number | null; - sessionId?: number | null; + sessionId?: string | null; routineId?: number | null; exercise?: Exercise; diff --git a/src/components/WorkoutRoutines/models/WorkoutSession.ts b/src/components/WorkoutRoutines/models/WorkoutSession.ts index 6d730982c..edcd4c1cc 100644 --- a/src/components/WorkoutRoutines/models/WorkoutSession.ts +++ b/src/components/WorkoutRoutines/models/WorkoutSession.ts @@ -21,11 +21,11 @@ export interface AddSessionParams { } export interface EditSessionParams extends Partial { - id: number, + id: string, } interface WorkoutSessionParams { - id: number; + id: string; dayId: number; routineId: number; date: Date; @@ -39,7 +39,7 @@ interface WorkoutSessionParams { export class WorkoutSession { - id: number; + id: string; dayId: number; routineId: number; date: Date; diff --git a/src/components/WorkoutRoutines/queries/logs.ts b/src/components/WorkoutRoutines/queries/logs.ts index d9235b3ee..1f3d3973a 100644 --- a/src/components/WorkoutRoutines/queries/logs.ts +++ b/src/components/WorkoutRoutines/queries/logs.ts @@ -7,7 +7,7 @@ export function useDeleteRoutineLogQuery(routineId: number) { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (logId: number) => deleteLog(logId), + mutationFn: (logId: string) => deleteLog(logId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QueryKey.ROUTINE_LOG_DATA, routineId] }); queryClient.invalidateQueries({ queryKey: [QueryKey.ROUTINE_STATS, routineId] }); diff --git a/src/components/WorkoutRoutines/queries/sessions.ts b/src/components/WorkoutRoutines/queries/sessions.ts index 21bbac1b4..7e06d9f40 100644 --- a/src/components/WorkoutRoutines/queries/sessions.ts +++ b/src/components/WorkoutRoutines/queries/sessions.ts @@ -26,7 +26,7 @@ export const useSessionsQuery = (options?: SessionQueryOptions) => useQuery({ }); -export const useEditSessionQuery = (id: number) => { +export const useEditSessionQuery = (id: string) => { const queryClient = useQueryClient(); return useMutation({ diff --git a/src/components/WorkoutRoutines/widgets/LogWidgets.test.tsx b/src/components/WorkoutRoutines/widgets/LogWidgets.test.tsx index 39ada8008..decc5e1ca 100644 --- a/src/components/WorkoutRoutines/widgets/LogWidgets.test.tsx +++ b/src/components/WorkoutRoutines/widgets/LogWidgets.test.tsx @@ -68,7 +68,7 @@ describe('ExerciseLog', () => { ); await user.click(screen.getAllByRole('menuitem', { name: /delete/i })[0]); - expect(mockDeleteMutate).toHaveBeenCalledWith(5); + expect(mockDeleteMutate).toHaveBeenCalledWith('aaaaaaaa-aaaa-aaaa-aaaa-000000000005'); expect(mockEditMutate).not.toHaveBeenCalled(); }); diff --git a/src/components/WorkoutRoutines/widgets/LogWidgets.tsx b/src/components/WorkoutRoutines/widgets/LogWidgets.tsx index 4b53b380b..52d2f76f1 100644 --- a/src/components/WorkoutRoutines/widgets/LogWidgets.tsx +++ b/src/components/WorkoutRoutines/widgets/LogWidgets.tsx @@ -74,7 +74,7 @@ export const ExerciseLog = (props: { exercise: Exercise, routineId: number, logE }; const handleDeleteClick = (id: GridRowId) => () => { - deleteLogQuery.mutate(id as number); + deleteLogQuery.mutate(id.toString()); setRows(rows.filter((row) => row.id !== id)); }; diff --git a/src/components/WorkoutRoutines/widgets/forms/SessionForm.test.tsx b/src/components/WorkoutRoutines/widgets/forms/SessionForm.test.tsx index 83fd8e791..295adabb7 100644 --- a/src/components/WorkoutRoutines/widgets/forms/SessionForm.test.tsx +++ b/src/components/WorkoutRoutines/widgets/forms/SessionForm.test.tsx @@ -32,7 +32,7 @@ describe('SessionForm', () => { // Arrange const user = userEvent.setup(); const mockSession = new WorkoutSession({ - id: 0, + id: 'bbbbbbbb-bbbb-bbbb-bbbb-000000000000', dayId: 0, routineId: 0, date: new Date(), @@ -92,7 +92,7 @@ describe('SessionForm', () => { const timeEndFormatted = timeEnd.toLocaleString(DateTime.TIME_SIMPLE, { locale: 'en-us' }); const mockSession = new WorkoutSession({ - id: 1, + id: 'bbbbbbbb-bbbb-bbbb-bbbb-000000000001', dayId: dayId, routineId: routineId, date: date.toJSDate(), diff --git a/src/services/measurements.test.ts b/src/services/measurements.test.ts index 187f7385e..f9314dc2e 100644 --- a/src/services/measurements.test.ts +++ b/src/services/measurements.test.ts @@ -5,6 +5,10 @@ import { getMeasurementCategories, getMeasurementCategory } from "services/measu jest.mock("axios"); +// Test-marker UUIDs matching the Django fixtures convention. +const CATEGORY_UUID = 'cccccccc-cccc-cccc-cccc-000000000001'; +const ENTRY_UUID = 'dddddddd-dddd-dddd-dddd-000000000001'; + describe('measurement service tests', () => { const measurementEntryResponse = { count: 2, @@ -12,8 +16,8 @@ describe('measurement service tests', () => { previous: null, results: [ { - "id": 1, - "category": 1, + "id": ENTRY_UUID, + "category": CATEGORY_UUID, "value": 80, "date": "2021-01-01", "notes": "" @@ -27,7 +31,7 @@ describe('measurement service tests', () => { previous: null, results: [ { - "id": 1, + "id": CATEGORY_UUID, "name": "Weight", "unit": "kg" } @@ -35,7 +39,7 @@ describe('measurement service tests', () => { }; const measurementDetailResponse = { - "id": 1, + "id": CATEGORY_UUID, "name": "Weight", "unit": "kg" }; @@ -47,7 +51,7 @@ describe('measurement service tests', () => { (axios.get as jest.Mock).mockImplementation((url: string) => { if (url.includes("measurement-category")) { return Promise.resolve({ data: measurementOverviewResponse }); - } else if (url.includes("measurement/?category=1")) { + } else if (url.includes(`measurement/?category=${CATEGORY_UUID}`)) { return Promise.resolve({ data: measurementEntryResponse }); } }); @@ -78,8 +82,8 @@ describe('measurement service tests', () => { expect(axios.get).toHaveBeenCalledTimes(2); expect(result).toStrictEqual([ - new MeasurementCategory(1, "Weight", "kg", [ - new MeasurementEntry(1, 1, new Date("2021-01-01"), 80, "") + new MeasurementCategory(CATEGORY_UUID, "Weight", "kg", [ + new MeasurementEntry(ENTRY_UUID, CATEGORY_UUID, new Date("2021-01-01"), 80, "") ]) ]); }); @@ -87,19 +91,19 @@ describe('measurement service tests', () => { test('GET measurement category', async () => { (axios.get as jest.Mock).mockImplementation((url: string) => { - if (url.includes("measurement-category/1")) { + if (url.includes(`measurement-category/${CATEGORY_UUID}`)) { return Promise.resolve({ data: measurementDetailResponse }); - } else if (url.includes("measurement/?category=1")) { + } else if (url.includes(`measurement/?category=${CATEGORY_UUID}`)) { return Promise.resolve({ data: measurementEntryResponse }); } }); - const result = await getMeasurementCategory(1); + const result = await getMeasurementCategory(CATEGORY_UUID); expect(axios.get).toHaveBeenCalledTimes(2); expect(result).toStrictEqual( - new MeasurementCategory(1, "Weight", "kg", [ - new MeasurementEntry(1, 1, new Date("2021-01-01"), 80, "") + new MeasurementCategory(CATEGORY_UUID, "Weight", "kg", [ + new MeasurementEntry(ENTRY_UUID, CATEGORY_UUID, new Date("2021-01-01"), 80, "") ]) ); }); diff --git a/src/services/measurements.ts b/src/services/measurements.ts index 04760a4e4..cc9c063e4 100644 --- a/src/services/measurements.ts +++ b/src/services/measurements.ts @@ -54,7 +54,7 @@ export const getMeasurementCategories = async (options?: MeasurementQueryOptions const settingsResponses = await Promise.all(entryResponses); // Save entries to each category - let categoryId: number; + let categoryId: string; settingsResponses.forEach((entries) => { if (entries.length > 0) { categoryId = entries[0].category; @@ -65,7 +65,7 @@ export const getMeasurementCategories = async (options?: MeasurementQueryOptions return categories; }; -export const getMeasurementCategory = async (id: number): Promise => { +export const getMeasurementCategory = async (id: string): Promise => { const { data: receivedCategories } = await axios.get( makeUrl(API_MEASUREMENTS_CATEGORY_PATH, { id: id }), { headers: makeHeader() }, @@ -106,7 +106,7 @@ export const addMeasurementCategory = async (data: AddMeasurementCategoryParams) }; export interface editMeasurementCategoryParams { - id: number, + id: string, name: string; unit: string; } @@ -124,18 +124,18 @@ export const editMeasurementCategory = async (data: editMeasurementCategoryParam return MeasurementCategory.fromJson(response.data); }; -export const deleteMeasurementCategory = async (id: number): Promise => { +export const deleteMeasurementCategory = async (id: string): Promise => { await axios.delete(makeUrl(API_MEASUREMENTS_CATEGORY_PATH, { id: id }), { headers: makeHeader() }); }; -export const deleteMeasurementEntry = async (id: number): Promise => { +export const deleteMeasurementEntry = async (id: string): Promise => { await axios.delete(makeUrl(API_MEASUREMENTS_ENTRY_PATH, { id: id }), { headers: makeHeader() }); }; export interface editMeasurementParams { - id: number, - categoryId?: number, + id: string, + categoryId?: string, date: Date; value: number; notes: string; @@ -156,7 +156,7 @@ export const editMeasurementEntry = async (data: editMeasurementParams): Promise }; export interface AddMeasurementParams { - categoryId: number; + categoryId: string; date: Date; value: number; notes: string; diff --git a/src/services/routine.test.ts b/src/services/routine.test.ts index 4a0490451..210f41037 100644 --- a/src/services/routine.test.ts +++ b/src/services/routine.test.ts @@ -77,7 +77,7 @@ describe("workout routine service tests", () => { expect(axios.get).toHaveBeenCalledTimes(1); expect(result).toStrictEqual([ new WorkoutLog({ - id: 2, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002', routineId: 1, date: new Date("2023-05-10"), iteration: 1, @@ -94,7 +94,7 @@ describe("workout routine service tests", () => { }), new WorkoutLog({ - id: 1, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001', routineId: 1, date: new Date("2023-05-13"), iteration: 1, diff --git a/src/services/workoutLogs.test.ts b/src/services/workoutLogs.test.ts index 60958b0eb..50564cc72 100644 --- a/src/services/workoutLogs.test.ts +++ b/src/services/workoutLogs.test.ts @@ -36,7 +36,7 @@ describe("workout logs service tests", () => { expect(axios.get).toHaveBeenCalledTimes(1); expect(result).toStrictEqual([ new WorkoutLog({ - id: 2, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002', routineId: 1, date: new Date("2023-05-10"), iteration: 1, @@ -58,7 +58,7 @@ describe("workout logs service tests", () => { }), new WorkoutLog({ - id: 1, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001', routineId: 1, date: new Date("2023-05-13"), iteration: 1, @@ -97,7 +97,7 @@ describe("workout logs service tests", () => { expect(axios.get).toHaveBeenCalledTimes(1); expect(result).toStrictEqual([ new WorkoutLog({ - id: 2, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002', routineId: 1, date: new Date("2023-05-10"), iteration: 1, @@ -121,7 +121,7 @@ describe("workout logs service tests", () => { }), new WorkoutLog({ - id: 1, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001', routineId: 1, date: new Date("2023-05-13"), iteration: 1, diff --git a/src/services/workoutLogs.ts b/src/services/workoutLogs.ts index 64ba9b2d1..cf4a46d0b 100644 --- a/src/services/workoutLogs.ts +++ b/src/services/workoutLogs.ts @@ -7,7 +7,7 @@ import { API_MAX_PAGE_SIZE, ApiPath } from "utils/consts"; import { fetchPaginated } from "utils/requests"; import { makeHeader, makeUrl } from "utils/url"; -export const deleteLog = async (id: number): Promise => { +export const deleteLog = async (id: string): Promise => { const response = await axios.delete(makeUrl(ApiPath.WORKOUT_LOG, { id: id }), { headers: makeHeader(), }); diff --git a/src/tests/measurementsTestData.ts b/src/tests/measurementsTestData.ts index 940377dde..1473b29ad 100644 --- a/src/tests/measurementsTestData.ts +++ b/src/tests/measurementsTestData.ts @@ -1,31 +1,36 @@ import { MeasurementCategory } from "components/Measurements/models/Category"; import { MeasurementEntry } from "components/Measurements/models/Entry"; +// Recognisable test-marker UUIDs matching the Django fixtures convention +const CATEGORY_1 = 'cccccccc-cccc-cccc-cccc-000000000001'; +const CATEGORY_2 = 'cccccccc-cccc-cccc-cccc-000000000002'; +const entry = (n: number) => `dddddddd-dddd-dddd-dddd-${n.toString().padStart(12, '0')}`; + export const TEST_MEASUREMENT_ENTRIES_1 = [ - new MeasurementEntry(1, 1, new Date(2023, 1, 1, 8, 0), 10, "test note"), - new MeasurementEntry(2, 1, new Date(2023, 1, 1, 18, 30), 12, "evening measurement"), - new MeasurementEntry(3, 1, new Date(2023, 1, 2, 7, 45), 20, ""), - new MeasurementEntry(4, 1, new Date(2023, 1, 3, 9, 15), 30, "important note"), - new MeasurementEntry(5, 1, new Date(2023, 1, 4, 12, 0), 40, "this day was good"), - new MeasurementEntry(6, 1, new Date(2023, 1, 5, 8, 0), 50, ""), - new MeasurementEntry(7, 1, new Date(2023, 1, 6, 8, 0), 60, ""), - new MeasurementEntry(8, 1, new Date(2023, 1, 7, 8, 0), 70, ""), + new MeasurementEntry(entry(1), CATEGORY_1, new Date(2023, 1, 1, 8, 0), 10, "test note"), + new MeasurementEntry(entry(2), CATEGORY_1, new Date(2023, 1, 1, 18, 30), 12, "evening measurement"), + new MeasurementEntry(entry(3), CATEGORY_1, new Date(2023, 1, 2, 7, 45), 20, ""), + new MeasurementEntry(entry(4), CATEGORY_1, new Date(2023, 1, 3, 9, 15), 30, "important note"), + new MeasurementEntry(entry(5), CATEGORY_1, new Date(2023, 1, 4, 12, 0), 40, "this day was good"), + new MeasurementEntry(entry(6), CATEGORY_1, new Date(2023, 1, 5, 8, 0), 50, ""), + new MeasurementEntry(entry(7), CATEGORY_1, new Date(2023, 1, 6, 8, 0), 60, ""), + new MeasurementEntry(entry(8), CATEGORY_1, new Date(2023, 1, 7, 8, 0), 70, ""), ]; export const TEST_MEASUREMENT_ENTRIES_2 = [ - new MeasurementEntry(1, 2, new Date(2023, 3, 1, 7, 0), 11, ""), - new MeasurementEntry(2, 2, new Date(2023, 3, 1, 19, 0), 13, ""), - new MeasurementEntry(3, 2, new Date(2023, 3, 2, 8, 30), 22, ""), - new MeasurementEntry(4, 2, new Date(2023, 3, 3, 9, 0), 33, ""), - new MeasurementEntry(5, 2, new Date(2023, 3, 4, 10, 15), 44, ""), - new MeasurementEntry(6, 2, new Date(2023, 3, 5, 7, 45), 55, ""), - new MeasurementEntry(7, 2, new Date(2023, 3, 6, 8, 0), 66, ""), - new MeasurementEntry(8, 2, new Date(2023, 3, 7, 8, 0), 77, ""), + new MeasurementEntry(entry(101), CATEGORY_2, new Date(2023, 3, 1, 7, 0), 11, ""), + new MeasurementEntry(entry(102), CATEGORY_2, new Date(2023, 3, 1, 19, 0), 13, ""), + new MeasurementEntry(entry(103), CATEGORY_2, new Date(2023, 3, 2, 8, 30), 22, ""), + new MeasurementEntry(entry(104), CATEGORY_2, new Date(2023, 3, 3, 9, 0), 33, ""), + new MeasurementEntry(entry(105), CATEGORY_2, new Date(2023, 3, 4, 10, 15), 44, ""), + new MeasurementEntry(entry(106), CATEGORY_2, new Date(2023, 3, 5, 7, 45), 55, ""), + new MeasurementEntry(entry(107), CATEGORY_2, new Date(2023, 3, 6, 8, 0), 66, ""), + new MeasurementEntry(entry(108), CATEGORY_2, new Date(2023, 3, 7, 8, 0), 77, ""), ]; export const TEST_MEASUREMENT_CATEGORY_1 = new MeasurementCategory( - 1, + CATEGORY_1, "Biceps", "cm", TEST_MEASUREMENT_ENTRIES_1, @@ -33,8 +38,8 @@ export const TEST_MEASUREMENT_CATEGORY_1 = new MeasurementCategory( export const TEST_MEASUREMENT_CATEGORY_2 = new MeasurementCategory( - 2, + CATEGORY_2, "Body fat", "%", TEST_MEASUREMENT_ENTRIES_2 -); \ No newline at end of file +); diff --git a/src/tests/workoutLogsRoutinesTestData.ts b/src/tests/workoutLogsRoutinesTestData.ts index 7ab890899..ce9f43f21 100644 --- a/src/tests/workoutLogsRoutinesTestData.ts +++ b/src/tests/workoutLogsRoutinesTestData.ts @@ -4,7 +4,7 @@ import { testExerciseSquats } from "tests/exerciseTestdata"; import { testRepUnitRepetitions, testWeightUnitKg } from "tests/workoutRoutinesTestData"; const testWorkoutLog1 = new WorkoutLog({ - id: 5, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000005', routineId: 1, date: new Date(2023, 1, 1), iteration: 345, @@ -21,7 +21,7 @@ const testWorkoutLog1 = new WorkoutLog({ }); const testWorkoutLog2 = new WorkoutLog({ - id: 6, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000006', routineId: 1, date: new Date(2023, 1, 2), iteration: 345, @@ -38,7 +38,7 @@ const testWorkoutLog2 = new WorkoutLog({ }); const testWorkoutLog3 = new WorkoutLog({ - id: 7, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000007', routineId: 1, date: new Date(2023, 1, 3), iteration: 345, @@ -55,7 +55,7 @@ const testWorkoutLog3 = new WorkoutLog({ }); const testWorkoutLog4 = new WorkoutLog({ - id: 8, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000008', routineId: 1, date: new Date(2023, 1, 10), iteration: 345, @@ -79,7 +79,7 @@ export const testWorkoutLogs = [ ]; export const testWorkoutSession = new WorkoutSession({ - id: 1, + id: 'bbbbbbbb-bbbb-bbbb-bbbb-000000000001', dayId: 2, routineId: 3, date: new Date(2025, 1, 10), diff --git a/src/tests/workoutRoutinesTestData.ts b/src/tests/workoutRoutinesTestData.ts index a96625fb3..484a8ef4a 100644 --- a/src/tests/workoutRoutinesTestData.ts +++ b/src/tests/workoutRoutinesTestData.ts @@ -205,7 +205,7 @@ export const testRoutineDayData1 = [ export const testRoutineLogData = [ new RoutineLogData( new WorkoutSession({ - id: 111, + id: 'bbbbbbbb-bbbb-bbbb-bbbb-000000000111', dayId: 2, routineId: 1, date: new Date('2024-07-01'), @@ -308,7 +308,7 @@ export const responseRoutineLogs = { "previous": null, "results": [ { - "id": 2, + "id": "aaaaaaaa-aaaa-aaaa-aaaa-000000000002", "iteration": 1, "date": "2023-05-10", "exercise": 100, @@ -327,7 +327,7 @@ export const responseRoutineLogs = { "rir_target": null }, { - "id": 1, + "id": "aaaaaaaa-aaaa-aaaa-aaaa-000000000001", "iteration": 1, "date": "2023-05-13", "exercise": 100, diff --git a/src/utils/url.ts b/src/utils/url.ts index b06e6500c..9fd2bb776 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -4,7 +4,7 @@ import i18n from "i18n"; import slug from "slug"; interface makeUrlInterface { - id?: number, + id?: number | string, server?: string, objectMethod?: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -100,7 +100,7 @@ export enum WgerLink { TROPHIES, } -type UrlParams = { id: number, id2?: number, slug?: string, date?: string }; +type UrlParams = { id: number | string, id2?: number | string, slug?: string, date?: string }; /* From 2fa9595aa011f34a04cef469241a4f132f869e99 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Sat, 2 May 2026 16:15:43 +0200 Subject: [PATCH 2/4] The nutrition tables now have UUIDs as PKs --- src/components/Dashboard/NutritionCard.tsx | 2 +- .../components/NutritionDiaryOverview.tsx | 6 +- .../Nutrition/components/PlanDetail.tsx | 6 +- src/components/Nutrition/models/diaryEntry.ts | 18 ++-- src/components/Nutrition/models/meal.ts | 12 +-- src/components/Nutrition/models/mealItem.ts | 14 +-- .../Nutrition/models/nutritionalPlan.test.ts | 6 +- .../Nutrition/models/nutritionalPlan.ts | 6 +- src/components/Nutrition/queries/diary.ts | 10 +-- src/components/Nutrition/queries/meal.ts | 8 +- src/components/Nutrition/queries/mealItem.ts | 8 +- src/components/Nutrition/queries/plan.ts | 10 +-- .../Nutrition/widgets/DiaryOverview.tsx | 2 +- .../Nutrition/widgets/MealDetail.tsx | 4 +- .../Nutrition/widgets/MealDetailDropdown.tsx | 2 +- .../Nutrition/widgets/forms/MealForm.test.tsx | 10 +-- .../Nutrition/widgets/forms/MealForm.tsx | 2 +- .../widgets/forms/MealItemForm.test.tsx | 12 +-- .../Nutrition/widgets/forms/MealItemForm.tsx | 6 +- .../forms/NutritionDiaryEntryForm.test.tsx | 30 ++++--- .../widgets/forms/NutritionDiaryEntryForm.tsx | 6 +- .../Nutrition/widgets/forms/PlanForm.test.tsx | 2 +- .../Nutrition/widgets/forms/PlanForm.tsx | 2 +- src/services/meal.ts | 4 +- src/services/mealItem.ts | 2 +- src/services/nutritionalDiary.ts | 2 +- src/services/nutritionalPlan.test.ts | 12 +-- src/services/nutritionalPlan.ts | 4 +- src/tests/nutritionDiaryTestdata.ts | 86 +++++++++---------- src/tests/nutritionTestdata.ts | 48 +++++------ src/types.ts | 8 +- 31 files changed, 178 insertions(+), 172 deletions(-) diff --git a/src/components/Dashboard/NutritionCard.tsx b/src/components/Dashboard/NutritionCard.tsx index ef2b5145e..d4e8081b2 100644 --- a/src/components/Dashboard/NutritionCard.tsx +++ b/src/components/Dashboard/NutritionCard.tsx @@ -100,7 +100,7 @@ function NutritionCardContent(props: { plan: NutritionalPlan }) { ); } -const MealListItem = (props: { meal: Meal; planId: number }) => { +const MealListItem = (props: { meal: Meal; planId: string }) => { const [t, i18n] = useTranslation(); const addDiaryEntryQuery = useAddDiaryEntryQuery(props.planId); diff --git a/src/components/Nutrition/components/NutritionDiaryOverview.tsx b/src/components/Nutrition/components/NutritionDiaryOverview.tsx index 476b2d06e..a0e223c08 100644 --- a/src/components/Nutrition/components/NutritionDiaryOverview.tsx +++ b/src/components/Nutrition/components/NutritionDiaryOverview.tsx @@ -14,9 +14,9 @@ export const NutritionDiaryOverview = () => { const [t] = useTranslation(); const params = useParams<{ planId: string, date: string }>(); - const planId = parseInt(params.planId!); - if (Number.isNaN(planId)) { - return

Please pass an integer as the nutritional plan id.

; + const planId = params.planId ?? ''; + if (planId === '') { + return

Please pass a UUID as the nutritional plan id.

; } const date = new Date(params.date!); diff --git a/src/components/Nutrition/components/PlanDetail.tsx b/src/components/Nutrition/components/PlanDetail.tsx index a445ab34e..0a6374cb2 100644 --- a/src/components/Nutrition/components/PlanDetail.tsx +++ b/src/components/Nutrition/components/PlanDetail.tsx @@ -21,9 +21,9 @@ import { useParams } from "react-router-dom"; export const PlanDetail = () => { const [t] = useTranslation(); const params = useParams<{ planId: string }>(); - const planId = parseInt(params.planId ?? ''); - if (Number.isNaN(planId)) { - return

Please pass an integer as the nutritional plan id.

; + const planId = params.planId ?? ''; + if (planId === '') { + return

Please pass a UUID as the nutritional plan id.

; } // eslint-disable-next-line react-hooks/rules-of-hooks diff --git a/src/components/Nutrition/models/diaryEntry.ts b/src/components/Nutrition/models/diaryEntry.ts index a09886840..6db60b7bf 100644 --- a/src/components/Nutrition/models/diaryEntry.ts +++ b/src/components/Nutrition/models/diaryEntry.ts @@ -6,9 +6,9 @@ import { Adapter } from "utils/Adapter"; import { numberGramLocale } from "utils/numbers"; export interface ApiNutritionDiaryType { - id: number, - plan: number, - meal: number | null, + id: string, + plan: string, + meal: string | null, ingredient: number, weight_unit: number, datetime: Date, @@ -16,9 +16,9 @@ export interface ApiNutritionDiaryType { } export type DiaryEntryConstructorParams = { - id?: number; - planId: number; - mealId?: number | null; + id?: string; + planId: string; + mealId?: string | null; ingredientId: number; weightUnitId?: number | null; amount: number; @@ -29,9 +29,9 @@ export type DiaryEntryConstructorParams = { export class DiaryEntry { - public id?: number | null; - public planId: number; - public mealId: number | null; + public id?: string | null; + public planId: string; + public mealId: string | null; public amount: number; public datetime: Date; diff --git a/src/components/Nutrition/models/meal.ts b/src/components/Nutrition/models/meal.ts index 747c33dba..ae9ad698d 100644 --- a/src/components/Nutrition/models/meal.ts +++ b/src/components/Nutrition/models/meal.ts @@ -6,8 +6,8 @@ import { Adapter } from "utils/Adapter"; import { dateTimeToHHMM, dateTimeToLocaleHHMM, HHMMToDateTime, isSameDay } from "utils/date"; export interface ApiMealType { - id: number, - plan: number, + id: string, + plan: string, order: number, time: string | null, name: string @@ -15,8 +15,8 @@ export interface ApiMealType { export type MealConstructorParams = { - id?: number | null; - planId?: number | null; + id?: string | null; + planId?: string | null; order?: number; time?: Date | null; name: string; @@ -26,8 +26,8 @@ export type MealConstructorParams = { export class Meal { - public id: number | null = null; - public planId: number | null = null; + public id: string | null = null; + public planId: string | null = null; public order: number; public time: Date | null = null; public name: string; diff --git a/src/components/Nutrition/models/mealItem.ts b/src/components/Nutrition/models/mealItem.ts index 6e5683d1d..09ebd1a50 100644 --- a/src/components/Nutrition/models/mealItem.ts +++ b/src/components/Nutrition/models/mealItem.ts @@ -7,8 +7,8 @@ import { Adapter } from "utils/Adapter"; import { numberGramLocale } from "utils/numbers"; export interface ApiMealItemType { - id: number, - meal: number, + id: string, + meal: string, ingredient: number, weight_unit: number, order: number, @@ -16,8 +16,8 @@ export interface ApiMealItemType { } export type MealItemConstructorParams = { - id?: number; - mealId: number; + id?: string; + mealId: string; amount: number; order: number; @@ -29,8 +29,8 @@ export type MealItemConstructorParams = { }; export class MealItem { - public id?: number | null; - public mealId: number; + public id?: string | null; + public mealId: string; public ingredientId: number; public weightUnitId: number | null; public amount: number; @@ -91,7 +91,7 @@ export class MealItem { }); } - diaryEntry(planId: number, date?: Date): DiaryEntry { + diaryEntry(planId: string, date?: Date): DiaryEntry { return new DiaryEntry({ mealId: this.mealId, planId: planId, diff --git a/src/components/Nutrition/models/nutritionalPlan.test.ts b/src/components/Nutrition/models/nutritionalPlan.test.ts index 1a52d1f5f..43093bc01 100644 --- a/src/components/Nutrition/models/nutritionalPlan.test.ts +++ b/src/components/Nutrition/models/nutritionalPlan.test.ts @@ -1,4 +1,4 @@ -import { NutritionalPlan } from "components/Nutrition/models/nutritionalPlan"; +import { NutritionalPlan, PSEUDO_MEAL_ID } from "components/Nutrition/models/nutritionalPlan"; import { TEST_MEAL_1, TEST_NUTRITIONAL_PLAN_1 } from "tests/nutritionTestdata"; jest.useFakeTimers(); @@ -142,7 +142,7 @@ describe("Test the nutritional plan model", () => { const meal = TEST_NUTRITIONAL_PLAN_1.pseudoMealOthers('the name'); // Assert - expect(meal.id).toBe(-1); + expect(meal.id).toBe(PSEUDO_MEAL_ID); expect(meal.name).toBe('the name'); expect(meal.diaryEntries.length).toBe(2); }); @@ -151,7 +151,7 @@ describe("Test the nutritional plan model", () => { // Act const plan = new NutritionalPlan({ - id: 1, + id: '00000000-0000-0000-0000-000000000001', creationDate: new Date(), description: 'test 1', }); diff --git a/src/components/Nutrition/models/nutritionalPlan.ts b/src/components/Nutrition/models/nutritionalPlan.ts index 1010b2050..4b61cac51 100644 --- a/src/components/Nutrition/models/nutritionalPlan.ts +++ b/src/components/Nutrition/models/nutritionalPlan.ts @@ -12,11 +12,11 @@ export type GroupedDiaryEntries = { nutritionalValues: NutritionalValues; } -export const PSEUDO_MEAL_ID = -1; +export const PSEUDO_MEAL_ID = '00000000-0000-0000-0000-000000000000'; type NutritionalPlanConstructorParams = { - id?: number | null, + id?: string | null, creationDate?: Date, start?: Date, end?: Date | null, @@ -33,7 +33,7 @@ type NutritionalPlanConstructorParams = { export class NutritionalPlan { - id: number | null; + id: string | null; creationDate: Date; start: Date; end: Date | null; diff --git a/src/components/Nutrition/queries/diary.ts b/src/components/Nutrition/queries/diary.ts index cc9da52be..c7304c111 100644 --- a/src/components/Nutrition/queries/diary.ts +++ b/src/components/Nutrition/queries/diary.ts @@ -14,7 +14,7 @@ export const useNutritionDiaryQuery = (options?: NutritionalDiaryEntriesOptions) queryKey: [QueryKey.NUTRITIONAL_PLAN_DIARY, JSON.stringify(options || {})], }); -export const useAddDiaryEntryQuery = (planId: number) => { +export const useAddDiaryEntryQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ @@ -25,7 +25,7 @@ export const useAddDiaryEntryQuery = (planId: number) => { }); }; -export const useAddDiaryEntriesQuery = (planId: number) => { +export const useAddDiaryEntriesQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ @@ -36,18 +36,18 @@ export const useAddDiaryEntriesQuery = (planId: number) => { }); }; -export const useDeleteDiaryEntryQuery = (planId: number) => { +export const useDeleteDiaryEntryQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: number) => deleteNutritionalDiaryEntry(id), + mutationFn: (id: string) => deleteNutritionalDiaryEntry(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: [QueryKey.NUTRITIONAL_PLAN, planId] }) }); }; -export const useEditDiaryEntryQuery = (planId: number) => { +export const useEditDiaryEntryQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ diff --git a/src/components/Nutrition/queries/meal.ts b/src/components/Nutrition/queries/meal.ts index 10fcf062d..2443d9bbd 100644 --- a/src/components/Nutrition/queries/meal.ts +++ b/src/components/Nutrition/queries/meal.ts @@ -3,7 +3,7 @@ import { Meal } from "components/Nutrition/models/meal"; import { addMeal, deleteMeal, editMeal } from "services/meal"; import { QueryKey } from "utils/consts"; -export const useAddMealQuery = (planId: number) => { +export const useAddMealQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ @@ -15,11 +15,11 @@ export const useAddMealQuery = (planId: number) => { } }); }; -export const useDeleteMealQuery = (planId: number) => { +export const useDeleteMealQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: number) => deleteMeal(id), + mutationFn: (id: string) => deleteMeal(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QueryKey.NUTRITIONAL_PLAN, planId] @@ -27,7 +27,7 @@ export const useDeleteMealQuery = (planId: number) => { } }); }; -export const useEditMealQuery = (planId: number) => { +export const useEditMealQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ diff --git a/src/components/Nutrition/queries/mealItem.ts b/src/components/Nutrition/queries/mealItem.ts index f15b3e947..d6269f2a9 100644 --- a/src/components/Nutrition/queries/mealItem.ts +++ b/src/components/Nutrition/queries/mealItem.ts @@ -3,7 +3,7 @@ import { MealItem } from "components/Nutrition/models/mealItem"; import { addMealItem, deleteMealItem, editMealItem } from "services/mealItem"; import { QueryKey } from "utils/consts"; -export const useAddMealItemQuery = (planId: number) => { +export const useAddMealItemQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ @@ -16,7 +16,7 @@ export const useAddMealItemQuery = (planId: number) => { }); }; -export const useEditMealItemQuery = (planId: number) => { +export const useEditMealItemQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ @@ -29,11 +29,11 @@ export const useEditMealItemQuery = (planId: number) => { }); }; -export const useDeleteMealItemQuery = (planId: number) => { +export const useDeleteMealItemQuery = (planId: string) => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: number) => deleteMealItem(id), + mutationFn: (id: string) => deleteMealItem(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QueryKey.NUTRITIONAL_PLAN, planId] diff --git a/src/components/Nutrition/queries/plan.ts b/src/components/Nutrition/queries/plan.ts index 9ecdb50ee..6808a4324 100644 --- a/src/components/Nutrition/queries/plan.ts +++ b/src/components/Nutrition/queries/plan.ts @@ -26,7 +26,7 @@ export function useFetchLastNutritionalPlanQuery() { }); } -export function useFetchNutritionalPlanQuery(planId: number) { +export function useFetchNutritionalPlanQuery(planId: string) { return useQuery({ queryKey: [QueryKey.NUTRITIONAL_PLAN, planId], queryFn: () => getNutritionalPlanFull(planId) @@ -37,7 +37,7 @@ export function useFetchNutritionalPlanQuery(planId: number) { * Fetches the full nutritional plan (meals, etc.), but only the diary entries for * the given date */ -export function useFetchNutritionalPlanDateQuery(planId: number | null, dateStr: string, enabled = true) { +export function useFetchNutritionalPlanDateQuery(planId: string | null, dateStr: string, enabled = true) { return useQuery({ queryKey: [QueryKey.NUTRITIONAL_PLAN, planId, dateStr], queryFn: () => getNutritionalPlanFull(planId, { filtersetQueryLogs: { "datetime__eq": dateToYYYYMMDD(new Date(dateStr)) } }), @@ -61,11 +61,11 @@ export const useAddNutritionalPlanQuery = () => { }); }; -export const useDeleteNutritionalPlanQuery = (id: number) => { +export const useDeleteNutritionalPlanQuery = (id: string) => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: number) => deleteNutritionalPlan(id), + mutationFn: (id: string) => deleteNutritionalPlan(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QueryKey.NUTRITIONAL_PLANS,] @@ -76,7 +76,7 @@ export const useDeleteNutritionalPlanQuery = (id: number) => { } }); }; -export const useEditNutritionalPlanQuery = (id: number) => { +export const useEditNutritionalPlanQuery = (id: string) => { const queryClient = useQueryClient(); return useMutation({ diff --git a/src/components/Nutrition/widgets/DiaryOverview.tsx b/src/components/Nutrition/widgets/DiaryOverview.tsx index 190214981..372f52ece 100644 --- a/src/components/Nutrition/widgets/DiaryOverview.tsx +++ b/src/components/Nutrition/widgets/DiaryOverview.tsx @@ -9,7 +9,7 @@ import { numberLocale } from "utils/numbers"; import { makeLink, WgerLink } from "utils/url"; export const DiaryOverview = (props: { - planId: number, + planId: string, logged: Map, planned: NutritionalValues }) => { diff --git a/src/components/Nutrition/widgets/MealDetail.tsx b/src/components/Nutrition/widgets/MealDetail.tsx index 95fb6b921..aa8cce83d 100644 --- a/src/components/Nutrition/widgets/MealDetail.tsx +++ b/src/components/Nutrition/widgets/MealDetail.tsx @@ -29,7 +29,7 @@ import { MealDetailDropdown } from "components/Nutrition/widgets/MealDetailDropd import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -const MealItemListItem = (props: { mealItem: MealItem, planId: number, mealId: number }) => { +const MealItemListItem = (props: { mealItem: MealItem, planId: string, mealId: string }) => { const [expandForm, setExpandForm] = useState(false); const handleToggleForm = () => setExpandForm(!expandForm); @@ -63,7 +63,7 @@ const MealItemListItem = (props: { mealItem: MealItem, planId: number, mealId: n ; }; -export const MealDetail = (props: { meal: Meal, planId: number, onlyLogging: boolean }) => { +export const MealDetail = (props: { meal: Meal, planId: string, onlyLogging: boolean }) => { const theme = useTheme(); const [t] = useTranslation(); const [expandViewStats, setExpandViewStats] = useState(false); diff --git a/src/components/Nutrition/widgets/MealDetailDropdown.tsx b/src/components/Nutrition/widgets/MealDetailDropdown.tsx index e0ec7a036..0bd89f231 100644 --- a/src/components/Nutrition/widgets/MealDetailDropdown.tsx +++ b/src/components/Nutrition/widgets/MealDetailDropdown.tsx @@ -17,7 +17,7 @@ import { SNACKBAR_AUTO_HIDE_DURATION } from "utils/consts"; export const MealDetailDropdown = (props: { meal: Meal, - planId: number, + planId: string, onlyLogging: boolean, isExpanded: boolean, handleExpanded: () => void, diff --git a/src/components/Nutrition/widgets/forms/MealForm.test.tsx b/src/components/Nutrition/widgets/forms/MealForm.test.tsx index 35a53671d..f4710bd5e 100644 --- a/src/components/Nutrition/widgets/forms/MealForm.test.tsx +++ b/src/components/Nutrition/widgets/forms/MealForm.test.tsx @@ -30,7 +30,7 @@ describe('Test the MealForm component', () => { // Act render( - + ); @@ -46,7 +46,7 @@ describe('Test the MealForm component', () => { expect(closeFnMock).toHaveBeenCalled(); expect(mutateAddMock).toHaveBeenCalledWith(new Meal({ name: '2nd breakfast', - planId: 987, + planId: 'aaaaaaaa-0000-0000-0000-000000000987', time: expect.any(Date), })); }); @@ -58,7 +58,7 @@ describe('Test the MealForm component', () => { // Act render( - + ); @@ -74,10 +74,10 @@ describe('Test the MealForm component', () => { expect(closeFnMock).toHaveBeenCalled(); expect(mutateEditMock).toHaveBeenCalledWith( expect.objectContaining({ - id: 78, + id: 'bbbbbbbb-0000-0000-0000-000000000078', name: '2nd breakfast', order: 2, - planId: 123, + planId: 'aaaaaaaa-0000-0000-0000-000000000123', time: TEST_MEAL_1.time }) ); diff --git a/src/components/Nutrition/widgets/forms/MealForm.tsx b/src/components/Nutrition/widgets/forms/MealForm.tsx index 0b303928d..5418e72b1 100644 --- a/src/components/Nutrition/widgets/forms/MealForm.tsx +++ b/src/components/Nutrition/widgets/forms/MealForm.tsx @@ -10,7 +10,7 @@ import { useTranslation } from "react-i18next"; import * as yup from "yup"; interface MealFormProps { - planId: number, + planId: string, meal?: Meal, closeFn?: () => void, } diff --git a/src/components/Nutrition/widgets/forms/MealItemForm.test.tsx b/src/components/Nutrition/widgets/forms/MealItemForm.test.tsx index 4213935f4..4a332069f 100644 --- a/src/components/Nutrition/widgets/forms/MealItemForm.test.tsx +++ b/src/components/Nutrition/widgets/forms/MealItemForm.test.tsx @@ -56,7 +56,8 @@ describe('Test the MealItemForm component', () => { // Act render( - + ); await fillInEntry(user); @@ -68,7 +69,7 @@ describe('Test the MealItemForm component', () => { expect(closeFnMock).toHaveBeenCalled(); expect(mutateAddMock).toHaveBeenCalledWith( expect.objectContaining({ - mealId: 123, + mealId: 'bbbbbbbb-0000-0000-0000-000000000123', amount: 120, ingredientId: 101, weightUnitId: null, @@ -82,7 +83,8 @@ describe('Test the MealItemForm component', () => { // Act render( - + ); await fillInEntry(user); @@ -94,8 +96,8 @@ describe('Test the MealItemForm component', () => { expect(closeFnMock).toHaveBeenCalled(); expect(mutateEditMock).toHaveBeenCalledWith( expect.objectContaining({ - id: 42, - mealId: 1001, + id: 'cccccccc-0000-0000-0000-000000000042', + mealId: 'bbbbbbbb-0000-0000-0000-000000001001', amount: 120, order: 3, ingredientId: 101, diff --git a/src/components/Nutrition/widgets/forms/MealItemForm.tsx b/src/components/Nutrition/widgets/forms/MealItemForm.tsx index 068e3fd75..eacd7e8d5 100644 --- a/src/components/Nutrition/widgets/forms/MealItemForm.tsx +++ b/src/components/Nutrition/widgets/forms/MealItemForm.tsx @@ -17,8 +17,8 @@ import * as yup from "yup"; const GRAM_UNIT_VALUE = 'g'; type MealItemFormProps = - | { planId: number; item: MealItem; closeFn?: () => void; mealId?: number } - | { planId: number; mealId: number; item?: undefined; closeFn?: () => void }; + | { planId: string; item: MealItem; closeFn?: () => void; mealId?: string } + | { planId: string; mealId: string; item?: undefined; closeFn?: () => void }; export const MealItemForm = ({ planId, item, mealId, closeFn }: MealItemFormProps) => { @@ -87,7 +87,7 @@ export const MealItemForm = ({ planId, item, mealId, closeFn }: MealItemFormProp } else { // Add addMealItemQuery.mutate(new MealItem({ - mealId: mealId, + mealId: mealId!, amount: newAmount, ingredientId: values.ingredient, weightUnitId: selectedUnit?.id ?? null, diff --git a/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.test.tsx b/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.test.tsx index c356ee40a..d8442647b 100644 --- a/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.test.tsx +++ b/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.test.tsx @@ -59,7 +59,7 @@ describe('Test the NutritionDiaryEntryForm component', () => { // Act render( - + ); await fillInEntry(user); @@ -74,7 +74,7 @@ describe('Test the NutritionDiaryEntryForm component', () => { amount: 120, datetime: expect.any(Date), ingredientId: 101, - planId: 123, + planId: 'aaaaaaaa-0000-0000-0000-000000000123', mealId: null, weightUnitId: null, }) @@ -87,7 +87,8 @@ describe('Test the NutritionDiaryEntryForm component', () => { // Act render( - + ); await fillInEntry(user); @@ -102,8 +103,8 @@ describe('Test the NutritionDiaryEntryForm component', () => { amount: 120, datetime: expect.any(Date), ingredientId: 101, - planId: 123, - mealId: 456, + planId: 'aaaaaaaa-0000-0000-0000-000000000123', + mealId: 'bbbbbbbb-0000-0000-0000-000000000456', weightUnitId: null, }) @@ -117,7 +118,8 @@ describe('Test the NutritionDiaryEntryForm component', () => { // Act render( - + ); await fillInEntry(user); @@ -127,10 +129,10 @@ describe('Test the NutritionDiaryEntryForm component', () => { expect(closeFnMock).toHaveBeenCalled(); expect(mutateEditMock).toHaveBeenCalledWith( expect.objectContaining({ - id: 42, + id: 'dddddddd-0000-0000-0000-000000000042', amount: 120, - mealId: 78, - planId: 123, + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', + planId: 'aaaaaaaa-0000-0000-0000-000000000123', ingredientId: 101, }) ); @@ -143,7 +145,9 @@ describe('Test the NutritionDiaryEntryForm component', () => { // Act render( - + ); await fillInEntry(user); @@ -153,9 +157,9 @@ describe('Test the NutritionDiaryEntryForm component', () => { expect(closeFnMock).toHaveBeenCalled(); expect(mutateEditMock).toHaveBeenCalledWith( expect.objectContaining({ - id: 42, - planId: 123, - mealId: 456, + id: 'dddddddd-0000-0000-0000-000000000042', + planId: 'aaaaaaaa-0000-0000-0000-000000000123', + mealId: 'bbbbbbbb-0000-0000-0000-000000000456', amount: 120, ingredientId: 101, weightUnitId: null, diff --git a/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.tsx b/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.tsx index b855e8b8f..ac68f074c 100644 --- a/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.tsx +++ b/src/components/Nutrition/widgets/forms/NutritionDiaryEntryForm.tsx @@ -17,9 +17,9 @@ import * as yup from "yup"; const GRAM_UNIT_VALUE = 'g'; type NutritionDiaryEntryFormProps = { - planId: number, + planId: string, entry?: DiaryEntry, - mealId?: number | null, + mealId?: string | null, meals?: Meal[], closeFn?: () => void, } @@ -33,7 +33,7 @@ export const NutritionDiaryEntryForm = ({ planId, entry, mealId, meals, closeFn const addDiaryQuery = useAddDiaryEntryQuery(planId); const editDiaryQuery = useEditDiaryEntryQuery(planId); const [dateValue, setDateValue] = useState(entry ? DateTime.fromJSDate(entry.datetime) : DateTime.now()); - const [selectedMeal, setSelectedMeal] = useState(meal); + const [selectedMeal, setSelectedMeal] = useState(meal); const [selectedUnit, setSelectedUnit] = useState(entry?.weightUnit ?? null); const [ingredientId, setIngredientId] = useState(entry?.ingredientId ?? null); diff --git a/src/components/Nutrition/widgets/forms/PlanForm.test.tsx b/src/components/Nutrition/widgets/forms/PlanForm.test.tsx index d78dcc94c..8a055e21d 100644 --- a/src/components/Nutrition/widgets/forms/PlanForm.test.tsx +++ b/src/components/Nutrition/widgets/forms/PlanForm.test.tsx @@ -59,7 +59,7 @@ describe("Test the PlanForm component", () => { // Assert await user.click(screen.getByRole('button', { name: 'submit' })); expect(mutate).toHaveBeenCalledWith(expect.objectContaining({ - id: 101, + id: 'aaaaaaaa-0000-0000-0000-000000000101', description: "a better name", goalCarbohydrates: null, goalFiber: null, diff --git a/src/components/Nutrition/widgets/forms/PlanForm.tsx b/src/components/Nutrition/widgets/forms/PlanForm.tsx index fc74696e5..8e95c48b2 100644 --- a/src/components/Nutrition/widgets/forms/PlanForm.tsx +++ b/src/components/Nutrition/widgets/forms/PlanForm.tsx @@ -32,7 +32,7 @@ export const PlanForm = ({ plan, closeFn }: PlanFormProps) => { const [t] = useTranslation(); const addPlanQuery = useAddNutritionalPlanQuery(); - const editPlanQuery = useEditNutritionalPlanQuery(plan?.id || 0); + const editPlanQuery = useEditNutritionalPlanQuery(plan?.id ?? ''); const [useGoals, setUseGoals] = useState(plan?.hasAnyGoals); const [startDateValue, setStartDateValue] = useState(plan ? DateTime.fromJSDate(plan.start) : DateTime.now); const [endDateValue, setEndDateValue] = useState(plan && plan?.end !== null ? DateTime.fromJSDate(plan!.end) : null); diff --git a/src/services/meal.ts b/src/services/meal.ts index 614414f0c..0a6e2e50f 100644 --- a/src/services/meal.ts +++ b/src/services/meal.ts @@ -28,14 +28,14 @@ export const editMeal = async (meal: Meal): Promise => { return Meal.fromJson(response.data); }; -export const deleteMeal = async (id: number): Promise => { +export const deleteMeal = async (id: string): Promise => { await axios.delete( makeUrl(ApiPath.MEAL, { id: id }), { headers: makeHeader() }, ); }; -export const getMealsForPlan = async (planId: number): Promise => { +export const getMealsForPlan = async (planId: string): Promise => { let ingredientIds: number[] = []; const { data: receivedMeals } = await axios.get>( diff --git a/src/services/mealItem.ts b/src/services/mealItem.ts index 8f350a504..40166ad7a 100644 --- a/src/services/mealItem.ts +++ b/src/services/mealItem.ts @@ -24,7 +24,7 @@ export const editMealItem = async (mealItem: MealItem): Promise => { return MealItem.fromJson(response.data); }; -export const deleteMealItem = async (id: number): Promise => { +export const deleteMealItem = async (id: string): Promise => { await axios.delete( makeUrl(ApiPath.MEAL_ITEM, { id: id }), { headers: makeHeader() }, diff --git a/src/services/nutritionalDiary.ts b/src/services/nutritionalDiary.ts index 9a67ee806..b3fdf3296 100644 --- a/src/services/nutritionalDiary.ts +++ b/src/services/nutritionalDiary.ts @@ -62,7 +62,7 @@ export const editNutritionalDiaryEntry = async (diaryEntry: DiaryEntry): Promise return DiaryEntry.fromJson(response.data); }; -export const deleteNutritionalDiaryEntry = async (id: number): Promise => { +export const deleteNutritionalDiaryEntry = async (id: string): Promise => { await axios.delete( makeUrl(ApiPath.NUTRITIONAL_DIARY, { id: id }), { headers: makeHeader() }, diff --git a/src/services/nutritionalPlan.test.ts b/src/services/nutritionalPlan.test.ts index 17118363c..b59e7ce3f 100644 --- a/src/services/nutritionalPlan.test.ts +++ b/src/services/nutritionalPlan.test.ts @@ -14,7 +14,7 @@ describe("Nutritional plan service tests", () => { previous: null, results: [ { - "id": 72559, + "id": "00000000-0000-0000-0000-000000072559", "creation_date": "2023-05-26", "start": "2023-06-01", "end": "2023-06-30", @@ -22,7 +22,7 @@ describe("Nutritional plan service tests", () => { "only_logging": true, }, { - "id": 60131, + "id": "00000000-0000-0000-0000-000000060131", "creation_date": "2022-06-01", "start": "2022-06-01", "end": null, @@ -30,7 +30,7 @@ describe("Nutritional plan service tests", () => { "only_logging": false, }, { - "id": 24752, + "id": "00000000-0000-0000-0000-000000024752", "creation_date": "2023-08-01", "start": "2023-08-01", "end": "2023-08-31", @@ -47,7 +47,7 @@ describe("Nutritional plan service tests", () => { expect(result).toStrictEqual([ new NutritionalPlan({ - id: 72559, + id: '00000000-0000-0000-0000-000000072559', creationDate: new Date('2023-05-26'), start: new Date('2023-06-01'), end: new Date('2023-06-30'), @@ -55,13 +55,13 @@ describe("Nutritional plan service tests", () => { onlyLogging: true }), new NutritionalPlan({ - id: 60131, + id: '00000000-0000-0000-0000-000000060131', creationDate: new Date('2022-06-01'), description: '', onlyLogging: false }), new NutritionalPlan({ - id: 24752, + id: '00000000-0000-0000-0000-000000024752', creationDate: new Date('2023-08-01'), start: new Date('2023-08-01'), end: new Date('2023-08-31'), diff --git a/src/services/nutritionalPlan.ts b/src/services/nutritionalPlan.ts index f2a417491..da6808993 100644 --- a/src/services/nutritionalPlan.ts +++ b/src/services/nutritionalPlan.ts @@ -34,7 +34,7 @@ export const getLastNutritionalPlan = async (): Promise return await getNutritionalPlanFull(receivedPlan.results[0].id); }; -export const getNutritionalPlanFull = async (id: number | null, options?: NutritionalPlanOptions): Promise => { +export const getNutritionalPlanFull = async (id: string | null, options?: NutritionalPlanOptions): Promise => { if (id === null) { return null; } @@ -96,7 +96,7 @@ export const editNutritionalPlan = async (plan: NutritionalPlan): Promise => { +export const deleteNutritionalPlan = async (id: string): Promise => { await axios.delete( makeUrl(API_NUTRITIONAL_PLAN_PATH, { id: id }), { headers: makeHeader() }, diff --git a/src/tests/nutritionDiaryTestdata.ts b/src/tests/nutritionDiaryTestdata.ts index 73cc10d44..d6b1d77c1 100644 --- a/src/tests/nutritionDiaryTestdata.ts +++ b/src/tests/nutritionDiaryTestdata.ts @@ -3,9 +3,9 @@ import { TEST_INGREDIENT_1, TEST_INGREDIENT_2, TEST_INGREDIENT_3, TEST_INGREDIEN export const TEST_DIARY_ENTRY_1 = new DiaryEntry({ - id: 42, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000042', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 101, weightUnitId: null, amount: 120, @@ -14,9 +14,9 @@ export const TEST_DIARY_ENTRY_1 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_2 = new DiaryEntry({ - id: 44, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000044', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 102, weightUnitId: null, amount: 50, @@ -25,9 +25,9 @@ export const TEST_DIARY_ENTRY_2 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_3 = new DiaryEntry({ - id: 45, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000045', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 200, @@ -36,9 +36,9 @@ export const TEST_DIARY_ENTRY_3 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_4 = new DiaryEntry({ - id: 46, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000046', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 20, @@ -47,9 +47,9 @@ export const TEST_DIARY_ENTRY_4 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_5 = new DiaryEntry({ - id: 47, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000047', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 20, @@ -58,9 +58,9 @@ export const TEST_DIARY_ENTRY_5 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_6 = new DiaryEntry({ - id: 48, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000048', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 50, @@ -69,9 +69,9 @@ export const TEST_DIARY_ENTRY_6 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_7 = new DiaryEntry({ - id: 49, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000049', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 50, @@ -80,9 +80,9 @@ export const TEST_DIARY_ENTRY_7 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_8 = new DiaryEntry({ - id: 50, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000050', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 100, @@ -91,9 +91,9 @@ export const TEST_DIARY_ENTRY_8 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_9 = new DiaryEntry({ - id: 51, - planId: 1, - mealId: 999, + id: 'dddddddd-0000-0000-0000-000000000051', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000999', ingredientId: 103, weightUnitId: null, amount: 80, @@ -102,9 +102,9 @@ export const TEST_DIARY_ENTRY_9 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_10 = new DiaryEntry({ - id: 51, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000051', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 103, weightUnitId: null, amount: 80, @@ -113,9 +113,9 @@ export const TEST_DIARY_ENTRY_10 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_11 = new DiaryEntry({ - id: 52, - planId: 1, - mealId: 999, + id: 'dddddddd-0000-0000-0000-000000000052', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000999', ingredientId: 103, weightUnitId: null, amount: 500, @@ -124,9 +124,9 @@ export const TEST_DIARY_ENTRY_11 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_12 = new DiaryEntry({ - id: 52, - planId: 1, - mealId: 999, + id: 'dddddddd-0000-0000-0000-000000000052', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000999', ingredientId: 104, weightUnitId: null, amount: 500, @@ -135,9 +135,9 @@ export const TEST_DIARY_ENTRY_12 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_13 = new DiaryEntry({ - id: 53, - planId: 1, - mealId: 78, + id: 'dddddddd-0000-0000-0000-000000000053', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', + mealId: 'bbbbbbbb-0000-0000-0000-000000000078', ingredientId: 104, weightUnitId: null, amount: 500, @@ -146,8 +146,8 @@ export const TEST_DIARY_ENTRY_13 = new DiaryEntry({ }); export const TEST_DIARY_ENTRY_14 = new DiaryEntry({ - id: 54, - planId: 1, + id: 'dddddddd-0000-0000-0000-000000000054', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', mealId: null, ingredientId: 104, weightUnitId: null, @@ -156,8 +156,8 @@ export const TEST_DIARY_ENTRY_14 = new DiaryEntry({ ingredient: TEST_INGREDIENT_4 }); export const TEST_DIARY_ENTRY_15 = new DiaryEntry({ - id: 54, - planId: 1, + id: 'dddddddd-0000-0000-0000-000000000054', + planId: 'aaaaaaaa-0000-0000-0000-000000000001', mealId: null, ingredientId: 103, weightUnitId: null, diff --git a/src/tests/nutritionTestdata.ts b/src/tests/nutritionTestdata.ts index 5e3fefaab..e8e465232 100644 --- a/src/tests/nutritionTestdata.ts +++ b/src/tests/nutritionTestdata.ts @@ -41,8 +41,8 @@ export const TEST_WEIGHT_UNIT_CUP = new NutritionWeightUnit( export const TEST_MEAL_ITEM_1 = new MealItem({ - id: 42, - mealId: 1001, + id: 'cccccccc-0000-0000-0000-000000000042', + mealId: 'bbbbbbbb-0000-0000-0000-000000001001', amount: 120, order: 3, ingredient: TEST_INGREDIENT_1, @@ -50,8 +50,8 @@ export const TEST_MEAL_ITEM_1 = new MealItem({ weightUnitId: null, }); export const TEST_MEAL_ITEM_2 = new MealItem({ - id: 43, - mealId: 1001, + id: 'cccccccc-0000-0000-0000-000000000043', + mealId: 'bbbbbbbb-0000-0000-0000-000000001001', amount: 220, order: 1, ingredientId: 102, @@ -59,8 +59,8 @@ export const TEST_MEAL_ITEM_2 = new MealItem({ ingredient: TEST_INGREDIENT_2 }); export const TEST_MEAL_ITEM_3 = new MealItem({ - id: 45, - mealId: 1001, + id: 'cccccccc-0000-0000-0000-000000000045', + mealId: 'bbbbbbbb-0000-0000-0000-000000001001', amount: 320, order: 2, ingredientId: 104, @@ -69,8 +69,8 @@ export const TEST_MEAL_ITEM_3 = new MealItem({ }); export const TEST_MEAL_ITEM_4 = new MealItem({ - id: 46, - mealId: 999, + id: 'cccccccc-0000-0000-0000-000000000046', + mealId: 'bbbbbbbb-0000-0000-0000-000000000999', amount: 320, order: 1, ingredientId: 105, @@ -79,8 +79,8 @@ export const TEST_MEAL_ITEM_4 = new MealItem({ }); export const TEST_MEAL_ITEM_5 = new MealItem({ - id: 47, - mealId: 1, + id: 'cccccccc-0000-0000-0000-000000000047', + mealId: 'bbbbbbbb-0000-0000-0000-000000000001', amount: 320, order: 1, ingredientId: 101, @@ -89,8 +89,8 @@ export const TEST_MEAL_ITEM_5 = new MealItem({ }); export const TEST_MEAL_ITEM_6 = new MealItem({ - id: 48, - mealId: 123, + id: 'cccccccc-0000-0000-0000-000000000048', + mealId: 'bbbbbbbb-0000-0000-0000-000000000123', amount: 100, order: 2, ingredientId: 102, @@ -98,8 +98,8 @@ export const TEST_MEAL_ITEM_6 = new MealItem({ ingredient: TEST_INGREDIENT_2 }); export const TEST_MEAL_ITEM_7 = new MealItem({ - id: 103, - mealId: 2345, + id: 'cccccccc-0000-0000-0000-000000000103', + mealId: 'bbbbbbbb-0000-0000-0000-000000002345', amount: 100, order: 1, ingredientId: 109, @@ -108,8 +108,8 @@ export const TEST_MEAL_ITEM_7 = new MealItem({ }); export const TEST_MEAL_ITEM_8 = new MealItem({ - id: 104, - mealId: 2222, + id: 'cccccccc-0000-0000-0000-000000000104', + mealId: 'bbbbbbbb-0000-0000-0000-000000002222', amount: 120, order: 1, ingredientId: 110, @@ -119,8 +119,8 @@ export const TEST_MEAL_ITEM_8 = new MealItem({ export const TEST_MEAL_1 = new Meal({ - id: 78, - planId: 123, + id: 'bbbbbbbb-0000-0000-0000-000000000078', + planId: 'aaaaaaaa-0000-0000-0000-000000000123', order: 2, time: HHMMToDateTime('12:30'), name: 'Second breakfast', @@ -129,7 +129,7 @@ TEST_MEAL_1.items = [TEST_MEAL_ITEM_1, TEST_MEAL_ITEM_2, TEST_MEAL_ITEM_3]; export const TEST_MEAL_2 = new Meal({ - id: 999, + id: 'bbbbbbbb-0000-0000-0000-000000000999', order: 3, time: HHMMToDateTime('22:30'), name: 'evening snack', @@ -137,7 +137,7 @@ export const TEST_MEAL_2 = new Meal({ TEST_MEAL_2.items = [TEST_MEAL_ITEM_4]; export const TEST_MEAL_3 = new Meal({ - id: 1, + id: 'bbbbbbbb-0000-0000-0000-000000000001', order: 1, time: HHMMToDateTime('6:30'), name: 'breakfast', @@ -145,7 +145,7 @@ export const TEST_MEAL_3 = new Meal({ TEST_MEAL_3.items = [TEST_MEAL_ITEM_5, TEST_MEAL_ITEM_6]; export const TEST_MEAL_4 = new Meal({ - id: 2, + id: 'bbbbbbbb-0000-0000-0000-000000000002', order: 1, time: HHMMToDateTime('7:45'), name: 'Cake time', @@ -153,7 +153,7 @@ export const TEST_MEAL_4 = new Meal({ TEST_MEAL_4.items = [TEST_MEAL_ITEM_7]; export const TEST_MEAL_5 = new Meal({ - id: 22, + id: 'bbbbbbbb-0000-0000-0000-000000000022', order: 2, time: HHMMToDateTime('12:00'), name: 'Time to visit McDonalds', @@ -161,7 +161,7 @@ export const TEST_MEAL_5 = new Meal({ TEST_MEAL_5.items = [TEST_MEAL_ITEM_8]; export const TEST_NUTRITIONAL_PLAN_1 = new NutritionalPlan({ - id: 101, + id: 'aaaaaaaa-0000-0000-0000-000000000101', creationDate: new Date('2023-01-01'), description: 'Summer body!!!', }); @@ -191,7 +191,7 @@ TEST_NUTRITIONAL_PLAN_1.diaryEntries = [ export const TEST_NUTRITIONAL_PLAN_2 = new NutritionalPlan({ - id: 222, + id: 'aaaaaaaa-0000-0000-0000-000000000222', creationDate: new Date('2023-08-01'), description: 'Bulking till we puke', }); diff --git a/src/types.ts b/src/types.ts index 0e2c00980..fac7f1e29 100644 --- a/src/types.ts +++ b/src/types.ts @@ -49,7 +49,7 @@ export interface ApiAliasType { } export interface ApiMeasurementCategoryType { - id: number, + id: string, name: string, unit: string } @@ -112,7 +112,7 @@ export type ApiIngredientWeightUnitType = { } export interface ApiNutritionalPlanType { - id: number, + id: string, creation_date: string, start: string, end: string | null, @@ -127,8 +127,8 @@ export interface ApiNutritionalPlanType { export interface ApiMeasurementEntryType { - id: number, - category: number, + id: string, + category: string, date: Date, value: number, notes: string From 3135dbba43244b68544f5366583e39ee2dc55eb9 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 27 May 2026 16:03:46 +0200 Subject: [PATCH 3/4] Move further models to use string (uuid) IDs --- .../Measurements/api/measurements.test.ts | 64 ++++++++++--------- src/components/Nutrition/api/meal.test.ts | 47 +++++++++----- src/components/Nutrition/api/mealItem.test.ts | 31 ++++++--- .../Nutrition/api/nutritionalDiary.test.ts | 32 ++++++---- .../Nutrition/api/nutritionalPlan.test.ts | 55 +++++++++------- .../Nutrition/models/nutritionalPlan.test.ts | 12 +++- src/components/Routines/api/routine.test.ts | 4 +- src/components/Routines/api/session.test.ts | 34 ++++++---- .../Routines/api/workoutLogs.test.ts | 32 ++++++---- .../Routines/widgets/forms/SessionForm.tsx | 2 +- src/tests/nutritionTestdata.ts | 38 ++++++----- 11 files changed, 211 insertions(+), 140 deletions(-) diff --git a/src/components/Measurements/api/measurements.test.ts b/src/components/Measurements/api/measurements.test.ts index 913f7f58b..d68606e23 100644 --- a/src/components/Measurements/api/measurements.test.ts +++ b/src/components/Measurements/api/measurements.test.ts @@ -15,6 +15,12 @@ import type { Mock } from 'vitest'; vi.mock("axios"); +// Recognisable test-marker UUIDs matching the Django fixtures convention +const CATEGORY_UUID = 'cccccccc-cccc-cccc-cccc-000000000001'; +const CATEGORY_UUID_2 = 'cccccccc-cccc-cccc-cccc-000000000009'; +const ENTRY_UUID = 'dddddddd-dddd-dddd-dddd-000000000001'; +const ENTRY_UUID_2 = 'dddddddd-dddd-dddd-dddd-000000000005'; + describe('measurement service tests', () => { const measurementEntryResponse = { count: 2, @@ -22,8 +28,8 @@ describe('measurement service tests', () => { previous: null, results: [ { - "id": 1, - "category": 1, + "id": ENTRY_UUID, + "category": CATEGORY_UUID, "value": 80, "date": "2021-01-01", "notes": "" @@ -37,7 +43,7 @@ describe('measurement service tests', () => { previous: null, results: [ { - "id": 1, + "id": CATEGORY_UUID, "name": "Weight", "unit": "kg" } @@ -45,7 +51,7 @@ describe('measurement service tests', () => { }; const measurementDetailResponse = { - "id": 1, + "id": CATEGORY_UUID, "name": "Weight", "unit": "kg" }; @@ -57,7 +63,7 @@ describe('measurement service tests', () => { (axios.get as Mock).mockImplementation((url: string) => { if (url.includes("measurement-category")) { return Promise.resolve({ data: measurementOverviewResponse }); - } else if (url.includes("measurement/?category=1")) { + } else if (url.includes(`measurement/?category=${CATEGORY_UUID}`)) { return Promise.resolve({ data: measurementEntryResponse }); } }); @@ -88,8 +94,8 @@ describe('measurement service tests', () => { expect(axios.get).toHaveBeenCalledTimes(2); expect(result).toStrictEqual([ - new MeasurementCategory(1, "Weight", "kg", [ - new MeasurementEntry(1, 1, new Date("2021-01-01"), 80, "") + new MeasurementCategory(CATEGORY_UUID, "Weight", "kg", [ + new MeasurementEntry(ENTRY_UUID, CATEGORY_UUID, new Date("2021-01-01"), 80, "") ]) ]); }); @@ -97,26 +103,26 @@ describe('measurement service tests', () => { test('GET measurement category', async () => { (axios.get as Mock).mockImplementation((url: string) => { - if (url.includes("measurement-category/1")) { + if (url.includes(`measurement-category/${CATEGORY_UUID}`)) { return Promise.resolve({ data: measurementDetailResponse }); - } else if (url.includes("measurement/?category=1")) { + } else if (url.includes(`measurement/?category=${CATEGORY_UUID}`)) { return Promise.resolve({ data: measurementEntryResponse }); } }); - const result = await getMeasurementCategory(1); + const result = await getMeasurementCategory(CATEGORY_UUID); expect(axios.get).toHaveBeenCalledTimes(2); expect(result).toStrictEqual( - new MeasurementCategory(1, "Weight", "kg", [ - new MeasurementEntry(1, 1, new Date("2021-01-01"), 80, "") + new MeasurementCategory(CATEGORY_UUID, "Weight", "kg", [ + new MeasurementEntry(ENTRY_UUID, CATEGORY_UUID, new Date("2021-01-01"), 80, "") ]) ); }); test('addMeasurementCategory POSTs name + unit and returns the parsed category', async () => { (axios.post as Mock).mockResolvedValue({ - data: { id: 9, name: "Body fat", unit: "%" }, + data: { id: CATEGORY_UUID_2, name: "Body fat", unit: "%" }, }); const result = await addMeasurementCategory({ name: "Body fat", unit: "%" }); @@ -126,19 +132,19 @@ describe('measurement service tests', () => { expect(url).toMatch(/\/api\/v2\/measurement-category\/$/); expect(body).toEqual({ name: "Body fat", unit: "%" }); expect(result).toBeInstanceOf(MeasurementCategory); - expect(result.id).toBe(9); + expect(result.id).toBe(CATEGORY_UUID_2); }); test('editMeasurementCategory PATCHes /measurement-category//', async () => { (axios.patch as Mock).mockResolvedValue({ - data: { id: 9, name: "Renamed", unit: "%" }, + data: { id: CATEGORY_UUID_2, name: "Renamed", unit: "%" }, }); - const result = await editMeasurementCategory({ id: 9, name: "Renamed", unit: "%" }); + const result = await editMeasurementCategory({ id: CATEGORY_UUID_2, name: "Renamed", unit: "%" }); expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/measurement-category\/9\/$/); + expect(url).toMatch(new RegExp(`/api/v2/measurement-category/${CATEGORY_UUID_2}/$`)); expect(body).toEqual({ name: "Renamed", unit: "%" }); expect(result.name).toBe("Renamed"); }); @@ -146,21 +152,21 @@ describe('measurement service tests', () => { test('deleteMeasurementCategory DELETEs /measurement-category//', async () => { (axios.delete as Mock).mockResolvedValue({ status: 204 }); - await deleteMeasurementCategory(9); + await deleteMeasurementCategory(CATEGORY_UUID_2); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/measurement-category\/9\/$/), + expect.stringMatching(new RegExp(`/api/v2/measurement-category/${CATEGORY_UUID_2}/$`)), expect.anything() ); }); test('addMeasurementEntry POSTs the entry with serialized date', async () => { (axios.post as Mock).mockResolvedValue({ - data: { id: 5, category: 1, value: 80.5, date: "2024-08-01", notes: "" }, + data: { id: ENTRY_UUID_2, category: CATEGORY_UUID, value: 80.5, date: "2024-08-01", notes: "" }, }); const result = await addMeasurementEntry({ - categoryId: 1, + categoryId: CATEGORY_UUID, date: new Date("2024-08-01T12:34:00Z"), value: 80.5, notes: "", @@ -170,24 +176,24 @@ describe('measurement service tests', () => { const [url, body] = (axios.post as Mock).mock.calls[0]; expect(url).toMatch(/\/api\/v2\/measurement\/$/); expect(body).toMatchObject({ - category: 1, + category: CATEGORY_UUID, value: 80.5, notes: "", }); // Date is YYYY-MM-DD expect(body.date).toMatch(/^\d{4}-\d{2}-\d{2}$/); expect(result).toBeInstanceOf(MeasurementEntry); - expect(result.id).toBe(5); + expect(result.id).toBe(ENTRY_UUID_2); }); test('editMeasurementEntry PATCHes /measurement// with date/value/notes only', async () => { (axios.patch as Mock).mockResolvedValue({ - data: { id: 5, category: 1, value: 81, date: "2024-08-02", notes: "edited" }, + data: { id: ENTRY_UUID_2, category: CATEGORY_UUID, value: 81, date: "2024-08-02", notes: "edited" }, }); const result = await editMeasurementEntry({ - id: 5, - categoryId: 1, + id: ENTRY_UUID_2, + categoryId: CATEGORY_UUID, date: new Date("2024-08-02T00:00:00Z"), value: 81, notes: "edited", @@ -195,7 +201,7 @@ describe('measurement service tests', () => { expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/measurement\/5\/$/); + expect(url).toMatch(new RegExp(`/api/v2/measurement/${ENTRY_UUID_2}/$`)); // Note: 'category' is NOT sent on edit (categoryId is part of the params but ignored in body) expect(body).not.toHaveProperty("category"); expect(body).toMatchObject({ value: 81, notes: "edited" }); @@ -206,10 +212,10 @@ describe('measurement service tests', () => { test('deleteMeasurementEntry DELETEs /measurement//', async () => { (axios.delete as Mock).mockResolvedValue({ status: 204 }); - await deleteMeasurementEntry(5); + await deleteMeasurementEntry(ENTRY_UUID_2); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/measurement\/5\/$/), + expect.stringMatching(new RegExp(`/api/v2/measurement/${ENTRY_UUID_2}/$`)), expect.anything() ); }); diff --git a/src/components/Nutrition/api/meal.test.ts b/src/components/Nutrition/api/meal.test.ts index e17aeae3c..abe817cbf 100644 --- a/src/components/Nutrition/api/meal.test.ts +++ b/src/components/Nutrition/api/meal.test.ts @@ -1,14 +1,16 @@ -import axios from "axios"; -import { Meal } from "@/components/Nutrition/models/meal"; -import { addMeal, deleteMeal, editMeal, getMealsForPlan } from "@/components/Nutrition/api/meal"; import { getIngredients } from "@/components/Nutrition/api/ingredient"; +import { addMeal, deleteMeal, editMeal, getMealsForPlan } from "@/components/Nutrition/api/meal"; +import { Meal } from "@/components/Nutrition/models/meal"; +import { HHMMToDateTime } from "@/core/lib/date"; +import { TEST_INGREDIENT_1, TEST_INGREDIENT_2 } from "@/tests/ingredientTestdata"; import { + RESPONSE_MEAL_UUID, + RESPONSE_PLAN_UUID_2, responseMealDetail, responseMealItemsForMeal, responseMealsForPlan, } from "@/tests/nutritionTestdata"; -import { TEST_INGREDIENT_1, TEST_INGREDIENT_2 } from "@/tests/ingredientTestdata"; -import { HHMMToDateTime } from "@/core/lib/date"; +import axios from "axios"; import type { Mock } from "vitest"; vi.mock("axios"); @@ -20,7 +22,12 @@ describe("meal service tests", () => { }); test("addMeal POSTs the serialized meal and returns the parsed Meal", async () => { - const meal = new Meal({ planId: 123, order: 2, time: HHMMToDateTime("12:30"), name: "Second breakfast" }); + const meal = new Meal({ + planId: RESPONSE_PLAN_UUID_2, + order: 2, + time: HHMMToDateTime("12:30"), + name: "Second breakfast" + }); (axios.post as Mock).mockResolvedValue({ data: responseMealDetail }); const result = await addMeal(meal); @@ -28,34 +35,40 @@ describe("meal service tests", () => { expect(axios.post).toHaveBeenCalledTimes(1); const [url, body] = (axios.post as Mock).mock.calls[0]; expect(url).toMatch(/\/api\/v2\/meal\/$/); - expect(body).toMatchObject({ plan: 123, name: "Second breakfast", order: 2, time: "12:30" }); + expect(body).toMatchObject({ plan: RESPONSE_PLAN_UUID_2, name: "Second breakfast", order: 2, time: "12:30" }); // toJson omits the id field when it's null - verify expect(body).not.toHaveProperty("id"); expect(result).toBeInstanceOf(Meal); - expect(result.id).toBe(78); + expect(result.id).toBe(RESPONSE_MEAL_UUID); }); test("editMeal PATCHes /meal// and returns the parsed Meal", async () => { - const meal = new Meal({ id: 78, planId: 123, order: 2, time: HHMMToDateTime("12:30"), name: "renamed" }); + const meal = new Meal({ + id: RESPONSE_MEAL_UUID, + planId: RESPONSE_PLAN_UUID_2, + order: 2, + time: HHMMToDateTime("12:30"), + name: "renamed" + }); (axios.patch as Mock).mockResolvedValue({ data: { ...responseMealDetail, name: "renamed" } }); const result = await editMeal(meal); expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/meal\/78\/$/); - expect(body).toMatchObject({ id: 78, name: "renamed" }); + expect(url).toMatch(new RegExp(`/api/v2/meal/${RESPONSE_MEAL_UUID}/$`)); + expect(body).toMatchObject({ id: RESPONSE_MEAL_UUID, name: "renamed" }); expect(result.name).toBe("renamed"); }); test("deleteMeal DELETEs /meal//", async () => { (axios.delete as Mock).mockResolvedValue({ status: 204 }); - await deleteMeal(78); + await deleteMeal(RESPONSE_MEAL_UUID); expect(axios.delete).toHaveBeenCalledTimes(1); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/meal\/78\/$/), + expect.stringMatching(new RegExp(`/api/v2/meal/${RESPONSE_MEAL_UUID}/$`)), expect.anything() ); }); @@ -70,12 +83,12 @@ describe("meal service tests", () => { }); (getIngredients as Mock).mockResolvedValue([TEST_INGREDIENT_1, TEST_INGREDIENT_2]); - const result = await getMealsForPlan(123); + const result = await getMealsForPlan(RESPONSE_PLAN_UUID_2); // The list call filters by plan, the item call filters by meal const calledUrls = (axios.get as Mock).mock.calls.map(([u]) => u as string); - expect(calledUrls.some(u => u.includes("/meal/?plan=123"))).toBe(true); - expect(calledUrls.some(u => u.includes("/mealitem/?meal=78"))).toBe(true); + expect(calledUrls.some(u => u.includes(`/meal/?plan=${RESPONSE_PLAN_UUID_2}`))).toBe(true); + expect(calledUrls.some(u => u.includes(`/mealitem/?meal=${RESPONSE_MEAL_UUID}`))).toBe(true); // getIngredients is called once per meal with the deduped ingredient ids expect(getIngredients).toHaveBeenCalledWith([101, 102]); @@ -95,7 +108,7 @@ describe("meal service tests", () => { data: { count: 0, next: null, previous: null, results: [] }, }); - const result = await getMealsForPlan(123); + const result = await getMealsForPlan(RESPONSE_PLAN_UUID_2); expect(result).toEqual([]); // No item calls, no ingredient lookups diff --git a/src/components/Nutrition/api/mealItem.test.ts b/src/components/Nutrition/api/mealItem.test.ts index ff3833d4e..24cd4f93d 100644 --- a/src/components/Nutrition/api/mealItem.test.ts +++ b/src/components/Nutrition/api/mealItem.test.ts @@ -1,6 +1,6 @@ import { addMealItem, deleteMealItem, editMealItem } from "@/components/Nutrition/api/mealItem"; import { MealItem } from "@/components/Nutrition/models/mealItem"; -import { responseMealItemDetail } from "@/tests/nutritionTestdata"; +import { RESPONSE_MEAL_ITEM_UUID, RESPONSE_MEAL_UUID, responseMealItemDetail, } from "@/tests/nutritionTestdata"; import axios from "axios"; import type { Mock } from "vitest"; @@ -12,7 +12,13 @@ describe("mealItem service tests", () => { }); test("addMealItem POSTs the serialized item and returns the parsed MealItem", async () => { - const item = new MealItem({ mealId: 78, ingredientId: 101, weightUnitId: null, amount: 120, order: 3 }); + const item = new MealItem({ + mealId: RESPONSE_MEAL_UUID, + ingredientId: 101, + weightUnitId: null, + amount: 120, + order: 3 + }); (axios.post as Mock).mockResolvedValue({ data: responseMealItemDetail }); const result = await addMealItem(item); @@ -21,7 +27,7 @@ describe("mealItem service tests", () => { const [url, body] = (axios.post as Mock).mock.calls[0]; expect(url).toMatch(/\/api\/v2\/mealitem\/$/); expect(body).toMatchObject({ - meal: 78, + meal: RESPONSE_MEAL_UUID, ingredient: 101, weight_unit: null, @@ -30,29 +36,36 @@ describe("mealItem service tests", () => { }); expect(body).not.toHaveProperty("id"); expect(result).toBeInstanceOf(MealItem); - expect(result.id).toBe(42); + expect(result.id).toBe(RESPONSE_MEAL_ITEM_UUID); }); test("editMealItem PATCHes /mealitem//", async () => { - const item = new MealItem({ id: 42, mealId: 78, ingredientId: 101, weightUnitId: null, amount: 99, order: 3 }); + const item = new MealItem({ + id: RESPONSE_MEAL_ITEM_UUID, + mealId: RESPONSE_MEAL_UUID, + ingredientId: 101, + weightUnitId: null, + amount: 99, + order: 3 + }); (axios.patch as Mock).mockResolvedValue({ data: { ...responseMealItemDetail, amount: "99.00" } }); const result = await editMealItem(item); expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/mealitem\/42\/$/); - expect(body).toMatchObject({ id: 42, amount: "99" }); + expect(url).toMatch(new RegExp(`/api/v2/mealitem/${RESPONSE_MEAL_ITEM_UUID}/$`)); + expect(body).toMatchObject({ id: RESPONSE_MEAL_ITEM_UUID, amount: "99" }); expect(result.amount).toBe(99); }); test("deleteMealItem DELETEs /mealitem//", async () => { (axios.delete as Mock).mockResolvedValue({ status: 204 }); - await deleteMealItem(42); + await deleteMealItem(RESPONSE_MEAL_ITEM_UUID); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/mealitem\/42\/$/), + expect.stringMatching(new RegExp(`/api/v2/mealitem/${RESPONSE_MEAL_ITEM_UUID}/$`)), expect.anything() ); }); diff --git a/src/components/Nutrition/api/nutritionalDiary.test.ts b/src/components/Nutrition/api/nutritionalDiary.test.ts index 339ef3164..ce109dd1e 100644 --- a/src/components/Nutrition/api/nutritionalDiary.test.ts +++ b/src/components/Nutrition/api/nutritionalDiary.test.ts @@ -7,7 +7,13 @@ import { } from "@/components/Nutrition/api/nutritionalDiary"; import { DiaryEntry } from "@/components/Nutrition/models/diaryEntry"; import { TEST_INGREDIENT_1 } from "@/tests/ingredientTestdata"; -import { responseDiaryEntries, responseDiaryEntryDetail } from "@/tests/nutritionTestdata"; +import { + RESPONSE_DIARY_UUID, + RESPONSE_MEAL_UUID, + RESPONSE_PLAN_UUID, + responseDiaryEntries, + responseDiaryEntryDetail, +} from "@/tests/nutritionTestdata"; import axios from "axios"; import type { Mock } from 'vitest'; @@ -55,7 +61,7 @@ describe("Nutritional diary service tests", () => { count: 2, results: [ responseDiaryEntries.results[0], - { ...responseDiaryEntries.results[0], id: 10 }, + { ...responseDiaryEntries.results[0], id: 'dddddddd-0000-0000-0000-000000000010' }, ], }; (axios.get as Mock).mockResolvedValue({ data: dupedEntries }); @@ -74,8 +80,8 @@ describe("Nutritional diary service tests", () => { test('addNutritionalDiaryEntry POSTs the serialized entry', async () => { const entry = new DiaryEntry({ - planId: 101, - mealId: 78, + planId: RESPONSE_PLAN_UUID, + mealId: RESPONSE_MEAL_UUID, ingredientId: 101, weightUnitId: null, amount: 150, @@ -89,8 +95,8 @@ describe("Nutritional diary service tests", () => { const [url, body] = (axios.post as Mock).mock.calls[0]; expect(url).toMatch(/\/api\/v2\/nutritiondiary\/$/); expect(body).toMatchObject({ - plan: 101, - meal: 78, + plan: RESPONSE_PLAN_UUID, + meal: RESPONSE_MEAL_UUID, ingredient: 101, weight_unit: null, @@ -98,14 +104,14 @@ describe("Nutritional diary service tests", () => { datetime: "2024-08-01T08:00:00.000Z", }); expect(result).toBeInstanceOf(DiaryEntry); - expect(result.id).toBe(9); + expect(result.id).toBe(RESPONSE_DIARY_UUID); }); test('editNutritionalDiaryEntry PATCHes /nutritiondiary//', async () => { const entry = new DiaryEntry({ - id: 9, - planId: 101, - mealId: 78, + id: RESPONSE_DIARY_UUID, + planId: RESPONSE_PLAN_UUID, + mealId: RESPONSE_MEAL_UUID, ingredientId: 101, weightUnitId: null, amount: 99, @@ -119,7 +125,7 @@ describe("Nutritional diary service tests", () => { expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/nutritiondiary\/9\/$/); + expect(url).toMatch(new RegExp(`/api/v2/nutritiondiary/${RESPONSE_DIARY_UUID}/$`)); expect(body).toMatchObject({ amount: "99" }); expect(result.amount).toBe(99); }); @@ -127,10 +133,10 @@ describe("Nutritional diary service tests", () => { test('deleteNutritionalDiaryEntry DELETEs /nutritiondiary//', async () => { (axios.delete as Mock).mockResolvedValue({ status: 204 }); - await deleteNutritionalDiaryEntry(9); + await deleteNutritionalDiaryEntry(RESPONSE_DIARY_UUID); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/nutritiondiary\/9\/$/), + expect.stringMatching(new RegExp(`/api/v2/nutritiondiary/${RESPONSE_DIARY_UUID}/$`)), expect.anything() ); }); diff --git a/src/components/Nutrition/api/nutritionalPlan.test.ts b/src/components/Nutrition/api/nutritionalPlan.test.ts index 12e226bf7..12f8e6d30 100644 --- a/src/components/Nutrition/api/nutritionalPlan.test.ts +++ b/src/components/Nutrition/api/nutritionalPlan.test.ts @@ -10,6 +10,8 @@ import { } from "@/components/Nutrition/api/nutritionalPlan"; import { NutritionalPlan } from "@/components/Nutrition/models/nutritionalPlan"; import { + RESPONSE_MEAL_UUID, + RESPONSE_PLAN_UUID, responseEmptyPlanList, responseNutritionalPlanDetail, responseSinglePlanList, @@ -37,13 +39,17 @@ describe("Nutritional plan service tests", () => { test('GET plans - sparse', async () => { + const PLAN_UUID_A = 'aaaaaaaa-0000-0000-0000-000000072559'; + const PLAN_UUID_B = 'aaaaaaaa-0000-0000-0000-000000060131'; + const PLAN_UUID_C = 'aaaaaaaa-0000-0000-0000-000000024752'; + const planResponse = { count: 2, next: null, previous: null, results: [ { - "id": 72559, + "id": PLAN_UUID_A, "creation_date": "2023-05-26", "start": "2023-06-01", "end": "2023-06-30", @@ -51,7 +57,7 @@ describe("Nutritional plan service tests", () => { "only_logging": true, }, { - "id": 60131, + "id": PLAN_UUID_B, "creation_date": "2022-06-01", "start": "2022-06-01", "end": null, @@ -59,7 +65,7 @@ describe("Nutritional plan service tests", () => { "only_logging": false, }, { - "id": 24752, + "id": PLAN_UUID_C, "creation_date": "2023-08-01", "start": "2023-08-01", "end": "2023-08-31", @@ -76,7 +82,7 @@ describe("Nutritional plan service tests", () => { expect(result).toStrictEqual([ new NutritionalPlan({ - id: 72559, + id: PLAN_UUID_A, creationDate: new Date('2023-05-26'), start: new Date('2023-06-01'), end: new Date('2023-06-30'), @@ -84,13 +90,13 @@ describe("Nutritional plan service tests", () => { onlyLogging: true }), new NutritionalPlan({ - id: 60131, + id: PLAN_UUID_B, creationDate: new Date('2022-06-01'), description: '', onlyLogging: false }), new NutritionalPlan({ - id: 24752, + id: PLAN_UUID_C, creationDate: new Date('2023-08-01'), start: new Date('2023-08-01'), end: new Date('2023-08-31'), @@ -125,11 +131,11 @@ describe("Nutritional plan service tests", () => { const result = await getLastNutritionalPlan(); expect(result).toBeInstanceOf(NutritionalPlan); - expect(result!.id).toBe(101); - expect(getMealsForPlan).toHaveBeenCalledWith(101); + expect(result!.id).toBe(RESPONSE_PLAN_UUID); + expect(getMealsForPlan).toHaveBeenCalledWith(RESPONSE_PLAN_UUID); // Diary entries are filtered by plan id expect(getNutritionalDiaryEntries).toHaveBeenCalledWith({ - filtersetQuery: { plan: 101 }, + filtersetQuery: { plan: RESPONSE_PLAN_UUID }, }); }); @@ -142,24 +148,25 @@ describe("Nutritional plan service tests", () => { }); test('getNutritionalPlanFull wires meals back to their diary entries by mealId', async () => { - // Two diary entries, one for meal 78 and one for an unrelated meal + const OTHER_MEAL_UUID = 'bbbbbbbb-0000-0000-0000-000000000099'; + // Two diary entries, one for the matching meal and one for an unrelated meal const diaryEntries = [ - { mealId: 78 }, - { mealId: 99 }, - { mealId: 78 }, + { mealId: RESPONSE_MEAL_UUID }, + { mealId: OTHER_MEAL_UUID }, + { mealId: RESPONSE_MEAL_UUID }, ]; - const meals = [{ id: 78, diaryEntries: [] as { mealId: number }[] }]; + const meals = [{ id: RESPONSE_MEAL_UUID, diaryEntries: [] as { mealId: string }[] }]; (axios.get as Mock).mockResolvedValue({ data: responseNutritionalPlanDetail }); (getMealsForPlan as Mock).mockResolvedValue(meals); (getNutritionalDiaryEntries as Mock).mockResolvedValue(diaryEntries); - const result = await getNutritionalPlanFull(101); + const result = await getNutritionalPlanFull(RESPONSE_PLAN_UUID); expect(result).not.toBeNull(); // The meal collected only the entries that match its id expect(meals[0].diaryEntries).toHaveLength(2); - expect(meals[0].diaryEntries.every(e => e.mealId === 78)).toBe(true); + expect(meals[0].diaryEntries.every(e => e.mealId === RESPONSE_MEAL_UUID)).toBe(true); // Both data sources are wired into the plan expect(result!.diaryEntries).toBe(diaryEntries); expect(result!.meals).toBe(meals); @@ -170,10 +177,10 @@ describe("Nutritional plan service tests", () => { (getMealsForPlan as Mock).mockResolvedValue([]); (getNutritionalDiaryEntries as Mock).mockResolvedValue([]); - await getNutritionalPlanFull(101, { filtersetQueryLogs: { datetime__date: "2024-08-01" } }); + await getNutritionalPlanFull(RESPONSE_PLAN_UUID, { filtersetQueryLogs: { datetime__date: "2024-08-01" } }); expect(getNutritionalDiaryEntries).toHaveBeenCalledWith({ - filtersetQuery: { plan: 101, datetime__date: "2024-08-01" }, + filtersetQuery: { plan: RESPONSE_PLAN_UUID, datetime__date: "2024-08-01" }, }); }); @@ -203,12 +210,12 @@ describe("Nutritional plan service tests", () => { }); expect(body).not.toHaveProperty("id"); expect(result).toBeInstanceOf(NutritionalPlan); - expect(result.id).toBe(101); + expect(result.id).toBe(RESPONSE_PLAN_UUID); }); test('editNutritionalPlan PATCHes /nutritionplan//', async () => { const plan = new NutritionalPlan({ - id: 101, + id: RESPONSE_PLAN_UUID, description: "edited", start: new Date("2024-06-01"), end: new Date("2024-08-31"), @@ -221,18 +228,18 @@ describe("Nutritional plan service tests", () => { expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/nutritionplan\/101\/$/); - expect(body).toMatchObject({ id: 101, description: "edited" }); + expect(url).toMatch(new RegExp(`/api/v2/nutritionplan/${RESPONSE_PLAN_UUID}/$`)); + expect(body).toMatchObject({ id: RESPONSE_PLAN_UUID, description: "edited" }); expect(result.description).toBe("edited"); }); test('deleteNutritionalPlan DELETEs /nutritionplan//', async () => { (axios.delete as Mock).mockResolvedValue({ status: 204 }); - await deleteNutritionalPlan(101); + await deleteNutritionalPlan(RESPONSE_PLAN_UUID); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/nutritionplan\/101\/$/), + expect.stringMatching(new RegExp(`/api/v2/nutritionplan/${RESPONSE_PLAN_UUID}/$`)), expect.anything() ); }); diff --git a/src/components/Nutrition/models/nutritionalPlan.test.ts b/src/components/Nutrition/models/nutritionalPlan.test.ts index bcc95151a..1e3dc6ccf 100644 --- a/src/components/Nutrition/models/nutritionalPlan.test.ts +++ b/src/components/Nutrition/models/nutritionalPlan.test.ts @@ -139,7 +139,11 @@ describe("Test the nutritional plan model", () => { }); test('7-day average returns zero values when no entries exist', () => { - const plan = new NutritionalPlan({ id: 1, creationDate: new Date(), description: 'test' }); + const plan = new NutritionalPlan({ + id: 'aaaaaaaa-0000-0000-0000-000000000001', + creationDate: new Date(), + description: 'test' + }); const values = plan.loggedNutritionalValues7DayAvg; expect(values.energy).toBe(0); @@ -151,7 +155,11 @@ describe("Test the nutritional plan model", () => { test('7-day average divides total by 7 without rounding', () => { // INGREDIENT_3: energy=60, protein=0.89, carbs=14, sugar=11.78, sodium=0.006 per 100g // ENTRY_3: 200g → energy=120; ENTRY_4: 20g → energy=12; total=132, avg=132/7≈18.857 - const plan = new NutritionalPlan({ id: 1, creationDate: new Date(), description: 'test' }); + const plan = new NutritionalPlan({ + id: 'aaaaaaaa-0000-0000-0000-000000000001', + creationDate: new Date(), + description: 'test' + }); plan.diaryEntries = [TEST_DIARY_ENTRY_3, TEST_DIARY_ENTRY_4]; const values = plan.loggedNutritionalValues7DayAvg; diff --git a/src/components/Routines/api/routine.test.ts b/src/components/Routines/api/routine.test.ts index 821bcfed8..a1431942c 100644 --- a/src/components/Routines/api/routine.test.ts +++ b/src/components/Routines/api/routine.test.ts @@ -114,7 +114,7 @@ describe("workout routine service tests", () => { expect(axios.get).toHaveBeenCalledTimes(1); expect(result).toStrictEqual([ new WorkoutLog({ - id: 2, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002', routineId: 1, date: new Date("2023-05-10"), iteration: 1, @@ -131,7 +131,7 @@ describe("workout routine service tests", () => { }), new WorkoutLog({ - id: 1, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001', routineId: 1, date: new Date("2023-05-13"), iteration: 1, diff --git a/src/components/Routines/api/session.test.ts b/src/components/Routines/api/session.test.ts index fcd822b37..85f1439b0 100644 --- a/src/components/Routines/api/session.test.ts +++ b/src/components/Routines/api/session.test.ts @@ -8,6 +8,12 @@ import type { Mock } from 'vitest'; vi.mock("axios"); vi.mock("@/components/Exercises/api/exercise"); +// Recognisable test-marker UUIDs matching the Django fixtures convention +const SESSION_UUID = 'bbbbbbbb-bbbb-bbbb-bbbb-000000024284'; +const SESSION_UUID_2 = 'bbbbbbbb-bbbb-bbbb-bbbb-000000000001'; +const LOG_UUID_1 = 'aaaaaaaa-aaaa-aaaa-aaaa-000004072327'; +const LOG_UUID_2 = 'aaaaaaaa-aaaa-aaaa-aaaa-000004072329'; + describe("Session service tests", () => { beforeEach(() => { vi.resetAllMocks(); @@ -23,9 +29,9 @@ describe("Session service tests", () => { previous: null, results: [ { - "id": 4072327, + "id": LOG_UUID_1, "date": "2025-08-07T00:00:00+02:00", - "session": 24284, + "session": SESSION_UUID, "routine": 39764, "iteration": 1, "slot_entry": 316691, @@ -43,9 +49,9 @@ describe("Session service tests", () => { "rest_target": null }, { - "id": 4072329, + "id": LOG_UUID_2, "date": "2025-08-07T00:00:00+02:00", - "session": 24284, + "session": SESSION_UUID, "routine": 39764, "iteration": 1, "slot_entry": 316693, @@ -75,7 +81,7 @@ describe("Session service tests", () => { previous: null, results: [ { - "id": 24284, + "id": SESSION_UUID, "routine": 39764, "day": null, "date": "2025-08-07", @@ -102,7 +108,7 @@ describe("Session service tests", () => { // Assert expect(sessions).toHaveLength(1); - expect(sessions[0].id).toBe(24284); + expect(sessions[0].id).toBe(SESSION_UUID); expect(sessions[0].logs).toHaveLength(2); expect(sessions[0].logs[0].exerciseId).toBe(200); expect(sessions[0].logs[0].exerciseObj).toBeDefined(); @@ -162,7 +168,7 @@ describe("Session service tests", () => { count: 1, next: null, previous: null, results: [ { - id: 24284, routine: 39764, day: 5, + id: SESSION_UUID, routine: 39764, day: 5, date: "2025-08-07", notes: "ok", impression: "3", @@ -179,7 +185,7 @@ describe("Session service tests", () => { expect(url).toContain("routine=39764"); expect(url).toContain("date=2025-08-07"); expect(result).toBeInstanceOf(WorkoutSession); - expect(result?.id).toBe(24284); + expect(result?.id).toBe(SESSION_UUID); }); test('searchSession returns null when count !== 1', async () => { @@ -205,7 +211,7 @@ describe("Session service tests", () => { test('addSession POSTs the params and returns the parsed session', async () => { (axios.post as Mock).mockResolvedValue({ data: { - id: 1, routine: 39764, day: 5, date: "2025-08-07", + id: SESSION_UUID_2, routine: 39764, day: 5, date: "2025-08-07", notes: null, impression: "3", time_start: null, time_end: null, }, @@ -228,27 +234,27 @@ describe("Session service tests", () => { impression: "3", }); expect(result).toBeInstanceOf(WorkoutSession); - expect(result.id).toBe(1); + expect(result.id).toBe(SESSION_UUID_2); }); test('editSession PATCHes /workoutsession// with the params', async () => { (axios.patch as Mock).mockResolvedValue({ data: { - id: 24284, routine: 39764, day: 5, date: "2025-08-07", + id: SESSION_UUID, routine: 39764, day: 5, date: "2025-08-07", notes: "edited", impression: "3", time_start: null, time_end: null, }, }); const result = await editSession({ - id: 24284, + id: SESSION_UUID, notes: "edited", }); expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/workoutsession\/24284\/$/); - expect(body).toEqual({ id: 24284, notes: "edited" }); + expect(url).toMatch(new RegExp(`/api/v2/workoutsession/${SESSION_UUID}/$`)); + expect(body).toEqual({ id: SESSION_UUID, notes: "edited" }); expect(result.notes).toBe("edited"); }); }); \ No newline at end of file diff --git a/src/components/Routines/api/workoutLogs.test.ts b/src/components/Routines/api/workoutLogs.test.ts index 2534b56d9..029133d44 100644 --- a/src/components/Routines/api/workoutLogs.test.ts +++ b/src/components/Routines/api/workoutLogs.test.ts @@ -38,7 +38,7 @@ describe("workout logs service tests", () => { expect(axios.get).toHaveBeenCalledTimes(1); expect(result).toStrictEqual([ new WorkoutLog({ - id: 2, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002', routineId: 1, date: new Date("2023-05-10"), iteration: 1, @@ -60,7 +60,7 @@ describe("workout logs service tests", () => { }), new WorkoutLog({ - id: 1, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001', routineId: 1, date: new Date("2023-05-13"), iteration: 1, @@ -99,7 +99,7 @@ describe("workout logs service tests", () => { expect(axios.get).toHaveBeenCalledTimes(1); expect(result).toStrictEqual([ new WorkoutLog({ - id: 2, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002', routineId: 1, date: new Date("2023-05-10"), iteration: 1, @@ -123,7 +123,7 @@ describe("workout logs service tests", () => { }), new WorkoutLog({ - id: 1, + id: 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001', routineId: 1, date: new Date("2023-05-13"), iteration: 1, @@ -149,21 +149,23 @@ describe("workout logs service tests", () => { }); test('deleteLog DELETEs /workoutlog// and returns the response status', async () => { + const LOG_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-000000000007'; (axios.delete as Mock).mockResolvedValue({ status: 204 }); - const result = await deleteLog(7); + const result = await deleteLog(LOG_UUID); expect(axios.delete).toHaveBeenCalledTimes(1); expect(axios.delete).toHaveBeenCalledWith( - expect.stringMatching(/\/api\/v2\/workoutlog\/7\/$/), + expect.stringMatching(new RegExp(`/api/v2/workoutlog/${LOG_UUID}/$`)), expect.anything() ); expect(result).toBe(204); }); test('editLog PATCHes /workoutlog// with the snake_case body and returns the parsed log', async () => { + const LOG_UUID = 'aaaaaaaa-aaaa-aaaa-aaaa-000000000005'; const apiResponse = { - id: 5, + id: LOG_UUID, iteration: 1, date: "2024-08-01T08:00:00.000Z", exercise: 100, @@ -183,7 +185,7 @@ describe("workout logs service tests", () => { (axios.patch as Mock).mockResolvedValue({ data: apiResponse }); const log = new WorkoutLog({ - id: 5, + id: LOG_UUID, routineId: 1, slotEntryId: 2, exerciseId: 100, @@ -203,9 +205,9 @@ describe("workout logs service tests", () => { expect(axios.patch).toHaveBeenCalledTimes(1); const [url, body] = (axios.patch as Mock).mock.calls[0]; - expect(url).toMatch(/\/api\/v2\/workoutlog\/5\/$/); + expect(url).toMatch(new RegExp(`/api/v2/workoutlog/${LOG_UUID}/$`)); expect(body).toMatchObject({ - id: 5, + id: LOG_UUID, exercise: 100, slot_entry: 2, @@ -214,13 +216,15 @@ describe("workout logs service tests", () => { repetitions_unit: 1, }); expect(result).toBeInstanceOf(WorkoutLog); - expect(result.id).toBe(5); + expect(result.id).toBe(LOG_UUID); }); test('addLogs POSTs each entry sequentially and collects the parsed responses', async () => { + const LOG_UUID_1 = 'aaaaaaaa-aaaa-aaaa-aaaa-000000000001'; + const LOG_UUID_2 = 'aaaaaaaa-aaaa-aaaa-aaaa-000000000002'; const responses = [ { - id: 1, + id: LOG_UUID_1, iteration: 1, date: "2024-08-01T00:00:00Z", exercise: 100, @@ -238,7 +242,7 @@ describe("workout logs service tests", () => { rest_target: null }, { - id: 2, + id: LOG_UUID_2, iteration: 1, date: "2024-08-02T00:00:00Z", exercise: 100, @@ -270,7 +274,7 @@ describe("workout logs service tests", () => { expect(url).toMatch(/\/api\/v2\/workoutlog\/$/); expect(result).toHaveLength(2); expect(result[0]).toBeInstanceOf(WorkoutLog); - expect(result.map(l => l.id)).toEqual([1, 2]); + expect(result.map(l => l.id)).toEqual([LOG_UUID_1, LOG_UUID_2]); }); test('addLogs returns [] when given an empty list (no requests fire)', async () => { diff --git a/src/components/Routines/widgets/forms/SessionForm.tsx b/src/components/Routines/widgets/forms/SessionForm.tsx index 7e72744f5..158e1c1e4 100644 --- a/src/components/Routines/widgets/forms/SessionForm.tsx +++ b/src/components/Routines/widgets/forms/SessionForm.tsx @@ -43,7 +43,7 @@ export const SessionForm = ({ initialSession, dayId, routineId, selectedDate, se const [session, setSession] = React.useState(initialSession); const addSessionQuery = useAddSessionQuery(); - const editSessionQuery = useEditSessionQuery(session?.id || 0); + const editSessionQuery = useEditSessionQuery(session?.id || ''); const findSessionQuery = useFindSessionQuery( routineId, { diff --git a/src/tests/nutritionTestdata.ts b/src/tests/nutritionTestdata.ts index 902ceade2..c155b7aec 100644 --- a/src/tests/nutritionTestdata.ts +++ b/src/tests/nutritionTestdata.ts @@ -198,10 +198,18 @@ export const TEST_NUTRITIONAL_PLAN_2 = new NutritionalPlan({ TEST_NUTRITIONAL_PLAN_2.meals = [TEST_MEAL_4, TEST_MEAL_5]; +// Recognisable test-marker UUIDs for the API response envelopes below +export const RESPONSE_PLAN_UUID = 'aaaaaaaa-0000-0000-0000-000000000101'; +export const RESPONSE_PLAN_UUID_2 = 'aaaaaaaa-0000-0000-0000-000000000123'; +export const RESPONSE_MEAL_UUID = 'bbbbbbbb-0000-0000-0000-000000000078'; +export const RESPONSE_MEAL_ITEM_UUID = 'cccccccc-0000-0000-0000-000000000042'; +export const RESPONSE_MEAL_ITEM_UUID_2 = 'cccccccc-0000-0000-0000-000000000043'; +export const RESPONSE_DIARY_UUID = 'dddddddd-0000-0000-0000-000000000009'; + // API envelope for a single meal (POST/PATCH /meal/ response). export const responseMealDetail = { - id: 78, - plan: 123, + id: RESPONSE_MEAL_UUID, + plan: RESPONSE_PLAN_UUID_2, order: 2, time: '12:30', name: 'Second breakfast', @@ -222,16 +230,16 @@ export const responseMealItemsForMeal = { previous: null, results: [ { - id: 42, - meal: 78, + id: RESPONSE_MEAL_ITEM_UUID, + meal: RESPONSE_MEAL_UUID, ingredient: 101, weight_unit: null, order: 3, amount: '120.00', }, { - id: 43, - meal: 78, + id: RESPONSE_MEAL_ITEM_UUID_2, + meal: RESPONSE_MEAL_UUID, ingredient: 102, weight_unit: null, order: 1, @@ -242,8 +250,8 @@ export const responseMealItemsForMeal = { // Single mealitem envelope (POST/PATCH /mealitem/ response) export const responseMealItemDetail = { - id: 42, - meal: 78, + id: RESPONSE_MEAL_ITEM_UUID, + meal: RESPONSE_MEAL_UUID, ingredient: 101, weight_unit: null, order: 3, @@ -252,7 +260,7 @@ export const responseMealItemDetail = { // Single nutritional plan envelope (POST/PATCH /nutritionplan/ response) export const responseNutritionalPlanDetail = { - id: 101, + id: RESPONSE_PLAN_UUID, creation_date: '2023-01-01', start: '2023-01-01', end: '2023-12-31', @@ -288,9 +296,9 @@ export const responseDiaryEntries = { previous: null, results: [ { - id: 9, - plan: 101, - meal: 78, + id: RESPONSE_DIARY_UUID, + plan: RESPONSE_PLAN_UUID, + meal: RESPONSE_MEAL_UUID, ingredient: 101, weight_unit: null, amount: '150.00', @@ -301,9 +309,9 @@ export const responseDiaryEntries = { // Single diary entry envelope (POST/PATCH /nutritiondiary/ response) export const responseDiaryEntryDetail = { - id: 9, - plan: 101, - meal: 78, + id: RESPONSE_DIARY_UUID, + plan: RESPONSE_PLAN_UUID, + meal: RESPONSE_MEAL_UUID, ingredient: 101, weight_unit: null, amount: '150.00', From fa915d98dfcb896690ebfc6a81b6b9b5236e5fda Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 27 May 2026 16:11:55 +0200 Subject: [PATCH 4/4] Re-format translation files --- .editorconfig | 6 + public/locales/cs/translation.json | 680 ++++++++++----------- public/locales/de/translation.json | 762 +++++++++++------------ public/locales/el/translation.json | 186 +++--- public/locales/es/translation.json | 736 +++++++++++----------- public/locales/gl/translation.json | 172 +++--- public/locales/hi/translation.json | 14 +- public/locales/hr/translation.json | 740 +++++++++++----------- public/locales/it/translation.json | 762 +++++++++++------------ public/locales/nl/translation.json | 712 ++++++++++----------- public/locales/pt/translation.json | 780 ++++++++++++------------ public/locales/pt_BR/translation.json | 752 +++++++++++------------ public/locales/sr/translation.json | 472 +++++++------- public/locales/sv/translation.json | 324 +++++----- public/locales/tr/translation.json | 468 +++++++------- public/locales/zh_Hant/translation.json | 190 +++--- 16 files changed, 3881 insertions(+), 3875 deletions(-) diff --git a/.editorconfig b/.editorconfig index ba2e60bb3..8c7b20388 100644 --- a/.editorconfig +++ b/.editorconfig @@ -513,6 +513,12 @@ ij_json_spaces_within_braces = false ij_json_spaces_within_brackets = false ij_json_wrap_long_lines = false +# Weblate writes translation files with 4-space indent. Match that to avoid +# whole-file reformat diffs when an editor saves them. +[public/locales/**/*.json] +indent_size = 4 +tab_width = 4 + [{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] ij_continuation_indent_size = 4 ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 diff --git a/public/locales/cs/translation.json b/public/locales/cs/translation.json index 56b16e4cd..0dbf1ce8a 100644 --- a/public/locales/cs/translation.json +++ b/public/locales/cs/translation.json @@ -1,344 +1,344 @@ { - "exercises": { - "deleteExerciseBody": "Chcete odstranit cvičení „{{name}}“? Můžete odstranit buď aktuální překlad do jazyka {{language}} nebo celé cvičení se všemi překlady, obrázky apod.", - "noEquipment": "Žádné vybavení", - "missingExercise": "Chybí vám nějaké cvičení?", - "searchExerciseName": "Hledat podle názvu cvičení", - "imageStyle3D": "3D", - "notesHelpText": "Poznámky jsou krátké komentáře o tom, jak provádět cvičení, například „tělo držte napřímené“", - "imageStylePhoto": "Fotka", - "imageStyleLowPoly": "Low-poly", - "imageStyleLine": "Čára", - "imageStyleOther": "Jiné", - "imageDetails": "Podrobnosti o obrázku", - "notEnoughRights": "Cviky můžete přidávat pouze, pokud je váš účet starší než {{days}} dní a máte ověřený svůj e-mail", - "step1HeaderBasics": "Základy v angličtině", - "variations": "Variace", - "notEnoughRightsHeader": "Nemůžete přidávat cviky", - "replacementsInfoText": "Volitelně můžete také vybrat cvičení, které by mělo toto cvičení nahradit (např. protože bylo odesláno dvakrát apod.). Tím se cvičení nahradí v rutinách i tréninkových protokolech, místo aby se pouze vymazalo. Tyto změny se také promítnou do jakékoli instance, která synchronizuje cvičení z této instance.", - "replacementsSearch": "Vyhledejte cvičení nebo zkopírujte a vložte známé ID do pole a klikněte na tlačítko „Načíst“.", - "whatVariationsExist": "Které variace tohoto cvičení existují, pokud nějaké jsou?", - "filterVariations": "Zadejte název cvičení pro filtrování variací", - "identicalExercisePleaseDiscard": "Pokud si všimnete cvičení, které je identické tomu, které právě přidáváte, zahoďte prosím váš návrh a místo toho upravte dané cvičení.", - "compatibleImagesCC": "Obrázky musí být kompatibilní s licencí CC BY SA. Pokud si nejste jistí, nahrajte pouze fotky, které jste sami pořídili.", - "alternativeNames": "Alternativní názvy", + "exercises": { + "deleteExerciseBody": "Chcete odstranit cvičení „{{name}}“? Můžete odstranit buď aktuální překlad do jazyka {{language}} nebo celé cvičení se všemi překlady, obrázky apod.", + "noEquipment": "Žádné vybavení", + "missingExercise": "Chybí vám nějaké cvičení?", + "searchExerciseName": "Hledat podle názvu cvičení", + "imageStyle3D": "3D", + "notesHelpText": "Poznámky jsou krátké komentáře o tom, jak provádět cvičení, například „tělo držte napřímené“", + "imageStylePhoto": "Fotka", + "imageStyleLowPoly": "Low-poly", + "imageStyleLine": "Čára", + "imageStyleOther": "Jiné", + "imageDetails": "Podrobnosti o obrázku", + "notEnoughRights": "Cviky můžete přidávat pouze, pokud je váš účet starší než {{days}} dní a máte ověřený svůj e-mail", + "step1HeaderBasics": "Základy v angličtině", + "variations": "Variace", + "notEnoughRightsHeader": "Nemůžete přidávat cviky", + "replacementsInfoText": "Volitelně můžete také vybrat cvičení, které by mělo toto cvičení nahradit (např. protože bylo odesláno dvakrát apod.). Tím se cvičení nahradí v rutinách i tréninkových protokolech, místo aby se pouze vymazalo. Tyto změny se také promítnou do jakékoli instance, která synchronizuje cvičení z této instance.", + "replacementsSearch": "Vyhledejte cvičení nebo zkopírujte a vložte známé ID do pole a klikněte na tlačítko „Načíst“.", + "whatVariationsExist": "Které variace tohoto cvičení existují, pokud nějaké jsou?", + "filterVariations": "Zadejte název cvičení pro filtrování variací", + "identicalExercisePleaseDiscard": "Pokud si všimnete cvičení, které je identické tomu, které právě přidáváte, zahoďte prosím váš návrh a místo toho upravte dané cvičení.", + "compatibleImagesCC": "Obrázky musí být kompatibilní s licencí CC BY SA. Pokud si nejste jistí, nahrajte pouze fotky, které jste sami pořídili.", + "alternativeNames": "Alternativní názvy", + "notes": "Poznámky", + "equipment": "Vybavení", + "checkInformationBeforeSubmitting": "Před odesláním cvičení prosím zkontrolujte, že jsou zadané informace správné", + "submitExercise": "Odeslat cvičení", + "successfullyUpdated": "Cvičení bylo úspěšně upraveno. Kvůli ukládání do mezipaměti může zobrazení změn v aplikaci chvíli trvat.", + "exerciseNotTranslated": "Překlad není dostupný", + "exerciseNotTranslatedBody": "Toto cvičení momentálně není dostupné ve vybraném jazyce. Chcete přidat vlastní překlad?", + "replacements": "Nahrazení", + "noReplacementSelected": " Žádné cvičení nebylo vybráno jako náhrada", + "contributeExercise": "Přidat cvičení", + "muscles": "Svaly", + "secondaryMuscles": "Sekundární svaly", + "identicalExercise": "Vyhněte se duplicitním cvičením", + "translateExerciseNow": "Přeložit toto cvičení", + "cacheWarning": "Kvůli ukládání do mezipaměti může zobrazení změn v aplikaci chvíli trvat.", + "description": "Popis", + "basics": "Základy", + "alsoKnownAs": "Také známé jako:", + "primaryMuscles": "Primární svaly", + "deleteTranslation": "Odstranit překlad", + "deleteExerciseFull": "Odstranit celé cvičení", + "deleteExerciseReplace": "Odstranit a nahradit", + "exercises": "Cvičení", + "changeExerciseLanguage": "Změnit jazyk tohoto cvičení", + "missingExerciseDescription": "Pomozte komunitě jeho přidáním!", + "newNote": "Nová poznámka", + "swapExercise": "Změna cvičení", + "exactMatch": "Přesná shoda" + }, + "nutrition": { + "plans": "Výživové plány", + "plan": "Výživový plán", + "goalsTitle": "Cíle", + "useGoalsHelpText": "Přidat cíle do tohoto plánu", + "goalEnergy": "Cíl energie", + "goalFat": "Cíl tuku", + "addNutritionalDiary": "Přidat záznam do výživového deníku", + "meal": "Jídlo", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "searchIngredientName": "Hledat podle názvu ingredience", + "today": "Dnes", + "7dayAvg": "Průměr za 7 dní", + "protein": "Bílkovina", + "sugar": "Cukr", + "pseudoMealTitle": "Další záznamy", + "others": "Jiné", + "copyPlan": "Kopírovat tento plán", + "goalProtein": "Cíl bílkovin", + "goalCarbohydrates": "Cíl sacharidů", + "addMeal": "Přidat jídlo", + "addMealItem": "Přidat ingredienci do jídla", + "nutritionalDiary": "Výživový deník", + "gramShort": "g", + "kcal": "kcal", + "valueEnergyKcal": "{{value}} kcal", + "macronutrient": "Makroživina", + "percentEnergy": "Procento energie", + "gPerBodyKg": "g na tělo-kg", + "planned": "Plánováno", + "logged": "Zaznamenáno", + "loggedToday": "Zaznamenáno dnes", + "difference": "Rozdíl", + "energy": "Energie", + "carbohydrates": "Sacharidy", + "ofWhichSugars": "z toho cukry", + "fat": "Tuk", + "ofWhichSaturated": "z toho nasycené", + "saturatedFat": "Nasycený tuk", + "fibres": "Vláknina", + "sodium": "Sodík", + "onlyLoggingHelpText": "Sledovat pouze kalorie. Pole zaškrtněte, pokud chcete zaznamenávat pouze vaše kalorie a nechcete nastavovat podrobný výživový plán se specifickými jídly", + "valueRemaining": "zbývá", + "diaryEntrySaved": "Záznam do deníku úspěšně uložen", + "valueTooMany": "příliš mnoho", + "useGoalsHelpTextLong": "Toto vám umožňuje nastavit obecné cíle pro energii, bílkoviny, sacharidy nebo tuky pro váš plán. Upozorňujeme, že pokud si nastavíte podrobný plán jídel, budou tyto hodnoty mít přednost.", + "planDeleteInfo": "Touto akcí odstraníte také všechny záznamy ve výživovém deníku", + "mealDeleteInfo": "Záznamy ve výživovém deníku u tohoto jídla nebudou odstraněny a budou přesunuty pod „ostatní záznamy“", + "logThisMeal": "Zaznamenat jídlo do deníku tak jak je", + "logThisMealItem": "Zaznamenat ingredienci do deníku tak jak je", + "goalFiber": "Cíl vlákniny", + "languageFilterCurrentOnly": "Pouze v aktuálním jazyce ({{lang}})", + "languageFilterCurrentAndEnglish": "Aktuální jazyk ({{lang}}) & Angličtina", + "languageFilterAll": "Všechny jazyky", + "filterVegan": "Vegan", + "filterVegetarian": "Vegetarián", + "filterNutriscore": "Nutri-Score filter", + "filterNutriscoreOff": "Vypnout", + "filterNutriscoreNoFilter": "Žádný filtr", + "filterNutriscoreOrBetter": "{{grade}} nebo lepší" + }, + "add": "Přidat", + "licenses": { + "derivativeSourceUrlHelper": "Odvozené dílo je dílo, které je nejen založeno na předchozím díle, ale které také obsahuje dostatečně nový, tvůrčí obsah, aby mu vznikl nárok na vlastní autorská práva.", + "originalObjectUrl": "Odkaz na zdrojový web, pokud je dostupný", + "authors": "Autoři", + "authorProfile": "Odkaz na web nebo profil autora, pokud je dostupný", + "derivativeSourceUrl": "Odkaz na původní zdroj, pokud se jedná o odvozené dílo", + "originalTitle": "Název" + }, + "loading": "Načítání...", + "addEntry": "Přidat záznam", + "seeDetails": "Zobrazit podrobnosti", "notes": "Poznámky", - "equipment": "Vybavení", - "checkInformationBeforeSubmitting": "Před odesláním cvičení prosím zkontrolujte, že jsou zadané informace správné", - "submitExercise": "Odeslat cvičení", - "successfullyUpdated": "Cvičení bylo úspěšně upraveno. Kvůli ukládání do mezipaměti může zobrazení změn v aplikaci chvíli trvat.", - "exerciseNotTranslated": "Překlad není dostupný", - "exerciseNotTranslatedBody": "Toto cvičení momentálně není dostupné ve vybraném jazyce. Chcete přidat vlastní překlad?", - "replacements": "Nahrazení", - "noReplacementSelected": " Žádné cvičení nebylo vybráno jako náhrada", - "contributeExercise": "Přidat cvičení", - "muscles": "Svaly", - "secondaryMuscles": "Sekundární svaly", - "identicalExercise": "Vyhněte se duplicitním cvičením", - "translateExerciseNow": "Přeložit toto cvičení", - "cacheWarning": "Kvůli ukládání do mezipaměti může zobrazení změn v aplikaci chvíli trvat.", - "description": "Popis", - "basics": "Základy", - "alsoKnownAs": "Také známé jako:", - "primaryMuscles": "Primární svaly", - "deleteTranslation": "Odstranit překlad", - "deleteExerciseFull": "Odstranit celé cvičení", - "deleteExerciseReplace": "Odstranit a nahradit", - "exercises": "Cvičení", - "changeExerciseLanguage": "Změnit jazyk tohoto cvičení", - "missingExerciseDescription": "Pomozte komunitě jeho přidáním!", - "newNote": "Nová poznámka", - "swapExercise": "Změna cvičení", - "exactMatch": "Přesná shoda" - }, - "nutrition": { - "plans": "Výživové plány", - "plan": "Výživový plán", - "goalsTitle": "Cíle", - "useGoalsHelpText": "Přidat cíle do tohoto plánu", - "goalEnergy": "Cíl energie", - "goalFat": "Cíl tuku", - "addNutritionalDiary": "Přidat záznam do výživového deníku", - "meal": "Jídlo", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "searchIngredientName": "Hledat podle názvu ingredience", - "today": "Dnes", - "7dayAvg": "Průměr za 7 dní", - "protein": "Bílkovina", - "sugar": "Cukr", - "pseudoMealTitle": "Další záznamy", - "others": "Jiné", - "copyPlan": "Kopírovat tento plán", - "goalProtein": "Cíl bílkovin", - "goalCarbohydrates": "Cíl sacharidů", - "addMeal": "Přidat jídlo", - "addMealItem": "Přidat ingredienci do jídla", - "nutritionalDiary": "Výživový deník", - "gramShort": "g", - "kcal": "kcal", - "valueEnergyKcal": "{{value}} kcal", - "macronutrient": "Makroživina", - "percentEnergy": "Procento energie", - "gPerBodyKg": "g na tělo-kg", - "planned": "Plánováno", - "logged": "Zaznamenáno", - "loggedToday": "Zaznamenáno dnes", + "nothingHereYet": "Zatím tu nic není...", + "weight": "Váha", + "date": "Datum", + "timeOfDay": "Čas", + "submit": "Potvrdit", + "edit": "Upravit", + "delete": "Odstranit", + "deleteConfirmation": "Opravdu chcete odstranit „{{name}}“?", + "close": "Zavřít", "difference": "Rozdíl", - "energy": "Energie", - "carbohydrates": "Sacharidy", - "ofWhichSugars": "z toho cukry", - "fat": "Tuk", - "ofWhichSaturated": "z toho nasycené", - "saturatedFat": "Nasycený tuk", - "fibres": "Vláknina", - "sodium": "Sodík", - "onlyLoggingHelpText": "Sledovat pouze kalorie. Pole zaškrtněte, pokud chcete zaznamenávat pouze vaše kalorie a nechcete nastavovat podrobný výživový plán se specifickými jídly", - "valueRemaining": "zbývá", - "diaryEntrySaved": "Záznam do deníku úspěšně uložen", - "valueTooMany": "příliš mnoho", - "useGoalsHelpTextLong": "Toto vám umožňuje nastavit obecné cíle pro energii, bílkoviny, sacharidy nebo tuky pro váš plán. Upozorňujeme, že pokud si nastavíte podrobný plán jídel, budou tyto hodnoty mít přednost.", - "planDeleteInfo": "Touto akcí odstraníte také všechny záznamy ve výživovém deníku", - "mealDeleteInfo": "Záznamy ve výživovém deníku u tohoto jídla nebudou odstraněny a budou přesunuty pod „ostatní záznamy“", - "logThisMeal": "Zaznamenat jídlo do deníku tak jak je", - "logThisMealItem": "Zaznamenat ingredienci do deníku tak jak je", - "goalFiber": "Cíl vlákniny", - "languageFilterCurrentOnly": "Pouze v aktuálním jazyce ({{lang}})", - "languageFilterCurrentAndEnglish": "Aktuální jazyk ({{lang}}) & Angličtina", - "languageFilterAll": "Všechny jazyky", - "filterVegan": "Vegan", - "filterVegetarian": "Vegetarián", - "filterNutriscore": "Nutri-Score filter", - "filterNutriscoreOff": "Vypnout", - "filterNutriscoreNoFilter": "Žádný filtr", - "filterNutriscoreOrBetter": "{{grade}} nebo lepší" - }, - "add": "Přidat", - "licenses": { - "derivativeSourceUrlHelper": "Odvozené dílo je dílo, které je nejen založeno na předchozím díle, ale které také obsahuje dostatečně nový, tvůrčí obsah, aby mu vznikl nárok na vlastní autorská práva.", - "originalObjectUrl": "Odkaz na zdrojový web, pokud je dostupný", - "authors": "Autoři", - "authorProfile": "Odkaz na web nebo profil autora, pokud je dostupný", - "derivativeSourceUrl": "Odkaz na původní zdroj, pokud se jedná o odvozené dílo", - "originalTitle": "Název" - }, - "loading": "Načítání...", - "addEntry": "Přidat záznam", - "seeDetails": "Zobrazit podrobnosti", - "notes": "Poznámky", - "nothingHereYet": "Zatím tu nic není...", - "weight": "Váha", - "date": "Datum", - "timeOfDay": "Čas", - "submit": "Potvrdit", - "edit": "Upravit", - "delete": "Odstranit", - "deleteConfirmation": "Opravdu chcete odstranit „{{name}}“?", - "close": "Zavřít", - "difference": "Rozdíl", - "days": "Dny", - "nutritionalPlan": "Výživový plán", - "currentWeight": "Aktuální váha", - "workout": "Trénink", - "actions": "Akce", - "nothingHereYetAction": "Stiskněte akční tlačítko pro začátek", - "value": "Hodnota", - "unit": "Jednotka", - "alsoSearchEnglish": "Také hledat názvy v angličtině", - "copyToClipboard": "Kopírovat do schránky", - "downloadAsPdf": "Stáhnout jako PDF", - "total": "Celkem", - "description": "Popis", - "translation": "Překlad", - "routines": { - "logsHeader": "Tréninkový záznam pro trénink", - "addDay": "Přidat tréninkový den", - "logsFilterNote": "Jsou zobrazeny pouze záznamy s jednotkou hmotnosti kg nebo lb a opakováními, ostatní kombinace, jako je čas nebo do selhání, jsou zde ignorovány", - "addLogToDay": "Přidat záznam k tomuto dni", - "addWeightLog": "Přidat tréninkový záznam", - "routine": "Rutina", - "routines": "Rutiny", - "rir": "OvR", - "reps": "Repetice", - "currentRoutine": "Současná trasa", - "routineHasNoDays": "Tento program nemá žádné dny", - "setHasNoExercises": "Tato sada neobsahuje žádná cvičení", - "fitDaysInWeek": "Pevný týdenní rozvrh", - "fitDaysInWeekHelpText": "Toto nastavení určuje, jak se dny ve vašem tréninkovém plánu rozvrhují v rámci více týdnů. Je-li tato funkce zapnutá, budou se dny opakovat v týdenním cyklu. Například tréninkový plán s tréninky v pondělí, ve středu a v pátek bude v tomto vzoru pokračovat i v následující pondělí, středu a pátek. Je-li tato funkce vypnutá, budou se dny řadit za sebou bez ohledu na začátek nového týdne. To se hodí pro tréninkové plány, které se neřídí striktním týdenním rozvrhem.", - "needsLogsToAdvance": "K postupu jsou zapotřebí záznamy", - "needsLogsToAdvanceHelpText": "Pokud tuto možnost zaškrtnete, tréninkový plán přejde k dalšímu naplánovanému dni pouze v případě, že jste zaznamenali trénink za aktuální den. Pokud tuto možnost nezaškrtnete, tréninkový plán automaticky přejde k dalšímu dni bez ohledu na to, zda jste trénink zaznamenali, či nikoli.", - "addSuperset": "Přidat superset", - "addExercise": "Přidat cvičení", - "exerciseNr": "Cvičení {{number}}", - "supersetNr": "Superset {{number}}", - "editProgression": "Upravit postup", - "progressionNeedsReplace": "Jeden z předchozích záznamů musí obsahovat nahrazení", - "exerciseHasProgression": "Toto cvičení má pravidla postupu a nelze jej zde upravit. Chcete-li jej upravit, klikněte na tlačítko.", - "defaultRounding": "Základní zaokrouhlení", - "rounding": "Zaokrouhlování (toto cvičení)", - "roundingHelp": "Nastavte výchozí zaokrouhlování pro váhu a počet opakování (to se hodí zejména při použití kroku s procentuálním nárůstem v progresi). Toto nastavení se použije na všechny nové série, lze jej však individuálně změnit v formuláři progrese. Chcete-li zaokrouhlování deaktivovat, ponechte pole prázdné.", - "newDay": "Nový den", - "weightLogNotPlanned": "Ukládání záznamů do kalendáře, ve kterém nebyla naplánována žádná cvičení.", - "logsOverview": "Přehled protokolů", - "alsoShowLogs": "Zobrazit také protokoly", - "statsOverview": "Statistiky", - "simpleMode": "Základní režim", - "restDay": "Den odpočinku", - "confirmRestDay": "Potvrďte změnu dne odpočinku", - "confirmRestDayHelpText": "Upozorňujeme, že jakmile označíte daný den jako den odpočinku, budou všechny tréninkové sestavy a cviky odstraněny.", - "duplicate": "Duplikovat rutinu", - "downloadPdfTable": "Stáhnout PDF (tabulka)", - "downloadPdfLogs": "Stáhnout PDF (záznamy)", - "downloadIcal": "Stáhnout iCal soubor (kalendář)", - "impression": "Celkový dojem", - "impressionGood": "Dobré", - "impressionNeutral": "Neutrální", - "impressionBad": "Špatné", - "impressionHelpText": "Tento formulář zaznamenává výsledky vašeho tréninku (počet opakování, váhu atd.) u každého cvičení. Změny, které zde provedete, jako je odstranění nebo výměna cvičení, se projeví pouze v konkrétních záznamech, které uložíte, a neovlivní váš celkový tréninkový plán. Ukládají se pouze řádky, které obsahují hodnoty pro váhu nebo počet opakování.", - "addAdditionalLog": "Přidat další záznam", - "operation": "Provoz", - "step": "Krok", - "requirements": "Požadavky", - "requirementsHelpText": "Vyberte výsledky tréninku (z předchozích záznamů), které musí být splněny, aby se toto pravidlo uplatnilo", - "repeat": "Opakovací pravidlo", - "repeatHelpText": "Zaškrtněte toto políčko, pokud chcete, aby se toto pravidlo nadále vztahovalo na následující tréninky, dokud nenastavíte nové", - "markAsTemplate": "Spravovat šablonu", - "template": "Šablona", - "templates": "Šablony", - "publicTemplate": "Veřejná šablona", - "publicTemplates": "Veřejné šablony", - "templatesHelpText": "Šablony slouží k uložení vaší rutiny pro pozdější použití a jako výchozí bod pro další rutiny. Šablony nelze upravovat, ale můžete je duplikovat a provádět změny v kopii (samozřejmě je také můžete převést zpět na běžnou rutinu).", - "publicTemplateHelpText": "Veřejné šablony jsou k dispozici všem uživatelům.", - "copyAndUseTemplate": "Zkopírujte a použijte šablonu", - "set": { - "type": "Napiš", - "normalSet": "Normální série", - "dropSet": "Drop série", - "myo": "MYO", - "partial": "Částečná", - "forced": "Nucený", - "tut": "Čas pod zátěží", - "iso": "Izometrické držení", - "jump": "Skok" - } - }, - "measurements": { - "measurements": "Měření", - "unitFormHelpText": "Jednotka, ve které bude kategorie měřena, například cm nebo %", - "deleteInfo": "Touto akcí také odstraníte kategorii a její záznamy" - }, - "server": { - "arms": "Paže", - "back": "Záda", - "bench": "Lavice", - "barbell": "Vzpěračská činka", - "biceps": "Bicepsy", - "incline_bench": "Šikmá lavice", - "kilometers_per_hour": "Kilometry za hodinu", - "lb": "lb", - "abs": "Břišní svaly", - "body_weight": "Tělesná hmotnost", - "calves": "Lýtka", - "cardio": "Kardio", - "chest": "Hrudník", - "dumbbell": "Jednoruční činka", - "glutes": "Hýždě", - "gym_mat": "Gymnastická podložka", - "hamstrings": "Zadní stehenní svaly", - "kettlebell": "Kettlebell", - "kilometers": "Kilometry", - "lats": "Široký sval zádový", - "legs": "Nohy", - "max_reps": "Max. opakování", - "miles": "Míle", - "miles_per_hour": "Míle za hodinu", - "minutes": "Minuty", - "plates": "Závaží", - "pull_up_bar": "Hrazda", - "quads": "Čtyřhlavý sval stehenní", - "repetitions": "Opakování", - "sz_bar": "Lišta SZ", - "seconds": "Sekundy", - "shoulders": "Ramena", - "swiss_ball": "Gymnastický míč", - "triceps": "Tricepsy", - "until_failure": "Do selhání", - "kg": "kg", - "none__bodyweight_exercise_": "žádný (cvičení s vlastní vahou)" - }, - "images": "Obrázky", - "overview": "Přehled", - "preferences": "Předvolby", - "continue": "Pokračovat", - "goBack": "Zpět", - "language": "Jazyk", - "forms": { - "supportedImageFormats": "Jsou podporovány pouze soubory JPEG, PNG, WEBP a AVIF do velikosti 20 Mb", - "valueTooShort": "Hodnota je příliš krátká", - "valueTooLong": "Hodnota je příliš dlouhá", - "fieldRequired": "Toto pole je vyžadováno", - "maxLength": "Zadejte prosím méně než {{chars}} znaků", - "minLength": "Zadejte prosím více než {{chars}} znaků", - "minValue": "Hodnota tohoto pole musí být vyšší než {{value}}", - "maxValue": "Hodnota tohoto pole musí být nižší než {{value}}", - "enterNumber": "Zadejte prosím platné číslo", - "enterInteger": "Zadejte prosím celé číslo", - "maxLessThanMin": "Maximální hodnota musí být větší než minimální", - "endBeforeStart": "Konečná hodnota nemůže být předcházející počáteční hodnotě" - }, - "name": "Název", - "category": "Kategorie", - "success": "Úspěch!", - "English": "Čeština", - "save": "Uložit", - "videos": "Videa", - "cannotBeUndone": "Tato akce je nevratná.", - "cancel": "Zrušit", - "noResults": "Žádné výsledky", - "noResultsDescription": "Nenalezeny žádné výsledky pro tento dotaz, zvažte snížení počtu filtrů.", - "filters": "Filtry", - "calendar": "Kalendář", - "entries": "Záznamy", - "no_entries_for_day": "Žádné záznamy pro tento den", - "editName": "Upravit {{name}}", - "start": "Start", - "end": "Konec", - "comment": "Komentář", - "min": "Min", - "max": "Max", - "durationWeeks": "{{number}} týdnů", - "durationWeeksDays": "{{nrWeeks}} týdnů, {{nrDays}} dní", - "undo": "Vrátit", - "successfullyDeleted": "Úspěšně smazáno", - "height": "Výška", - "cm": "cm", - "all": "Vše", - "lastYear": "Minulý rok", - "lastHalfYear": "Posledních 6 měsíců", - "lastMonth": "Poslední měsíc", - "lastWeek": "Poslední Týden", - "bmi": { - "overweight": "Nadváha", - "normal": "Normální váha", - "calculator": "BMI kalkulačka", - "obese": "Obezita", - "underweight": "Podváha", - "result": "Vaše BMI je {{value}}" - }, - "dashboard": { - "customizeDashboard": "Přizpůsobit panel", - "dragWidgetsHelp": "Přetažením widgetů můžete změnit jejich umístění nebo velikost pomocí pravého dolního rohu.", - "resetLayout": "Zpět na základní rozvržení" - }, - "core": { - "exitEditMode": "Opustit upravovací režim", - "customize": "Upravit" - }, - "preview": "Náhled", - "useMarkdownHint": "Pro formátování textu můžete použít základní Markdown: *italic*, **bold**, - list", - "trophies": { - "trophies": "Trofeje" - }, - "totalChange": "Celkoví změna", - "private": "Soukromý", - "public": "Veřejný" + "days": "Dny", + "nutritionalPlan": "Výživový plán", + "currentWeight": "Aktuální váha", + "workout": "Trénink", + "actions": "Akce", + "nothingHereYetAction": "Stiskněte akční tlačítko pro začátek", + "value": "Hodnota", + "unit": "Jednotka", + "alsoSearchEnglish": "Také hledat názvy v angličtině", + "copyToClipboard": "Kopírovat do schránky", + "downloadAsPdf": "Stáhnout jako PDF", + "total": "Celkem", + "description": "Popis", + "translation": "Překlad", + "routines": { + "logsHeader": "Tréninkový záznam pro trénink", + "addDay": "Přidat tréninkový den", + "logsFilterNote": "Jsou zobrazeny pouze záznamy s jednotkou hmotnosti kg nebo lb a opakováními, ostatní kombinace, jako je čas nebo do selhání, jsou zde ignorovány", + "addLogToDay": "Přidat záznam k tomuto dni", + "addWeightLog": "Přidat tréninkový záznam", + "routine": "Rutina", + "routines": "Rutiny", + "rir": "OvR", + "reps": "Repetice", + "currentRoutine": "Současná trasa", + "routineHasNoDays": "Tento program nemá žádné dny", + "setHasNoExercises": "Tato sada neobsahuje žádná cvičení", + "fitDaysInWeek": "Pevný týdenní rozvrh", + "fitDaysInWeekHelpText": "Toto nastavení určuje, jak se dny ve vašem tréninkovém plánu rozvrhují v rámci více týdnů. Je-li tato funkce zapnutá, budou se dny opakovat v týdenním cyklu. Například tréninkový plán s tréninky v pondělí, ve středu a v pátek bude v tomto vzoru pokračovat i v následující pondělí, středu a pátek. Je-li tato funkce vypnutá, budou se dny řadit za sebou bez ohledu na začátek nového týdne. To se hodí pro tréninkové plány, které se neřídí striktním týdenním rozvrhem.", + "needsLogsToAdvance": "K postupu jsou zapotřebí záznamy", + "needsLogsToAdvanceHelpText": "Pokud tuto možnost zaškrtnete, tréninkový plán přejde k dalšímu naplánovanému dni pouze v případě, že jste zaznamenali trénink za aktuální den. Pokud tuto možnost nezaškrtnete, tréninkový plán automaticky přejde k dalšímu dni bez ohledu na to, zda jste trénink zaznamenali, či nikoli.", + "addSuperset": "Přidat superset", + "addExercise": "Přidat cvičení", + "exerciseNr": "Cvičení {{number}}", + "supersetNr": "Superset {{number}}", + "editProgression": "Upravit postup", + "progressionNeedsReplace": "Jeden z předchozích záznamů musí obsahovat nahrazení", + "exerciseHasProgression": "Toto cvičení má pravidla postupu a nelze jej zde upravit. Chcete-li jej upravit, klikněte na tlačítko.", + "defaultRounding": "Základní zaokrouhlení", + "rounding": "Zaokrouhlování (toto cvičení)", + "roundingHelp": "Nastavte výchozí zaokrouhlování pro váhu a počet opakování (to se hodí zejména při použití kroku s procentuálním nárůstem v progresi). Toto nastavení se použije na všechny nové série, lze jej však individuálně změnit v formuláři progrese. Chcete-li zaokrouhlování deaktivovat, ponechte pole prázdné.", + "newDay": "Nový den", + "weightLogNotPlanned": "Ukládání záznamů do kalendáře, ve kterém nebyla naplánována žádná cvičení.", + "logsOverview": "Přehled protokolů", + "alsoShowLogs": "Zobrazit také protokoly", + "statsOverview": "Statistiky", + "simpleMode": "Základní režim", + "restDay": "Den odpočinku", + "confirmRestDay": "Potvrďte změnu dne odpočinku", + "confirmRestDayHelpText": "Upozorňujeme, že jakmile označíte daný den jako den odpočinku, budou všechny tréninkové sestavy a cviky odstraněny.", + "duplicate": "Duplikovat rutinu", + "downloadPdfTable": "Stáhnout PDF (tabulka)", + "downloadPdfLogs": "Stáhnout PDF (záznamy)", + "downloadIcal": "Stáhnout iCal soubor (kalendář)", + "impression": "Celkový dojem", + "impressionGood": "Dobré", + "impressionNeutral": "Neutrální", + "impressionBad": "Špatné", + "impressionHelpText": "Tento formulář zaznamenává výsledky vašeho tréninku (počet opakování, váhu atd.) u každého cvičení. Změny, které zde provedete, jako je odstranění nebo výměna cvičení, se projeví pouze v konkrétních záznamech, které uložíte, a neovlivní váš celkový tréninkový plán. Ukládají se pouze řádky, které obsahují hodnoty pro váhu nebo počet opakování.", + "addAdditionalLog": "Přidat další záznam", + "operation": "Provoz", + "step": "Krok", + "requirements": "Požadavky", + "requirementsHelpText": "Vyberte výsledky tréninku (z předchozích záznamů), které musí být splněny, aby se toto pravidlo uplatnilo", + "repeat": "Opakovací pravidlo", + "repeatHelpText": "Zaškrtněte toto políčko, pokud chcete, aby se toto pravidlo nadále vztahovalo na následující tréninky, dokud nenastavíte nové", + "markAsTemplate": "Spravovat šablonu", + "template": "Šablona", + "templates": "Šablony", + "publicTemplate": "Veřejná šablona", + "publicTemplates": "Veřejné šablony", + "templatesHelpText": "Šablony slouží k uložení vaší rutiny pro pozdější použití a jako výchozí bod pro další rutiny. Šablony nelze upravovat, ale můžete je duplikovat a provádět změny v kopii (samozřejmě je také můžete převést zpět na běžnou rutinu).", + "publicTemplateHelpText": "Veřejné šablony jsou k dispozici všem uživatelům.", + "copyAndUseTemplate": "Zkopírujte a použijte šablonu", + "set": { + "type": "Napiš", + "normalSet": "Normální série", + "dropSet": "Drop série", + "myo": "MYO", + "partial": "Částečná", + "forced": "Nucený", + "tut": "Čas pod zátěží", + "iso": "Izometrické držení", + "jump": "Skok" + } + }, + "measurements": { + "measurements": "Měření", + "unitFormHelpText": "Jednotka, ve které bude kategorie měřena, například cm nebo %", + "deleteInfo": "Touto akcí také odstraníte kategorii a její záznamy" + }, + "server": { + "arms": "Paže", + "back": "Záda", + "bench": "Lavice", + "barbell": "Vzpěračská činka", + "biceps": "Bicepsy", + "incline_bench": "Šikmá lavice", + "kilometers_per_hour": "Kilometry za hodinu", + "lb": "lb", + "abs": "Břišní svaly", + "body_weight": "Tělesná hmotnost", + "calves": "Lýtka", + "cardio": "Kardio", + "chest": "Hrudník", + "dumbbell": "Jednoruční činka", + "glutes": "Hýždě", + "gym_mat": "Gymnastická podložka", + "hamstrings": "Zadní stehenní svaly", + "kettlebell": "Kettlebell", + "kilometers": "Kilometry", + "lats": "Široký sval zádový", + "legs": "Nohy", + "max_reps": "Max. opakování", + "miles": "Míle", + "miles_per_hour": "Míle za hodinu", + "minutes": "Minuty", + "plates": "Závaží", + "pull_up_bar": "Hrazda", + "quads": "Čtyřhlavý sval stehenní", + "repetitions": "Opakování", + "sz_bar": "Lišta SZ", + "seconds": "Sekundy", + "shoulders": "Ramena", + "swiss_ball": "Gymnastický míč", + "triceps": "Tricepsy", + "until_failure": "Do selhání", + "kg": "kg", + "none__bodyweight_exercise_": "žádný (cvičení s vlastní vahou)" + }, + "images": "Obrázky", + "overview": "Přehled", + "preferences": "Předvolby", + "continue": "Pokračovat", + "goBack": "Zpět", + "language": "Jazyk", + "forms": { + "supportedImageFormats": "Jsou podporovány pouze soubory JPEG, PNG, WEBP a AVIF do velikosti 20 Mb", + "valueTooShort": "Hodnota je příliš krátká", + "valueTooLong": "Hodnota je příliš dlouhá", + "fieldRequired": "Toto pole je vyžadováno", + "maxLength": "Zadejte prosím méně než {{chars}} znaků", + "minLength": "Zadejte prosím více než {{chars}} znaků", + "minValue": "Hodnota tohoto pole musí být vyšší než {{value}}", + "maxValue": "Hodnota tohoto pole musí být nižší než {{value}}", + "enterNumber": "Zadejte prosím platné číslo", + "enterInteger": "Zadejte prosím celé číslo", + "maxLessThanMin": "Maximální hodnota musí být větší než minimální", + "endBeforeStart": "Konečná hodnota nemůže být předcházející počáteční hodnotě" + }, + "name": "Název", + "category": "Kategorie", + "success": "Úspěch!", + "English": "Čeština", + "save": "Uložit", + "videos": "Videa", + "cannotBeUndone": "Tato akce je nevratná.", + "cancel": "Zrušit", + "noResults": "Žádné výsledky", + "noResultsDescription": "Nenalezeny žádné výsledky pro tento dotaz, zvažte snížení počtu filtrů.", + "filters": "Filtry", + "calendar": "Kalendář", + "entries": "Záznamy", + "no_entries_for_day": "Žádné záznamy pro tento den", + "editName": "Upravit {{name}}", + "start": "Start", + "end": "Konec", + "comment": "Komentář", + "min": "Min", + "max": "Max", + "durationWeeks": "{{number}} týdnů", + "durationWeeksDays": "{{nrWeeks}} týdnů, {{nrDays}} dní", + "undo": "Vrátit", + "successfullyDeleted": "Úspěšně smazáno", + "height": "Výška", + "cm": "cm", + "all": "Vše", + "lastYear": "Minulý rok", + "lastHalfYear": "Posledních 6 měsíců", + "lastMonth": "Poslední měsíc", + "lastWeek": "Poslední Týden", + "bmi": { + "overweight": "Nadváha", + "normal": "Normální váha", + "calculator": "BMI kalkulačka", + "obese": "Obezita", + "underweight": "Podváha", + "result": "Vaše BMI je {{value}}" + }, + "dashboard": { + "customizeDashboard": "Přizpůsobit panel", + "dragWidgetsHelp": "Přetažením widgetů můžete změnit jejich umístění nebo velikost pomocí pravého dolního rohu.", + "resetLayout": "Zpět na základní rozvržení" + }, + "core": { + "exitEditMode": "Opustit upravovací režim", + "customize": "Upravit" + }, + "preview": "Náhled", + "useMarkdownHint": "Pro formátování textu můžete použít základní Markdown: *italic*, **bold**, - list", + "trophies": { + "trophies": "Trofeje" + }, + "totalChange": "Celkoví změna", + "private": "Soukromý", + "public": "Veřejný" } diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 86c743b29..779da6fdd 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -1,386 +1,386 @@ { - "add": "Hinzufügen", - "addEntry": "Eintrag hinzufügen", - "change": "Veränderung", - "close": "Schließen", - "currentWeight": "Aktuelles Gewicht", - "date": "Datum", - "days": "Tage", - "loading": "Lade...", - "delete": "Löschen", - "difference": "Differenz", - "edit": "Bearbeiten", - "category": "Kategorie", - "English": "Englisch", - "save": "Speichern", - "continue": "Fortfahren", - "exercises": { - "equipment": "Gerät", - "exercises": "Übungen", - "muscles": "Muskeln", - "secondaryMuscles": "Sekundäre Muskeln", - "noEquipment": "Keine Ausrüstung", - "searchExerciseName": "Nach Übungsnamen suchen", - "exerciseNotTranslated": "Keine Übersetzung verfügbar", - "exerciseNotTranslatedBody": "Diese Übung ist derzeit nicht in der gewählten Sprache verfügbar. Möchtest du eine Übersetzung beisteuern?", - "translateExerciseNow": "Diese Übung jetzt übersetzen", - "notes": "Anmerkungen", + "add": "Hinzufügen", + "addEntry": "Eintrag hinzufügen", + "change": "Veränderung", + "close": "Schließen", + "currentWeight": "Aktuelles Gewicht", + "date": "Datum", + "days": "Tage", + "loading": "Lade...", + "delete": "Löschen", + "difference": "Differenz", + "edit": "Bearbeiten", + "category": "Kategorie", + "English": "Englisch", + "save": "Speichern", + "continue": "Fortfahren", + "exercises": { + "equipment": "Gerät", + "exercises": "Übungen", + "muscles": "Muskeln", + "secondaryMuscles": "Sekundäre Muskeln", + "noEquipment": "Keine Ausrüstung", + "searchExerciseName": "Nach Übungsnamen suchen", + "exerciseNotTranslated": "Keine Übersetzung verfügbar", + "exerciseNotTranslatedBody": "Diese Übung ist derzeit nicht in der gewählten Sprache verfügbar. Möchtest du eine Übersetzung beisteuern?", + "translateExerciseNow": "Diese Übung jetzt übersetzen", + "notes": "Anmerkungen", + "description": "Beschreibung", + "primaryMuscles": "Primäre Muskeln", + "identicalExercisePleaseDiscard": "Wenn dir eine Übung auffällt, die mit der von dir hinzugefügten identisch ist, verwerfe bitte deinen Entwurf und bearbeite stattdessen diese Übung.", + "contributeExercise": "Eine Übung beisteuern", + "checkInformationBeforeSubmitting": "Bitte überprüfe vor dem Absenden der Übung, ob die von dir eingegebenen Informationen korrekt sind", + "successfullyUpdated": "Die Übung wurde erfolgreich aktualisiert. Aufgrund von Caching kann es einige Zeit dauern, bis die Änderungen in der gesamten Anwendung sichtbar sind.", + "alsoKnownAs": "Auch bekannt als:", + "deleteExerciseTranslation": "Aktuelle Übersetzung löschen?", + "deleteExerciseTranslationBody": "Du bist dabei, die Übersetzung {{language}} für die Übung \"{{name}}\" zu löschen. Diese Aktion kann nicht rückgängig gemacht werden. Weitermachen?", + "missingExercise": "Fehlt eine bestimmte Übung?", + "newNote": "Neuer Hinweis", + "notesHelpText": "Hinweise sind kurze Kommentare zur Ausführung der Übung, wie z. B. \"Halte deinen Körper gerade\"", + "variations": "Variationen", + "step1HeaderBasics": "Grundlagen auf Englisch", + "whatVariationsExist": "Welche Variationen dieser Übung gibt es, wenn überhaupt?", + "filterVariations": "Name der Übung eingeben, um Variationen zu filtern", + "submitExercise": "Übung einreichen", + "compatibleImagesCC": "Die Bilder müssen mit der CC BY SA-Lizenz kompatibel sein. Im Zweifelsfall solltest du nur Fotos hochladen, die du selbst aufgenommen hast.", + "alternativeNames": "Alternative Namen", + "missingExerciseDescription": "Hilf der Community und leiste einen Beitrag!", + "deleteExerciseFull": "Vollständige Übung löschen", + "deleteTranslation": "Übersetzung löschen", + "deleteExerciseBody": "Möchtest du die Übung \"{{name}}\" löschen? Du kannst entweder die aktuelle {{language}} Übersetzung oder die komplette Übung mit allen Übersetzungen, Bildern usw. löschen.", + "basics": "Grundlagen", + "notEnoughRightsHeader": "Du kannst keine Übungen beisteuern", + "notEnoughRights": "Du kannst Übungen nur dann beisteuern, wenn dein Benutzerkonto älter als {{days}} Tage und deine E-Mail-Adresse verifiziert ist", + "changeExerciseLanguage": "Ändere die Sprache dieser Übung", + "identicalExercise": "Vermeide doppelte Übungen", + "cacheWarning": "Aufgrund von Caching kann es einige Zeit dauern, bis Änderungen in der ganzen Anwendung sichtbar sind.", + "replacements": "Ersatz", + "replacementsInfoText": "Optional können Sie auch eine Übung auswählen, die diese ersetzen soll (z. B. weil sie zweimal eingereicht wurde oder ähnliches). Dadurch wird die Übung in Routinen sowie Trainingsprotokollen ersetzt, anstatt sie einfach zu löschen. Diese Änderungen werden auch auf alle Instanzen übertragen, die Übungen von dieser übernehmen.", + "replacementsSearch": "Suche nach Übungen oder kopiere eine Bekannte ID in das Feld und drücke den \"Laden\" Button.", + "noReplacementSelected": " Keine Übung zum ersätzen ausgewählt", + "deleteExerciseReplace": "Löschen und ersetzen", + "imageStylePhoto": "Foto", + "imageStyle3D": "3D", + "imageStyleLine": "Linie", + "imageStyleLowPoly": "Niedrig-Poly", + "imageStyleOther": "andere", + "imageDetails": "Bilddetails", + "swapExercise": "Übungen tauschen", + "exactMatch": "Exakte Übereinstimmung", + "replacementCannotBeSame": "Der Ersatz kann nicht dieselbe Übung sein, die gelöscht wird.", + "transferMediaLabel": "Übertrage Medien auf die Ersatzübung", + "transferTranslationsLabel": "Übertrage Übersetzungen auf den Ersatz (überspringt Sprachen, die bereits vorhanden sind)", + "imageIsAiGenerated": "Bild wurde mit KI generiert", + "dropOrClickImage": "Ziehe ein Bild hierher oder klicke, um auszuwählen", + "addImage": "Bild hinzufügen" + }, + "noResults": "Keine Ergebnisse", + "noResultsDescription": "Keine Ergebnisse für diese Suche gefunden, bitte reduziere die Anzahl der Filter.", + "nutritionalPlan": "Ernährungsplan", + "server": { + "abs": "Bauch", + "arms": "Arme", + "back": "Rücken", + "barbell": "Langhantel", + "bench": "Bank", + "biceps": "Bizeps", + "calves": "Waden", + "chest": "Brust", + "dumbbell": "Kurzhantel", + "glutes": "Po", + "gym_mat": "Matte", + "hamstrings": "Beinbeuger", + "incline_bench": "Schrägbank", + "kettlebell": "Kugelhantel", + "kilometers": "Kilometer", + "lats": "Latissimus", + "legs": "Beine", + "lower_back": "Unterer Rücken", + "miles": "Meilen", + "minutes": "Minuten", + "none__bodyweight_exercise_": "keine (Körpergewichtübung)", + "pull_up_bar": "Klimmzugstange", + "quads": "Beinstrecker", + "repetitions": "Wiederholungen", + "seconds": "Sekunden", + "shoulders": "Schultern", + "swiss_ball": "Schweizer Ball", + "sz_bar": "SZ Stange", + "triceps": "Trizeps", + "until_failure": "Bis zum Muskelversagen", + "cardio": "Kardio", + "lb": "lb", + "kg": "kg", + "kilometers_per_hour": "Kilometer pro Stunde", + "body_weight": "Körpergewicht", + "miles_per_hour": "Meilen pro Stunde", + "max_reps": "Max. Wdh.", + "plates": "Gewichtsscheiben" + }, + "submit": "Abschicken", + "weight": "Gewicht", + "workout": "Training", + "images": "Bilder", "description": "Beschreibung", - "primaryMuscles": "Primäre Muskeln", - "identicalExercisePleaseDiscard": "Wenn dir eine Übung auffällt, die mit der von dir hinzugefügten identisch ist, verwerfe bitte deinen Entwurf und bearbeite stattdessen diese Übung.", - "contributeExercise": "Eine Übung beisteuern", - "checkInformationBeforeSubmitting": "Bitte überprüfe vor dem Absenden der Übung, ob die von dir eingegebenen Informationen korrekt sind", - "successfullyUpdated": "Die Übung wurde erfolgreich aktualisiert. Aufgrund von Caching kann es einige Zeit dauern, bis die Änderungen in der gesamten Anwendung sichtbar sind.", - "alsoKnownAs": "Auch bekannt als:", - "deleteExerciseTranslation": "Aktuelle Übersetzung löschen?", - "deleteExerciseTranslationBody": "Du bist dabei, die Übersetzung {{language}} für die Übung \"{{name}}\" zu löschen. Diese Aktion kann nicht rückgängig gemacht werden. Weitermachen?", - "missingExercise": "Fehlt eine bestimmte Übung?", - "newNote": "Neuer Hinweis", - "notesHelpText": "Hinweise sind kurze Kommentare zur Ausführung der Übung, wie z. B. \"Halte deinen Körper gerade\"", - "variations": "Variationen", - "step1HeaderBasics": "Grundlagen auf Englisch", - "whatVariationsExist": "Welche Variationen dieser Übung gibt es, wenn überhaupt?", - "filterVariations": "Name der Übung eingeben, um Variationen zu filtern", - "submitExercise": "Übung einreichen", - "compatibleImagesCC": "Die Bilder müssen mit der CC BY SA-Lizenz kompatibel sein. Im Zweifelsfall solltest du nur Fotos hochladen, die du selbst aufgenommen hast.", - "alternativeNames": "Alternative Namen", - "missingExerciseDescription": "Hilf der Community und leiste einen Beitrag!", - "deleteExerciseFull": "Vollständige Übung löschen", - "deleteTranslation": "Übersetzung löschen", - "deleteExerciseBody": "Möchtest du die Übung \"{{name}}\" löschen? Du kannst entweder die aktuelle {{language}} Übersetzung oder die komplette Übung mit allen Übersetzungen, Bildern usw. löschen.", - "basics": "Grundlagen", - "notEnoughRightsHeader": "Du kannst keine Übungen beisteuern", - "notEnoughRights": "Du kannst Übungen nur dann beisteuern, wenn dein Benutzerkonto älter als {{days}} Tage und deine E-Mail-Adresse verifiziert ist", - "changeExerciseLanguage": "Ändere die Sprache dieser Übung", - "identicalExercise": "Vermeide doppelte Übungen", - "cacheWarning": "Aufgrund von Caching kann es einige Zeit dauern, bis Änderungen in der ganzen Anwendung sichtbar sind.", - "replacements": "Ersatz", - "replacementsInfoText": "Optional können Sie auch eine Übung auswählen, die diese ersetzen soll (z. B. weil sie zweimal eingereicht wurde oder ähnliches). Dadurch wird die Übung in Routinen sowie Trainingsprotokollen ersetzt, anstatt sie einfach zu löschen. Diese Änderungen werden auch auf alle Instanzen übertragen, die Übungen von dieser übernehmen.", - "replacementsSearch": "Suche nach Übungen oder kopiere eine Bekannte ID in das Feld und drücke den \"Laden\" Button.", - "noReplacementSelected": " Keine Übung zum ersätzen ausgewählt", - "deleteExerciseReplace": "Löschen und ersetzen", - "imageStylePhoto": "Foto", - "imageStyle3D": "3D", - "imageStyleLine": "Linie", - "imageStyleLowPoly": "Niedrig-Poly", - "imageStyleOther": "andere", - "imageDetails": "Bilddetails", - "swapExercise": "Übungen tauschen", - "exactMatch": "Exakte Übereinstimmung", - "replacementCannotBeSame": "Der Ersatz kann nicht dieselbe Übung sein, die gelöscht wird.", - "transferMediaLabel": "Übertrage Medien auf die Ersatzübung", - "transferTranslationsLabel": "Übertrage Übersetzungen auf den Ersatz (überspringt Sprachen, die bereits vorhanden sind)", - "imageIsAiGenerated": "Bild wurde mit KI generiert", - "dropOrClickImage": "Ziehe ein Bild hierher oder klicke, um auszuwählen", - "addImage": "Bild hinzufügen" - }, - "noResults": "Keine Ergebnisse", - "noResultsDescription": "Keine Ergebnisse für diese Suche gefunden, bitte reduziere die Anzahl der Filter.", - "nutritionalPlan": "Ernährungsplan", - "server": { - "abs": "Bauch", - "arms": "Arme", - "back": "Rücken", - "barbell": "Langhantel", - "bench": "Bank", - "biceps": "Bizeps", - "calves": "Waden", - "chest": "Brust", - "dumbbell": "Kurzhantel", - "glutes": "Po", - "gym_mat": "Matte", - "hamstrings": "Beinbeuger", - "incline_bench": "Schrägbank", - "kettlebell": "Kugelhantel", - "kilometers": "Kilometer", - "lats": "Latissimus", - "legs": "Beine", - "lower_back": "Unterer Rücken", - "miles": "Meilen", - "minutes": "Minuten", - "none__bodyweight_exercise_": "keine (Körpergewichtübung)", - "pull_up_bar": "Klimmzugstange", - "quads": "Beinstrecker", - "repetitions": "Wiederholungen", - "seconds": "Sekunden", - "shoulders": "Schultern", - "swiss_ball": "Schweizer Ball", - "sz_bar": "SZ Stange", - "triceps": "Trizeps", - "until_failure": "Bis zum Muskelversagen", - "cardio": "Kardio", - "lb": "lb", - "kg": "kg", - "kilometers_per_hour": "Kilometer pro Stunde", - "body_weight": "Körpergewicht", - "miles_per_hour": "Meilen pro Stunde", - "max_reps": "Max. Wdh.", - "plates": "Gewichtsscheiben" - }, - "submit": "Abschicken", - "weight": "Gewicht", - "workout": "Training", - "images": "Bilder", - "description": "Beschreibung", - "translation": "Übersetzung", - "overview": "Überblick", - "goBack": "Zurück", - "language": "Sprache", - "forms": { - "supportedImageFormats": "Es werden nur JPEG-, PNG-, WEBP- und AVIF-Dateien unter 20Mb unterstützt", - "valueTooShort": "Der Wert ist zu gering", - "valueTooLong": "Der Wert ist zu groß", - "fieldRequired": "Pflichtfeld", - "maxLength": "Bitte geben Sie weniger als {{chars}} Zeichen ein", - "minLength": "Bitte geben Sie mehr als {{chars}} Zeichen ein", - "minValue": "Der Wert für dieses Feld muss höher sein als {{value}}", - "maxValue": "Der Wert für dieses Feld muss niedriger sein als {{value}}", - "enterNumber": "Bitte gib eine gültige Nummer ein", - "enterInteger": "Bitte gib eine ganze Zahl ein", - "maxLessThanMin": "Der maximale Wert muss größer als der minimale sein", - "endBeforeStart": "Der Endwert darf nicht vor dem Startwert liegen" - }, - "routines": { - "sets": "Sätze", - "reps": "Wdh.", - "rir": "RiR", - "volume": "Volumen", - "intensity": "Intensität", - "currentRoutine": "Aktuelle Routine", - "iteration": "Iteration", - "weekly": "Wöchentlich", - "daily": "Täglich", - "restTime": "Pausenzeit", - "workoutNr": "Training {{number}}", - "weekNr": "Woche {{number}}", - "addDay": "Trainingstag hinzufügen", - "needsLogsToAdvance": "Benötigt Logeinträge, um fortzufahren", - "needsLogsToAdvanceHelpText": "Wenn du diese Option auswählst, wird die Routine nur dann zum nächsten geplanten Tag fortschreiten, wenn du ein Training für den aktuellen Tag protokolliert hast. Wenn diese Option nicht ausgewählt ist, wird die Routine automatisch zum nächsten Tag fortschreiten, unabhängig davon, ob du ein Training protokolliert hast oder nicht.", - "routineHasNoDays": "Diese Routine hat keine Trainingstage", - "setHasNoExercises": "Dieser Satz hat keine Übungen", - "routine": "Routine", - "editProgression": "Progression bearbeiten", - "progressionNeedsReplace": "Einer der vorherigen Einträge muss eine Ersetzungsoperation haben", - "exerciseHasProgression": "Diese Übung hat Progressionsregeln und kann hier nicht bearbeitet werden. Klicke dazu auf die Schaltfläche.", - "routines": "Routinen", - "addSuperset": "Supersatz hinzufügen", - "addExercise": "Übung hinzufügen", - "exerciseNr": "Übung {{number}}", - "supersetNr": "Supersatz {{number}}", - "statsOverview": "Statistiken", - "simpleMode": "Einfacher Modus", - "restDay": "Ruhetag", - "addWeightLog": "Trainingslog hinzufügen", - "logsFilterNote": "Beachte, dass nur Einträge mit einer Gewichtseinheit (kg oder lb) und Wiederholungen gezeichnet werden, andere Kombinationen wie Zeit oder bis zum Ausfall werden hier ignoriert", - "logsHeader": "Trainingsprotokoll für das Workout", - "addLogToDay": "Protokoll zu diesem Tag hinzufügen", - "backToRoutine": "Zurück zur Routine", - "maxLengthRoutine": "Die Routine darf maximal {{number}} Wochen lang sein", - "resultingRoutine": "Resultierende Routine", - "deleteDayConfirmation": "Dies löscht alle Sets, Übungen und Fortschrittsregeln", - "fitDaysInWeek": "Fester Wochenrhythmus", - "defaultRounding": "Standardrundung", - "rounding": "Rundung (diese Übung)", - "weightLogNotPlanned": "Speichere Log an einem Tag ohne geplantes Workout.", - "alsoShowLogs": "Zeige auch Logeinträge", - "confirmRestDay": "Änderung des Ruhetags bestätigen", - "confirmRestDayHelpText": "Bitte beachten Sie, dass alle Sätze und Übungen entfernt werden, wenn Sie einen Tag als Ruhetag markieren.", - "duplicate": "Routine duplizieren", - "downloadPdfTable": "Download PDF (Tabelle)", - "downloadPdfLogs": "Download PDF (Logs)", - "downloadIcal": "Download iCal Datei", - "impression": "Gesamteindruck", - "impressionGood": "Gut", - "impressionNeutral": "Neutral", - "operation": "Funktion", - "step": "Schritt", - "requirements": "Voraussetzungen", - "repeat": "Wiederhole Regel", - "requirementsHelpText": "Wähle das Trainingsergebnis (aus einem vorherigen Eintrag), welcher erreicht werden muss, damit die Regel auslöst", - "markAsTemplate": "Verwalte Vorlage", - "template": "Vorlage", - "templates": "Vorlagen", - "publicTemplate": "Öffentliche Vorlage", - "publicTemplates": "Öffentliche Vorlagen", - "copyAndUseTemplate": "Vorlage kopieren und verwenden", - "publicTemplateHelpText": "Öffentliche Vorlagen sind sichtbar für alle Nutzer.", - "set": { - "type": "Typ", - "myo": "MYO", - "partial": "Teilweise", - "forced": "Erzwungenes", - "normalSet": "Normaler Satz", - "dropSet": "Absteigender Satz", - "tut": "Zeit unter Spannung", - "iso": "Isometrischer Halt", - "jump": "Sprung", - "warmup": "Aufwärmen" + "translation": "Übersetzung", + "overview": "Überblick", + "goBack": "Zurück", + "language": "Sprache", + "forms": { + "supportedImageFormats": "Es werden nur JPEG-, PNG-, WEBP- und AVIF-Dateien unter 20Mb unterstützt", + "valueTooShort": "Der Wert ist zu gering", + "valueTooLong": "Der Wert ist zu groß", + "fieldRequired": "Pflichtfeld", + "maxLength": "Bitte geben Sie weniger als {{chars}} Zeichen ein", + "minLength": "Bitte geben Sie mehr als {{chars}} Zeichen ein", + "minValue": "Der Wert für dieses Feld muss höher sein als {{value}}", + "maxValue": "Der Wert für dieses Feld muss niedriger sein als {{value}}", + "enterNumber": "Bitte gib eine gültige Nummer ein", + "enterInteger": "Bitte gib eine ganze Zahl ein", + "maxLessThanMin": "Der maximale Wert muss größer als der minimale sein", + "endBeforeStart": "Der Endwert darf nicht vor dem Startwert liegen" + }, + "routines": { + "sets": "Sätze", + "reps": "Wdh.", + "rir": "RiR", + "volume": "Volumen", + "intensity": "Intensität", + "currentRoutine": "Aktuelle Routine", + "iteration": "Iteration", + "weekly": "Wöchentlich", + "daily": "Täglich", + "restTime": "Pausenzeit", + "workoutNr": "Training {{number}}", + "weekNr": "Woche {{number}}", + "addDay": "Trainingstag hinzufügen", + "needsLogsToAdvance": "Benötigt Logeinträge, um fortzufahren", + "needsLogsToAdvanceHelpText": "Wenn du diese Option auswählst, wird die Routine nur dann zum nächsten geplanten Tag fortschreiten, wenn du ein Training für den aktuellen Tag protokolliert hast. Wenn diese Option nicht ausgewählt ist, wird die Routine automatisch zum nächsten Tag fortschreiten, unabhängig davon, ob du ein Training protokolliert hast oder nicht.", + "routineHasNoDays": "Diese Routine hat keine Trainingstage", + "setHasNoExercises": "Dieser Satz hat keine Übungen", + "routine": "Routine", + "editProgression": "Progression bearbeiten", + "progressionNeedsReplace": "Einer der vorherigen Einträge muss eine Ersetzungsoperation haben", + "exerciseHasProgression": "Diese Übung hat Progressionsregeln und kann hier nicht bearbeitet werden. Klicke dazu auf die Schaltfläche.", + "routines": "Routinen", + "addSuperset": "Supersatz hinzufügen", + "addExercise": "Übung hinzufügen", + "exerciseNr": "Übung {{number}}", + "supersetNr": "Supersatz {{number}}", + "statsOverview": "Statistiken", + "simpleMode": "Einfacher Modus", + "restDay": "Ruhetag", + "addWeightLog": "Trainingslog hinzufügen", + "logsFilterNote": "Beachte, dass nur Einträge mit einer Gewichtseinheit (kg oder lb) und Wiederholungen gezeichnet werden, andere Kombinationen wie Zeit oder bis zum Ausfall werden hier ignoriert", + "logsHeader": "Trainingsprotokoll für das Workout", + "addLogToDay": "Protokoll zu diesem Tag hinzufügen", + "backToRoutine": "Zurück zur Routine", + "maxLengthRoutine": "Die Routine darf maximal {{number}} Wochen lang sein", + "resultingRoutine": "Resultierende Routine", + "deleteDayConfirmation": "Dies löscht alle Sets, Übungen und Fortschrittsregeln", + "fitDaysInWeek": "Fester Wochenrhythmus", + "defaultRounding": "Standardrundung", + "rounding": "Rundung (diese Übung)", + "weightLogNotPlanned": "Speichere Log an einem Tag ohne geplantes Workout.", + "alsoShowLogs": "Zeige auch Logeinträge", + "confirmRestDay": "Änderung des Ruhetags bestätigen", + "confirmRestDayHelpText": "Bitte beachten Sie, dass alle Sätze und Übungen entfernt werden, wenn Sie einen Tag als Ruhetag markieren.", + "duplicate": "Routine duplizieren", + "downloadPdfTable": "Download PDF (Tabelle)", + "downloadPdfLogs": "Download PDF (Logs)", + "downloadIcal": "Download iCal Datei", + "impression": "Gesamteindruck", + "impressionGood": "Gut", + "impressionNeutral": "Neutral", + "operation": "Funktion", + "step": "Schritt", + "requirements": "Voraussetzungen", + "repeat": "Wiederhole Regel", + "requirementsHelpText": "Wähle das Trainingsergebnis (aus einem vorherigen Eintrag), welcher erreicht werden muss, damit die Regel auslöst", + "markAsTemplate": "Verwalte Vorlage", + "template": "Vorlage", + "templates": "Vorlagen", + "publicTemplate": "Öffentliche Vorlage", + "publicTemplates": "Öffentliche Vorlagen", + "copyAndUseTemplate": "Vorlage kopieren und verwenden", + "publicTemplateHelpText": "Öffentliche Vorlagen sind sichtbar für alle Nutzer.", + "set": { + "type": "Typ", + "myo": "MYO", + "partial": "Teilweise", + "forced": "Erzwungenes", + "normalSet": "Normaler Satz", + "dropSet": "Absteigender Satz", + "tut": "Zeit unter Spannung", + "iso": "Isometrischer Halt", + "jump": "Sprung", + "warmup": "Aufwärmen" + }, + "impressionBad": "Schlecht", + "newDay": "Neuer Tag", + "logsOverview": "Log Übersicht", + "minLengthRoutine": "Die Routine muss mindestens {{number}} Wochen lang sein", + "workoutSession": "Trainingseinheit", + "repeatHelpText": "Aktivieren Sie das Kontrollkästchen, wenn diese Regel auch für nachfolgende Trainingseinheiten gelten soll, bis Sie eine neue definieren", + "impressionHelpText": "Dieses Formular erfasst Ihre Trainingsergebnisse (Wiederholungen, Gewicht usw.) für jede Übung. Änderungen, die Sie hier vornehmen, wie das Entfernen oder Austauschen von Übungen, wirken sich nur auf die gespeicherten Protokolle aus und haben keinen Einfluss auf Ihr Gesamtprogramm. Es werden nur Zeilen mit Werten für Gewicht oder Wiederholungen gespeichert.", + "fitDaysInWeekHelpText": "Diese Einstellung steuert die Verteilung der Trainingstage deiner Routine über mehrere Wochen. Ist diese Option aktiviert, wiederholen sich die Tage wöchentlich. Beispielsweise wird ein Trainingsplan mit Trainingseinheiten am Montag, Mittwoch und Freitag am darauffolgenden Montag, Mittwoch und Freitag fortgesetzt. Ist diese Option deaktiviert, werden die Trainingstage unabhängig vom Wochenbeginn nacheinander abgearbeitet. Dies ist nützlich für Trainingspläne, die keinem strengen Wochenplan folgen.", + "templatesHelpText": "Vorlagen ermöglichen es Ihnen, Ihre Routine für die spätere Verwendung zu speichern und als Ausgangspunkt für weitere Routinen zu verwenden. Sie können Vorlagen nicht bearbeiten, aber Sie können sie duplizieren und Änderungen an der Kopie vornehmen (und sie natürlich auch wieder in eine reguläre Routine umwandeln).", + "roundingHelp": "Lege die Standardrundung für Gewicht und Wiederholungen fest (dies ist besonders nützlich, wenn du den prozentualen Steigerungsschritt in der Progression verwendest). Dies gilt für alle neuen Sätze, kann aber im Progressionsformular individuell geändert werden. Lasse das Feld leer, um die Rundung zu deaktivieren.", + "addAdditionalLog": "Hinzufügen eines zusätzlichen Eintrags", + "day": { + "custom": "personalisiert", + "enom": "Jede volle Minute", + "amrap": "So viele Runden wie möglich", + "hiit": "Hochintensives Intervalltraining", + "edt": "Eskalierendes Intensivtraining", + "rft": "Runden auf Zeit", + "afap": "So schnell wie möglich", + "tabata": "Tabata" + }, + "addSet": "Satz hinzufügen", + "setNr": "Satz {{number}}" + }, + "name": "Name", + "cancel": "Abbrechen", + "videos": "Videos", + "cannotBeUndone": "Diese Aktion kann nicht rückgängig gemacht werden.", + "preferences": "Voreinstellungen", + "success": "Geschafft!", + "measurements": { + "deleteInfo": "Dies wird die Kategorie sowie alle seine Einträge löschen", + "unitFormHelpText": "Die Einheit, in der die Kategorie gemessen wird, wie cm oder %", + "measurements": "Messungen" + }, + "timeOfDay": "Uhrzeit", + "notes": "Notizen", + "value": "Wert", + "unit": "Einheit", + "alsoSearchEnglish": "Namen auch auf Englisch suchen", + "deleteConfirmation": "Sind Sie sicher, dass Sie \"{{name}}\" löschen wollen?", + "seeDetails": "Details anzeigen", + "actions": "Aktion", + "nothingHereYet": "Hier ist noch nichts...", + "nothingHereYetAction": "Drücken Sie die Aktionstaste, um zu beginnen", + "copyToClipboard": "In Zwischenablage kopieren", + "nutrition": { + "plans": "Ernährungspläne", + "plan": "Ernährungsplan", + "useGoalsHelpText": "Ziele zu diesem Plan hinzufügen", + "meal": "Mahlzeit", + "gramShort": "g", + "valueEnergyKcal": "{{value}} kcal", + "kcal": "kcal", + "percentEnergy": "Prozent der Energie", + "gPerBodyKg": "g pro Körper-kg", + "planned": "Geplant", + "logged": "Protokolliert", + "difference": "Unterschied", + "today": "Heute", + "7dayAvg": "7-Tage-Durchschnitt", + "carbohydrates": "Kohlenhydrate", + "sugar": "Zucker", + "ofWhichSugars": "davon Zucker", + "fat": "Fett", + "others": "Sonstige", + "fibres": "Ballaststoffe", + "sodium": "Natrium", + "planDeleteInfo": "Dies wird ebenfalls alle Nahrungstagebucheinträge löschen", + "mealDeleteInfo": "Ernährungstagebucheinträge zu dieser Mahlzeit werden nicht gelöscht und erscheinen unter \"andere Protokolle\"", + "diaryEntrySaved": "Tagebucheintrag erfolgreich gespeichert", + "goalsTitle": "Ziele", + "goalEnergy": "Energieziel", + "goalProtein": "Protein Ziel", + "goalCarbohydrates": "Kohlenhydrate Ziel", + "goalFat": "Fett Ziel", + "addNutritionalDiary": "Nahrungstagebucheintrag hinzufügen", + "nutritionalDiary": "Ernährungstagebuch", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "energy": "Energie", + "protein": "Eiweiß", + "ofWhichSaturated": "davon gesättigt", + "pseudoMealTitle": "Andere Protokolle", + "valueRemaining": "verbleibend", + "copyPlan": "Mache eine Kopie dieses Plans", + "macronutrient": "Makronährstoff", + "loggedToday": "Heute protokolliert", + "addMeal": "Mahlzeit hinzufügen", + "useGoalsHelpTextLong": "So kannst du allgemeine Ziele für Energie, Eiweiß, Kohlenhydrate oder Fett für den Plan festlegen. Beachte, dass diese Werte Vorrang haben, wenn du einen detaillierten Mahlzeitenplan erstellst.", + "addMealItem": "Zutat zu Mahlzeit hinzufügen", + "searchIngredientName": "Suche nach Zutatenname", + "languageFilterCurrentOnly": "Nur in aktueller Sprache ({{lang}})", + "languageFilterCurrentAndEnglish": "Aktuelle Sprache ({{lang}}) & Englisch", + "languageFilterAll": "Alle Sprachen", + "saturatedFat": "Gesättigte Fette", + "valueTooMany": "zu viele", + "logThisMealItem": "Diese Zutat unverändert in das Ernährungstagebuch eintragen", + "onlyLoggingHelpText": "Nur Kalorien verfolgen. Markiere das Kästchen, wenn du nur deine Kalorien protokollieren möchtest und keinen detaillierten Ernährungsplan mit spezifischen Mahlzeiten einrichten willst", + "goalFiber": "Ballaststoffziel", + "logThisMeal": "Dieses Gericht unverändert in das Ernährungstagebuch eintragen", + "filterVegan": "Vegan", + "filterVegetarian": "Vegetarisch", + "filterNutriscore": "Nährwertfilter", + "filterNutriscoreOff": "Aus", + "filterNutriscoreNoFilter": "Kein Filter", + "filterNutriscoreOrBetter": "{{grade}} oder besser" + }, + "downloadAsPdf": "Download als PDF", + "total": "Gesamt", + "licenses": { + "authors": "Autor(en)", + "derivativeSourceUrl": "Link zur Originalquelle, falls es sich um die Abwandlung eines anderen Werkes handelt", + "originalObjectUrl": "Link zur Quell-Website, falls verfügbar", + "originalTitle": "Titel", + "authorProfile": "Link zur Website oder Profil des Autors, falls verfügbar", + "derivativeSourceUrlHelper": "Beachte, dass ein abgeleitetes Werk nicht nur auf einem vorherigen Werk basiert, sondern auch genügend neue, kreative Inhalte enthält, um ein eigenes Urheberrecht zu beanspruchen." + }, + "filters": "Filter", + "calendar": "Kalender", + "entries": "Einträge", + "no_entries_for_day": "Keine Einträge für diesen Tag", + "height": "Größe", + "cm": "cm", + "all": "Alle", + "lastYear": "Letztes Jahr", + "lastHalfYear": "In den letzten 6 Monaten", + "lastMonth": "Letzten Monat", + "lastWeek": "Letzte Woche", + "bmi": { + "overweight": "Übergewicht", + "obese": "Fettleibig", + "normal": "Normales Gewicht", + "calculator": "BMI Rechner", + "underweight": "Untergewicht", + "result": "Dein BMI ist {{value}}" + }, + "editName": "{{name}} bearbeiten", + "start": "Start", + "end": "Ende", + "comment": "Kommentar", + "min": "Min", + "max": "Max", + "durationWeeks": "{{number}} Wochen", + "durationWeeksDays": "{{nrWeeks}} Wochen, {{nrDays}} Tage", + "undo": "Rückgängig machen", + "successfullyDeleted": "Erfolgreich gelöscht", + "private": "Privat", + "public": "Öffentlich", + "dashboard": { + "customizeDashboard": "Dashboard anpassen", + "dragWidgetsHelp": "Ziehen Sie Widgets, um sie neu zu positionieren, oder ändern Sie ihre Größe über die rechte untere Ecke.", + "resetLayout": "Auf Standardlayout zurücksetzen" + }, + "core": { + "exitEditMode": "Bearbeitungsmodus verlassen", + "customize": "Anpassen" }, - "impressionBad": "Schlecht", - "newDay": "Neuer Tag", - "logsOverview": "Log Übersicht", - "minLengthRoutine": "Die Routine muss mindestens {{number}} Wochen lang sein", - "workoutSession": "Trainingseinheit", - "repeatHelpText": "Aktivieren Sie das Kontrollkästchen, wenn diese Regel auch für nachfolgende Trainingseinheiten gelten soll, bis Sie eine neue definieren", - "impressionHelpText": "Dieses Formular erfasst Ihre Trainingsergebnisse (Wiederholungen, Gewicht usw.) für jede Übung. Änderungen, die Sie hier vornehmen, wie das Entfernen oder Austauschen von Übungen, wirken sich nur auf die gespeicherten Protokolle aus und haben keinen Einfluss auf Ihr Gesamtprogramm. Es werden nur Zeilen mit Werten für Gewicht oder Wiederholungen gespeichert.", - "fitDaysInWeekHelpText": "Diese Einstellung steuert die Verteilung der Trainingstage deiner Routine über mehrere Wochen. Ist diese Option aktiviert, wiederholen sich die Tage wöchentlich. Beispielsweise wird ein Trainingsplan mit Trainingseinheiten am Montag, Mittwoch und Freitag am darauffolgenden Montag, Mittwoch und Freitag fortgesetzt. Ist diese Option deaktiviert, werden die Trainingstage unabhängig vom Wochenbeginn nacheinander abgearbeitet. Dies ist nützlich für Trainingspläne, die keinem strengen Wochenplan folgen.", - "templatesHelpText": "Vorlagen ermöglichen es Ihnen, Ihre Routine für die spätere Verwendung zu speichern und als Ausgangspunkt für weitere Routinen zu verwenden. Sie können Vorlagen nicht bearbeiten, aber Sie können sie duplizieren und Änderungen an der Kopie vornehmen (und sie natürlich auch wieder in eine reguläre Routine umwandeln).", - "roundingHelp": "Lege die Standardrundung für Gewicht und Wiederholungen fest (dies ist besonders nützlich, wenn du den prozentualen Steigerungsschritt in der Progression verwendest). Dies gilt für alle neuen Sätze, kann aber im Progressionsformular individuell geändert werden. Lasse das Feld leer, um die Rundung zu deaktivieren.", - "addAdditionalLog": "Hinzufügen eines zusätzlichen Eintrags", - "day": { - "custom": "personalisiert", - "enom": "Jede volle Minute", - "amrap": "So viele Runden wie möglich", - "hiit": "Hochintensives Intervalltraining", - "edt": "Eskalierendes Intensivtraining", - "rft": "Runden auf Zeit", - "afap": "So schnell wie möglich", - "tabata": "Tabata" + "preview": "Vorschau", + "useMarkdownHint": "Sie können simples Markdown verwenden, um den Text zu formatieren: *kursiv*, **fett**, - Liste", + "trophies": { + "trophies": "Trophäen" }, - "addSet": "Satz hinzufügen", - "setNr": "Satz {{number}}" - }, - "name": "Name", - "cancel": "Abbrechen", - "videos": "Videos", - "cannotBeUndone": "Diese Aktion kann nicht rückgängig gemacht werden.", - "preferences": "Voreinstellungen", - "success": "Geschafft!", - "measurements": { - "deleteInfo": "Dies wird die Kategorie sowie alle seine Einträge löschen", - "unitFormHelpText": "Die Einheit, in der die Kategorie gemessen wird, wie cm oder %", - "measurements": "Messungen" - }, - "timeOfDay": "Uhrzeit", - "notes": "Notizen", - "value": "Wert", - "unit": "Einheit", - "alsoSearchEnglish": "Namen auch auf Englisch suchen", - "deleteConfirmation": "Sind Sie sicher, dass Sie \"{{name}}\" löschen wollen?", - "seeDetails": "Details anzeigen", - "actions": "Aktion", - "nothingHereYet": "Hier ist noch nichts...", - "nothingHereYetAction": "Drücken Sie die Aktionstaste, um zu beginnen", - "copyToClipboard": "In Zwischenablage kopieren", - "nutrition": { - "plans": "Ernährungspläne", - "plan": "Ernährungsplan", - "useGoalsHelpText": "Ziele zu diesem Plan hinzufügen", - "meal": "Mahlzeit", - "gramShort": "g", - "valueEnergyKcal": "{{value}} kcal", - "kcal": "kcal", - "percentEnergy": "Prozent der Energie", - "gPerBodyKg": "g pro Körper-kg", - "planned": "Geplant", - "logged": "Protokolliert", - "difference": "Unterschied", - "today": "Heute", - "7dayAvg": "7-Tage-Durchschnitt", - "carbohydrates": "Kohlenhydrate", - "sugar": "Zucker", - "ofWhichSugars": "davon Zucker", - "fat": "Fett", - "others": "Sonstige", - "fibres": "Ballaststoffe", - "sodium": "Natrium", - "planDeleteInfo": "Dies wird ebenfalls alle Nahrungstagebucheinträge löschen", - "mealDeleteInfo": "Ernährungstagebucheinträge zu dieser Mahlzeit werden nicht gelöscht und erscheinen unter \"andere Protokolle\"", - "diaryEntrySaved": "Tagebucheintrag erfolgreich gespeichert", - "goalsTitle": "Ziele", - "goalEnergy": "Energieziel", - "goalProtein": "Protein Ziel", - "goalCarbohydrates": "Kohlenhydrate Ziel", - "goalFat": "Fett Ziel", - "addNutritionalDiary": "Nahrungstagebucheintrag hinzufügen", - "nutritionalDiary": "Ernährungstagebuch", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "energy": "Energie", - "protein": "Eiweiß", - "ofWhichSaturated": "davon gesättigt", - "pseudoMealTitle": "Andere Protokolle", - "valueRemaining": "verbleibend", - "copyPlan": "Mache eine Kopie dieses Plans", - "macronutrient": "Makronährstoff", - "loggedToday": "Heute protokolliert", - "addMeal": "Mahlzeit hinzufügen", - "useGoalsHelpTextLong": "So kannst du allgemeine Ziele für Energie, Eiweiß, Kohlenhydrate oder Fett für den Plan festlegen. Beachte, dass diese Werte Vorrang haben, wenn du einen detaillierten Mahlzeitenplan erstellst.", - "addMealItem": "Zutat zu Mahlzeit hinzufügen", - "searchIngredientName": "Suche nach Zutatenname", - "languageFilterCurrentOnly": "Nur in aktueller Sprache ({{lang}})", - "languageFilterCurrentAndEnglish": "Aktuelle Sprache ({{lang}}) & Englisch", - "languageFilterAll": "Alle Sprachen", - "saturatedFat": "Gesättigte Fette", - "valueTooMany": "zu viele", - "logThisMealItem": "Diese Zutat unverändert in das Ernährungstagebuch eintragen", - "onlyLoggingHelpText": "Nur Kalorien verfolgen. Markiere das Kästchen, wenn du nur deine Kalorien protokollieren möchtest und keinen detaillierten Ernährungsplan mit spezifischen Mahlzeiten einrichten willst", - "goalFiber": "Ballaststoffziel", - "logThisMeal": "Dieses Gericht unverändert in das Ernährungstagebuch eintragen", - "filterVegan": "Vegan", - "filterVegetarian": "Vegetarisch", - "filterNutriscore": "Nährwertfilter", - "filterNutriscoreOff": "Aus", - "filterNutriscoreNoFilter": "Kein Filter", - "filterNutriscoreOrBetter": "{{grade}} oder besser" - }, - "downloadAsPdf": "Download als PDF", - "total": "Gesamt", - "licenses": { - "authors": "Autor(en)", - "derivativeSourceUrl": "Link zur Originalquelle, falls es sich um die Abwandlung eines anderen Werkes handelt", - "originalObjectUrl": "Link zur Quell-Website, falls verfügbar", - "originalTitle": "Titel", - "authorProfile": "Link zur Website oder Profil des Autors, falls verfügbar", - "derivativeSourceUrlHelper": "Beachte, dass ein abgeleitetes Werk nicht nur auf einem vorherigen Werk basiert, sondern auch genügend neue, kreative Inhalte enthält, um ein eigenes Urheberrecht zu beanspruchen." - }, - "filters": "Filter", - "calendar": "Kalender", - "entries": "Einträge", - "no_entries_for_day": "Keine Einträge für diesen Tag", - "height": "Größe", - "cm": "cm", - "all": "Alle", - "lastYear": "Letztes Jahr", - "lastHalfYear": "In den letzten 6 Monaten", - "lastMonth": "Letzten Monat", - "lastWeek": "Letzte Woche", - "bmi": { - "overweight": "Übergewicht", - "obese": "Fettleibig", - "normal": "Normales Gewicht", - "calculator": "BMI Rechner", - "underweight": "Untergewicht", - "result": "Dein BMI ist {{value}}" - }, - "editName": "{{name}} bearbeiten", - "start": "Start", - "end": "Ende", - "comment": "Kommentar", - "min": "Min", - "max": "Max", - "durationWeeks": "{{number}} Wochen", - "durationWeeksDays": "{{nrWeeks}} Wochen, {{nrDays}} Tage", - "undo": "Rückgängig machen", - "successfullyDeleted": "Erfolgreich gelöscht", - "private": "Privat", - "public": "Öffentlich", - "dashboard": { - "customizeDashboard": "Dashboard anpassen", - "dragWidgetsHelp": "Ziehen Sie Widgets, um sie neu zu positionieren, oder ändern Sie ihre Größe über die rechte untere Ecke.", - "resetLayout": "Auf Standardlayout zurücksetzen" - }, - "core": { - "exitEditMode": "Bearbeitungsmodus verlassen", - "customize": "Anpassen" - }, - "preview": "Vorschau", - "useMarkdownHint": "Sie können simples Markdown verwenden, um den Text zu formatieren: *kursiv*, **fett**, - Liste", - "trophies": { - "trophies": "Trophäen" - }, - "totalChange": "Alle Änderungen", - "currentTrend": "Aktueller Trend", - "mean": "Mittelwert", - "trend": "Trend", - "variance": "Varianz" + "totalChange": "Alle Änderungen", + "currentTrend": "Aktueller Trend", + "mean": "Mittelwert", + "trend": "Trend", + "variance": "Varianz" } diff --git a/public/locales/el/translation.json b/public/locales/el/translation.json index fa18e6bef..fc7e2ec84 100644 --- a/public/locales/el/translation.json +++ b/public/locales/el/translation.json @@ -1,97 +1,97 @@ { - "exercises": { - "secondaryMuscles": "Δευτερεύοντες μύες", - "muscles": "Μύες", - "contributeExercise": "Συνεισφέρετε μια άσκηση", - "notEnoughRights": "Μπορείτε να συνεισφέρετε ασκήσεις μόνο εάν ο λογαριασμός σας είναι παλαιότερος από {{days}} ημέρες και έχετε επαληθεύσει το ηλεκτρονικό σας ταχυδρομείο", - "variations": "Παραλλαγές", - "notEnoughRightsHeader": "Δεν μπορείτε να συνεισφέρετε ασκήσεις", - "newNote": "Νέα σημείωση", - "identicalExercise": "Αποφύγετε διπλές ασκήσεις", - "identicalExercisePleaseDiscard": "Αν παρατηρήσετε μια άσκηση που είναι πανομοιότυπη με αυτή που προσθέτετε, παρακαλούμε απορρίψτε το προσχέδιό σας και επεξεργαστείτε αυτή την άσκηση.", - "missingExerciseDescription": "Βοηθήστε την κοινότητα με τη συνεισφορά σας!", - "equipment": "Εξοπλισμός", - "exercises": "Ασκήσεις", - "alsoKnownAs": "Επίσης γνωστό ως:", - "primaryMuscles": "Πρωτεύοντες μύες", - "successfullyUpdated": "Η άσκηση ενημερώθηκε επιτυχώς. Λόγω της προσωρινής αποθήκευσης μπορεί να χρειαστεί κάποιος χρόνος μέχρι οι αλλαγές να είναι ορατές σε όλη την εφαρμογή.", - "noEquipment": "Χωρίς εξοπλισμό", - "translateExerciseNow": "Μεταφράστε αυτή την άσκηση τώρα", - "notesHelpText": "Οι σημειώσεις είναι σύντομα σχόλια για τον τρόπο εκτέλεσης της άσκησης, όπως \"κρατήστε το σώμα σας ίσιο\"", + "exercises": { + "secondaryMuscles": "Δευτερεύοντες μύες", + "muscles": "Μύες", + "contributeExercise": "Συνεισφέρετε μια άσκηση", + "notEnoughRights": "Μπορείτε να συνεισφέρετε ασκήσεις μόνο εάν ο λογαριασμός σας είναι παλαιότερος από {{days}} ημέρες και έχετε επαληθεύσει το ηλεκτρονικό σας ταχυδρομείο", + "variations": "Παραλλαγές", + "notEnoughRightsHeader": "Δεν μπορείτε να συνεισφέρετε ασκήσεις", + "newNote": "Νέα σημείωση", + "identicalExercise": "Αποφύγετε διπλές ασκήσεις", + "identicalExercisePleaseDiscard": "Αν παρατηρήσετε μια άσκηση που είναι πανομοιότυπη με αυτή που προσθέτετε, παρακαλούμε απορρίψτε το προσχέδιό σας και επεξεργαστείτε αυτή την άσκηση.", + "missingExerciseDescription": "Βοηθήστε την κοινότητα με τη συνεισφορά σας!", + "equipment": "Εξοπλισμός", + "exercises": "Ασκήσεις", + "alsoKnownAs": "Επίσης γνωστό ως:", + "primaryMuscles": "Πρωτεύοντες μύες", + "successfullyUpdated": "Η άσκηση ενημερώθηκε επιτυχώς. Λόγω της προσωρινής αποθήκευσης μπορεί να χρειαστεί κάποιος χρόνος μέχρι οι αλλαγές να είναι ορατές σε όλη την εφαρμογή.", + "noEquipment": "Χωρίς εξοπλισμό", + "translateExerciseNow": "Μεταφράστε αυτή την άσκηση τώρα", + "notesHelpText": "Οι σημειώσεις είναι σύντομα σχόλια για τον τρόπο εκτέλεσης της άσκησης, όπως \"κρατήστε το σώμα σας ίσιο\"", + "notes": "Σημειώσεις", + "basics": "Βασικά στοιχεία", + "whatVariationsExist": "Ποιες παραλλαγές αυτής της άσκησης υπάρχουν, αν υπάρχουν;", + "submitExercise": "Υποβολή άσκησης", + "changeExerciseLanguage": "Αλλάξτε τη γλώσσα αυτής της άσκησης", + "exerciseNotTranslated": "Δεν υπάρχει διαθέσιμη μετάφραση", + "compatibleImagesCC": "Οι εικόνες πρέπει να είναι συμβατές με την άδεια CC BY SA. Αν έχετε αμφιβολίες, ανεβάζετε μόνο φωτογραφίες που έχετε τραβήξει μόνοι σας.", + "step1HeaderBasics": "Βασικά στα αγγλικά", + "exerciseNotTranslatedBody": "Αυτή η άσκηση δεν είναι προς το παρόν διαθέσιμη στην τρέχουσα επιλεγμένη γλώσσα. Θέλετε να συνεισφέρετε μια μετάφραση;", + "cacheWarning": "Λόγω της προσωρινής αποθήκευσης μπορεί να χρειαστεί κάποιος χρόνος μέχρι οι αλλαγές να είναι ορατές σε όλη την εφαρμογή.", + "deleteTranslation": "Διαγραφή μετάφρασης", + "checkInformationBeforeSubmitting": "Βεβαιωθείτε ότι οι πληροφορίες που καταχωρήσατε είναι σωστές πριν υποβάλετε την άσκηση", + "searchExerciseName": "Αναζήτηση με το όνομα της άσκησης", + "description": "Περιγραφή", + "deleteExerciseBody": "Θέλετε να διαγράψετε την άσκηση \"{{όνομα}}\"; Μπορείτε να διαγράψετε είτε την τρέχουσα μετάφραση {{γλώσσα}} είτε ολόκληρη την άσκηση με όλες τις μεταφράσεις, τις εικόνες, κ.λπ.", + "missingExercise": "Σας λείπει μια συγκεκριμένη άσκηση;", + "deleteExerciseFull": "Διαγραφή πλήρους άσκησης", + "alternativeNames": "Εναλλακτικές ονομασίες", + "filterVariations": "Εισάγετε το όνομα της άσκησης για να φιλτράρετε τις παραλλαγές" + }, + "nutritionalPlan": "Διατροφικό σχέδιο", + "date": "Ημερομηνία", + "days": "Ημέρες", + "edit": "Επεξεργασία", + "submit": "Υποβολλή", + "value": "Αξία", + "delete": "Διαγραφή", + "deleteConfirmation": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το \"{{name}}\";", "notes": "Σημειώσεις", - "basics": "Βασικά στοιχεία", - "whatVariationsExist": "Ποιες παραλλαγές αυτής της άσκησης υπάρχουν, αν υπάρχουν;", - "submitExercise": "Υποβολή άσκησης", - "changeExerciseLanguage": "Αλλάξτε τη γλώσσα αυτής της άσκησης", - "exerciseNotTranslated": "Δεν υπάρχει διαθέσιμη μετάφραση", - "compatibleImagesCC": "Οι εικόνες πρέπει να είναι συμβατές με την άδεια CC BY SA. Αν έχετε αμφιβολίες, ανεβάζετε μόνο φωτογραφίες που έχετε τραβήξει μόνοι σας.", - "step1HeaderBasics": "Βασικά στα αγγλικά", - "exerciseNotTranslatedBody": "Αυτή η άσκηση δεν είναι προς το παρόν διαθέσιμη στην τρέχουσα επιλεγμένη γλώσσα. Θέλετε να συνεισφέρετε μια μετάφραση;", - "cacheWarning": "Λόγω της προσωρινής αποθήκευσης μπορεί να χρειαστεί κάποιος χρόνος μέχρι οι αλλαγές να είναι ορατές σε όλη την εφαρμογή.", - "deleteTranslation": "Διαγραφή μετάφρασης", - "checkInformationBeforeSubmitting": "Βεβαιωθείτε ότι οι πληροφορίες που καταχωρήσατε είναι σωστές πριν υποβάλετε την άσκηση", - "searchExerciseName": "Αναζήτηση με το όνομα της άσκησης", + "difference": "Διαφορά", + "seeDetails": "Δείτε λεπτομέρειες", + "server": { + "none__bodyweight_exercise_": "κανένα (άσκηση με σωματικό βάρος)" + }, + "currentWeight": "Τρέχον βάρος", + "workout": "Προπόνηση", + "addEntry": "Προσθήκη καταχώρησης", + "actions": "Ενέργειες", + "unit": "Μονάδα", + "loading": "Φόρτωση…", + "weight": "Βάρος", + "add": "Προσθήκη", + "routines": { + "logsHeader": "Ημερολόγιο βάρους για προπόνηση", + "addDay": "Προσθέστε ημέρα προπόνησης", + "addWeightLog": "Προσθέστε ημερολόγιο βάρους", + "logsFilterNote": "Σημειώστε ότι καταγράφονται μόνο καταχωρήσεις με μονάδα βάρους kg ή lb και επαναλήψεις, άλλοι συνδυασμοί όπως χρόνος ή μέχρι την αποτυχία αγνοούνται εδώ" + }, + "images": "Εικόνες", + "save": "Αποθήκευση", + "forms": { + "valueTooLong": "Η τιμή είναι πολύ μεγάλη", + "minValue": "Η τιμή για αυτό το πεδίο πρέπει να είναι μεγαλύτερη από {{value}}", + "minLength": "Παρακαλώ εισάγετε περισσότερους από {{chars}} χαρακτήρες", + "valueTooShort": "Η τιμή είναι πολύ μικρή", + "supportedImageFormats": "Υποστηρίζονται μόνο αρχεία JPEG, PNG, WEBP και AVIF κάτω των 20Mb", + "maxLength": "Παρακαλώ εισάγετε λιγότερους από {{chars}} χαρακτήρες", + "maxValue": "Η τιμή για αυτό το πεδίο πρέπει να είναι μικρότερη από {{value}}", + "fieldRequired": "Το πεδίο αυτό είναι υποχρεωτικό" + }, + "videos": "Βίντεο", + "English": "Αγγλικά", + "success": "Επιτυχία!", "description": "Περιγραφή", - "deleteExerciseBody": "Θέλετε να διαγράψετε την άσκηση \"{{όνομα}}\"; Μπορείτε να διαγράψετε είτε την τρέχουσα μετάφραση {{γλώσσα}} είτε ολόκληρη την άσκηση με όλες τις μεταφράσεις, τις εικόνες, κ.λπ.", - "missingExercise": "Σας λείπει μια συγκεκριμένη άσκηση;", - "deleteExerciseFull": "Διαγραφή πλήρους άσκησης", - "alternativeNames": "Εναλλακτικές ονομασίες", - "filterVariations": "Εισάγετε το όνομα της άσκησης για να φιλτράρετε τις παραλλαγές" - }, - "nutritionalPlan": "Διατροφικό σχέδιο", - "date": "Ημερομηνία", - "days": "Ημέρες", - "edit": "Επεξεργασία", - "submit": "Υποβολλή", - "value": "Αξία", - "delete": "Διαγραφή", - "deleteConfirmation": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το \"{{name}}\";", - "notes": "Σημειώσεις", - "difference": "Διαφορά", - "seeDetails": "Δείτε λεπτομέρειες", - "server": { - "none__bodyweight_exercise_": "κανένα (άσκηση με σωματικό βάρος)" - }, - "currentWeight": "Τρέχον βάρος", - "workout": "Προπόνηση", - "addEntry": "Προσθήκη καταχώρησης", - "actions": "Ενέργειες", - "unit": "Μονάδα", - "loading": "Φόρτωση…", - "weight": "Βάρος", - "add": "Προσθήκη", - "routines": { - "logsHeader": "Ημερολόγιο βάρους για προπόνηση", - "addDay": "Προσθέστε ημέρα προπόνησης", - "addWeightLog": "Προσθέστε ημερολόγιο βάρους", - "logsFilterNote": "Σημειώστε ότι καταγράφονται μόνο καταχωρήσεις με μονάδα βάρους kg ή lb και επαναλήψεις, άλλοι συνδυασμοί όπως χρόνος ή μέχρι την αποτυχία αγνοούνται εδώ" - }, - "images": "Εικόνες", - "save": "Αποθήκευση", - "forms": { - "valueTooLong": "Η τιμή είναι πολύ μεγάλη", - "minValue": "Η τιμή για αυτό το πεδίο πρέπει να είναι μεγαλύτερη από {{value}}", - "minLength": "Παρακαλώ εισάγετε περισσότερους από {{chars}} χαρακτήρες", - "valueTooShort": "Η τιμή είναι πολύ μικρή", - "supportedImageFormats": "Υποστηρίζονται μόνο αρχεία JPEG, PNG, WEBP και AVIF κάτω των 20Mb", - "maxLength": "Παρακαλώ εισάγετε λιγότερους από {{chars}} χαρακτήρες", - "maxValue": "Η τιμή για αυτό το πεδίο πρέπει να είναι μικρότερη από {{value}}", - "fieldRequired": "Το πεδίο αυτό είναι υποχρεωτικό" - }, - "videos": "Βίντεο", - "English": "Αγγλικά", - "success": "Επιτυχία!", - "description": "Περιγραφή", - "name": "Όνομα", - "preferences": "Προτιμήσεις", - "continue": "Συνεχίστε", - "noResults": "Δεν υπάρχουν αποτελέσματα", - "goBack": "Πίσω", - "translation": "Μετάφραση", - "cancel": "Ακύρωση", - "language": "Γλώσσα", - "noResultsDescription": "Δεν βρέθηκαν αποτελέσματα για αυτό το ερώτημα, σκεφτείτε να μειώσετε τον αριθμό των φίλτρων.", - "overview": "Επισκόπηση", - "category": "Κατηγορία", - "cannotBeUndone": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί." + "name": "Όνομα", + "preferences": "Προτιμήσεις", + "continue": "Συνεχίστε", + "noResults": "Δεν υπάρχουν αποτελέσματα", + "goBack": "Πίσω", + "translation": "Μετάφραση", + "cancel": "Ακύρωση", + "language": "Γλώσσα", + "noResultsDescription": "Δεν βρέθηκαν αποτελέσματα για αυτό το ερώτημα, σκεφτείτε να μειώσετε τον αριθμό των φίλτρων.", + "overview": "Επισκόπηση", + "category": "Κατηγορία", + "cannotBeUndone": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί." } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 6ea03edb0..41c4bee91 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,372 +1,372 @@ { - "add": "Añadir", - "addEntry": "Añadir entrada", - "close": "Cerrar", - "currentWeight": "Peso actual", - "date": "Fecha", - "days": "Días", - "delete": "Borrar", - "difference": "Diferencia", - "edit": "Editar", - "nutritionalPlan": "Plan nutricional", - "submit": "Enviar", - "weight": "Peso", - "workout": "Entrenamiento", - "exercises": { - "secondaryMuscles": "Músculos secundarios", - "contributeExercise": "Aporta un ejercicio", - "variations": "Variaciones", - "whatVariationsExist": "¿Qué variaciones de este ejercicio existen, si las hay?", - "translateExerciseNow": "Traducir este ejercicio ahora", - "compatibleImagesCC": "Las imágenes deben ser compatibles con la licencia CC BY SA. En caso de duda, cargue solo fotos que haya tomado usted mismo.", - "filterVariations": "Introduce el nombre del ejercicio para filtrar variaciones", - "muscles": "Músculos", - "identicalExercisePleaseDiscard": "Si observa un ejercicio que es idéntico al que está agregando, descarte su borrador y edite ese ejercicio en su lugar.", - "basics": "Básicos", - "missingExerciseDescription": "¡Ayuda a la comunidad aportándolo!", - "searchExerciseName": "Buscar por nombre de ejercicio", - "newNote": "Nueva nota", - "notesHelpText": "Las notas son comentarios breves sobre cómo realizar el ejercicio, como \"mantener el cuerpo recto\"", - "notes": "Notas", - "notEnoughRightsHeader": "No puedes aportar ejercicios", - "equipment": "Equipamiento", - "submitExercise": "Enviar ejercicio", - "step1HeaderBasics": "Conceptos básicos en inglés", - "alsoKnownAs": "También conocido como:", - "exerciseNotTranslatedBody": "Este ejercicio no está disponible actualmente en el idioma seleccionado. ¿Quieres contribuir con una traducción?", - "primaryMuscles": "Músculos primarios", - "exercises": "Ejercicios", - "noEquipment": "Sin equipamiento", - "notEnoughRights": "Solo puede aportar ejercicios si su cuenta tiene más de {{days}} días y ha verificado su correo electrónico", - "alternativeNames": "Nombres alternativos", - "checkInformationBeforeSubmitting": "Verifique que la información que ingresó sea correcta antes de enviar el ejercicio", - "successfullyUpdated": "El ejercicio se actualizó con éxito. Debido al almacenamiento en caché, puede llevar algún tiempo hasta que los cambios sean visibles en toda la aplicación.", + "add": "Añadir", + "addEntry": "Añadir entrada", + "close": "Cerrar", + "currentWeight": "Peso actual", + "date": "Fecha", + "days": "Días", + "delete": "Borrar", + "difference": "Diferencia", + "edit": "Editar", + "nutritionalPlan": "Plan nutricional", + "submit": "Enviar", + "weight": "Peso", + "workout": "Entrenamiento", + "exercises": { + "secondaryMuscles": "Músculos secundarios", + "contributeExercise": "Aporta un ejercicio", + "variations": "Variaciones", + "whatVariationsExist": "¿Qué variaciones de este ejercicio existen, si las hay?", + "translateExerciseNow": "Traducir este ejercicio ahora", + "compatibleImagesCC": "Las imágenes deben ser compatibles con la licencia CC BY SA. En caso de duda, cargue solo fotos que haya tomado usted mismo.", + "filterVariations": "Introduce el nombre del ejercicio para filtrar variaciones", + "muscles": "Músculos", + "identicalExercisePleaseDiscard": "Si observa un ejercicio que es idéntico al que está agregando, descarte su borrador y edite ese ejercicio en su lugar.", + "basics": "Básicos", + "missingExerciseDescription": "¡Ayuda a la comunidad aportándolo!", + "searchExerciseName": "Buscar por nombre de ejercicio", + "newNote": "Nueva nota", + "notesHelpText": "Las notas son comentarios breves sobre cómo realizar el ejercicio, como \"mantener el cuerpo recto\"", + "notes": "Notas", + "notEnoughRightsHeader": "No puedes aportar ejercicios", + "equipment": "Equipamiento", + "submitExercise": "Enviar ejercicio", + "step1HeaderBasics": "Conceptos básicos en inglés", + "alsoKnownAs": "También conocido como:", + "exerciseNotTranslatedBody": "Este ejercicio no está disponible actualmente en el idioma seleccionado. ¿Quieres contribuir con una traducción?", + "primaryMuscles": "Músculos primarios", + "exercises": "Ejercicios", + "noEquipment": "Sin equipamiento", + "notEnoughRights": "Solo puede aportar ejercicios si su cuenta tiene más de {{days}} días y ha verificado su correo electrónico", + "alternativeNames": "Nombres alternativos", + "checkInformationBeforeSubmitting": "Verifique que la información que ingresó sea correcta antes de enviar el ejercicio", + "successfullyUpdated": "El ejercicio se actualizó con éxito. Debido al almacenamiento en caché, puede llevar algún tiempo hasta que los cambios sean visibles en toda la aplicación.", + "description": "Descripción", + "exerciseNotTranslated": "No hay traducción disponible", + "deleteExerciseBody": "¿Quieres eliminar el ejercicio \"{{name}}\"? Puede eliminar la traducción actual de {{language}} o el ejercicio completo con todas las traducciones, imágenes, etc.", + "deleteExerciseFull": "Eliminar ejercicio completo", + "deleteTranslation": "Eliminar traducción", + "changeExerciseLanguage": "Cambiar el idioma de este ejercicio", + "missingExercise": "¿Falta algún ejercicio?", + "identicalExercise": "Evitar los ejercicios duplicados", + "cacheWarning": "Debido al almacenamiento en caché, puede pasar algún tiempo hasta que los cambios sean visibles en toda la aplicación.", + "replacements": "Sustituciones", + "replacementsInfoText": "Opcionalmente, también puede seleccionar un ejercicio que debería sustituir a éste (por ejemplo, porque fue enviado dos veces, o similar). Esto sustituye el ejercicio en las rutinas así como en los registros de entrenamiento, en lugar de simplemente borrarlo. Estos cambios también se propagarán a cualquier instancia que sincronice los ejercicios.", + "deleteExerciseReplace": "Borrar y sustituir", + "replacementsSearch": "Busque un ejercicio o copie y pegue un ID conocido en el campo y pulse el botón \"cargar\".", + "noReplacementSelected": " Ningún ejercicio seleccionado para sustituir", + "imageStylePhoto": "Foto", + "imageStyle3D": "3D", + "imageStyleOther": "Otro", + "imageStyleLine": "Línea", + "imageDetails": "Detalles de la imagen", + "imageStyleLowPoly": "Bajo poligonaje (Low-Poly)", + "swapExercise": "Cambiar ejercicio", + "replacementCannotBeSame": "El reemplazo no puede ser el mismo ejercicio que se está eliminando.", + "transferMediaLabel": "Transferir archivos multimedia al ejercicio de reemplazo", + "exactMatch": "Coincidencia exacta" + }, + "loading": "Cargando...", + "images": "Imágenes", + "translation": "Traducción", "description": "Descripción", - "exerciseNotTranslated": "No hay traducción disponible", - "deleteExerciseBody": "¿Quieres eliminar el ejercicio \"{{name}}\"? Puede eliminar la traducción actual de {{language}} o el ejercicio completo con todas las traducciones, imágenes, etc.", - "deleteExerciseFull": "Eliminar ejercicio completo", - "deleteTranslation": "Eliminar traducción", - "changeExerciseLanguage": "Cambiar el idioma de este ejercicio", - "missingExercise": "¿Falta algún ejercicio?", - "identicalExercise": "Evitar los ejercicios duplicados", - "cacheWarning": "Debido al almacenamiento en caché, puede pasar algún tiempo hasta que los cambios sean visibles en toda la aplicación.", - "replacements": "Sustituciones", - "replacementsInfoText": "Opcionalmente, también puede seleccionar un ejercicio que debería sustituir a éste (por ejemplo, porque fue enviado dos veces, o similar). Esto sustituye el ejercicio en las rutinas así como en los registros de entrenamiento, en lugar de simplemente borrarlo. Estos cambios también se propagarán a cualquier instancia que sincronice los ejercicios.", - "deleteExerciseReplace": "Borrar y sustituir", - "replacementsSearch": "Busque un ejercicio o copie y pegue un ID conocido en el campo y pulse el botón \"cargar\".", - "noReplacementSelected": " Ningún ejercicio seleccionado para sustituir", - "imageStylePhoto": "Foto", - "imageStyle3D": "3D", - "imageStyleOther": "Otro", - "imageStyleLine": "Línea", - "imageDetails": "Detalles de la imagen", - "imageStyleLowPoly": "Bajo poligonaje (Low-Poly)", - "swapExercise": "Cambiar ejercicio", - "replacementCannotBeSame": "El reemplazo no puede ser el mismo ejercicio que se está eliminando.", - "transferMediaLabel": "Transferir archivos multimedia al ejercicio de reemplazo", - "exactMatch": "Coincidencia exacta" - }, - "loading": "Cargando...", - "images": "Imágenes", - "translation": "Traducción", - "description": "Descripción", - "overview": "Descripción general", - "noResultsDescription": "No se encontraron resultados para esta consulta, considere reducir la cantidad de filtros.", - "server": { - "arms": "Brazos", - "back": "Espalda", - "calves": "Pantorrillas", - "pull_up_bar": "Barra de dominadas", - "sz_bar": "Barra SZ", - "swiss_ball": "Pelota suiza", - "biceps": "Bíceps", - "hamstrings": "Isquiotibiales", - "lower_back": "Espalda baja", - "glutes": "Glúteos", - "lats": "Laterales", - "barbell": "Barra con pesas", - "none__bodyweight_exercise_": "Ninguno (ejercicio de peso corporal)", - "quads": "Cuádriceps", - "triceps": "Tríceps", - "miles": "Millas", - "minutes": "Minutos", - "repetitions": "Repeticiones", - "seconds": "Segundos", - "until_failure": "Hasta que falle", - "abs": "Abdominales", - "chest": "Pecho", - "kettlebell": "Pesa rusa", - "legs": "Piernas", - "bench": "Banco", - "shoulders": "Hombros", - "kilometers": "Kilómetros", - "dumbbell": "Mancuerna", - "gym_mat": "Colchoneta", - "incline_bench": "Banco inclinado", - "cardio": "Cardio", - "max_reps": "Número máximo de repeticiones", - "kg": "kg", - "lb": "lb", - "miles_per_hour": "Millas por hora", - "plates": "Platos", - "body_weight": "Peso corporal", - "kilometers_per_hour": "Kilómetros por hora" - }, - "English": "Inglés", - "name": "Nombre", - "category": "Categoría", - "save": "Guardar", - "videos": "Videos", - "cannotBeUndone": "Esta acción no se puede deshacer.", - "continue": "Continuar", - "language": "Lenguaje", - "goBack": "Atrás", - "forms": { - "supportedImageFormats": "Solo se admiten archivos JPEG, PNG, WEBP y AVIF de menos de 20 Mb", - "valueTooShort": "El valor es demasiado corto", - "valueTooLong": "El valor es demasiado largo", - "fieldRequired": "Este campo es obligatorio", - "minValue": "El valor de este campo tiene que ser superior a {{value}}", - "minLength": "Por favor, introduce más de {{chars}} caracteres", - "maxLength": "Por favor, escribe menos de {{chars}} caracteres", - "maxValue": "El valor de este campo tiene que ser inferior a {{value}}", - "enterNumber": "Introduzca un número válido", - "enterInteger": "Introduzca un número entero", - "maxLessThanMin": "El valor máximo ha de ser superior al mínimo", - "endBeforeStart": "El final no puede ser anterior al inicio" - }, - "preferences": "Preferencias", - "cancel": "Cancelar", - "noResults": "Sin resultados", - "success": "¡Éxito!", - "routines": { - "rir": "Repeticiones", - "addDay": "Añadir un día de entrenamiento", - "addWeightLog": "Añadir un registro para el entrenamiento", - "addLogToDay": "Añadir un registro a este día", - "routine": "Rutina", - "logsHeader": "Registro de entrenamientos", - "logsFilterNote": "Ten en cuenta que sólo se registran las entradas con una unidad de peso de kg o lb y las repeticiones, aquí se ignoran otras combinaciones como el tiempo o hasta los errores", - "routines": "Rutinas", - "sets": "Conjuntos", - "reps": "Repet", - "volume": "Volumen", - "intensity": "Intensidad", - "currentRoutine": "Rutina actual", - "iteration": "Iteración", - "weekly": "Semanal", - "daily": "Diaria", - "restTime": "Descanso", - "workoutNr": "Sesión Num. {{number}}", - "weekNr": "Semana {{number}}", - "backToRoutine": "Vuelta a la rutina", - "minLengthRoutine": "La rutina debe ser de al menos {{number}} semanas", - "resultingRoutine": "Rutina resultante", - "routineHasNoDays": "La rutina no tiene días", - "setHasNoExercises": "El conjunto no tiene días", - "fitDaysInWeek": "Horario semanal fijo", - "needsLogsToAdvance": "Necesita registros para avanzar", - "needsLogsToAdvanceHelpText": "Si selecciona esta opción, la rutina solo progresará al próximo día programado si ha registrado un entrenamiento para el día actual. Si esta opción no está seleccionada, la rutina avanzará automáticamente al día siguiente, independientemente de si registró un entrenamiento o no.", - "addSuperset": "Añadir superset", - "addExercise": "Añadir ejercicio", - "exerciseNr": "Ejercicio {{number}}", - "supersetNr": "Superserie {{number}}", - "editProgression": "Editar progreso", - "progressionNeedsReplace": "Una de las entradas anteriores debe tener ser reemplazada", - "exerciseHasProgression": "Este ejercicio tiene reglas de progresión y no se puede editar aquí. Para hacerlo, haga clic en el botón.", - "defaultRounding": "Redondeo por defecto", - "rounding": "Redondeo (este ejercicio)", - "newDay": "Nuevo día", - "weightLogNotPlanned": "Guardar registros de peso a una fecha para la cual no se planificaron entrenamientos.", - "logsOverview": "Examinar registros", - "alsoShowLogs": "Mostrar también registros", - "simpleMode": "Modo sencillo", - "restDay": "Día de descanso", - "confirmRestDayHelpText": "Tenga en cuenta que todos los conjuntos y ejercicios se eliminarán cuando marque un día como día de descanso.", - "duplicate": "Duplicar rutina", - "confirmRestDay": "Confirmar cambio de día de descanso", - "downloadPdfTable": "Descargar PDF (tabla)", - "downloadPdfLogs": "Descargar PDF (registros)", - "downloadIcal": "Descargar fichero iCal", - "impressionNeutral": "Impresión neutra", - "impressionBad": "Mala impresión", - "impressionGood": "Buena impresión", - "impression": "Impresión", - "addAdditionalLog": "Añada registro adicional", - "step": "Paso", - "operation": "Operación", - "requirements": "Requisitos", - "markAsTemplate": "Hacer plantilla", - "publicTemplates": "Plantillas públicas", - "set": { - "dropSet": "Borrar conjunto", - "myo": "Técnica MYO", - "tut": "Trabajo bajo tensión", - "normalSet": "Conjunto normal", - "partial": "Parcial", - "forced": "Forzado", - "type": "Tipo", - "jump": "Salto", - "iso": "Aguante isométrico" + "overview": "Descripción general", + "noResultsDescription": "No se encontraron resultados para esta consulta, considere reducir la cantidad de filtros.", + "server": { + "arms": "Brazos", + "back": "Espalda", + "calves": "Pantorrillas", + "pull_up_bar": "Barra de dominadas", + "sz_bar": "Barra SZ", + "swiss_ball": "Pelota suiza", + "biceps": "Bíceps", + "hamstrings": "Isquiotibiales", + "lower_back": "Espalda baja", + "glutes": "Glúteos", + "lats": "Laterales", + "barbell": "Barra con pesas", + "none__bodyweight_exercise_": "Ninguno (ejercicio de peso corporal)", + "quads": "Cuádriceps", + "triceps": "Tríceps", + "miles": "Millas", + "minutes": "Minutos", + "repetitions": "Repeticiones", + "seconds": "Segundos", + "until_failure": "Hasta que falle", + "abs": "Abdominales", + "chest": "Pecho", + "kettlebell": "Pesa rusa", + "legs": "Piernas", + "bench": "Banco", + "shoulders": "Hombros", + "kilometers": "Kilómetros", + "dumbbell": "Mancuerna", + "gym_mat": "Colchoneta", + "incline_bench": "Banco inclinado", + "cardio": "Cardio", + "max_reps": "Número máximo de repeticiones", + "kg": "kg", + "lb": "lb", + "miles_per_hour": "Millas por hora", + "plates": "Platos", + "body_weight": "Peso corporal", + "kilometers_per_hour": "Kilómetros por hora" }, - "roundingHelp": "Establezca el redondeo predeterminado para obtener peso y repeticiones (esto es especialmente útil cuando se usan incrementos porcentuales en la progresión). Esto se aplicará a todos los conjuntos nuevos, pero se puede cambiar individualmente en el formulario de progresión. Deja vacío para deshabilitar el redondeo.", - "maxLengthRoutine": "La rutina debe tener como mucho {{number}} semanas", - "deleteDayConfirmation": "Esto eliminará todos los conjuntos, ejercicios y progresos del día", - "statsOverview": "Estadísticas", - "repeat": "Regla para repeticiones", - "fitDaysInWeekHelpText": "Esta configuración controla cómo se programan los días de su rutina en varias semanas. Si está habilitado, los días se repetirán en un ciclo semanal. Por ejemplo, una rutina con sesiones el lunes, miércoles y viernes continuará este patrón los lunes, miércoles y viernes siguientes. Si está deshabilitado, los días seguirán secuencialmente sin tener en cuenta el comienzo de una nueva semana. Esto es útil para rutinas que no siguen un horario semanal estricto.", - "impressionHelpText": "Este formulario registra los resultados de su entrenamiento (repeticiones, peso, etc.) para cada ejercicio. Los cambios que realice aquí, como eliminar o intercambiar ejercicios, solo afectan los registros específicos que guarde y no cambiarán su rutina general. Solo se guardan filas con valores para peso o repeticiones.", - "repeatHelpText": "Compruebe la casilla de verificación si desea que esta regla se siga aplicando a ejercicios posteriores hasta que defina una nueva", - "templatesHelpText": "Las plantillas son una manera de guardar su rutina para uso posterior y como punto de partida para futuras rutinas. No puedes editar plantillas, pero puedes duplicarlas y hacer cambios en la copia (así como convertirlas en una rutina regular, por supuesto).", - "workoutSession": "Sesión de entrenamiento", - "requirementsHelpText": "Seleccione los resultados de entrenamiento (de registros anteriores) que deben cumplirse para que esta regla surta efecto", - "template": "Plantilla", - "templates": "Plantillas", - "publicTemplate": "Plantilla pública", - "publicTemplateHelpText": "Las plantillas públicas están disponibles para todos los usuarios.", - "copyAndUseTemplate": "Copiar y usar plantilla", - "day": { - "custom": "Personalizado", - "enom": "Cada minuto, en el minuto", - "amrap": "Tantas rondas como sea posible", - "hiit": "Entrenamiento en intervalos de alta intensidad", - "tabata": "Entrenamiento Tabata", - "edt": "Entrenamiento de densidad creciente", - "rft": "Rondas por tiempo", - "afap": "Tan rápido como sea posible" - } - }, - "actions": "Acciones", - "value": "Valor", - "unit": "Unidad", - "notes": "Notas personales", - "seeDetails": "Ver los detalles", - "measurements": { - "measurements": "Mediciones", - "unitFormHelpText": "La unidad en la que se medirá la categoría, como cm o %", - "deleteInfo": "Esto eliminará la categoría así como todas sus entradas" - }, - "deleteConfirmation": "¿Estás seguro de que quieres borrar \"{{name}}\"?", - "nutrition": { - "percentEnergy": "Porcentaje de energía", - "fibres": "Fibra", - "saturatedFat": "Grasas saturadas", - "loggedToday": "Registrado hoy", - "goalsTitle": "Objetivos", - "addMealItem": "Añadir el ingrediente para la comida", - "sugar": "Azúcar", - "planned": "Planeado", - "mealDeleteInfo": "Las entradas del diario nutricional para esta comida no se borrarán y aparecerán en \"otros registros\"", - "goalEnergy": "Objetivo energético", - "logged": "Registrado", - "logThisMeal": "Registre esta comida en el diario nutricional", - "valueEnergyKcal": "{{value}} kcal", - "7dayAvg": "Promedio de los 7 días", - "ofWhichSugars": "de los cuales azúcares", - "ofWhichSaturated": "de las cuales saturadas", - "nutritionalDiary": "Diario nutricional", - "valueRemaining": "restante", - "plan": "Plan nutricional", - "valueTooMany": "demasiados", - "logThisMealItem": "Registre este ingrediente en el diario nutricional", - "kcal": "kcal", - "planDeleteInfo": "Esto borrará también todas las entradas del diario nutricional", - "copyPlan": "Haga una copia de este plan", - "plans": "Planes nutricionales", - "others": "Otros", - "useGoalsHelpTextLong": "Esto le permite establecer los objetivos generales de energía, proteínas, carbohidratos o grasas para el plan. Tenga en cuenta que si configura un plan de comidas detallado, estos valores tendrán prioridad.", - "difference": "Diferencia", - "protein": "Proteína", - "addNutritionalDiary": "Añadir una entrada al diario nutricional", - "today": "Hoy", - "onlyLoggingHelpText": "Registrar sólo las calorías. Marque la casilla si sólo desea registrar las calorías y no desea configurar un plan nutricional detallado con comidas específicas", - "fat": "Grasa", - "gPerBodyKg": "g por kg de peso", - "goalProtein": "Objetivo proteico", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "goalFat": "Objetivo de grasa", - "meal": "Menú", - "goalCarbohydrates": "Objetivo de carbohidratos", - "diaryEntrySaved": "Entrada para la agenda guardada correctamente", - "energy": "Energía", - "useGoalsHelpText": "Añadir objetivos a este plan", - "addMeal": "Añadir un menú", - "carbohydrates": "Carbohidratos", - "macronutrient": "Macronutriente", - "gramShort": "g", - "searchIngredientName": "Búsqueda por nombre de ingrediente", - "sodium": "Sodio", - "pseudoMealTitle": "Otros registros", - "goalFiber": "Objetivo de fibra", - "languageFilterCurrentOnly": "Solo en el idioma actual ({{lang}})", - "languageFilterCurrentAndEnglish": "Idioma actual ({{lang}}) e Inglés", - "languageFilterAll": "Todos los idiomas", - "filterVegan": "Vegana", - "filterVegetarian": "Vegetariana" - }, - "downloadAsPdf": "Descargar como un PDF", - "total": "Total", - "alsoSearchEnglish": "Buscar también los nombres en inglés", - "timeOfDay": "Hora del día", - "nothingHereYet": "Todavía no hay nada aquí...", - "nothingHereYetAction": "Pulse el botón de acción para empezar", - "copyToClipboard": "Copiar al portapapeles", - "licenses": { - "authors": "Autor(es)", - "derivativeSourceUrl": "Enlace a la fuente original, si se trata de una obra derivada", - "originalObjectUrl": "Enlace al sitio web de origen, si está disponible", - "originalTitle": "Título", - "derivativeSourceUrlHelper": "Tenga en cuenta que una obra derivada es aquella que no sólo se basa en una obra anterior, sino que además contiene suficiente contenido nuevo y creativo como para tener derecho a sus propios derechos de autor.", - "authorProfile": "Enlace al sitio web o perfil del autor, si está disponible" - }, - "filters": "Filtros", - "lastYear": "El año pasado", - "lastHalfYear": "Últimos 6 meses", - "lastMonth": "Último mes", - "all": "Todo", - "lastWeek": "Última semana", - "calendar": "Calendario", - "entries": "Entradas", - "no_entries_for_day": "No hay entradas para este día", - "height": "Altura", - "cm": "cm", - "bmi": { - "calculator": "Calculadora de IMC", - "overweight": "Sobrepeso", - "obese": "Obeso", - "normal": "En tu peso ideal", - "underweight": "Bajo peso", - "result": "Su IMC es {{value}}" - }, - "editName": "Editar {{name}}", - "start": "Comenzar", - "end": "Fin", - "comment": "Comentar", - "min": "Mínimo", - "max": "Máximo", - "durationWeeks": "{{number}} semanas", - "durationWeeksDays": "{{nrWeeks}} semanas, {{nrDays}} días", - "undo": "Deshacer", - "successfullyDeleted": "Borrado completado", - "public": "Público", - "private": "Privado", - "dashboard": { - "customizeDashboard": "Personalizar panel de control", - "dragWidgetsHelp": "Arrastra widgets para recolocarlos o cambia su tamaño con la esquina inferior derecha.", - "resetLayout": "Reestablecer a la disposición por defecto" - }, - "core": { - "exitEditMode": "Salir del modo edición", - "customize": "Personalizar" - }, - "trophies": { - "trophies": "Trofeos" - }, - "preview": "Vista previa", - "useMarkdownHint": "Puedes usar Markdown básico para dar formato al texto: *cursiva*, **negrita**, - lista", - "totalChange": "Cambio total", - "currentTrend": "Tendencia actual", - "mean": "Medio", - "trend": "Tendencia", - "variance": "Variación" + "English": "Inglés", + "name": "Nombre", + "category": "Categoría", + "save": "Guardar", + "videos": "Videos", + "cannotBeUndone": "Esta acción no se puede deshacer.", + "continue": "Continuar", + "language": "Lenguaje", + "goBack": "Atrás", + "forms": { + "supportedImageFormats": "Solo se admiten archivos JPEG, PNG, WEBP y AVIF de menos de 20 Mb", + "valueTooShort": "El valor es demasiado corto", + "valueTooLong": "El valor es demasiado largo", + "fieldRequired": "Este campo es obligatorio", + "minValue": "El valor de este campo tiene que ser superior a {{value}}", + "minLength": "Por favor, introduce más de {{chars}} caracteres", + "maxLength": "Por favor, escribe menos de {{chars}} caracteres", + "maxValue": "El valor de este campo tiene que ser inferior a {{value}}", + "enterNumber": "Introduzca un número válido", + "enterInteger": "Introduzca un número entero", + "maxLessThanMin": "El valor máximo ha de ser superior al mínimo", + "endBeforeStart": "El final no puede ser anterior al inicio" + }, + "preferences": "Preferencias", + "cancel": "Cancelar", + "noResults": "Sin resultados", + "success": "¡Éxito!", + "routines": { + "rir": "Repeticiones", + "addDay": "Añadir un día de entrenamiento", + "addWeightLog": "Añadir un registro para el entrenamiento", + "addLogToDay": "Añadir un registro a este día", + "routine": "Rutina", + "logsHeader": "Registro de entrenamientos", + "logsFilterNote": "Ten en cuenta que sólo se registran las entradas con una unidad de peso de kg o lb y las repeticiones, aquí se ignoran otras combinaciones como el tiempo o hasta los errores", + "routines": "Rutinas", + "sets": "Conjuntos", + "reps": "Repet", + "volume": "Volumen", + "intensity": "Intensidad", + "currentRoutine": "Rutina actual", + "iteration": "Iteración", + "weekly": "Semanal", + "daily": "Diaria", + "restTime": "Descanso", + "workoutNr": "Sesión Num. {{number}}", + "weekNr": "Semana {{number}}", + "backToRoutine": "Vuelta a la rutina", + "minLengthRoutine": "La rutina debe ser de al menos {{number}} semanas", + "resultingRoutine": "Rutina resultante", + "routineHasNoDays": "La rutina no tiene días", + "setHasNoExercises": "El conjunto no tiene días", + "fitDaysInWeek": "Horario semanal fijo", + "needsLogsToAdvance": "Necesita registros para avanzar", + "needsLogsToAdvanceHelpText": "Si selecciona esta opción, la rutina solo progresará al próximo día programado si ha registrado un entrenamiento para el día actual. Si esta opción no está seleccionada, la rutina avanzará automáticamente al día siguiente, independientemente de si registró un entrenamiento o no.", + "addSuperset": "Añadir superset", + "addExercise": "Añadir ejercicio", + "exerciseNr": "Ejercicio {{number}}", + "supersetNr": "Superserie {{number}}", + "editProgression": "Editar progreso", + "progressionNeedsReplace": "Una de las entradas anteriores debe tener ser reemplazada", + "exerciseHasProgression": "Este ejercicio tiene reglas de progresión y no se puede editar aquí. Para hacerlo, haga clic en el botón.", + "defaultRounding": "Redondeo por defecto", + "rounding": "Redondeo (este ejercicio)", + "newDay": "Nuevo día", + "weightLogNotPlanned": "Guardar registros de peso a una fecha para la cual no se planificaron entrenamientos.", + "logsOverview": "Examinar registros", + "alsoShowLogs": "Mostrar también registros", + "simpleMode": "Modo sencillo", + "restDay": "Día de descanso", + "confirmRestDayHelpText": "Tenga en cuenta que todos los conjuntos y ejercicios se eliminarán cuando marque un día como día de descanso.", + "duplicate": "Duplicar rutina", + "confirmRestDay": "Confirmar cambio de día de descanso", + "downloadPdfTable": "Descargar PDF (tabla)", + "downloadPdfLogs": "Descargar PDF (registros)", + "downloadIcal": "Descargar fichero iCal", + "impressionNeutral": "Impresión neutra", + "impressionBad": "Mala impresión", + "impressionGood": "Buena impresión", + "impression": "Impresión", + "addAdditionalLog": "Añada registro adicional", + "step": "Paso", + "operation": "Operación", + "requirements": "Requisitos", + "markAsTemplate": "Hacer plantilla", + "publicTemplates": "Plantillas públicas", + "set": { + "dropSet": "Borrar conjunto", + "myo": "Técnica MYO", + "tut": "Trabajo bajo tensión", + "normalSet": "Conjunto normal", + "partial": "Parcial", + "forced": "Forzado", + "type": "Tipo", + "jump": "Salto", + "iso": "Aguante isométrico" + }, + "roundingHelp": "Establezca el redondeo predeterminado para obtener peso y repeticiones (esto es especialmente útil cuando se usan incrementos porcentuales en la progresión). Esto se aplicará a todos los conjuntos nuevos, pero se puede cambiar individualmente en el formulario de progresión. Deja vacío para deshabilitar el redondeo.", + "maxLengthRoutine": "La rutina debe tener como mucho {{number}} semanas", + "deleteDayConfirmation": "Esto eliminará todos los conjuntos, ejercicios y progresos del día", + "statsOverview": "Estadísticas", + "repeat": "Regla para repeticiones", + "fitDaysInWeekHelpText": "Esta configuración controla cómo se programan los días de su rutina en varias semanas. Si está habilitado, los días se repetirán en un ciclo semanal. Por ejemplo, una rutina con sesiones el lunes, miércoles y viernes continuará este patrón los lunes, miércoles y viernes siguientes. Si está deshabilitado, los días seguirán secuencialmente sin tener en cuenta el comienzo de una nueva semana. Esto es útil para rutinas que no siguen un horario semanal estricto.", + "impressionHelpText": "Este formulario registra los resultados de su entrenamiento (repeticiones, peso, etc.) para cada ejercicio. Los cambios que realice aquí, como eliminar o intercambiar ejercicios, solo afectan los registros específicos que guarde y no cambiarán su rutina general. Solo se guardan filas con valores para peso o repeticiones.", + "repeatHelpText": "Compruebe la casilla de verificación si desea que esta regla se siga aplicando a ejercicios posteriores hasta que defina una nueva", + "templatesHelpText": "Las plantillas son una manera de guardar su rutina para uso posterior y como punto de partida para futuras rutinas. No puedes editar plantillas, pero puedes duplicarlas y hacer cambios en la copia (así como convertirlas en una rutina regular, por supuesto).", + "workoutSession": "Sesión de entrenamiento", + "requirementsHelpText": "Seleccione los resultados de entrenamiento (de registros anteriores) que deben cumplirse para que esta regla surta efecto", + "template": "Plantilla", + "templates": "Plantillas", + "publicTemplate": "Plantilla pública", + "publicTemplateHelpText": "Las plantillas públicas están disponibles para todos los usuarios.", + "copyAndUseTemplate": "Copiar y usar plantilla", + "day": { + "custom": "Personalizado", + "enom": "Cada minuto, en el minuto", + "amrap": "Tantas rondas como sea posible", + "hiit": "Entrenamiento en intervalos de alta intensidad", + "tabata": "Entrenamiento Tabata", + "edt": "Entrenamiento de densidad creciente", + "rft": "Rondas por tiempo", + "afap": "Tan rápido como sea posible" + } + }, + "actions": "Acciones", + "value": "Valor", + "unit": "Unidad", + "notes": "Notas personales", + "seeDetails": "Ver los detalles", + "measurements": { + "measurements": "Mediciones", + "unitFormHelpText": "La unidad en la que se medirá la categoría, como cm o %", + "deleteInfo": "Esto eliminará la categoría así como todas sus entradas" + }, + "deleteConfirmation": "¿Estás seguro de que quieres borrar \"{{name}}\"?", + "nutrition": { + "percentEnergy": "Porcentaje de energía", + "fibres": "Fibra", + "saturatedFat": "Grasas saturadas", + "loggedToday": "Registrado hoy", + "goalsTitle": "Objetivos", + "addMealItem": "Añadir el ingrediente para la comida", + "sugar": "Azúcar", + "planned": "Planeado", + "mealDeleteInfo": "Las entradas del diario nutricional para esta comida no se borrarán y aparecerán en \"otros registros\"", + "goalEnergy": "Objetivo energético", + "logged": "Registrado", + "logThisMeal": "Registre esta comida en el diario nutricional", + "valueEnergyKcal": "{{value}} kcal", + "7dayAvg": "Promedio de los 7 días", + "ofWhichSugars": "de los cuales azúcares", + "ofWhichSaturated": "de las cuales saturadas", + "nutritionalDiary": "Diario nutricional", + "valueRemaining": "restante", + "plan": "Plan nutricional", + "valueTooMany": "demasiados", + "logThisMealItem": "Registre este ingrediente en el diario nutricional", + "kcal": "kcal", + "planDeleteInfo": "Esto borrará también todas las entradas del diario nutricional", + "copyPlan": "Haga una copia de este plan", + "plans": "Planes nutricionales", + "others": "Otros", + "useGoalsHelpTextLong": "Esto le permite establecer los objetivos generales de energía, proteínas, carbohidratos o grasas para el plan. Tenga en cuenta que si configura un plan de comidas detallado, estos valores tendrán prioridad.", + "difference": "Diferencia", + "protein": "Proteína", + "addNutritionalDiary": "Añadir una entrada al diario nutricional", + "today": "Hoy", + "onlyLoggingHelpText": "Registrar sólo las calorías. Marque la casilla si sólo desea registrar las calorías y no desea configurar un plan nutricional detallado con comidas específicas", + "fat": "Grasa", + "gPerBodyKg": "g por kg de peso", + "goalProtein": "Objetivo proteico", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "goalFat": "Objetivo de grasa", + "meal": "Menú", + "goalCarbohydrates": "Objetivo de carbohidratos", + "diaryEntrySaved": "Entrada para la agenda guardada correctamente", + "energy": "Energía", + "useGoalsHelpText": "Añadir objetivos a este plan", + "addMeal": "Añadir un menú", + "carbohydrates": "Carbohidratos", + "macronutrient": "Macronutriente", + "gramShort": "g", + "searchIngredientName": "Búsqueda por nombre de ingrediente", + "sodium": "Sodio", + "pseudoMealTitle": "Otros registros", + "goalFiber": "Objetivo de fibra", + "languageFilterCurrentOnly": "Solo en el idioma actual ({{lang}})", + "languageFilterCurrentAndEnglish": "Idioma actual ({{lang}}) e Inglés", + "languageFilterAll": "Todos los idiomas", + "filterVegan": "Vegana", + "filterVegetarian": "Vegetariana" + }, + "downloadAsPdf": "Descargar como un PDF", + "total": "Total", + "alsoSearchEnglish": "Buscar también los nombres en inglés", + "timeOfDay": "Hora del día", + "nothingHereYet": "Todavía no hay nada aquí...", + "nothingHereYetAction": "Pulse el botón de acción para empezar", + "copyToClipboard": "Copiar al portapapeles", + "licenses": { + "authors": "Autor(es)", + "derivativeSourceUrl": "Enlace a la fuente original, si se trata de una obra derivada", + "originalObjectUrl": "Enlace al sitio web de origen, si está disponible", + "originalTitle": "Título", + "derivativeSourceUrlHelper": "Tenga en cuenta que una obra derivada es aquella que no sólo se basa en una obra anterior, sino que además contiene suficiente contenido nuevo y creativo como para tener derecho a sus propios derechos de autor.", + "authorProfile": "Enlace al sitio web o perfil del autor, si está disponible" + }, + "filters": "Filtros", + "lastYear": "El año pasado", + "lastHalfYear": "Últimos 6 meses", + "lastMonth": "Último mes", + "all": "Todo", + "lastWeek": "Última semana", + "calendar": "Calendario", + "entries": "Entradas", + "no_entries_for_day": "No hay entradas para este día", + "height": "Altura", + "cm": "cm", + "bmi": { + "calculator": "Calculadora de IMC", + "overweight": "Sobrepeso", + "obese": "Obeso", + "normal": "En tu peso ideal", + "underweight": "Bajo peso", + "result": "Su IMC es {{value}}" + }, + "editName": "Editar {{name}}", + "start": "Comenzar", + "end": "Fin", + "comment": "Comentar", + "min": "Mínimo", + "max": "Máximo", + "durationWeeks": "{{number}} semanas", + "durationWeeksDays": "{{nrWeeks}} semanas, {{nrDays}} días", + "undo": "Deshacer", + "successfullyDeleted": "Borrado completado", + "public": "Público", + "private": "Privado", + "dashboard": { + "customizeDashboard": "Personalizar panel de control", + "dragWidgetsHelp": "Arrastra widgets para recolocarlos o cambia su tamaño con la esquina inferior derecha.", + "resetLayout": "Reestablecer a la disposición por defecto" + }, + "core": { + "exitEditMode": "Salir del modo edición", + "customize": "Personalizar" + }, + "trophies": { + "trophies": "Trofeos" + }, + "preview": "Vista previa", + "useMarkdownHint": "Puedes usar Markdown básico para dar formato al texto: *cursiva*, **negrita**, - lista", + "totalChange": "Cambio total", + "currentTrend": "Tendencia actual", + "mean": "Medio", + "trend": "Tendencia", + "variance": "Variación" } diff --git a/public/locales/gl/translation.json b/public/locales/gl/translation.json index 1c32b6211..39853f8d4 100644 --- a/public/locales/gl/translation.json +++ b/public/locales/gl/translation.json @@ -1,88 +1,88 @@ { - "dashboard": { - "customizeDashboard": "Personalizar o cadro de mando", - "dragWidgetsHelp": "Arrastra os widgets para reposicionalos ou cambiar o seu tamaño usando o canto inferior dereito.", - "resetLayout": "Restablecer á configuración predeterminada" - }, - "core": { - "exitEditMode": "Salir do modo de edición", - "customize": "Personalizar" - }, - "weight": "Peso", - "height": "Altura", - "cm": "cm", - "date": "Data", - "timeOfDay": "Hora do día", - "submit": "Enviar", - "edit": "Editar", - "preview": "Vista previa", - "editName": "Editar {{name}}", - "delete": "Eliminar", - "deleteConfirmation": "Estás segro que queres eliminar \"{{name}}\"?", - "add": "Engadir", - "close": "Fechar", - "lastHalfYear": "Últimos 6 meses", - "lastMonth": "Último mes", - "lastWeek": "Última semana", - "start": "Iniciar", - "end": "Fin", - "comment": "Comentar", - "trophies": { - "trophies": "Trofeos" - }, - "licenses": { - "authors": "Autor(a)", - "authorProfile": "Link para o perfil ou website do autor, se existe", - "derivativeSourceUrl": "Link para a fonte origial, no caso de ser unha obra derivada", - "derivativeSourceUrlHelper": "Nota: unha obra derivada é aquela que non só se basea nunha obra anterior, senón que tamén contén contido creativo e novo suficiente para ter dereito ao seu propio dereito de autor.", - "originalObjectUrl": "Ligazón para o sitio web de orixe, de estar dispoñible", - "originalTitle": "Título" - }, - "loading": "Cargando...", - "nutritionalPlan": "Plan nutricional", - "addEntry": "Engadir entrada", - "currentWeight": "Peso actual", - "currentTrend": "Tendencia actual", - "mean": "Media", - "trend": "Tendencia", - "variance": "Variación", - "totalChange": "Cambio total", - "workout": "Entrenamento", - "seeDetails": "Ver os detalles", - "actions": "Accións", - "exercises": { - "filterVariations": "Introduce o nome do exercicio para filtrar variacións", - "identicalExercise": "Evitar exercicios duplicados", - "identicalExercisePleaseDiscard": "Se observa un exercicio que é idéntico ao que está engadindo, descarte o seu borrador e edite ese exercicio no seu lugar.", - "translateExerciseNow": "Traducir este exercicio agora", - "replacements": "Substitucións", - "replacementsInfoText": "Opcionalmente, tamén podes seleccionar un exercicio que substitúa este (por exemplo, porque se enviou dúas veces ou algo similar). Isto substituirá o exercicio nas rutinas e nos rexistros de adestramento, en lugar de simplemente eliminalo. Estes cambios tamén se propagarán a calquera instancia que sincronice os exercicios dende esta.", - "replacementsSearch": "Busca un exercicio ou copia e pega un ID coñecido no campo e fai click no botón de \"cargar\".", - "noReplacementSelected": " Ningún exercicio seleccionado para substituír", - "replacementCannotBeSame": "A substitución non pode ser o mesmo exercicio que estás a eliminar.", - "transferMediaLabel": "Transferir os arquivos multimedia ao exercicio substituto", - "transferTranslationsLabel": "Transferir traducións á substitución (omite as linguas xa presentes)", - "contributeExercise": "Contribuir cun exercicio", - "step1HeaderBasics": "Conceptos básicos en inglés", - "variations": "Variacións", - "notEnoughRightsHeader": "Non podes contribuir con exercicios", - "notEnoughRights": "Só podes contribuír exercicios se a túa conta ten máis de {{days}} días e verificaches o teu correo electrónico", - "muscles": "Músculos", - "secondaryMuscles": "Músculos secundarios" - }, - "difference": "Diferenza", - "useMarkdownHint": "Podes empregar Markdown básico para dar formato ao texto: *itálico*, **negrita**, - lista", - "days": "Días", - "all": "Todo", - "lastYear": "Último ano", - "nothingHereYet": "Aínda non hai nada aquí...", - "nothingHereYetAction": "Pulsa o botón de acción para empezar", - "notes": "Notas", - "value": "Valor", - "unit": "Unidade", - "alsoSearchEnglish": "Buscar tamén correos en inglés", - "copyToClipboard": "Copiar ao portapapeis", - "filters": "Filtros", - "private": "Privado", - "public": "Público" + "dashboard": { + "customizeDashboard": "Personalizar o cadro de mando", + "dragWidgetsHelp": "Arrastra os widgets para reposicionalos ou cambiar o seu tamaño usando o canto inferior dereito.", + "resetLayout": "Restablecer á configuración predeterminada" + }, + "core": { + "exitEditMode": "Salir do modo de edición", + "customize": "Personalizar" + }, + "weight": "Peso", + "height": "Altura", + "cm": "cm", + "date": "Data", + "timeOfDay": "Hora do día", + "submit": "Enviar", + "edit": "Editar", + "preview": "Vista previa", + "editName": "Editar {{name}}", + "delete": "Eliminar", + "deleteConfirmation": "Estás segro que queres eliminar \"{{name}}\"?", + "add": "Engadir", + "close": "Fechar", + "lastHalfYear": "Últimos 6 meses", + "lastMonth": "Último mes", + "lastWeek": "Última semana", + "start": "Iniciar", + "end": "Fin", + "comment": "Comentar", + "trophies": { + "trophies": "Trofeos" + }, + "licenses": { + "authors": "Autor(a)", + "authorProfile": "Link para o perfil ou website do autor, se existe", + "derivativeSourceUrl": "Link para a fonte origial, no caso de ser unha obra derivada", + "derivativeSourceUrlHelper": "Nota: unha obra derivada é aquela que non só se basea nunha obra anterior, senón que tamén contén contido creativo e novo suficiente para ter dereito ao seu propio dereito de autor.", + "originalObjectUrl": "Ligazón para o sitio web de orixe, de estar dispoñible", + "originalTitle": "Título" + }, + "loading": "Cargando...", + "nutritionalPlan": "Plan nutricional", + "addEntry": "Engadir entrada", + "currentWeight": "Peso actual", + "currentTrend": "Tendencia actual", + "mean": "Media", + "trend": "Tendencia", + "variance": "Variación", + "totalChange": "Cambio total", + "workout": "Entrenamento", + "seeDetails": "Ver os detalles", + "actions": "Accións", + "exercises": { + "filterVariations": "Introduce o nome do exercicio para filtrar variacións", + "identicalExercise": "Evitar exercicios duplicados", + "identicalExercisePleaseDiscard": "Se observa un exercicio que é idéntico ao que está engadindo, descarte o seu borrador e edite ese exercicio no seu lugar.", + "translateExerciseNow": "Traducir este exercicio agora", + "replacements": "Substitucións", + "replacementsInfoText": "Opcionalmente, tamén podes seleccionar un exercicio que substitúa este (por exemplo, porque se enviou dúas veces ou algo similar). Isto substituirá o exercicio nas rutinas e nos rexistros de adestramento, en lugar de simplemente eliminalo. Estes cambios tamén se propagarán a calquera instancia que sincronice os exercicios dende esta.", + "replacementsSearch": "Busca un exercicio ou copia e pega un ID coñecido no campo e fai click no botón de \"cargar\".", + "noReplacementSelected": " Ningún exercicio seleccionado para substituír", + "replacementCannotBeSame": "A substitución non pode ser o mesmo exercicio que estás a eliminar.", + "transferMediaLabel": "Transferir os arquivos multimedia ao exercicio substituto", + "transferTranslationsLabel": "Transferir traducións á substitución (omite as linguas xa presentes)", + "contributeExercise": "Contribuir cun exercicio", + "step1HeaderBasics": "Conceptos básicos en inglés", + "variations": "Variacións", + "notEnoughRightsHeader": "Non podes contribuir con exercicios", + "notEnoughRights": "Só podes contribuír exercicios se a túa conta ten máis de {{days}} días e verificaches o teu correo electrónico", + "muscles": "Músculos", + "secondaryMuscles": "Músculos secundarios" + }, + "difference": "Diferenza", + "useMarkdownHint": "Podes empregar Markdown básico para dar formato ao texto: *itálico*, **negrita**, - lista", + "days": "Días", + "all": "Todo", + "lastYear": "Último ano", + "nothingHereYet": "Aínda non hai nada aquí...", + "nothingHereYetAction": "Pulsa o botón de acción para empezar", + "notes": "Notas", + "value": "Valor", + "unit": "Unidade", + "alsoSearchEnglish": "Buscar tamén correos en inglés", + "copyToClipboard": "Copiar ao portapapeis", + "filters": "Filtros", + "private": "Privado", + "public": "Público" } diff --git a/public/locales/hi/translation.json b/public/locales/hi/translation.json index 95d971a22..00ec00975 100644 --- a/public/locales/hi/translation.json +++ b/public/locales/hi/translation.json @@ -1,9 +1,9 @@ { - "date": "तारीख", - "edit": "संपादित करना", - "cm": "cm", - "dashboard": { - "customizeDashboard": "डैशबोर्ड को अनुकूलित करें", - "dragWidgetsHelp": "विजेट्स को उनकी जगह बदलने के लिए खींचें, या नीचे-दाएँ कोने का इस्तेमाल करके उनका साइज़ बदलें।" - } + "date": "तारीख", + "edit": "संपादित करना", + "cm": "cm", + "dashboard": { + "customizeDashboard": "डैशबोर्ड को अनुकूलित करें", + "dragWidgetsHelp": "विजेट्स को उनकी जगह बदलने के लिए खींचें, या नीचे-दाएँ कोने का इस्तेमाल करके उनका साइज़ बदलें।" + } } diff --git a/public/locales/hr/translation.json b/public/locales/hr/translation.json index e8d8a69e9..1c32b39f7 100644 --- a/public/locales/hr/translation.json +++ b/public/locales/hr/translation.json @@ -1,377 +1,377 @@ { - "add": "Dodaj", - "addEntry": "Dodaj unos", - "close": "Zatvori", - "currentWeight": "Trenutačna težina", - "date": "Datum", - "days": "Dani", - "delete": "Izbriši", - "difference": "Razlika", - "edit": "Uredi", - "exercises": { - "alsoKnownAs": "Poznata i kao:", + "add": "Dodaj", + "addEntry": "Dodaj unos", + "close": "Zatvori", + "currentWeight": "Trenutačna težina", + "date": "Datum", + "days": "Dani", + "delete": "Izbriši", + "difference": "Razlika", + "edit": "Uredi", + "exercises": { + "alsoKnownAs": "Poznata i kao:", + "category": "Kategorija", + "contributeExercise": "Dodaj vježbu", + "description": "Opis", + "equipment": "Oprema", + "exercises": "Vježbe", + "missingExercise": "Nedostaje određena vježba?", + "missingExerciseDescription": "Pomogni zajednici svojim doprinosom!", + "muscles": "Mišići", + "noEquipment": "Bez opreme", + "notes": "Bilješke", + "primaryMuscles": "Primarni mišići", + "searchExerciseName": "Traži prema imenu vježbe", + "secondaryMuscles": "Sekundarni mišići", + "deleteExerciseBody": "Želiš li izbrisati vježbu „{{name}}”? Možeš izbrisati trenutačni {{language}} prijevod ili cijelu vježbu sa svim prijevodima, slikama itd.", + "deleteExerciseFull": "Izbriši cijelu vježbu", + "deleteTranslation": "Izbriši prijevod", + "step1HeaderBasics": "Osnove na engleskom", + "variations": "Varijacije", + "whatVariationsExist": "Koje varijacije ove vježbe postoje, ako ih ima?", + "filterVariations": "Upiši ime vježbe za filtriranje varijacija", + "identicalExercisePleaseDiscard": "Ako primijetiš vježbu koja je identična onoj koju dodaješ, odbaci svoju vježbu i umjesto toga uredi tu vježbu.", + "translateExerciseNow": "Prevedi ovu vježbu sada", + "compatibleImagesCC": "Slike moraju biti kompatibilne s licencom CC BY SA. Ako si u nedoumici, prenesi samo svoje vlastite fotografije.", + "alternativeNames": "Alternativna imena", + "exerciseNotTranslated": "Nema prijevoda", + "submitExercise": "Pošalji vježbu", + "successfullyUpdated": "Vježba je uspješno aktualizirana. Zbog predmemoriranja može potrajati neko vrijeme dok promjene ne budu vidljive u cijeloj aplikaciji.", + "checkInformationBeforeSubmitting": "Provjeri točnost tvojih unesenih podataka prije slanja vježbe", + "exerciseNotTranslatedBody": "Ova vježba trenutačno nije dostupna na trenutačno odabranom jeziku. Želiš li doprinijeti prijevodu?", + "newNote": "Nova bilješka", + "notesHelpText": "Bilješke su kratki komentari o tome kako izvesti vježbu, poput „drži tijelo ravno”", + "identicalExercise": "Nemoj dodavati vježbe koje već postoje", + "changeExerciseLanguage": "Promijeni jezik za ovu vježbu", + "basics": "Osnove", + "cacheWarning": "Zbog predmemoriranja, vidljivost promjena u aplikaciji može nešto potrajati.", + "notEnoughRightsHeader": "Ne možeš dodati vježbe", + "notEnoughRights": "Vježbe možeš dodati samo ako je tvoj račun stariji od {{days}} dana i ako si potvrdio/la tvoju e-mail adresu", + "replacements": "Zamjene", + "replacementsInfoText": "Opcionalno možeš odabrati i vježbu koja bi trebala zamijeniti ovu (npr. zato što je poslana dva puta ili jer je slična). To će zamijeniti vježbu u rutinama kao i dnevnike treninga, umjesto da se samo izbrišu. Ove promjene će se također proširiti na bilo koju instancu koja sinkronizira vježbe iz ove.", + "deleteExerciseReplace": "Izbriši i zamijeni", + "replacementsSearch": "Traži vježbu ili kopiraj i umetni poznati ID u polje i pritisni gumb „Učitaj”.", + "noReplacementSelected": " Nije odabrana nijedna vježba za zamjenu", + "imageStylePhoto": "Fotografija", + "imageStyle3D": "3D", + "imageStyleLine": "Linija", + "imageStyleLowPoly": "Grubi poligoni", + "imageStyleOther": "Drugo", + "imageDetails": "Detalji slike", + "swapExercise": "Zamijeni vježbu", + "exactMatch": "Točno podudaranje" + }, + "noResults": "Nema rezultata", + "noResultsDescription": "Za ovaj upit nisu pronađeni rezultati. Smanji broja filtara.", + "nutritionalPlan": "Plan prehrane", + "server": { + "arms": "Ruke", + "back": "Leđa", + "barbell": "Šipka", + "bench": "Klupa", + "calves": "Lisni mišići", + "chest": "Prsa", + "dumbbell": "Ručni uteg", + "gym_mat": "Podloga za treniranje", + "incline_bench": "Nagnuta klupa", + "kettlebell": "Kuglasti uteg", + "kilometers": "Kilometri", + "legs": "Noge", + "miles": "Milje", + "minutes": "Minute", + "none_(bodyweight_exercise)": "ništa (vježba za tjelesnu težinu)", + "pull-up_bar": "Prečka", + "repetitions": "Ponavljanja", + "seconds": "Sekunde", + "shoulders": "Ramena", + "swiss_ball": "Gimnastička lopta", + "sz-bar": "SZ prečka", + "until_failure": "Do neuspjeha", + "abs": "Trbuh", + "quads": "Kvadriceps", + "triceps": "Triceps", + "pull_up_bar": "Prečka", + "sz_bar": "Zaobljena šipka", + "none__bodyweight_exercise_": "bez (vježba za tjelesnu težinu)", + "biceps": "Bicepsi", + "hamstrings": "Tetive koljena", + "lower_back": "Donji dio leđa", + "glutes": "Stražnjica", + "lats": "Leđni mišići", + "cardio": "Kardio", + "body_weight": "Tjelesna težina", + "kilometers_per_hour": "Kilometara na sat", + "miles_per_hour": "Milja na sat", + "lb": "lb", + "kg": "kg", + "plates": "Ploče", + "max_reps": "Maks. broj ponavljanja" + }, + "submit": "Pošalji", + "weight": "Težina", + "workout": "Trening", + "goBack": "Idi natrag", + "language": "Jezik", + "videos": "Videa", + "cannotBeUndone": "Ova se radnja ne može poništiti.", + "forms": { + "supportedImageFormats": "Podržane su samo JPEG, PNG, WEBP i AVIF datoteke manje od 20 Mb", + "valueTooLong": "Vrijednost je predugačka", + "valueTooShort": "Vrijednost je prekratka", + "fieldRequired": "Ovo je obavezno polje", + "maxLength": "Upiši manje od {{chars}} znakova", + "minLength": "Upiši više od {{chars}} znakova", + "minValue": "Vrijednost za ovo polje mora biti veća od {{value}}", + "maxValue": "Vrijednost za ovo polje mora biti manja od {{value}}", + "enterNumber": "Upiši valjani broj", + "enterInteger": "Upiši cijeli broj", + "maxLessThanMin": "Maksimalna vrijednost mora biti manja od minimalne", + "endBeforeStart": "Vrijednost kraja ne može biti prije vrijednosti početka" + }, + "English": "Engleski", + "name": "Ime", "category": "Kategorija", - "contributeExercise": "Dodaj vježbu", + "save": "Spremi", + "cancel": "Odustani", + "loading": "Učitavanje …", "description": "Opis", - "equipment": "Oprema", - "exercises": "Vježbe", - "missingExercise": "Nedostaje određena vježba?", - "missingExerciseDescription": "Pomogni zajednici svojim doprinosom!", - "muscles": "Mišići", - "noEquipment": "Bez opreme", + "translation": "Prijevod", + "images": "Slike", + "overview": "Pregled", + "continue": "Nastavi", + "success": "Uspjeh!", + "routines": { + "addDay": "Dodaj dan treninga", + "addWeightLog": "Dodaj dnevnik treninga", + "addLogToDay": "Dodaj dnevnik za ovaj dan", + "routine": "Rutina", + "routines": "Rutine", + "logsFilterNote": "Napomena: prikazuju se samo unosi s jedinicom težine kg ili lb i ponavljanja, druge kombinacije kao što su vrijeme ili do neuspjeha se ovdje zanemaruju", + "logsHeader": "Dnevnik treninga za trening", + "rir": "Broj ponavljanja u rezervi", + "sets": "Serije", + "reps": "Ponavljanja", + "intensity": "Intenzitet", + "currentRoutine": "Trenutačna rutina", + "iteration": "Ponavljanje rutine", + "weekly": "Tjedno", + "daily": "Dnevno", + "day": { + "afap": "Što brže moguće", + "custom": "Prilagođeno", + "enom": "Svake minute u minuti", + "rft": "Runde za vrijeme", + "amrap": "Što više rundi", + "hiit": "Trening visokog intenziteta u intervalima", + "tabata": "Tabata", + "edt": "Trening s postupnim povećanjem ponavljanja/serija" + }, + "set": { + "partial": "Djelomično", + "forced": "Prisiljeno", + "type": "Vrsta", + "normalSet": "Normalna serija", + "tut": "Vrijeme pod napetošću", + "iso": "Izometrijsko držanje", + "jump": "Skok", + "myo": "MYO (intenzivnije aktiviranje mišićnih vlakana)", + "dropSet": "Drop set (serije sa smanjivanjem težine)", + "warmup": "Zagrijavanje" + }, + "restTime": "Vrijeme odmora", + "workoutNr": "Trening br. {{number}}", + "weekNr": "{{number}}. tjedan", + "backToRoutine": "Natrag na rutinu", + "minLengthRoutine": "Rutina mora trajati najmanje {{number}} tjedna", + "maxLengthRoutine": "Rutina mora trajati najviše {{number}} tjedna", + "resultingRoutine": "Rezultirajuća rutina", + "deleteDayConfirmation": "Ovo će ukloniti sve serije, vježbe i pravila napredovanja", + "exerciseHasProgression": "Ova vježba ima pravila napredovanja i ne može se ovdje uređivati. Za uređivanje klikni gumb.", + "requirementsHelpText": "Odaberi rezultate treninga (iz prethodnih dnevnika) koji se moraju doseći da bi ovo pravilo stupilo na snagu", + "repeat": "Ponovi pravilo", + "repeatHelpText": "Označi potvrdni okvir ako želiš da se ovo pravilo i dalje primjenjuje na sljedeće treninge sve dok ne definiraš novo pravilo", + "step": "Korak", + "requirements": "Uvjeti", + "addAdditionalLog": "Dodaj dodatni zapis", + "restDay": "Dan odmora", + "confirmRestDay": "Potvrdi mijenjanje dana odmora", + "confirmRestDayHelpText": "Imaj na umu da će se sve serije i vježbe ukloniti kada označiš dan kao dan odmora.", + "duplicate": "Dupla rutina", + "downloadPdfTable": "Preuzmi PDF (tablica)", + "downloadPdfLogs": "Preuzmi PDF (dnevnici)", + "downloadIcal": "Preuzmi iCal datoteku", + "impression": "Opći dojam", + "impressionGood": "Dobro", + "impressionNeutral": "Neutralno", + "impressionBad": "Loše", + "needsLogsToAdvance": "Treba dnevnike za nastavljanje", + "weightLogNotPlanned": "Spremanje dnevnika na datum za koji treninzi nisu bili planirani.", + "logsOverview": "Pregled dnevnika", + "alsoShowLogs": "Također prikaži dnevnike", + "markAsTemplate": "Upravljaj predloškom", + "template": "Predložak", + "templates": "Predlošci", + "publicTemplate": "Javni predložak", + "publicTemplates": "Javni predlošci", + "publicTemplateHelpText": "Javni predlošci su dostupni svim korisnicima.", + "copyAndUseTemplate": "Kopiraj i koristi predložak", + "defaultRounding": "Standardno zaokruživanje", + "rounding": "Zaokruživanje (ova vježba)", + "newDay": "Novi dan", + "statsOverview": "Statistike", + "simpleMode": "Jednostavni modus", + "roundingHelp": "Postavi standardno zaokruživanje za težinu i ponavljanja (ovo je posebno korisno pri korištenju postotnog povećanja u napredovanju). Ovo će se primjenjivati na sve nove serije, ali se može pojedinačno promijeniti u obrascu za napredovanje. Ostavi prazno za deaktiviranje zaokruživanja.", + "workoutSession": "Sesija treninga", + "routineHasNoDays": "Rutina nema dane", + "setHasNoExercises": "Ova serija nema vježbe", + "fitDaysInWeek": "Fiksiran tjedni raspored", + "fitDaysInWeekHelpText": "Ova postavka kontrolira kako su dani vaše rutine raspoređeni tijekom više tjedana. Ako je aktivirana, dani će se ponavljati u tjednom ciklusu. Na primjer, rutina s vježbama u ponedjeljak, srijedu i petak nastavit će ovaj uzorak sljedeći ponedjeljak, srijedu i petak. Ako je deaktivirana, dani će slijediti sekvencijalno bez obzira na početak novog tjedna. Ovo je korisno za rutine koje ne slijede strogi tjedni raspored.", + "needsLogsToAdvanceHelpText": "Ako odabereš ovu opciju, rutina će prijeći na sljedeći zakazani dan samo ako je trening zabilježen za trenutačni dan. Ako ova opcija nije odabrana, rutina će automatski prijeći na sljedeći dan bez obzira je li trening zabilježen ili ne.", + "addSuperset": "Dodaj super-seriju", + "addExercise": "Dodaj vježbu", + "exerciseNr": "Vježba {{number}}", + "supersetNr": "Super-serija {{number}}", + "editProgression": "Uredi napredovanje", + "impressionHelpText": "Ovaj obrazac bilježi rezultate tvog treninga (ponavljanja, težina itd.) za svaku vježbu. Promjene koje ovdje napraviš, poput uklanjanja ili zamjene vježbi, utječu samo na konkretne dnevnike koje spremiš i neće promijeniti tvoju ukupnu rutinu. Spremaju se samo redci u kojima su unesene vrijednosti za težinu ili broj ponavljanja.", + "templatesHelpText": "Predlošci su način spremanja tvoje rutine za kasniju upotrebu i kao polazna točka za nove rutine. Predlošci se ne mogu uređivati, ali se mogu duplicirati i izraditi promjene na kopiji (kao i naravno pretvoriti ih natrag u običnu rutinu).", + "progressionNeedsReplace": "Jedan od prethodnih unosa mora imati operaciju zamjene", + "operation": "Operacija", + "volume": "Ukupna težina", + "addSet": "Dodaj seriju", + "setNr": "Serija {{number}}" + }, + "preferences": "Postavke", "notes": "Bilješke", - "primaryMuscles": "Primarni mišići", - "searchExerciseName": "Traži prema imenu vježbe", - "secondaryMuscles": "Sekundarni mišići", - "deleteExerciseBody": "Želiš li izbrisati vježbu „{{name}}”? Možeš izbrisati trenutačni {{language}} prijevod ili cijelu vježbu sa svim prijevodima, slikama itd.", - "deleteExerciseFull": "Izbriši cijelu vježbu", - "deleteTranslation": "Izbriši prijevod", - "step1HeaderBasics": "Osnove na engleskom", - "variations": "Varijacije", - "whatVariationsExist": "Koje varijacije ove vježbe postoje, ako ih ima?", - "filterVariations": "Upiši ime vježbe za filtriranje varijacija", - "identicalExercisePleaseDiscard": "Ako primijetiš vježbu koja je identična onoj koju dodaješ, odbaci svoju vježbu i umjesto toga uredi tu vježbu.", - "translateExerciseNow": "Prevedi ovu vježbu sada", - "compatibleImagesCC": "Slike moraju biti kompatibilne s licencom CC BY SA. Ako si u nedoumici, prenesi samo svoje vlastite fotografije.", - "alternativeNames": "Alternativna imena", - "exerciseNotTranslated": "Nema prijevoda", - "submitExercise": "Pošalji vježbu", - "successfullyUpdated": "Vježba je uspješno aktualizirana. Zbog predmemoriranja može potrajati neko vrijeme dok promjene ne budu vidljive u cijeloj aplikaciji.", - "checkInformationBeforeSubmitting": "Provjeri točnost tvojih unesenih podataka prije slanja vježbe", - "exerciseNotTranslatedBody": "Ova vježba trenutačno nije dostupna na trenutačno odabranom jeziku. Želiš li doprinijeti prijevodu?", - "newNote": "Nova bilješka", - "notesHelpText": "Bilješke su kratki komentari o tome kako izvesti vježbu, poput „drži tijelo ravno”", - "identicalExercise": "Nemoj dodavati vježbe koje već postoje", - "changeExerciseLanguage": "Promijeni jezik za ovu vježbu", - "basics": "Osnove", - "cacheWarning": "Zbog predmemoriranja, vidljivost promjena u aplikaciji može nešto potrajati.", - "notEnoughRightsHeader": "Ne možeš dodati vježbe", - "notEnoughRights": "Vježbe možeš dodati samo ako je tvoj račun stariji od {{days}} dana i ako si potvrdio/la tvoju e-mail adresu", - "replacements": "Zamjene", - "replacementsInfoText": "Opcionalno možeš odabrati i vježbu koja bi trebala zamijeniti ovu (npr. zato što je poslana dva puta ili jer je slična). To će zamijeniti vježbu u rutinama kao i dnevnike treninga, umjesto da se samo izbrišu. Ove promjene će se također proširiti na bilo koju instancu koja sinkronizira vježbe iz ove.", - "deleteExerciseReplace": "Izbriši i zamijeni", - "replacementsSearch": "Traži vježbu ili kopiraj i umetni poznati ID u polje i pritisni gumb „Učitaj”.", - "noReplacementSelected": " Nije odabrana nijedna vježba za zamjenu", - "imageStylePhoto": "Fotografija", - "imageStyle3D": "3D", - "imageStyleLine": "Linija", - "imageStyleLowPoly": "Grubi poligoni", - "imageStyleOther": "Drugo", - "imageDetails": "Detalji slike", - "swapExercise": "Zamijeni vježbu", - "exactMatch": "Točno podudaranje" - }, - "noResults": "Nema rezultata", - "noResultsDescription": "Za ovaj upit nisu pronađeni rezultati. Smanji broja filtara.", - "nutritionalPlan": "Plan prehrane", - "server": { - "arms": "Ruke", - "back": "Leđa", - "barbell": "Šipka", - "bench": "Klupa", - "calves": "Lisni mišići", - "chest": "Prsa", - "dumbbell": "Ručni uteg", - "gym_mat": "Podloga za treniranje", - "incline_bench": "Nagnuta klupa", - "kettlebell": "Kuglasti uteg", - "kilometers": "Kilometri", - "legs": "Noge", - "miles": "Milje", - "minutes": "Minute", - "none_(bodyweight_exercise)": "ništa (vježba za tjelesnu težinu)", - "pull-up_bar": "Prečka", - "repetitions": "Ponavljanja", - "seconds": "Sekunde", - "shoulders": "Ramena", - "swiss_ball": "Gimnastička lopta", - "sz-bar": "SZ prečka", - "until_failure": "Do neuspjeha", - "abs": "Trbuh", - "quads": "Kvadriceps", - "triceps": "Triceps", - "pull_up_bar": "Prečka", - "sz_bar": "Zaobljena šipka", - "none__bodyweight_exercise_": "bez (vježba za tjelesnu težinu)", - "biceps": "Bicepsi", - "hamstrings": "Tetive koljena", - "lower_back": "Donji dio leđa", - "glutes": "Stražnjica", - "lats": "Leđni mišići", - "cardio": "Kardio", - "body_weight": "Tjelesna težina", - "kilometers_per_hour": "Kilometara na sat", - "miles_per_hour": "Milja na sat", - "lb": "lb", - "kg": "kg", - "plates": "Ploče", - "max_reps": "Maks. broj ponavljanja" - }, - "submit": "Pošalji", - "weight": "Težina", - "workout": "Trening", - "goBack": "Idi natrag", - "language": "Jezik", - "videos": "Videa", - "cannotBeUndone": "Ova se radnja ne može poništiti.", - "forms": { - "supportedImageFormats": "Podržane su samo JPEG, PNG, WEBP i AVIF datoteke manje od 20 Mb", - "valueTooLong": "Vrijednost je predugačka", - "valueTooShort": "Vrijednost je prekratka", - "fieldRequired": "Ovo je obavezno polje", - "maxLength": "Upiši manje od {{chars}} znakova", - "minLength": "Upiši više od {{chars}} znakova", - "minValue": "Vrijednost za ovo polje mora biti veća od {{value}}", - "maxValue": "Vrijednost za ovo polje mora biti manja od {{value}}", - "enterNumber": "Upiši valjani broj", - "enterInteger": "Upiši cijeli broj", - "maxLessThanMin": "Maksimalna vrijednost mora biti manja od minimalne", - "endBeforeStart": "Vrijednost kraja ne može biti prije vrijednosti početka" - }, - "English": "Engleski", - "name": "Ime", - "category": "Kategorija", - "save": "Spremi", - "cancel": "Odustani", - "loading": "Učitavanje …", - "description": "Opis", - "translation": "Prijevod", - "images": "Slike", - "overview": "Pregled", - "continue": "Nastavi", - "success": "Uspjeh!", - "routines": { - "addDay": "Dodaj dan treninga", - "addWeightLog": "Dodaj dnevnik treninga", - "addLogToDay": "Dodaj dnevnik za ovaj dan", - "routine": "Rutina", - "routines": "Rutine", - "logsFilterNote": "Napomena: prikazuju se samo unosi s jedinicom težine kg ili lb i ponavljanja, druge kombinacije kao što su vrijeme ili do neuspjeha se ovdje zanemaruju", - "logsHeader": "Dnevnik treninga za trening", - "rir": "Broj ponavljanja u rezervi", - "sets": "Serije", - "reps": "Ponavljanja", - "intensity": "Intenzitet", - "currentRoutine": "Trenutačna rutina", - "iteration": "Ponavljanje rutine", - "weekly": "Tjedno", - "daily": "Dnevno", - "day": { - "afap": "Što brže moguće", - "custom": "Prilagođeno", - "enom": "Svake minute u minuti", - "rft": "Runde za vrijeme", - "amrap": "Što više rundi", - "hiit": "Trening visokog intenziteta u intervalima", - "tabata": "Tabata", - "edt": "Trening s postupnim povećanjem ponavljanja/serija" + "value": "Vrijednost", + "unit": "Jedinica", + "seeDetails": "Pogledaj detalje", + "actions": "Radnje", + "measurements": { + "measurements": "Mjerenja", + "unitFormHelpText": "Jedinica za mjerenje kategorije, npr. cm ili %", + "deleteInfo": "Ovo će izbrisati kategoriju kao i sve njezine unose" }, - "set": { - "partial": "Djelomično", - "forced": "Prisiljeno", - "type": "Vrsta", - "normalSet": "Normalna serija", - "tut": "Vrijeme pod napetošću", - "iso": "Izometrijsko držanje", - "jump": "Skok", - "myo": "MYO (intenzivnije aktiviranje mišićnih vlakana)", - "dropSet": "Drop set (serije sa smanjivanjem težine)", - "warmup": "Zagrijavanje" + "deleteConfirmation": "Stvarno želiš izbrisati „{{name}}”?", + "nutrition": { + "percentEnergy": "Postotak energije", + "fibres": "Balastne tvari", + "saturatedFat": "Zasićena mast", + "loggedToday": "Zapisano danas", + "goalsTitle": "Ciljevi", + "addMealItem": "Dodaj sastojak obroku", + "sugar": "Šećer", + "planned": "Planirano", + "mealDeleteInfo": "Unosi u dnevniku prehrane se za ovaj obrok neće izbrisati i pojavit će se pod „Drugi dnevnici”", + "goalEnergy": "Cilj za energiju", + "logged": "Zapisano", + "logThisMeal": "Zapiši ovaj obrok u dnevnik prehrane", + "valueEnergyKcal": "{{value}} kcal", + "7dayAvg": "sedmodnevni prosjek", + "ofWhichSugars": "od kojih šećeri", + "ofWhichSaturated": "od kojih zasićene", + "nutritionalDiary": "Dnevnik prehrane", + "valueRemaining": "preostalo", + "plan": "Plan prehrane", + "valueTooMany": "previše", + "logThisMealItem": "Zapiši ovaj sastojak u dnevnik prehrane", + "kcal": "kcal", + "planDeleteInfo": "Ovo će izbrisati i sve unose u dnevniku prehrane", + "copyPlan": "Napravi kopiju ovog plana", + "plans": "Planovi prehrane", + "others": "Drugo", + "useGoalsHelpTextLong": "To omogućuje postavljanje općih ciljeva za energiju, proteine, ugljikohidrate ili masti za plan. Napomena: ako postaviš detaljan plan obroka, ove će vrijednosti imati prioritet.", + "difference": "Razlika", + "protein": "Proteini", + "addNutritionalDiary": "Dodaj unos u dnevnik prehrane", + "today": "Danas", + "onlyLoggingHelpText": "Prati samo kalorije. Označi polje ako samo želiš zapisivati svoje kalorije bez postavljanja detaljnog plana prehrane s određenim obrocima", + "fat": "Masti", + "gPerBodyKg": "g po kg težine", + "goalProtein": "Cilj za proteine", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "goalFat": "Cilj za mast", + "meal": "Obrok", + "goalCarbohydrates": "Cilj za ugljikohidrate", + "diaryEntrySaved": "Unos u dnevnik je uspješno spremljen", + "energy": "Energija", + "useGoalsHelpText": "Dodaj ciljeve ovom planu", + "addMeal": "Dodaj obrok", + "carbohydrates": "Ugljikohidrati", + "macronutrient": "Makronutrijent", + "gramShort": "g", + "searchIngredientName": "Traži prema imenu sastojka", + "sodium": "Natrij", + "pseudoMealTitle": "Drugi dnevnici", + "goalFiber": "Cilj za vlakna", + "languageFilterCurrentOnly": "Samo u trenutačnom jeziku ({{lang}})", + "languageFilterCurrentAndEnglish": "Trenutačni jezik ({{lang}}) i engleski", + "languageFilterAll": "Svi jezici", + "filterVegan": "Veganski", + "filterVegetarian": "Vegetarijanski", + "filterNutriscore": "Nutri-Score filtar", + "filterNutriscoreOff": "Isključeno", + "filterNutriscoreNoFilter": "Bez filtra", + "filterNutriscoreOrBetter": "{{grade}} ili bolje" }, - "restTime": "Vrijeme odmora", - "workoutNr": "Trening br. {{number}}", - "weekNr": "{{number}}. tjedan", - "backToRoutine": "Natrag na rutinu", - "minLengthRoutine": "Rutina mora trajati najmanje {{number}} tjedna", - "maxLengthRoutine": "Rutina mora trajati najviše {{number}} tjedna", - "resultingRoutine": "Rezultirajuća rutina", - "deleteDayConfirmation": "Ovo će ukloniti sve serije, vježbe i pravila napredovanja", - "exerciseHasProgression": "Ova vježba ima pravila napredovanja i ne može se ovdje uređivati. Za uređivanje klikni gumb.", - "requirementsHelpText": "Odaberi rezultate treninga (iz prethodnih dnevnika) koji se moraju doseći da bi ovo pravilo stupilo na snagu", - "repeat": "Ponovi pravilo", - "repeatHelpText": "Označi potvrdni okvir ako želiš da se ovo pravilo i dalje primjenjuje na sljedeće treninge sve dok ne definiraš novo pravilo", - "step": "Korak", - "requirements": "Uvjeti", - "addAdditionalLog": "Dodaj dodatni zapis", - "restDay": "Dan odmora", - "confirmRestDay": "Potvrdi mijenjanje dana odmora", - "confirmRestDayHelpText": "Imaj na umu da će se sve serije i vježbe ukloniti kada označiš dan kao dan odmora.", - "duplicate": "Dupla rutina", - "downloadPdfTable": "Preuzmi PDF (tablica)", - "downloadPdfLogs": "Preuzmi PDF (dnevnici)", - "downloadIcal": "Preuzmi iCal datoteku", - "impression": "Opći dojam", - "impressionGood": "Dobro", - "impressionNeutral": "Neutralno", - "impressionBad": "Loše", - "needsLogsToAdvance": "Treba dnevnike za nastavljanje", - "weightLogNotPlanned": "Spremanje dnevnika na datum za koji treninzi nisu bili planirani.", - "logsOverview": "Pregled dnevnika", - "alsoShowLogs": "Također prikaži dnevnike", - "markAsTemplate": "Upravljaj predloškom", - "template": "Predložak", - "templates": "Predlošci", - "publicTemplate": "Javni predložak", - "publicTemplates": "Javni predlošci", - "publicTemplateHelpText": "Javni predlošci su dostupni svim korisnicima.", - "copyAndUseTemplate": "Kopiraj i koristi predložak", - "defaultRounding": "Standardno zaokruživanje", - "rounding": "Zaokruživanje (ova vježba)", - "newDay": "Novi dan", - "statsOverview": "Statistike", - "simpleMode": "Jednostavni modus", - "roundingHelp": "Postavi standardno zaokruživanje za težinu i ponavljanja (ovo je posebno korisno pri korištenju postotnog povećanja u napredovanju). Ovo će se primjenjivati na sve nove serije, ali se može pojedinačno promijeniti u obrascu za napredovanje. Ostavi prazno za deaktiviranje zaokruživanja.", - "workoutSession": "Sesija treninga", - "routineHasNoDays": "Rutina nema dane", - "setHasNoExercises": "Ova serija nema vježbe", - "fitDaysInWeek": "Fiksiran tjedni raspored", - "fitDaysInWeekHelpText": "Ova postavka kontrolira kako su dani vaše rutine raspoređeni tijekom više tjedana. Ako je aktivirana, dani će se ponavljati u tjednom ciklusu. Na primjer, rutina s vježbama u ponedjeljak, srijedu i petak nastavit će ovaj uzorak sljedeći ponedjeljak, srijedu i petak. Ako je deaktivirana, dani će slijediti sekvencijalno bez obzira na početak novog tjedna. Ovo je korisno za rutine koje ne slijede strogi tjedni raspored.", - "needsLogsToAdvanceHelpText": "Ako odabereš ovu opciju, rutina će prijeći na sljedeći zakazani dan samo ako je trening zabilježen za trenutačni dan. Ako ova opcija nije odabrana, rutina će automatski prijeći na sljedeći dan bez obzira je li trening zabilježen ili ne.", - "addSuperset": "Dodaj super-seriju", - "addExercise": "Dodaj vježbu", - "exerciseNr": "Vježba {{number}}", - "supersetNr": "Super-serija {{number}}", - "editProgression": "Uredi napredovanje", - "impressionHelpText": "Ovaj obrazac bilježi rezultate tvog treninga (ponavljanja, težina itd.) za svaku vježbu. Promjene koje ovdje napraviš, poput uklanjanja ili zamjene vježbi, utječu samo na konkretne dnevnike koje spremiš i neće promijeniti tvoju ukupnu rutinu. Spremaju se samo redci u kojima su unesene vrijednosti za težinu ili broj ponavljanja.", - "templatesHelpText": "Predlošci su način spremanja tvoje rutine za kasniju upotrebu i kao polazna točka za nove rutine. Predlošci se ne mogu uređivati, ali se mogu duplicirati i izraditi promjene na kopiji (kao i naravno pretvoriti ih natrag u običnu rutinu).", - "progressionNeedsReplace": "Jedan od prethodnih unosa mora imati operaciju zamjene", - "operation": "Operacija", - "volume": "Ukupna težina", - "addSet": "Dodaj seriju", - "setNr": "Serija {{number}}" - }, - "preferences": "Postavke", - "notes": "Bilješke", - "value": "Vrijednost", - "unit": "Jedinica", - "seeDetails": "Pogledaj detalje", - "actions": "Radnje", - "measurements": { - "measurements": "Mjerenja", - "unitFormHelpText": "Jedinica za mjerenje kategorije, npr. cm ili %", - "deleteInfo": "Ovo će izbrisati kategoriju kao i sve njezine unose" - }, - "deleteConfirmation": "Stvarno želiš izbrisati „{{name}}”?", - "nutrition": { - "percentEnergy": "Postotak energije", - "fibres": "Balastne tvari", - "saturatedFat": "Zasićena mast", - "loggedToday": "Zapisano danas", - "goalsTitle": "Ciljevi", - "addMealItem": "Dodaj sastojak obroku", - "sugar": "Šećer", - "planned": "Planirano", - "mealDeleteInfo": "Unosi u dnevniku prehrane se za ovaj obrok neće izbrisati i pojavit će se pod „Drugi dnevnici”", - "goalEnergy": "Cilj za energiju", - "logged": "Zapisano", - "logThisMeal": "Zapiši ovaj obrok u dnevnik prehrane", - "valueEnergyKcal": "{{value}} kcal", - "7dayAvg": "sedmodnevni prosjek", - "ofWhichSugars": "od kojih šećeri", - "ofWhichSaturated": "od kojih zasićene", - "nutritionalDiary": "Dnevnik prehrane", - "valueRemaining": "preostalo", - "plan": "Plan prehrane", - "valueTooMany": "previše", - "logThisMealItem": "Zapiši ovaj sastojak u dnevnik prehrane", - "kcal": "kcal", - "planDeleteInfo": "Ovo će izbrisati i sve unose u dnevniku prehrane", - "copyPlan": "Napravi kopiju ovog plana", - "plans": "Planovi prehrane", - "others": "Drugo", - "useGoalsHelpTextLong": "To omogućuje postavljanje općih ciljeva za energiju, proteine, ugljikohidrate ili masti za plan. Napomena: ako postaviš detaljan plan obroka, ove će vrijednosti imati prioritet.", - "difference": "Razlika", - "protein": "Proteini", - "addNutritionalDiary": "Dodaj unos u dnevnik prehrane", - "today": "Danas", - "onlyLoggingHelpText": "Prati samo kalorije. Označi polje ako samo želiš zapisivati svoje kalorije bez postavljanja detaljnog plana prehrane s određenim obrocima", - "fat": "Masti", - "gPerBodyKg": "g po kg težine", - "goalProtein": "Cilj za proteine", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "goalFat": "Cilj za mast", - "meal": "Obrok", - "goalCarbohydrates": "Cilj za ugljikohidrate", - "diaryEntrySaved": "Unos u dnevnik je uspješno spremljen", - "energy": "Energija", - "useGoalsHelpText": "Dodaj ciljeve ovom planu", - "addMeal": "Dodaj obrok", - "carbohydrates": "Ugljikohidrati", - "macronutrient": "Makronutrijent", - "gramShort": "g", - "searchIngredientName": "Traži prema imenu sastojka", - "sodium": "Natrij", - "pseudoMealTitle": "Drugi dnevnici", - "goalFiber": "Cilj za vlakna", - "languageFilterCurrentOnly": "Samo u trenutačnom jeziku ({{lang}})", - "languageFilterCurrentAndEnglish": "Trenutačni jezik ({{lang}}) i engleski", - "languageFilterAll": "Svi jezici", - "filterVegan": "Veganski", - "filterVegetarian": "Vegetarijanski", - "filterNutriscore": "Nutri-Score filtar", - "filterNutriscoreOff": "Isključeno", - "filterNutriscoreNoFilter": "Bez filtra", - "filterNutriscoreOrBetter": "{{grade}} ili bolje" - }, - "downloadAsPdf": "Preuzmi kao PDF", - "total": "Ukupno", - "alsoSearchEnglish": "Također traži imena na engleskom jeziku", - "timeOfDay": "Vrijeme dana", - "nothingHereYet": "Ovdje još nema ničega …", - "nothingHereYetAction": "Počni pritiskom gumba radnje", - "copyToClipboard": "Kopiraj u međuspremnik", - "licenses": { - "authorProfile": "Poveznica na web-stranicu autora ili profil, ako postoji", - "originalObjectUrl": "Poveznica na web-stranicu izvora, ako postoji", - "originalTitle": "Naslov", - "authors": "Autori", - "derivativeSourceUrl": "Poveznica na izvorni izvor, ako je ovo izvedeno djelo", - "derivativeSourceUrlHelper": "Izvedeni rad koji se ne temelji samo na prethodnom radu, te sadrži dovoljno novog, kreativnog sadržaja ima pravo na vlastito autorsko pravo." - }, - "filters": "Filtri", - "height": "Visina", - "cm": "cm", - "all": "Sve", - "lastYear": "Prošla godina", - "lastMonth": "Prošli mjesec", - "lastWeek": "Prošli tjedan", - "bmi": { - "calculator": "Kalkulator indeksa tjelesne mase", - "obese": "Pretilost", - "overweight": "Prekomjerna težina", - "normal": "Normalna težina", - "underweight": "Nedovoljna težina", - "result": "Tvoj indeks tjelesne mase je {{value}}" - }, - "lastHalfYear": "Prošlih 6 mjeseci", - "calendar": "Kalendar", - "entries": "Unosi", - "no_entries_for_day": "Nema unosa za ovaj dan", - "editName": "Uredi {{ime}}", - "start": "Start", - "end": "Kraj", - "comment": "Komentar", - "successfullyDeleted": "Uspješno izbrisano", - "private": "Privatno", - "public": "Javno", - "min": "Min.", - "max": "Maks.", - "durationWeeks": "{{number}} tjedna", - "durationWeeksDays": "{{number}} tjedna, {{nrDays}} dana", - "undo": "Poništi", - "trophies": { - "trophies": "Trofeje" - }, - "dashboard": { - "customizeDashboard": "Prilagodi nadzornu ploču", - "dragWidgetsHelp": "Povuci widgete za premještanje ili promijeni njihovu veličinu pomoću donjeg desnog kuta.", - "resetLayout": "Obnovi zadani raspored" - }, - "core": { - "exitEditMode": "Zatvori modus uređivanja", - "customize": "Prilagodi" - }, - "preview": "Pregledaj", - "useMarkdownHint": "Za formatiranje teksta se može koristiti osnovni Markdown: *kurziv*, **podebljano**, - popis", - "totalChange": "Ukupna promjena" + "downloadAsPdf": "Preuzmi kao PDF", + "total": "Ukupno", + "alsoSearchEnglish": "Također traži imena na engleskom jeziku", + "timeOfDay": "Vrijeme dana", + "nothingHereYet": "Ovdje još nema ničega …", + "nothingHereYetAction": "Počni pritiskom gumba radnje", + "copyToClipboard": "Kopiraj u međuspremnik", + "licenses": { + "authorProfile": "Poveznica na web-stranicu autora ili profil, ako postoji", + "originalObjectUrl": "Poveznica na web-stranicu izvora, ako postoji", + "originalTitle": "Naslov", + "authors": "Autori", + "derivativeSourceUrl": "Poveznica na izvorni izvor, ako je ovo izvedeno djelo", + "derivativeSourceUrlHelper": "Izvedeni rad koji se ne temelji samo na prethodnom radu, te sadrži dovoljno novog, kreativnog sadržaja ima pravo na vlastito autorsko pravo." + }, + "filters": "Filtri", + "height": "Visina", + "cm": "cm", + "all": "Sve", + "lastYear": "Prošla godina", + "lastMonth": "Prošli mjesec", + "lastWeek": "Prošli tjedan", + "bmi": { + "calculator": "Kalkulator indeksa tjelesne mase", + "obese": "Pretilost", + "overweight": "Prekomjerna težina", + "normal": "Normalna težina", + "underweight": "Nedovoljna težina", + "result": "Tvoj indeks tjelesne mase je {{value}}" + }, + "lastHalfYear": "Prošlih 6 mjeseci", + "calendar": "Kalendar", + "entries": "Unosi", + "no_entries_for_day": "Nema unosa za ovaj dan", + "editName": "Uredi {{ime}}", + "start": "Start", + "end": "Kraj", + "comment": "Komentar", + "successfullyDeleted": "Uspješno izbrisano", + "private": "Privatno", + "public": "Javno", + "min": "Min.", + "max": "Maks.", + "durationWeeks": "{{number}} tjedna", + "durationWeeksDays": "{{number}} tjedna, {{nrDays}} dana", + "undo": "Poništi", + "trophies": { + "trophies": "Trofeje" + }, + "dashboard": { + "customizeDashboard": "Prilagodi nadzornu ploču", + "dragWidgetsHelp": "Povuci widgete za premještanje ili promijeni njihovu veličinu pomoću donjeg desnog kuta.", + "resetLayout": "Obnovi zadani raspored" + }, + "core": { + "exitEditMode": "Zatvori modus uređivanja", + "customize": "Prilagodi" + }, + "preview": "Pregledaj", + "useMarkdownHint": "Za formatiranje teksta se može koristiti osnovni Markdown: *kurziv*, **podebljano**, - popis", + "totalChange": "Ukupna promjena" } diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index ab9ea0082..dce0d0a10 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -1,386 +1,386 @@ { - "add": "Aggiungi", - "addEntry": "Aggiungi voce", - "currentWeight": "Peso attuale", - "date": "Data", - "days": "Giorni", - "delete": "Elimina", - "difference": "Differenza", - "edit": "Modifica", - "exercises": { - "alsoKnownAs": "Conosciuto anche come:", - "category": "Categoria", - "contributeExercise": "Suggerisci un esercizio", + "add": "Aggiungi", + "addEntry": "Aggiungi voce", + "currentWeight": "Peso attuale", + "date": "Data", + "days": "Giorni", + "delete": "Elimina", + "difference": "Differenza", + "edit": "Modifica", + "exercises": { + "alsoKnownAs": "Conosciuto anche come:", + "category": "Categoria", + "contributeExercise": "Suggerisci un esercizio", + "description": "Descrizione", + "equipment": "Attrezzatura", + "exercises": "Esercizi", + "missingExercise": "Ti manca un certo esercizio?", + "missingExerciseDescription": "Aiuta la comunità contribuendo!", + "muscles": "Muscoli", + "noEquipment": "Senza attrezzatura", + "notes": "Note", + "primaryMuscles": "Muscoli primari", + "searchExerciseName": "Cerca per nome dell'esercizio", + "secondaryMuscles": "Muscoli secondari", + "deleteTranslation": "Elimina la traduzione", + "deleteExerciseFull": "Cancella tutto l'esercizio", + "exerciseNotTranslated": "Nessuna traduzione disponibile", + "notEnoughRightsHeader": "Non puoi contribuire agli esercizi", + "notEnoughRights": "Puoi contribuire agli esercizi solo se il tuo account è più vecchio di {{days}} giorni e hai verificato il tuo indirizzo mail", + "alternativeNames": "Nomi alternativi", + "changeExerciseLanguage": "Modifica la lingua dell'esercizio", + "filterVariations": "Inserisci il nome dell'esercizio per filtrare le varianti", + "translateExerciseNow": "Traduci l'esercizio adesso", + "compatibleImagesCC": "Le immagini devono essere compatibili con la licenza CC BY SA. In caso di dubbi, inserisci una foto che hai fatto personalmente.", + "submitExercise": "Invia esercizio", + "whatVariationsExist": "Quali varianti di questo esercizio esistono, se ce ne sono ?", + "variations": "Variazioni", + "identicalExercisePleaseDiscard": "Se noti un esercizio identico a quello che stai aggiungendo, elimina la bozza e modifica invece quell'esercizio.", + "checkInformationBeforeSubmitting": "Per favore controlla che le informazioni inserite siano corrette prima di confermare l'esercizio", + "step1HeaderBasics": "Nozioni di base in inglese", + "replacements": "Sostituzioni", + "newNote": "Nuova nota", + "identicalExercise": "Evita esercizi duplicati", + "successfullyUpdated": "L'esercizio è stato aggiornato con successo. A causa della memorizzazione nella cache, potrebbe essere necessario del tempo prima che le modifiche siano visibili in tutta l'applicazione.", + "notesHelpText": "Le note sono brevi commenti su come eseguire l'esercizio, ad esempio \"mantieni il corpo dritto\"", + "basics": "Nozioni di base", + "replacementsInfoText": "Facoltativamente, puoi anche selezionare un esercizio che puó sostituire il presente(ad esempio perché è stato inviato due volte o simile). Si sostituirà l'esercizio nelle routine e nei registri di allenamento, invece di eliminarlo semplicemente. Queste modifiche si propagheranno a qualsiasi istanza che sincronizzerà gli esercizi.", + "exerciseNotTranslatedBody": "Questo esercizio al momento non è disponibile nella lingua selezionata. Vuoi contribuire con una traduzione?", + "cacheWarning": "A causa della memorizzazione nella cache, potrebbe essere necessario del tempo prima che le modifiche siano visibili in tutta l'applicazione.", + "deleteExerciseReplace": "Elimina e sostituisci", + "deleteExerciseBody": "Vuoi eliminare l'esercizio \"{{name}}\"? Puoi eliminare la traduzione corrente in {{lingua}} o l'esercizio completo con tutte le traduzioni, immagini, ecc.", + "replacementsSearch": "Cerca un esercizio oppure copia e incolla un ID conosciuto nel campo e clicca sul pulsante \"carica\".", + "noReplacementSelected": " Nessun esercizio selezionato per la sostituzione", + "imageStylePhoto": "Foto", + "imageStyle3D": "3D", + "imageStyleLowPoly": "Basso numero di poligoni", + "imageStyleOther": "Altro", + "imageDetails": "Dettagli immagine", + "imageStyleLine": "Linea", + "swapExercise": "Esercizio di scambio", + "replacementCannotBeSame": "Il sostituto non può essere lo stesso esercizio che si sta eliminando.", + "transferMediaLabel": "Trasferisci i contenuti all’esercizio sostitutivo", + "transferTranslationsLabel": "Trasferisci le traduzioni all’esercizio sostitutivo (salta le lingue già presenti)", + "exactMatch": "Corrispondenza esatta", + "imageIsAiGenerated": "L’immagine è stata generata con l’IA", + "dropOrClickImage": "Trascina un’immagine qui o clicca per selezionarne una", + "addImage": "Aggiungi immagine" + }, + "noResults": "Nessun risultato", + "noResultsDescription": "Nessun risultato trovato. Prova a ridurre i termini di ricerca.", + "nutritionalPlan": "Piano nutrizionale", + "server": { + "arms": "Braccia", + "back": "Schiena", + "barbell": "Bilanciere", + "bench": "Panca", + "calves": "Polpacci", + "chest": "Petto", + "dumbbell": "Manubrio", + "gym_mat": "Materassino", + "incline_bench": "Panca inclinata", + "kettlebell": "Ghiria", + "kilometers": "Kilometri", + "legs": "Gambe", + "miles": "Miglia", + "minutes": "Minuti", + "none_(bodyweight_exercise)": "nessuno (esercizio a corpo libero)", + "pull-up_bar": "Barra per trazioni", + "repetitions": "Ripetizioni", + "seconds": "Secondi", + "shoulders": "Spalle", + "swiss_ball": "Palla da ginnastica", + "sz-bar": "SZ bar", + "until_failure": "A sfinimento", + "biceps": "Bicipiti", + "cardio": "Cardio", + "glutes": "Glutei", + "hamstrings": "Bicipiti femorali", + "max_reps": "Ripetizioni massime", + "miles_per_hour": "Miglia all'ora", + "plates": "Dischi", + "pull_up_bar": "Barra per le trazioni", + "sz_bar": "Bilanciere SZ", + "kg": "kg", + "lb": "lb", + "none__bodyweight_exercise_": "nessuno (esercizio a corpo libero)", + "abs": "Addominali", + "lats": "Gran dorsale", + "quads": "Quadricipiti", + "body_weight": "Peso corporeo", + "triceps": "Tricipiti", + "kilometers_per_hour": "Chilometri all'ora" + }, + "submit": "Invia", + "weight": "Peso", + "workout": "Allenamento", "description": "Descrizione", - "equipment": "Attrezzatura", - "exercises": "Esercizi", - "missingExercise": "Ti manca un certo esercizio?", - "missingExerciseDescription": "Aiuta la comunità contribuendo!", - "muscles": "Muscoli", - "noEquipment": "Senza attrezzatura", + "save": "Salva", + "category": "Categoria", + "name": "Nome", + "loading": "Caricamento…", + "actions": "Azioni", + "seeDetails": "Vedere dettagli", + "deleteConfirmation": "Sei sicuro di voler cancellare \"{{name}}\"?", "notes": "Note", - "primaryMuscles": "Muscoli primari", - "searchExerciseName": "Cerca per nome dell'esercizio", - "secondaryMuscles": "Muscoli secondari", - "deleteTranslation": "Elimina la traduzione", - "deleteExerciseFull": "Cancella tutto l'esercizio", - "exerciseNotTranslated": "Nessuna traduzione disponibile", - "notEnoughRightsHeader": "Non puoi contribuire agli esercizi", - "notEnoughRights": "Puoi contribuire agli esercizi solo se il tuo account è più vecchio di {{days}} giorni e hai verificato il tuo indirizzo mail", - "alternativeNames": "Nomi alternativi", - "changeExerciseLanguage": "Modifica la lingua dell'esercizio", - "filterVariations": "Inserisci il nome dell'esercizio per filtrare le varianti", - "translateExerciseNow": "Traduci l'esercizio adesso", - "compatibleImagesCC": "Le immagini devono essere compatibili con la licenza CC BY SA. In caso di dubbi, inserisci una foto che hai fatto personalmente.", - "submitExercise": "Invia esercizio", - "whatVariationsExist": "Quali varianti di questo esercizio esistono, se ce ne sono ?", - "variations": "Variazioni", - "identicalExercisePleaseDiscard": "Se noti un esercizio identico a quello che stai aggiungendo, elimina la bozza e modifica invece quell'esercizio.", - "checkInformationBeforeSubmitting": "Per favore controlla che le informazioni inserite siano corrette prima di confermare l'esercizio", - "step1HeaderBasics": "Nozioni di base in inglese", - "replacements": "Sostituzioni", - "newNote": "Nuova nota", - "identicalExercise": "Evita esercizi duplicati", - "successfullyUpdated": "L'esercizio è stato aggiornato con successo. A causa della memorizzazione nella cache, potrebbe essere necessario del tempo prima che le modifiche siano visibili in tutta l'applicazione.", - "notesHelpText": "Le note sono brevi commenti su come eseguire l'esercizio, ad esempio \"mantieni il corpo dritto\"", - "basics": "Nozioni di base", - "replacementsInfoText": "Facoltativamente, puoi anche selezionare un esercizio che puó sostituire il presente(ad esempio perché è stato inviato due volte o simile). Si sostituirà l'esercizio nelle routine e nei registri di allenamento, invece di eliminarlo semplicemente. Queste modifiche si propagheranno a qualsiasi istanza che sincronizzerà gli esercizi.", - "exerciseNotTranslatedBody": "Questo esercizio al momento non è disponibile nella lingua selezionata. Vuoi contribuire con una traduzione?", - "cacheWarning": "A causa della memorizzazione nella cache, potrebbe essere necessario del tempo prima che le modifiche siano visibili in tutta l'applicazione.", - "deleteExerciseReplace": "Elimina e sostituisci", - "deleteExerciseBody": "Vuoi eliminare l'esercizio \"{{name}}\"? Puoi eliminare la traduzione corrente in {{lingua}} o l'esercizio completo con tutte le traduzioni, immagini, ecc.", - "replacementsSearch": "Cerca un esercizio oppure copia e incolla un ID conosciuto nel campo e clicca sul pulsante \"carica\".", - "noReplacementSelected": " Nessun esercizio selezionato per la sostituzione", - "imageStylePhoto": "Foto", - "imageStyle3D": "3D", - "imageStyleLowPoly": "Basso numero di poligoni", - "imageStyleOther": "Altro", - "imageDetails": "Dettagli immagine", - "imageStyleLine": "Linea", - "swapExercise": "Esercizio di scambio", - "replacementCannotBeSame": "Il sostituto non può essere lo stesso esercizio che si sta eliminando.", - "transferMediaLabel": "Trasferisci i contenuti all’esercizio sostitutivo", - "transferTranslationsLabel": "Trasferisci le traduzioni all’esercizio sostitutivo (salta le lingue già presenti)", - "exactMatch": "Corrispondenza esatta", - "imageIsAiGenerated": "L’immagine è stata generata con l’IA", - "dropOrClickImage": "Trascina un’immagine qui o clicca per selezionarne una", - "addImage": "Aggiungi immagine" - }, - "noResults": "Nessun risultato", - "noResultsDescription": "Nessun risultato trovato. Prova a ridurre i termini di ricerca.", - "nutritionalPlan": "Piano nutrizionale", - "server": { - "arms": "Braccia", - "back": "Schiena", - "barbell": "Bilanciere", - "bench": "Panca", - "calves": "Polpacci", - "chest": "Petto", - "dumbbell": "Manubrio", - "gym_mat": "Materassino", - "incline_bench": "Panca inclinata", - "kettlebell": "Ghiria", - "kilometers": "Kilometri", - "legs": "Gambe", - "miles": "Miglia", - "minutes": "Minuti", - "none_(bodyweight_exercise)": "nessuno (esercizio a corpo libero)", - "pull-up_bar": "Barra per trazioni", - "repetitions": "Ripetizioni", - "seconds": "Secondi", - "shoulders": "Spalle", - "swiss_ball": "Palla da ginnastica", - "sz-bar": "SZ bar", - "until_failure": "A sfinimento", - "biceps": "Bicipiti", - "cardio": "Cardio", - "glutes": "Glutei", - "hamstrings": "Bicipiti femorali", - "max_reps": "Ripetizioni massime", - "miles_per_hour": "Miglia all'ora", - "plates": "Dischi", - "pull_up_bar": "Barra per le trazioni", - "sz_bar": "Bilanciere SZ", - "kg": "kg", - "lb": "lb", - "none__bodyweight_exercise_": "nessuno (esercizio a corpo libero)", - "abs": "Addominali", - "lats": "Gran dorsale", - "quads": "Quadricipiti", - "body_weight": "Peso corporeo", - "triceps": "Tricipiti", - "kilometers_per_hour": "Chilometri all'ora" - }, - "submit": "Invia", - "weight": "Peso", - "workout": "Allenamento", - "description": "Descrizione", - "save": "Salva", - "category": "Categoria", - "name": "Nome", - "loading": "Caricamento…", - "actions": "Azioni", - "seeDetails": "Vedere dettagli", - "deleteConfirmation": "Sei sicuro di voler cancellare \"{{name}}\"?", - "notes": "Note", - "value": "Valore", - "unit": "Unità", - "close": "Chiudi", - "nothingHereYet": "Qui non c'è ancora nulla ...", - "alsoSearchEnglish": "Cerca anche nomi in inglese", - "timeOfDay": "Ora del giorno", - "copyToClipboard": "Copia negli appunti", - "nothingHereYetAction": "Premi il pulsante di azione per iniziare", - "nutrition": { - "percentEnergy": "Percentuale di energia", - "fibres": "Fibre", - "saturatedFat": "Grassi saturi", - "loggedToday": "Registrato oggi", - "goalsTitle": "Obiettivi", - "addMealItem": "Aggiungi ingredienti al pasto", - "sugar": "Zucchero", - "planned": "Pianificato", - "mealDeleteInfo": "Le voci del diario nutrizionale relative a questo pasto non verranno eliminate e verranno visualizzate in \"altri registri\"", - "goalEnergy": "Obiettivo energetico", - "logged": "Registrato", - "logThisMeal": "Registra questo pasto così com'è nel diario nutrizionale", - "valueEnergyKcal": "{{value}} kcal", - "7dayAvg": "media di 7 giorni", - "ofWhichSugars": "di cui zuccheri", - "ofWhichSaturated": "di cui saturi", - "nutritionalDiary": "Diario nutrizionale", - "valueRemaining": "residuo", - "plan": "Piano nutrizionale", - "valueTooMany": "Troppo", - "logThisMealItem": "Registra questo ingrediente così com'è nel diario nutrizionale", - "kcal": "kcal", - "planDeleteInfo": "Eliminerà anche tutte le voci del diario nutrizionale", - "copyPlan": "Fai una copia di questo piano", - "plans": "Piani nutrizionali", - "others": "Altri", - "useGoalsHelpTextLong": "Ciò consente di impostare obiettivi generali per energia, proteine, carboidrati o grassi per il piano. Tieni presente che se imposti un piano alimentare dettagliato, questi valori avranno la precedenza.", - "difference": "Differenza", - "protein": "Proteina", - "addNutritionalDiary": "Aggiungi una voce al diario nutrizionale", - "today": "Oggi", - "onlyLoggingHelpText": "Tieni traccia solo delle calorie. Seleziona la casella se desideri registrare solo le calorie e non vuoi impostare un piano nutrizionale dettagliato con pasti specifici", - "fat": "Grasso", - "gPerBodyKg": "g per kg-corporeo", - "goalProtein": "Obiettivo proteico", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "goalFat": "Obiettivo grasso", - "meal": "Pasto", - "goalCarbohydrates": "Obiettivo carboidrati", - "diaryEntrySaved": "Voce del diario salvata con successo", - "energy": "Energia", - "useGoalsHelpText": "Aggiungi obiettivi a questo piano", - "addMeal": "Aggiungi pasto", - "carbohydrates": "Carboidrati", - "macronutrient": "Macronutriente", - "gramShort": "g", - "searchIngredientName": "Cerca per nome dell'ingrediente", - "sodium": "Sodio", - "pseudoMealTitle": "Altri registri", - "goalFiber": "Obiettivo fibre", - "languageFilterCurrentOnly": "Solo nella lingua corrente ({{lang}})", - "languageFilterCurrentAndEnglish": "Lingua corrente ({{lang}}) e inglese", - "languageFilterAll": "Tutte le lingue", - "filterVegan": "Vegano", - "filterVegetarian": "Vegetariano", - "filterNutriscore": "Filtro Nutri-Score", - "filterNutriscoreOff": "Disattivato", - "filterNutriscoreNoFilter": "Nessun filtro", - "filterNutriscoreOrBetter": "{{grade}} o meglio" - }, - "images": "Immagini", - "downloadAsPdf": "Scarica come PDF", - "total": "Totale", - "preferences": "Preferenze", - "continue": "Continua", - "translation": "Traduzione", - "overview": "Panoramica", - "language": "Lingua", - "forms": { - "valueTooLong": "Il valore è troppo lungo", - "fieldRequired": "Questo campo è richiesto", - "minLength": "Per favore inserisci più di {{chars}} caratteri", - "supportedImageFormats": "Sono supportati solo file JPEG, PNG, WEBP e AVIF al di sotto dei 20Mb", - "valueTooShort": "Il valore è troppo corto", - "maxLength": "Per favore inserisci meno di {{chars}} caratteri", - "maxValue": "Il valore di questo campo deve essere minore di {{value}}", - "minValue": "Il valore di questo campo deve essere maggiore di {{value}}", - "enterNumber": "Inserisci un numero valido", - "enterInteger": "Inserisci un numero intero", - "maxLessThanMin": "Il valore massimo deve essere più grande del minimo", - "endBeforeStart": "Il valore finale non può precedere quello iniziale" - }, - "goBack": "Indietro", - "licenses": { - "authorProfile": "Link al sito web o al profilo dell'autore, se disponibile", - "derivativeSourceUrl": "Link alla risorsa originale, se è un'opera derivata", - "derivativeSourceUrlHelper": "Tieni presente che un'opera derivata è un'opera che non solo si basa solo su un'opera precedente, ma che contiene anche contenuti nuovi e creativi a sufficienza per darle diritto al proprio copyright.", - "originalObjectUrl": "Link al sito web della fonte, se disponibile", - "originalTitle": "Titolo", - "authors": "Autore(i)" - }, - "cancel": "Annulla", - "routines": { - "routine": "Routine", - "routines": "Routine", - "rir": "RiR", - "addDay": "Aggiungi giorno di allenamento", - "addLogToDay": "Aggiungi registro a questo giorno", - "logsFilterNote": "Tieni presente che vengono tracciate solo le voci con un'unità di peso di kg o lb e le ripetizioni, altre combinazioni come il tempo o fino allo cedimento qui vengono ignorate", - "logsHeader": "Registro di allenamento per l'allenamento", - "addWeightLog": "Aggiungi registro di allenamento", - "iteration": "Iterazione", - "weekly": "Settimanale", - "daily": "Quotidiano", - "restTime": "Tempo di riposo", - "deleteDayConfirmation": "Questo rimuoverà tutti i set, gli esercizi e le regole di progressione", - "routineHasNoDays": "La routine non ha giorni", - "setHasNoExercises": "Questo set non ha esercizi", - "fitDaysInWeek": "Pianificazione settimanale fissa", - "fitDaysInWeekHelpText": "Questa impostazione controlla la programmazione dei giorni della tua routine su più settimane. Se abilitata, i giorni si ripeteranno in un ciclo settimanale. Ad esempio, una routine con allenamenti il lunedì, mercoledì e venerdì continuerà con questo schema il lunedì, mercoledì e venerdì successivi. Se disabilitata, i giorni si susseguiranno in sequenza, indipendentemente dall'inizio di una nuova settimana. Questa opzione è utile per le routine che non seguono un programma settimanale rigido.", - "needsLogsToAdvance": "Ha bisogno di registri per avanzare", - "needsLogsToAdvanceHelpText": "Se selezioni questa opzione, la routine passerà al giorno successivo programmato solo se hai registrato un allenamento per il giorno corrente. Se questa opzione non è selezionata, la routine passerà automaticamente al giorno successivo, indipendentemente dal fatto che tu abbia registrato o meno un allenamento.", - "simpleMode": "Modalità semplice", - "workoutSession": "Sessione di allenamento", - "restDay": "Giorno di riposo", - "confirmRestDay": "Conferma la modifica del giorno di riposo", - "confirmRestDayHelpText": "Tieni presente che tutte le serie e gli esercizi verranno rimossi quando contrassegni un giorno come giorno di riposo.", - "duplicate": "Routine duplicata", - "downloadPdfTable": "Scarica PDF (tabella)", - "downloadPdfLogs": "Scarica PDF (registri)", - "downloadIcal": "Scarica il file iCal", - "impression": "Impressione generale", - "impressionGood": "Bene", - "impressionNeutral": "Neutro", - "impressionBad": "Male", - "impressionHelpText": "Questo modulo registra i risultati del tuo allenamento (ripetizioni, peso, ecc.) per ogni esercizio. Le modifiche apportate qui, come la rimozione o lo scambio di esercizi, influiscono solo sui registri specifici salvati e non modificano la routine complessiva. Vengono salvate solo le righe con i valori relativi al peso o alle ripetizioni.", - "addAdditionalLog": "Aggiungi ulteriore registro", - "operation": "Operazione", - "requirements": "Requisiti", - "requirementsHelpText": "Seleziona i risultati dell'allenamento (dai registri precedenti) che devono essere soddisfatti affinché questa regola abbia effetto", - "repeatHelpText": "Seleziona la casella di controllo se desideri che questa regola continui ad applicarsi agli allenamenti successivi finché non ne definisci una nuova", - "template": "Modello", - "templates": "Modelli", - "publicTemplate": "Modello pubblico", - "publicTemplates": "Modelli pubblici", - "templatesHelpText": "I modelli sono un modo per salvare la routine per un utilizzo futuro e come punto di partenza per altre routine. Non è possibile modificare i modelli, ma è possibile duplicarli e apportare modifiche alla copia (oltre a riconvertirli in una routine normale, ovviamente).", - "publicTemplateHelpText": "I modelli pubblici sono disponibili a tutti gli utenti.", - "copyAndUseTemplate": "Copia e utilizza il modello", - "set": { - "type": "Tipo", - "normalSet": "Set normale", - "dropSet": "Set di rilascio", - "partial": "Parziale", - "myo": "Serie MYO", - "forced": "Forzato", - "tut": "Tempo sotto tensione", - "iso": "Tenuta isometrica", - "jump": "Salto", - "warmup": "Riscaldamento" + "value": "Valore", + "unit": "Unità", + "close": "Chiudi", + "nothingHereYet": "Qui non c'è ancora nulla ...", + "alsoSearchEnglish": "Cerca anche nomi in inglese", + "timeOfDay": "Ora del giorno", + "copyToClipboard": "Copia negli appunti", + "nothingHereYetAction": "Premi il pulsante di azione per iniziare", + "nutrition": { + "percentEnergy": "Percentuale di energia", + "fibres": "Fibre", + "saturatedFat": "Grassi saturi", + "loggedToday": "Registrato oggi", + "goalsTitle": "Obiettivi", + "addMealItem": "Aggiungi ingredienti al pasto", + "sugar": "Zucchero", + "planned": "Pianificato", + "mealDeleteInfo": "Le voci del diario nutrizionale relative a questo pasto non verranno eliminate e verranno visualizzate in \"altri registri\"", + "goalEnergy": "Obiettivo energetico", + "logged": "Registrato", + "logThisMeal": "Registra questo pasto così com'è nel diario nutrizionale", + "valueEnergyKcal": "{{value}} kcal", + "7dayAvg": "media di 7 giorni", + "ofWhichSugars": "di cui zuccheri", + "ofWhichSaturated": "di cui saturi", + "nutritionalDiary": "Diario nutrizionale", + "valueRemaining": "residuo", + "plan": "Piano nutrizionale", + "valueTooMany": "Troppo", + "logThisMealItem": "Registra questo ingrediente così com'è nel diario nutrizionale", + "kcal": "kcal", + "planDeleteInfo": "Eliminerà anche tutte le voci del diario nutrizionale", + "copyPlan": "Fai una copia di questo piano", + "plans": "Piani nutrizionali", + "others": "Altri", + "useGoalsHelpTextLong": "Ciò consente di impostare obiettivi generali per energia, proteine, carboidrati o grassi per il piano. Tieni presente che se imposti un piano alimentare dettagliato, questi valori avranno la precedenza.", + "difference": "Differenza", + "protein": "Proteina", + "addNutritionalDiary": "Aggiungi una voce al diario nutrizionale", + "today": "Oggi", + "onlyLoggingHelpText": "Tieni traccia solo delle calorie. Seleziona la casella se desideri registrare solo le calorie e non vuoi impostare un piano nutrizionale dettagliato con pasti specifici", + "fat": "Grasso", + "gPerBodyKg": "g per kg-corporeo", + "goalProtein": "Obiettivo proteico", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "goalFat": "Obiettivo grasso", + "meal": "Pasto", + "goalCarbohydrates": "Obiettivo carboidrati", + "diaryEntrySaved": "Voce del diario salvata con successo", + "energy": "Energia", + "useGoalsHelpText": "Aggiungi obiettivi a questo piano", + "addMeal": "Aggiungi pasto", + "carbohydrates": "Carboidrati", + "macronutrient": "Macronutriente", + "gramShort": "g", + "searchIngredientName": "Cerca per nome dell'ingrediente", + "sodium": "Sodio", + "pseudoMealTitle": "Altri registri", + "goalFiber": "Obiettivo fibre", + "languageFilterCurrentOnly": "Solo nella lingua corrente ({{lang}})", + "languageFilterCurrentAndEnglish": "Lingua corrente ({{lang}}) e inglese", + "languageFilterAll": "Tutte le lingue", + "filterVegan": "Vegano", + "filterVegetarian": "Vegetariano", + "filterNutriscore": "Filtro Nutri-Score", + "filterNutriscoreOff": "Disattivato", + "filterNutriscoreNoFilter": "Nessun filtro", + "filterNutriscoreOrBetter": "{{grade}} o meglio" + }, + "images": "Immagini", + "downloadAsPdf": "Scarica come PDF", + "total": "Totale", + "preferences": "Preferenze", + "continue": "Continua", + "translation": "Traduzione", + "overview": "Panoramica", + "language": "Lingua", + "forms": { + "valueTooLong": "Il valore è troppo lungo", + "fieldRequired": "Questo campo è richiesto", + "minLength": "Per favore inserisci più di {{chars}} caratteri", + "supportedImageFormats": "Sono supportati solo file JPEG, PNG, WEBP e AVIF al di sotto dei 20Mb", + "valueTooShort": "Il valore è troppo corto", + "maxLength": "Per favore inserisci meno di {{chars}} caratteri", + "maxValue": "Il valore di questo campo deve essere minore di {{value}}", + "minValue": "Il valore di questo campo deve essere maggiore di {{value}}", + "enterNumber": "Inserisci un numero valido", + "enterInteger": "Inserisci un numero intero", + "maxLessThanMin": "Il valore massimo deve essere più grande del minimo", + "endBeforeStart": "Il valore finale non può precedere quello iniziale" + }, + "goBack": "Indietro", + "licenses": { + "authorProfile": "Link al sito web o al profilo dell'autore, se disponibile", + "derivativeSourceUrl": "Link alla risorsa originale, se è un'opera derivata", + "derivativeSourceUrlHelper": "Tieni presente che un'opera derivata è un'opera che non solo si basa solo su un'opera precedente, ma che contiene anche contenuti nuovi e creativi a sufficienza per darle diritto al proprio copyright.", + "originalObjectUrl": "Link al sito web della fonte, se disponibile", + "originalTitle": "Titolo", + "authors": "Autore(i)" + }, + "cancel": "Annulla", + "routines": { + "routine": "Routine", + "routines": "Routine", + "rir": "RiR", + "addDay": "Aggiungi giorno di allenamento", + "addLogToDay": "Aggiungi registro a questo giorno", + "logsFilterNote": "Tieni presente che vengono tracciate solo le voci con un'unità di peso di kg o lb e le ripetizioni, altre combinazioni come il tempo o fino allo cedimento qui vengono ignorate", + "logsHeader": "Registro di allenamento per l'allenamento", + "addWeightLog": "Aggiungi registro di allenamento", + "iteration": "Iterazione", + "weekly": "Settimanale", + "daily": "Quotidiano", + "restTime": "Tempo di riposo", + "deleteDayConfirmation": "Questo rimuoverà tutti i set, gli esercizi e le regole di progressione", + "routineHasNoDays": "La routine non ha giorni", + "setHasNoExercises": "Questo set non ha esercizi", + "fitDaysInWeek": "Pianificazione settimanale fissa", + "fitDaysInWeekHelpText": "Questa impostazione controlla la programmazione dei giorni della tua routine su più settimane. Se abilitata, i giorni si ripeteranno in un ciclo settimanale. Ad esempio, una routine con allenamenti il lunedì, mercoledì e venerdì continuerà con questo schema il lunedì, mercoledì e venerdì successivi. Se disabilitata, i giorni si susseguiranno in sequenza, indipendentemente dall'inizio di una nuova settimana. Questa opzione è utile per le routine che non seguono un programma settimanale rigido.", + "needsLogsToAdvance": "Ha bisogno di registri per avanzare", + "needsLogsToAdvanceHelpText": "Se selezioni questa opzione, la routine passerà al giorno successivo programmato solo se hai registrato un allenamento per il giorno corrente. Se questa opzione non è selezionata, la routine passerà automaticamente al giorno successivo, indipendentemente dal fatto che tu abbia registrato o meno un allenamento.", + "simpleMode": "Modalità semplice", + "workoutSession": "Sessione di allenamento", + "restDay": "Giorno di riposo", + "confirmRestDay": "Conferma la modifica del giorno di riposo", + "confirmRestDayHelpText": "Tieni presente che tutte le serie e gli esercizi verranno rimossi quando contrassegni un giorno come giorno di riposo.", + "duplicate": "Routine duplicata", + "downloadPdfTable": "Scarica PDF (tabella)", + "downloadPdfLogs": "Scarica PDF (registri)", + "downloadIcal": "Scarica il file iCal", + "impression": "Impressione generale", + "impressionGood": "Bene", + "impressionNeutral": "Neutro", + "impressionBad": "Male", + "impressionHelpText": "Questo modulo registra i risultati del tuo allenamento (ripetizioni, peso, ecc.) per ogni esercizio. Le modifiche apportate qui, come la rimozione o lo scambio di esercizi, influiscono solo sui registri specifici salvati e non modificano la routine complessiva. Vengono salvate solo le righe con i valori relativi al peso o alle ripetizioni.", + "addAdditionalLog": "Aggiungi ulteriore registro", + "operation": "Operazione", + "requirements": "Requisiti", + "requirementsHelpText": "Seleziona i risultati dell'allenamento (dai registri precedenti) che devono essere soddisfatti affinché questa regola abbia effetto", + "repeatHelpText": "Seleziona la casella di controllo se desideri che questa regola continui ad applicarsi agli allenamenti successivi finché non ne definisci una nuova", + "template": "Modello", + "templates": "Modelli", + "publicTemplate": "Modello pubblico", + "publicTemplates": "Modelli pubblici", + "templatesHelpText": "I modelli sono un modo per salvare la routine per un utilizzo futuro e come punto di partenza per altre routine. Non è possibile modificare i modelli, ma è possibile duplicarli e apportare modifiche alla copia (oltre a riconvertirli in una routine normale, ovviamente).", + "publicTemplateHelpText": "I modelli pubblici sono disponibili a tutti gli utenti.", + "copyAndUseTemplate": "Copia e utilizza il modello", + "set": { + "type": "Tipo", + "normalSet": "Set normale", + "dropSet": "Set di rilascio", + "partial": "Parziale", + "myo": "Serie MYO", + "forced": "Forzato", + "tut": "Tempo sotto tensione", + "iso": "Tenuta isometrica", + "jump": "Salto", + "warmup": "Riscaldamento" + }, + "sets": "Serie", + "reps": "Ripetizioni", + "volume": "Volume", + "intensity": "Intensità", + "currentRoutine": "Programma attuale", + "workoutNr": "Allenamento Nr. {{number}}", + "weekNr": "Settimana {{number}}", + "backToRoutine": "Torna al programma", + "minLengthRoutine": "Il programma deve durare almeno {{number}} settimane", + "maxLengthRoutine": "Il programma può durare massimo {{number}} settimane", + "addSuperset": "Aggiungi serie combinata", + "addExercise": "Aggiungi esercizio", + "exerciseNr": "Esercizio {{number}}", + "supersetNr": "Serie combinata {{number}}", + "editProgression": "Modifica avanzamento", + "progressionNeedsReplace": "Una delle voci precedenti deve avere un'operazione di sostituzione", + "exerciseHasProgression": "Questo esercizio ha regole di progressione e non può essere modificato qui. Per farlo, clicca il bottone.", + "defaultRounding": "Arrotondamento predefinito", + "rounding": "Arrotondamento (per questo esercizio)", + "roundingHelp": "Imposta l'arrotondamento predefinito per peso e ripetizioni (particolarmente utile quando si utilizza l’aumento percentuale nella progressione). Verrà applicato a tutte le nuove serie, ma potrà essere modificato singolarmente nel modulo della progressione. Lascia vuoto per disattivare l'arrotondamento.", + "newDay": "Nuovo giorno", + "weightLogNotPlanned": "Salvataggio dei log in una data senza allenamenti programmati.", + "logsOverview": "Panoramica dei log", + "alsoShowLogs": "Mostra anche logs", + "statsOverview": "Statistiche", + "step": "Fase", + "repeat": "Impostazione di ripetizione", + "markAsTemplate": "Gestisci template", + "resultingRoutine": "Risultato routine", + "addSet": "Aggiungi serie", + "setNr": "Serie {{number}}", + "day": { + "custom": "Personalizzato", + "enom": "Ogni minuto, al minuto (emom)", + "amrap": "Più round possibili (amrap)", + "hiit": "Allenamento a intervalli ad alta intensità (hiit)", + "tabata": "Tabata", + "edt": "Allenamento a densità crescente", + "rft": "Round a tempo", + "afap": "Il più veloce possibile" + } + }, + "measurements": { + "deleteInfo": "Ciò eliminerà la categoria e tutte le sue voci", + "measurements": "Misure", + "unitFormHelpText": "L'unità in cui la categoria verrà misurata, come cm o %" + }, + "success": "Completato!", + "cannotBeUndone": "L'azione non può essere annullata.", + "English": "Inglese", + "videos": "Video", + "calendar": "Calendario", + "entries": "Voci", + "no_entries_for_day": "Nessuna voce per questo giorno", + "height": "Altezza", + "cm": "cm", + "all": "Tutto", + "lastYear": "Ultimo Anno", + "lastHalfYear": "Ultimi 6 mesi", + "lastMonth": "Ultimo mese", + "lastWeek": "Ultima settimana", + "start": "Inizia", + "end": "Fine", + "editName": "Modifica {{name}}", + "comment": "Commento", + "filters": "Filtri", + "bmi": { + "calculator": "Calcolatore IMC", + "overweight": "Sovrappeso", + "obese": "Obeso", + "normal": "Peso normale", + "underweight": "Sottopeso", + "result": "Il tuo IMC è {{value}}" + }, + "min": "Min", + "max": "Max", + "durationWeeks": "{{number}} settimane", + "durationWeeksDays": "{{nrWeeks}} settimane, {{nrDays}} giorni", + "undo": "Annulla", + "successfullyDeleted": "Eliminato con successo", + "private": "Privato", + "public": "Pubblico", + "core": { + "customize": "Personalizza", + "exitEditMode": "Esci dalla modalità modifica" + }, + "dashboard": { + "resetLayout": "Ripristina la disposizione predefinita", + "customizeDashboard": "Personalizza dashboard", + "dragWidgetsHelp": "Trascina i widget per riposizionarli o ridimensionali usando l’angolo in basso a destra." + }, + "preview": "Anteprima", + "useMarkdownHint": "Puoi usare il Markdown di base per formattare il testo: *corsivo*, **grassetto**, - elenco", + "trophies": { + "trophies": "Trofei" }, - "sets": "Serie", - "reps": "Ripetizioni", - "volume": "Volume", - "intensity": "Intensità", - "currentRoutine": "Programma attuale", - "workoutNr": "Allenamento Nr. {{number}}", - "weekNr": "Settimana {{number}}", - "backToRoutine": "Torna al programma", - "minLengthRoutine": "Il programma deve durare almeno {{number}} settimane", - "maxLengthRoutine": "Il programma può durare massimo {{number}} settimane", - "addSuperset": "Aggiungi serie combinata", - "addExercise": "Aggiungi esercizio", - "exerciseNr": "Esercizio {{number}}", - "supersetNr": "Serie combinata {{number}}", - "editProgression": "Modifica avanzamento", - "progressionNeedsReplace": "Una delle voci precedenti deve avere un'operazione di sostituzione", - "exerciseHasProgression": "Questo esercizio ha regole di progressione e non può essere modificato qui. Per farlo, clicca il bottone.", - "defaultRounding": "Arrotondamento predefinito", - "rounding": "Arrotondamento (per questo esercizio)", - "roundingHelp": "Imposta l'arrotondamento predefinito per peso e ripetizioni (particolarmente utile quando si utilizza l’aumento percentuale nella progressione). Verrà applicato a tutte le nuove serie, ma potrà essere modificato singolarmente nel modulo della progressione. Lascia vuoto per disattivare l'arrotondamento.", - "newDay": "Nuovo giorno", - "weightLogNotPlanned": "Salvataggio dei log in una data senza allenamenti programmati.", - "logsOverview": "Panoramica dei log", - "alsoShowLogs": "Mostra anche logs", - "statsOverview": "Statistiche", - "step": "Fase", - "repeat": "Impostazione di ripetizione", - "markAsTemplate": "Gestisci template", - "resultingRoutine": "Risultato routine", - "addSet": "Aggiungi serie", - "setNr": "Serie {{number}}", - "day": { - "custom": "Personalizzato", - "enom": "Ogni minuto, al minuto (emom)", - "amrap": "Più round possibili (amrap)", - "hiit": "Allenamento a intervalli ad alta intensità (hiit)", - "tabata": "Tabata", - "edt": "Allenamento a densità crescente", - "rft": "Round a tempo", - "afap": "Il più veloce possibile" - } - }, - "measurements": { - "deleteInfo": "Ciò eliminerà la categoria e tutte le sue voci", - "measurements": "Misure", - "unitFormHelpText": "L'unità in cui la categoria verrà misurata, come cm o %" - }, - "success": "Completato!", - "cannotBeUndone": "L'azione non può essere annullata.", - "English": "Inglese", - "videos": "Video", - "calendar": "Calendario", - "entries": "Voci", - "no_entries_for_day": "Nessuna voce per questo giorno", - "height": "Altezza", - "cm": "cm", - "all": "Tutto", - "lastYear": "Ultimo Anno", - "lastHalfYear": "Ultimi 6 mesi", - "lastMonth": "Ultimo mese", - "lastWeek": "Ultima settimana", - "start": "Inizia", - "end": "Fine", - "editName": "Modifica {{name}}", - "comment": "Commento", - "filters": "Filtri", - "bmi": { - "calculator": "Calcolatore IMC", - "overweight": "Sovrappeso", - "obese": "Obeso", - "normal": "Peso normale", - "underweight": "Sottopeso", - "result": "Il tuo IMC è {{value}}" - }, - "min": "Min", - "max": "Max", - "durationWeeks": "{{number}} settimane", - "durationWeeksDays": "{{nrWeeks}} settimane, {{nrDays}} giorni", - "undo": "Annulla", - "successfullyDeleted": "Eliminato con successo", - "private": "Privato", - "public": "Pubblico", - "core": { - "customize": "Personalizza", - "exitEditMode": "Esci dalla modalità modifica" - }, - "dashboard": { - "resetLayout": "Ripristina la disposizione predefinita", - "customizeDashboard": "Personalizza dashboard", - "dragWidgetsHelp": "Trascina i widget per riposizionarli o ridimensionali usando l’angolo in basso a destra." - }, - "preview": "Anteprima", - "useMarkdownHint": "Puoi usare il Markdown di base per formattare il testo: *corsivo*, **grassetto**, - elenco", - "trophies": { - "trophies": "Trofei" - }, - "currentTrend": "Tendenza attuale", - "mean": "Media", - "trend": "Tendenza", - "variance": "Varianza", - "totalChange": "Variazione totale" + "currentTrend": "Tendenza attuale", + "mean": "Media", + "trend": "Tendenza", + "variance": "Varianza", + "totalChange": "Variazione totale" } diff --git a/public/locales/nl/translation.json b/public/locales/nl/translation.json index 72e16ee8a..5bba73d51 100644 --- a/public/locales/nl/translation.json +++ b/public/locales/nl/translation.json @@ -1,360 +1,360 @@ { - "days": "Dagen", - "edit": "Wijzig", - "close": "Sluiten", - "submit": "Verzend", - "height": "Lengte", - "lastYear": "Vorig jaar", - "cm": "cm", - "date": "Datum", - "weight": "Gewicht", - "timeOfDay": "Tijd vandaag", - "licenses": { - "authorProfile": "Link naar de auteur website of profiel, indien beschikbaar", - "originalTitle": "Titel", - "authors": "Auteur", - "derivativeSourceUrl": "Link naar de originele bron, als die gebruikt is", - "derivativeSourceUrlHelper": "Wees ervan bewust dat \"afgeleid werk\" niet alleen gebaseerd is op een eerder werk, maar dat ook voldoende nieuwe, creatieve inhoud bevat om recht te geven op eigen auteursrecht.", - "originalObjectUrl": "Link naar de bron website, indien mogelijk" - }, - "nutritionalPlan": "Voedingsplan", - "delete": "Verwijder", - "lastWeek": "Vorige week", - "deleteConfirmation": "Weet je zeker dat je wil verwijderen \"{{name}}\"?", - "add": "Voeg toe", - "difference": "Verschil", - "all": "Alles", - "lastHalfYear": "Laatste 6 maanden", - "lastMonth": "Afgelopen maand", - "value": "Waarde", - "loading": "Aan het laden ...", - "currentWeight": "Huidig gewicht", - "workout": "Workout", - "seeDetails": "Zie details", - "actions": "Actie", - "addEntry": "Item toevoegen", - "notes": "Notities", - "unit": "Eenheid", - "copyToClipboard": "Kopieer naar klembord", - "exercises": { - "replacementsSearch": "Zoek naar een oefening of kopieer en plak een bekende ID in het veld en klik op de knop “laden”.", - "noReplacementSelected": " Geen oefening geselecteerd voor vervanging", - "contributeExercise": "Voeg een oefening toe", - "step1HeaderBasics": "Basis in Engels", - "variations": "Variaties", - "notEnoughRightsHeader": "Je kunt geen oefeningen toevoegen", - "muscles": "Spieren", - "notEnoughRights": "Je kunt alleen oefeningen bijdragen als je account ouder is dan {{days}} dagen en je, je e-mail hebt geverifieerd", - "replacements": "Alternatieven", - "replacementsInfoText": "Optioneel kun je ook een oefening selecteren die deze oefening moet vervangen (b.v. omdat deze twee keer is ingestuurd, of iets dergelijks). Dit zal de oefening vervangen in routines en trainingslogs, in plaats van deze gewoon te verwijderen. Deze wijzigingen worden ook doorgevoerd in elke instantie die de oefeningen van deze instantie synchroniseert.", - "secondaryMuscles": "Secundaire spieren", - "whatVariationsExist": "Welke variaties van deze oefening bestaan er?", - "filterVariations": "Voer de naam van de oefening in om varianten te filteren", - "identicalExercise": "Dubbele oefeningen vermijden", - "identicalExercisePleaseDiscard": "Als je een oefening ziet die identiek is aan de oefening die je toevoegt, gooi je ontwerp dan weg en bewerk in plaats daarvan die oefening.", - "translateExerciseNow": "Vertaal deze oefening nu", - "notes": "Notities", - "cacheWarning": "Door caching kan het even duren voordat de wijzigingen zichtbaar zijn in de hele applicatie.", - "equipment": "Benodigdheden", - "submitExercise": "Verstuur oefening", - "successfullyUpdated": "De oefening is succesvol bijgewerkt. Door caching kan het even duren voordat de wijzigingen zichtbaar zijn in de hele applicatie.", - "description": "Omschrijving", - "basics": "Basis", - "exerciseNotTranslated": "Geen vertaling beschikbaar", - "exerciseNotTranslatedBody": "Deze oefening is momenteel niet beschikbaar in de geselecteerde taal. Wil je een vertaling toevoegen?", - "missingExercise": "Mis je een bepaalde oefening?", - "primaryMuscles": "Primaire spieren", - "deleteTranslation": "Verwijder vertaling", - "deleteExerciseFull": "Verwijder hele oefening", - "deleteExerciseReplace": "Verwijder en vervang", - "exercises": "Oefeningen", - "changeExerciseLanguage": "Wijzig de taal van de oefening", - "noEquipment": "Geen benodigdheden", - "missingExerciseDescription": "Help de gemeenschap door een bijdrage te leveren!", - "searchExerciseName": "Zoeken op naam oefening", - "newNote": "Nieuwe opmerking", - "notesHelpText": "Opmerkingen zijn korte aantekeningen over hoe je de oefening moet uitvoeren, zoals “houd je lichaam recht”", - "imageStyle3D": "3D", - "imageStylePhoto": "Foto", - "imageStyleLine": "Lijn", - "imageStyleLowPoly": "Lage lijn", - "imageStyleOther": "Andere", - "imageDetails": "Beeld details", - "alternativeNames": "Alternatieve namen", - "alsoKnownAs": "Ook bekend als:", - "compatibleImagesCC": "Afbeeldingen moeten compatibel zijn met de CC BY SA-licentie. Als je twijfelt, upload dan alleen foto's die je zelf hebt gemaakt.", - "checkInformationBeforeSubmitting": "Controleer of de ingevoerde informatie correct is voordat u de oefening verzendt", - "deleteExerciseBody": "Wil je de oefening “{{naam}}” verwijderen? Je kunt de huidige {{taal}} vertaling verwijderen of de volledige oefening met alle vertalingen, afbeeldingen, enz.", - "swapExercise": "Wissel oefening" - }, - "filters": "Filters", - "nothingHereYet": "Nog niets ingevuld...", - "nothingHereYetAction": "Druk op de actie knop om te beginnen", - "alsoSearchEnglish": "Zoek ook voor de namen in Engelse taal", - "nutrition": { - "plans": "Voedings plannen", - "copyPlan": "Maak een kopie van dit plan", - "plan": "Maaltijd plan", - "goalsTitle": "Doelen", - "useGoalsHelpText": "Doelen aan dit plan toevoegen", - "useGoalsHelpTextLong": "Hiermee kun je algemene doelen instellen voor energie, eiwitten, koolhydraten of vet voor het plan. Merk op dat als je een gedetailleerd maaltijdplan instelt, deze waarden voorrang krijgen.", - "goalEnergy": "Energiedoel", - "addNutritionalDiary": "Voedingsdagboek toevoegen", - "meal": "Maaltijd", - "addMeal": "Maaltijd toevoegen", - "addMealItem": "Ingrediënt aan maaltijd toevoegen", - "nutritionalDiary": "Voedingsdagboek", - "gramShort": "gr", - "kcal": "kcal", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "macronutrient": "Macronutrient", - "percentEnergy": "Procent energie", - "gPerBodyKg": "gr per kg lichaams gewicht", - "planned": "Gepland", - "logged": "Bijgehouden", - "loggedToday": "Vandaag bijgehouden", - "7dayAvg": "7-dagen gemiddelde", - "energy": "Energie", - "protein": "Eiwit", - "carbohydrates": "Koolhydraten", - "sugar": "Suiker", - "ofWhichSugars": "waarvan suikers", - "fat": "Vet", - "ofWhichSaturated": "Van welke verzadigd", - "saturatedFat": "Vezadigd vet", - "pseudoMealTitle": "Andere logs", - "others": "Andere", - "fibres": "Vezels", - "diaryEntrySaved": "Agenda-item succesvol opgeslagen", - "logThisMealItem": "Log dit ingrediënt in het voedingsdagboek", - "logThisMeal": "Log deze maaltijd in het voedingsdagboek", - "onlyLoggingHelpText": "Alleen calorieën bijhouden. Vink het vakje aan als je alleen je calorieën wilt bijhouden en geen gedetailleerd voedingsplan met specifieke maaltijden wilt instellen", - "goalFiber": "Vezel doel", - "goalFat": "Vet doel", - "today": "Vandaag", - "goalProtein": "Eiwit doel", - "goalCarbohydrates": "Koolhydraten doel", - "valueEnergyKcal": "{{value}} kcal", - "searchIngredientName": "Zoek op ingrediënt naam", - "sodium": "Sodium", - "mealDeleteInfo": "Voedingsdagboekvermeldingen voor deze maaltijd worden niet verwijderd en verschijnen onder “andere logs”", - "valueRemaining": "resterend", + "days": "Dagen", + "edit": "Wijzig", + "close": "Sluiten", + "submit": "Verzend", + "height": "Lengte", + "lastYear": "Vorig jaar", + "cm": "cm", + "date": "Datum", + "weight": "Gewicht", + "timeOfDay": "Tijd vandaag", + "licenses": { + "authorProfile": "Link naar de auteur website of profiel, indien beschikbaar", + "originalTitle": "Titel", + "authors": "Auteur", + "derivativeSourceUrl": "Link naar de originele bron, als die gebruikt is", + "derivativeSourceUrlHelper": "Wees ervan bewust dat \"afgeleid werk\" niet alleen gebaseerd is op een eerder werk, maar dat ook voldoende nieuwe, creatieve inhoud bevat om recht te geven op eigen auteursrecht.", + "originalObjectUrl": "Link naar de bron website, indien mogelijk" + }, + "nutritionalPlan": "Voedingsplan", + "delete": "Verwijder", + "lastWeek": "Vorige week", + "deleteConfirmation": "Weet je zeker dat je wil verwijderen \"{{name}}\"?", + "add": "Voeg toe", "difference": "Verschil", - "planDeleteInfo": "Hierdoor worden ook alle voedingsdagboekvermeldingen verwijderd", - "valueTooMany": "teveel", - "filterVegan": "Veganistisch", - "filterVegetarian": "Vegetarisch" - }, - "bmi": { - "overweight": "Overgewicht", - "obese": "Obese", - "result": "Je BMI is {{value}}", - "underweight": "Onder gewicht", - "calculator": "BMI calculator", - "normal": "Normaal gewicht" - }, - "downloadAsPdf": "Download als PDF", - "total": "Totaal", - "description": "Beschrijving", - "translation": "Vertaling", - "images": "Afbeeldingen", - "overview": "Overzicht", - "preferences": "Voorkeuren", - "continue": "Ga door", - "goBack": "Ga terug", - "language": "Taal", - "forms": { - "supportedImageFormats": "Alleen JPEG-, PNG-, WEBP- en AVIF-bestanden van minder dan 20Mb worden ondersteund", - "valueTooShort": "De waarde is te kort", - "valueTooLong": "De waarde is te lang", - "fieldRequired": "Dit veld is vereist", - "maxLength": "Voer minder dan {{chars}} tekens in", - "minLength": "Voer meer dan {{chars}} tekens in", - "minValue": "De waarde voor dit veld moet hoger zijn dan {{value}}", - "maxValue": "De waarde voor dit veld moet kleiner zijn dan {{value}}", - "enterNumber": "Voer een geldig nummer in", - "enterInteger": "Voer een geheel getal in", - "maxLessThanMin": "De maximale waarde moet groter zijn dan de minimale waarde", - "endBeforeStart": "De eindwaarde mag niet vóór de beginwaarde liggen" - }, - "name": "Naam", - "category": "Categorie", - "success": "Gelukt!", - "English": "Engels", - "save": "Opslaan", - "videos": "Video's", - "cannotBeUndone": "Deze actie kan niet ongedaan worden gemaakt.", - "cancel": "Cancel", - "noResults": "Geen resultaten", - "noResultsDescription": "Geen resultaten gevonden voor deze zoekopdracht, overweeg het aantal filters te verminderen.", - "routines": { - "addDay": "Trainingsdag toevoegen", - "addWeightLog": "Trainingslogboek toevoegen", - "logsHeader": "Trainingslogboek voor workout", - "routine": "Routine", - "routines": "Routines", - "rir": "RiR", - "addLogToDay": "Logboek toevoegen aan deze dag", - "logsFilterNote": "Merk op dat alleen items met een gewichtseenheid van kg of lb en herhalingen in kaart worden gebracht, andere combinaties zoals tijd of tot falen worden hier genegeerd", - "sets": "Sets", - "reps": "Herhalingen", - "volume": "Volume", - "intensity": "Intensiteit", - "currentRoutine": "Huidige routine", - "iteration": "Iteratie", - "weekly": "Wekelijks", - "daily": "Dagelijks", - "restTime": "Rust tijd", - "workoutNr": "Workout Nr. {{number}}", - "weekNr": "Week {{number}}", - "backToRoutine": "Terug naar routine", - "minLengthRoutine": "De routine moet minimaal {{number}} weken duren", - "maxLengthRoutine": "De routine kan maximaal {{number}} weken duren", - "resultingRoutine": "Resulterende routine", - "deleteDayConfirmation": "Hierdoor worden alle sets, oefeningen en progressieregels verwijderd", - "routineHasNoDays": "De routine heeft geen dagen", - "setHasNoExercises": "Deze set heeft geen oefeningen", - "fitDaysInWeek": "Fitte dagen in de week", - "fitDaysInWeekHelpText": "Deze instelling bepaalt hoe de dagen van je trainingsschema over meerdere weken worden ingepland. Indien ingeschakeld, herhalen de dagen zich in een wekelijkse cyclus. Een schema met trainingen op maandag, woensdag en vrijdag zal dit patroon bijvoorbeeld voortzetten op de daaropvolgende maandag, woensdag en vrijdag. Indien uitgeschakeld, volgen de dagen elkaar op zonder rekening te houden met het begin van een nieuwe week. Dit is handig voor schema's die geen strikt wekelijks schema volgen.", - "needsLogsToAdvance": "Logs zijn nodig om verder te gaan", - "needsLogsToAdvanceHelpText": "Als u deze optie selecteert, gaat de routine alleen door naar de volgende geplande dag als u voor de huidige dag een training hebt geregistreerd. Als deze optie niet is geselecteerd, gaat de routine automatisch door naar de volgende dag, ongeacht of u een training hebt geregistreerd of niet.", - "addSuperset": "Superset toevoegen", - "addExercise": "Oefening toevoegen", - "exerciseNr": "Oefening {{number}}", - "supersetNr": "Superset {{number}}", - "editProgression": "Wijzig progressie", - "progressionNeedsReplace": "Een van de voorgaande entries moet een vervangingsbewerking bevatten", - "exerciseHasProgression": "Deze oefening heeft progressie regels die hier niet gewijzigd kunnen worden. Klik op de knop om dit te doen.", - "defaultRounding": "Standaard afronding", - "rounding": "Afronding (deze oefening)", - "roundingHelp": "Stel de standaard afronding in voor gewicht en herhalingen (dit is vooral handig bij het gebruik van de procentuele verhogingsstap in de progressie). Deze instelling is van toepassing op alle nieuwe sets, maar kan individueel worden gewijzigd in het progressieformulier. Laat dit veld leeg om afronding uit te schakelen.", - "newDay": "Nieuwe dag", - "weightLogNotPlanned": "Logs worden opgeslagen voor een datum waar geen workouts gepland zijn.", - "logsOverview": "Logs overzicht", - "alsoShowLogs": "Toon ook logs", - "statsOverview": "Statistieken", - "simpleMode": "Eenvoudige modus", - "workoutSession": "Workout sessies", - "restDay": "Rust dag", - "confirmRestDay": "Bevestig rustdag verandering", - "confirmRestDayHelpText": "Houd er rekening mee dat alle sets en oefeningen worden verwijderd wanneer u een dag als rustdag markeert.", - "duplicate": "Dupliceer routine", - "downloadPdfTable": "Download PDF (tabel)", - "downloadPdfLogs": "Download PDF (logs)", - "downloadIcal": "Download iCal bestand", - "impression": "Algemene indruk", - "impressionGood": "Goed", - "impressionNeutral": "Neutraal", - "impressionBad": "Slecht", - "impressionHelpText": "Dit formulier registreert je trainingsresultaten (herhalingen, gewicht, enz.) voor elke oefening. Wijzigingen die je hier aanbrengt, zoals het verwijderen of wisselen van oefeningen, hebben alleen invloed op de specifieke gegevens die je opslaat en veranderen je algehele trainingsschema niet. Alleen rijen met waarden voor gewicht of herhalingen worden opgeslagen.", - "addAdditionalLog": "Additionele logs toevoegen", - "operation": "Operatie", - "step": "Stap", - "requirements": "Vereisten", - "requirementsHelpText": "Selecteer de trainingsresultaten (uit eerdere logboeken) waaraan moet worden voldaan om deze regel van kracht te laten worden", - "repeat": "Herhaal regel", - "repeatHelpText": "Vink het selectievakje aan als u wilt dat deze regel van toepassing blijft op volgende trainingen totdat u een nieuwe regel definieert", - "markAsTemplate": "Beheer templates", - "template": "Template", - "templates": "Templates", - "publicTemplate": "Publieke template", - "publicTemplates": "Publieke templates", - "templatesHelpText": "Templates zijn een manier om je routine op te slaan voor later gebruik en als uitgangspunt voor nieuwe routines. Je kunt templates niet bewerken, maar je kunt ze dupliceren en wijzigingen aanbrengen in de kopie (en ze natuurlijk ook weer omzetten naar een normale routine).", - "publicTemplateHelpText": "Publieke templates zijn toegankelijk voor alle gebruikers.", - "copyAndUseTemplate": "Kopieer en gebruik template", - "set": { - "type": "Type", - "normalSet": "Normale set", - "dropSet": "Drop set", - "myo": "MYO", - "partial": "Gedeeltelijk", - "forced": "Geforceerd", - "tut": "Tijd onder spanning", - "iso": "Isometrische greep", - "jump": "Spring", - "warmup": "Opwarming" + "all": "Alles", + "lastHalfYear": "Laatste 6 maanden", + "lastMonth": "Afgelopen maand", + "value": "Waarde", + "loading": "Aan het laden ...", + "currentWeight": "Huidig gewicht", + "workout": "Workout", + "seeDetails": "Zie details", + "actions": "Actie", + "addEntry": "Item toevoegen", + "notes": "Notities", + "unit": "Eenheid", + "copyToClipboard": "Kopieer naar klembord", + "exercises": { + "replacementsSearch": "Zoek naar een oefening of kopieer en plak een bekende ID in het veld en klik op de knop “laden”.", + "noReplacementSelected": " Geen oefening geselecteerd voor vervanging", + "contributeExercise": "Voeg een oefening toe", + "step1HeaderBasics": "Basis in Engels", + "variations": "Variaties", + "notEnoughRightsHeader": "Je kunt geen oefeningen toevoegen", + "muscles": "Spieren", + "notEnoughRights": "Je kunt alleen oefeningen bijdragen als je account ouder is dan {{days}} dagen en je, je e-mail hebt geverifieerd", + "replacements": "Alternatieven", + "replacementsInfoText": "Optioneel kun je ook een oefening selecteren die deze oefening moet vervangen (b.v. omdat deze twee keer is ingestuurd, of iets dergelijks). Dit zal de oefening vervangen in routines en trainingslogs, in plaats van deze gewoon te verwijderen. Deze wijzigingen worden ook doorgevoerd in elke instantie die de oefeningen van deze instantie synchroniseert.", + "secondaryMuscles": "Secundaire spieren", + "whatVariationsExist": "Welke variaties van deze oefening bestaan er?", + "filterVariations": "Voer de naam van de oefening in om varianten te filteren", + "identicalExercise": "Dubbele oefeningen vermijden", + "identicalExercisePleaseDiscard": "Als je een oefening ziet die identiek is aan de oefening die je toevoegt, gooi je ontwerp dan weg en bewerk in plaats daarvan die oefening.", + "translateExerciseNow": "Vertaal deze oefening nu", + "notes": "Notities", + "cacheWarning": "Door caching kan het even duren voordat de wijzigingen zichtbaar zijn in de hele applicatie.", + "equipment": "Benodigdheden", + "submitExercise": "Verstuur oefening", + "successfullyUpdated": "De oefening is succesvol bijgewerkt. Door caching kan het even duren voordat de wijzigingen zichtbaar zijn in de hele applicatie.", + "description": "Omschrijving", + "basics": "Basis", + "exerciseNotTranslated": "Geen vertaling beschikbaar", + "exerciseNotTranslatedBody": "Deze oefening is momenteel niet beschikbaar in de geselecteerde taal. Wil je een vertaling toevoegen?", + "missingExercise": "Mis je een bepaalde oefening?", + "primaryMuscles": "Primaire spieren", + "deleteTranslation": "Verwijder vertaling", + "deleteExerciseFull": "Verwijder hele oefening", + "deleteExerciseReplace": "Verwijder en vervang", + "exercises": "Oefeningen", + "changeExerciseLanguage": "Wijzig de taal van de oefening", + "noEquipment": "Geen benodigdheden", + "missingExerciseDescription": "Help de gemeenschap door een bijdrage te leveren!", + "searchExerciseName": "Zoeken op naam oefening", + "newNote": "Nieuwe opmerking", + "notesHelpText": "Opmerkingen zijn korte aantekeningen over hoe je de oefening moet uitvoeren, zoals “houd je lichaam recht”", + "imageStyle3D": "3D", + "imageStylePhoto": "Foto", + "imageStyleLine": "Lijn", + "imageStyleLowPoly": "Lage lijn", + "imageStyleOther": "Andere", + "imageDetails": "Beeld details", + "alternativeNames": "Alternatieve namen", + "alsoKnownAs": "Ook bekend als:", + "compatibleImagesCC": "Afbeeldingen moeten compatibel zijn met de CC BY SA-licentie. Als je twijfelt, upload dan alleen foto's die je zelf hebt gemaakt.", + "checkInformationBeforeSubmitting": "Controleer of de ingevoerde informatie correct is voordat u de oefening verzendt", + "deleteExerciseBody": "Wil je de oefening “{{naam}}” verwijderen? Je kunt de huidige {{taal}} vertaling verwijderen of de volledige oefening met alle vertalingen, afbeeldingen, enz.", + "swapExercise": "Wissel oefening" + }, + "filters": "Filters", + "nothingHereYet": "Nog niets ingevuld...", + "nothingHereYetAction": "Druk op de actie knop om te beginnen", + "alsoSearchEnglish": "Zoek ook voor de namen in Engelse taal", + "nutrition": { + "plans": "Voedings plannen", + "copyPlan": "Maak een kopie van dit plan", + "plan": "Maaltijd plan", + "goalsTitle": "Doelen", + "useGoalsHelpText": "Doelen aan dit plan toevoegen", + "useGoalsHelpTextLong": "Hiermee kun je algemene doelen instellen voor energie, eiwitten, koolhydraten of vet voor het plan. Merk op dat als je een gedetailleerd maaltijdplan instelt, deze waarden voorrang krijgen.", + "goalEnergy": "Energiedoel", + "addNutritionalDiary": "Voedingsdagboek toevoegen", + "meal": "Maaltijd", + "addMeal": "Maaltijd toevoegen", + "addMealItem": "Ingrediënt aan maaltijd toevoegen", + "nutritionalDiary": "Voedingsdagboek", + "gramShort": "gr", + "kcal": "kcal", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "macronutrient": "Macronutrient", + "percentEnergy": "Procent energie", + "gPerBodyKg": "gr per kg lichaams gewicht", + "planned": "Gepland", + "logged": "Bijgehouden", + "loggedToday": "Vandaag bijgehouden", + "7dayAvg": "7-dagen gemiddelde", + "energy": "Energie", + "protein": "Eiwit", + "carbohydrates": "Koolhydraten", + "sugar": "Suiker", + "ofWhichSugars": "waarvan suikers", + "fat": "Vet", + "ofWhichSaturated": "Van welke verzadigd", + "saturatedFat": "Vezadigd vet", + "pseudoMealTitle": "Andere logs", + "others": "Andere", + "fibres": "Vezels", + "diaryEntrySaved": "Agenda-item succesvol opgeslagen", + "logThisMealItem": "Log dit ingrediënt in het voedingsdagboek", + "logThisMeal": "Log deze maaltijd in het voedingsdagboek", + "onlyLoggingHelpText": "Alleen calorieën bijhouden. Vink het vakje aan als je alleen je calorieën wilt bijhouden en geen gedetailleerd voedingsplan met specifieke maaltijden wilt instellen", + "goalFiber": "Vezel doel", + "goalFat": "Vet doel", + "today": "Vandaag", + "goalProtein": "Eiwit doel", + "goalCarbohydrates": "Koolhydraten doel", + "valueEnergyKcal": "{{value}} kcal", + "searchIngredientName": "Zoek op ingrediënt naam", + "sodium": "Sodium", + "mealDeleteInfo": "Voedingsdagboekvermeldingen voor deze maaltijd worden niet verwijderd en verschijnen onder “andere logs”", + "valueRemaining": "resterend", + "difference": "Verschil", + "planDeleteInfo": "Hierdoor worden ook alle voedingsdagboekvermeldingen verwijderd", + "valueTooMany": "teveel", + "filterVegan": "Veganistisch", + "filterVegetarian": "Vegetarisch" + }, + "bmi": { + "overweight": "Overgewicht", + "obese": "Obese", + "result": "Je BMI is {{value}}", + "underweight": "Onder gewicht", + "calculator": "BMI calculator", + "normal": "Normaal gewicht" + }, + "downloadAsPdf": "Download als PDF", + "total": "Totaal", + "description": "Beschrijving", + "translation": "Vertaling", + "images": "Afbeeldingen", + "overview": "Overzicht", + "preferences": "Voorkeuren", + "continue": "Ga door", + "goBack": "Ga terug", + "language": "Taal", + "forms": { + "supportedImageFormats": "Alleen JPEG-, PNG-, WEBP- en AVIF-bestanden van minder dan 20Mb worden ondersteund", + "valueTooShort": "De waarde is te kort", + "valueTooLong": "De waarde is te lang", + "fieldRequired": "Dit veld is vereist", + "maxLength": "Voer minder dan {{chars}} tekens in", + "minLength": "Voer meer dan {{chars}} tekens in", + "minValue": "De waarde voor dit veld moet hoger zijn dan {{value}}", + "maxValue": "De waarde voor dit veld moet kleiner zijn dan {{value}}", + "enterNumber": "Voer een geldig nummer in", + "enterInteger": "Voer een geheel getal in", + "maxLessThanMin": "De maximale waarde moet groter zijn dan de minimale waarde", + "endBeforeStart": "De eindwaarde mag niet vóór de beginwaarde liggen" + }, + "name": "Naam", + "category": "Categorie", + "success": "Gelukt!", + "English": "Engels", + "save": "Opslaan", + "videos": "Video's", + "cannotBeUndone": "Deze actie kan niet ongedaan worden gemaakt.", + "cancel": "Cancel", + "noResults": "Geen resultaten", + "noResultsDescription": "Geen resultaten gevonden voor deze zoekopdracht, overweeg het aantal filters te verminderen.", + "routines": { + "addDay": "Trainingsdag toevoegen", + "addWeightLog": "Trainingslogboek toevoegen", + "logsHeader": "Trainingslogboek voor workout", + "routine": "Routine", + "routines": "Routines", + "rir": "RiR", + "addLogToDay": "Logboek toevoegen aan deze dag", + "logsFilterNote": "Merk op dat alleen items met een gewichtseenheid van kg of lb en herhalingen in kaart worden gebracht, andere combinaties zoals tijd of tot falen worden hier genegeerd", + "sets": "Sets", + "reps": "Herhalingen", + "volume": "Volume", + "intensity": "Intensiteit", + "currentRoutine": "Huidige routine", + "iteration": "Iteratie", + "weekly": "Wekelijks", + "daily": "Dagelijks", + "restTime": "Rust tijd", + "workoutNr": "Workout Nr. {{number}}", + "weekNr": "Week {{number}}", + "backToRoutine": "Terug naar routine", + "minLengthRoutine": "De routine moet minimaal {{number}} weken duren", + "maxLengthRoutine": "De routine kan maximaal {{number}} weken duren", + "resultingRoutine": "Resulterende routine", + "deleteDayConfirmation": "Hierdoor worden alle sets, oefeningen en progressieregels verwijderd", + "routineHasNoDays": "De routine heeft geen dagen", + "setHasNoExercises": "Deze set heeft geen oefeningen", + "fitDaysInWeek": "Fitte dagen in de week", + "fitDaysInWeekHelpText": "Deze instelling bepaalt hoe de dagen van je trainingsschema over meerdere weken worden ingepland. Indien ingeschakeld, herhalen de dagen zich in een wekelijkse cyclus. Een schema met trainingen op maandag, woensdag en vrijdag zal dit patroon bijvoorbeeld voortzetten op de daaropvolgende maandag, woensdag en vrijdag. Indien uitgeschakeld, volgen de dagen elkaar op zonder rekening te houden met het begin van een nieuwe week. Dit is handig voor schema's die geen strikt wekelijks schema volgen.", + "needsLogsToAdvance": "Logs zijn nodig om verder te gaan", + "needsLogsToAdvanceHelpText": "Als u deze optie selecteert, gaat de routine alleen door naar de volgende geplande dag als u voor de huidige dag een training hebt geregistreerd. Als deze optie niet is geselecteerd, gaat de routine automatisch door naar de volgende dag, ongeacht of u een training hebt geregistreerd of niet.", + "addSuperset": "Superset toevoegen", + "addExercise": "Oefening toevoegen", + "exerciseNr": "Oefening {{number}}", + "supersetNr": "Superset {{number}}", + "editProgression": "Wijzig progressie", + "progressionNeedsReplace": "Een van de voorgaande entries moet een vervangingsbewerking bevatten", + "exerciseHasProgression": "Deze oefening heeft progressie regels die hier niet gewijzigd kunnen worden. Klik op de knop om dit te doen.", + "defaultRounding": "Standaard afronding", + "rounding": "Afronding (deze oefening)", + "roundingHelp": "Stel de standaard afronding in voor gewicht en herhalingen (dit is vooral handig bij het gebruik van de procentuele verhogingsstap in de progressie). Deze instelling is van toepassing op alle nieuwe sets, maar kan individueel worden gewijzigd in het progressieformulier. Laat dit veld leeg om afronding uit te schakelen.", + "newDay": "Nieuwe dag", + "weightLogNotPlanned": "Logs worden opgeslagen voor een datum waar geen workouts gepland zijn.", + "logsOverview": "Logs overzicht", + "alsoShowLogs": "Toon ook logs", + "statsOverview": "Statistieken", + "simpleMode": "Eenvoudige modus", + "workoutSession": "Workout sessies", + "restDay": "Rust dag", + "confirmRestDay": "Bevestig rustdag verandering", + "confirmRestDayHelpText": "Houd er rekening mee dat alle sets en oefeningen worden verwijderd wanneer u een dag als rustdag markeert.", + "duplicate": "Dupliceer routine", + "downloadPdfTable": "Download PDF (tabel)", + "downloadPdfLogs": "Download PDF (logs)", + "downloadIcal": "Download iCal bestand", + "impression": "Algemene indruk", + "impressionGood": "Goed", + "impressionNeutral": "Neutraal", + "impressionBad": "Slecht", + "impressionHelpText": "Dit formulier registreert je trainingsresultaten (herhalingen, gewicht, enz.) voor elke oefening. Wijzigingen die je hier aanbrengt, zoals het verwijderen of wisselen van oefeningen, hebben alleen invloed op de specifieke gegevens die je opslaat en veranderen je algehele trainingsschema niet. Alleen rijen met waarden voor gewicht of herhalingen worden opgeslagen.", + "addAdditionalLog": "Additionele logs toevoegen", + "operation": "Operatie", + "step": "Stap", + "requirements": "Vereisten", + "requirementsHelpText": "Selecteer de trainingsresultaten (uit eerdere logboeken) waaraan moet worden voldaan om deze regel van kracht te laten worden", + "repeat": "Herhaal regel", + "repeatHelpText": "Vink het selectievakje aan als u wilt dat deze regel van toepassing blijft op volgende trainingen totdat u een nieuwe regel definieert", + "markAsTemplate": "Beheer templates", + "template": "Template", + "templates": "Templates", + "publicTemplate": "Publieke template", + "publicTemplates": "Publieke templates", + "templatesHelpText": "Templates zijn een manier om je routine op te slaan voor later gebruik en als uitgangspunt voor nieuwe routines. Je kunt templates niet bewerken, maar je kunt ze dupliceren en wijzigingen aanbrengen in de kopie (en ze natuurlijk ook weer omzetten naar een normale routine).", + "publicTemplateHelpText": "Publieke templates zijn toegankelijk voor alle gebruikers.", + "copyAndUseTemplate": "Kopieer en gebruik template", + "set": { + "type": "Type", + "normalSet": "Normale set", + "dropSet": "Drop set", + "myo": "MYO", + "partial": "Gedeeltelijk", + "forced": "Geforceerd", + "tut": "Tijd onder spanning", + "iso": "Isometrische greep", + "jump": "Spring", + "warmup": "Opwarming" + }, + "day": { + "custom": "Aangepast", + "enom": "Elke minuut, op de minuut", + "amrap": "Zo veel mogelijk rondes", + "hiit": "High intensity interval training", + "tabata": "Tabata", + "edt": "Oplopende dichtheidstraining", + "rft": "Rondes voor tijd", + "afap": "Zo snel mogelijk" + } + }, + "measurements": { + "measurements": "Metingen", + "unitFormHelpText": "De eenheid waarin de categorie wordt gemeten, bijvoorbeeld: cm of %", + "deleteInfo": "Dit verwijdert de categorie en alle items" + }, + "server": { + "abs": "Buikspieren", + "arms": "Armen", + "back": "Rug", + "barbell": "Barbell", + "bench": "Bench", + "biceps": "Biceps", + "body_weight": "Lichaams gewicht", + "calves": "Kuiten", + "cardio": "Cardio", + "chest": "Borst", + "dumbbell": "Dumbbell", + "glutes": "Billen", + "gym_mat": "Gym matje", + "hamstrings": "Hamstrings", + "incline_bench": "Incline bench", + "kettlebell": "Kettlebell", + "kilometers": "Kilometers", + "kilometers_per_hour": "Kilometers per uur", + "lats": "Brede rugspieren (lats)", + "max_reps": "Max herh.", + "miles": "Mijl", + "miles_per_hour": "Mijl per uur", + "plates": "Schijven", + "pull_up_bar": "Optrek stang", + "quads": "Quads", + "repetitions": "Herhalingen", + "sz_bar": "SZ bar", + "seconds": "Seconden", + "shoulders": "Schouders", + "swiss_ball": "Swiss ball", + "triceps": "Triceps", + "until_failure": "Tot falen", + "kg": "kg", + "lb": "lb", + "none__bodyweight_exercise_": "geen (lichaamsgewicht oefening)", + "legs": "Benen", + "minutes": "Minuten" + }, + "entries": "Invoer", + "no_entries_for_day": "Geen items voor deze dag", + "calendar": "Kalender", + "start": "Start", + "end": "Einde", + "editName": "Bewerk {{naam}}", + "comment": "Commentaar", + "private": "Privé", + "public": "Publiek", + "dashboard": { + "customizeDashboard": "Dashboard aanpassen", + "dragWidgetsHelp": "Sleep widgets om ze te herpositioneren of verander de grootte vanuit de hoek rechts onder.", + "resetLayout": "Reset naar de standaard layout" + }, + "core": { + "exitEditMode": "Sluit bewerkmodus", + "customize": "Bewerk" + }, + "min": "Min", + "max": "Max", + "durationWeeks": "{{number}} weken", + "durationWeeksDays": "{{nrWeeks}} weken, {{nrDays}} dagen", + "undo": "Ongedaan maken", + "successfullyDeleted": "Succesvol verwijderd", + "trophies": { + "trophies": "Trofeeën" }, - "day": { - "custom": "Aangepast", - "enom": "Elke minuut, op de minuut", - "amrap": "Zo veel mogelijk rondes", - "hiit": "High intensity interval training", - "tabata": "Tabata", - "edt": "Oplopende dichtheidstraining", - "rft": "Rondes voor tijd", - "afap": "Zo snel mogelijk" - } - }, - "measurements": { - "measurements": "Metingen", - "unitFormHelpText": "De eenheid waarin de categorie wordt gemeten, bijvoorbeeld: cm of %", - "deleteInfo": "Dit verwijdert de categorie en alle items" - }, - "server": { - "abs": "Buikspieren", - "arms": "Armen", - "back": "Rug", - "barbell": "Barbell", - "bench": "Bench", - "biceps": "Biceps", - "body_weight": "Lichaams gewicht", - "calves": "Kuiten", - "cardio": "Cardio", - "chest": "Borst", - "dumbbell": "Dumbbell", - "glutes": "Billen", - "gym_mat": "Gym matje", - "hamstrings": "Hamstrings", - "incline_bench": "Incline bench", - "kettlebell": "Kettlebell", - "kilometers": "Kilometers", - "kilometers_per_hour": "Kilometers per uur", - "lats": "Brede rugspieren (lats)", - "max_reps": "Max herh.", - "miles": "Mijl", - "miles_per_hour": "Mijl per uur", - "plates": "Schijven", - "pull_up_bar": "Optrek stang", - "quads": "Quads", - "repetitions": "Herhalingen", - "sz_bar": "SZ bar", - "seconds": "Seconden", - "shoulders": "Schouders", - "swiss_ball": "Swiss ball", - "triceps": "Triceps", - "until_failure": "Tot falen", - "kg": "kg", - "lb": "lb", - "none__bodyweight_exercise_": "geen (lichaamsgewicht oefening)", - "legs": "Benen", - "minutes": "Minuten" - }, - "entries": "Invoer", - "no_entries_for_day": "Geen items voor deze dag", - "calendar": "Kalender", - "start": "Start", - "end": "Einde", - "editName": "Bewerk {{naam}}", - "comment": "Commentaar", - "private": "Privé", - "public": "Publiek", - "dashboard": { - "customizeDashboard": "Dashboard aanpassen", - "dragWidgetsHelp": "Sleep widgets om ze te herpositioneren of verander de grootte vanuit de hoek rechts onder.", - "resetLayout": "Reset naar de standaard layout" - }, - "core": { - "exitEditMode": "Sluit bewerkmodus", - "customize": "Bewerk" - }, - "min": "Min", - "max": "Max", - "durationWeeks": "{{number}} weken", - "durationWeeksDays": "{{nrWeeks}} weken, {{nrDays}} dagen", - "undo": "Ongedaan maken", - "successfullyDeleted": "Succesvol verwijderd", - "trophies": { - "trophies": "Trofeeën" - }, - "preview": "Voor­vertoning" + "preview": "Voor­vertoning" } diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 5eb7c3118..ab198cead 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -1,396 +1,396 @@ { - "date": "Data", - "days": "Dias", - "edit": "Editar", - "delete": "Deletar", - "add": "Adicionar", - "weight": "Peso", - "submit": "Enviar", - "difference": "Diferença", - "close": "Fechar", - "nutritionalPlan": "Plano nutricional", - "currentWeight": "Peso atual", - "addEntry": "Adicionar entrada", - "workout": "Treino", - "exercises": { - "searchExerciseName": "Procurar pelo nome do exercício", - "notes": "Notas", + "date": "Data", + "days": "Dias", + "edit": "Editar", + "delete": "Deletar", + "add": "Adicionar", + "weight": "Peso", + "submit": "Enviar", + "difference": "Diferença", + "close": "Fechar", + "nutritionalPlan": "Plano nutricional", + "currentWeight": "Peso atual", + "addEntry": "Adicionar entrada", + "workout": "Treino", + "exercises": { + "searchExerciseName": "Procurar pelo nome do exercício", + "notes": "Notas", + "description": "Descrição", + "arms": "Braços", + "calves": "Panturrilhas", + "chest": "Peito", + "legs": "Pernas", + "shoulders": "Ombros", + "dumbbell": "Halter", + "gym_mat": "Tapete para exercícios", + "incline_bench": "Supino inclinado", + "kettlebell": "Kettlebell", + "pull-up_bar": "Barra fixa", + "sz-bar": "Barra SZ", + "swiss_ball": "Bola suíça", + "none_(bodyweight_exercise)": "nenhum (exercício com o peso do corpo)", + "kilometers": "Quilômetros", + "miles": "Milhas", + "minutes": "Minutos", + "repetitions": "Repetições", + "seconds": "Segundos", + "until_failure": "Até a falha", + "primaryMuscles": "Músculos primários", + "alsoKnownAs": "Também conhecido como:", + "secondaryMuscles": "Músculos secundários", + "back": "Costas", + "barbell": "Barra", + "bench": "Supino", + "noEquipment": "Sem equipamento", + "missingExercise": "Sentindo falta de algum exercício?", + "missingExerciseDescription": "Ajuda a comunidade ao contribuir!", + "contributeExercise": "Contribua um exercício", + "exercises": "Exercícios", + "category": "Categoria", + "equipment": "Equipamento", + "muscles": "Músculos", + "notEnoughRightsHeader": "Você não pode contribuir com exercícios", + "variations": "Variações", + "deleteTranslation": "Deletar traduçao", + "deleteExerciseFull": "Excluir exercício completo", + "changeExerciseLanguage": "Mudar linguagem do exercício", + "basics": "Básico", + "newNote": "Nova nota", + "cacheWarning": "Devido ao caching, pode levar algum tempo até que as alterações sejam visíveis durante todo o processo de aplicação.", + "identicalExercise": "Evitar exercícios duplicados", + "notesHelpText": "As notas são breves comentários sobre como realizar o exercício, tais como \"manter o corpo direito\"", + "deleteExerciseBody": "Quer apagar o exercício \"{{nome}}\"? Pode apagar a tradução atual {{{língua}} ou o exercício completo com todas as traduções, imagens, etc.", + "notEnoughRights": "Você só pode contribuir com exercícios se sua conta tiver mais de {{days}} dias e tiver verificado seu e-mail", + "whatVariationsExist": "Que variações deste exercício existem, se é que existem?", + "filterVariations": "Introduzir o nome do exercício para filtrar variações", + "identicalExercisePleaseDiscard": "Se notar um exercício que seja idêntico ao que está a acrescentar, por favor descarte o seu rascunho e em vez disso edite esse exercício.", + "translateExerciseNow": "Traduza esse exercício agora", + "compatibleImagesCC": "As imagens devem ser compatíveis com a licença CC BY SA. Em caso de dúvida, carregue apenas fotografias que você mesmo tenha tirado.", + "alternativeNames": "Nomes alternativos", + "checkInformationBeforeSubmitting": "Verifique se a informação que introduziu está certa antes de submeter o exercício", + "submitExercise": "Enviar exercício", + "successfullyUpdated": "O exercício foi atualizado com sucesso. Devido ao caching, poderá levar algum tempo até que as alterações sejam visíveis ao longo de toda a aplicação.", + "exerciseNotTranslated": "Sem traduções disponíveis", + "exerciseNotTranslatedBody": "Este exercício não está atualmente disponível na língua atualmente selecionada. Quer contribuir com uma tradução?", + "step1HeaderBasics": "Conceitos básicos em inglês", + "replacementsInfoText": "Opcionalmente, você também pode selecionar um exercício que deva substituir este (por exemplo, porque foi enviado duas vezes ou algo semelhante). Isso substituirá o exercício nas rotinas e também nos registros de treinamento, em vez de apenas excluí-lo. Essas alterações também serão propagadas para qualquer instância que sincronize os exercícios desta.", + "replacements": "Substituições", + "replacementsSearch": "Procure um exercício ou copie e cole um ID conhecido no campo e clique no botão “carregar”.", + "noReplacementSelected": " Nenhum exercício selecionado para substituição", + "deleteExerciseReplace": "Excluir e substituir", + "imageStylePhoto": "Foto", + "imageStyle3D": "3D", + "imageStyleLine": "Linha", + "imageStyleLowPoly": "Baixa Poligonalidade", + "imageStyleOther": "Outro", + "imageDetails": "Detalhes da Imagem", + "swapExercise": "Trocar exercício", + "addImage": "Adicionar imagem" + }, + "noResults": "Sem resultados", + "noResultsDescription": "Nenhum resultado encontrado para essa consulta, considere reduzir o número de filtros.", + "loading": "Carregando...", + "overview": "Panorama", + "preferences": "Preferências", + "continue": "Continuar", + "goBack": "Desça novamente", + "forms": { + "fieldRequired": "Esse campo é obrigatório", + "supportedImageFormats": "São aceitos somente JPEG, PNG, WEBP e AVIF menores de 20Mb", + "valueTooShort": "O valor é muito curto", + "valueTooLong": "O valor é muito longo", + "minValue": "O valor para esse campo deve ser maior que {{value}}", + "maxLength": "Por favor, entre com menos de {{chars}} caracteres", + "minLength": "Por favor, use mais que {{chars}} caracteres", + "maxValue": "O valor para esse campo deve ser menor que {{value}}", + "enterNumber": "Favor inserir um número válido", + "enterInteger": "Favor inserir um número inteiro", + "maxLessThanMin": "O valor máximo deve ser maior que o mínimo", + "endBeforeStart": "O valor de fim não pode anteceder o início" + }, + "cannotBeUndone": "Essa ação é irreversível.", + "server": { + "back": "Costas", + "abs": "Abdominal", + "sz_bar": "Barra SZ", + "pull_up_bar": "Puxar barra", + "kettlebell": "Kettlebell", + "biceps": "Bíceps", + "triceps": "Tríceps", + "quads": "Quadríceps", + "miles": "Milhas", + "minutes": "Minutos", + "kilometers": "Quilômetros", + "arms": "Braços", + "until_failure": "Até falhar", + "gym_mat": "Tapete de ginástica", + "cardio": "Cardio", + "incline_bench": "Supino inclinado", + "dumbbell": "Haltere", + "barbell": "Barra", + "swiss_ball": "Bola suiça", + "shoulders": "Ombros", + "legs": "Pernas", + "repetitions": "Repetições", + "seconds": "Segundos", + "bench": "Supino", + "hamstrings": "Isquiotibiais", + "none__bodyweight_exercise_": "Nenhum (exercício corporal)", + "lower_back": "Lombar", + "calves": "Panturrilha", + "chest": "Peito", + "lats": "Dorsal", + "glutes": "Glúteos", + "body_weight": "Peso corporal", + "miles_per_hour": "Milhas por hora", + "kilometers_per_hour": "Quilômetros por hora", + "kg": "kg", + "lb": "lb", + "plates": "Pratos", + "max_reps": "Número máximo de repetições" + }, "description": "Descrição", - "arms": "Braços", - "calves": "Panturrilhas", - "chest": "Peito", - "legs": "Pernas", - "shoulders": "Ombros", - "dumbbell": "Halter", - "gym_mat": "Tapete para exercícios", - "incline_bench": "Supino inclinado", - "kettlebell": "Kettlebell", - "pull-up_bar": "Barra fixa", - "sz-bar": "Barra SZ", - "swiss_ball": "Bola suíça", - "none_(bodyweight_exercise)": "nenhum (exercício com o peso do corpo)", - "kilometers": "Quilômetros", - "miles": "Milhas", - "minutes": "Minutos", - "repetitions": "Repetições", - "seconds": "Segundos", - "until_failure": "Até a falha", - "primaryMuscles": "Músculos primários", - "alsoKnownAs": "Também conhecido como:", - "secondaryMuscles": "Músculos secundários", - "back": "Costas", - "barbell": "Barra", - "bench": "Supino", - "noEquipment": "Sem equipamento", - "missingExercise": "Sentindo falta de algum exercício?", - "missingExerciseDescription": "Ajuda a comunidade ao contribuir!", - "contributeExercise": "Contribua um exercício", - "exercises": "Exercícios", + "translation": "Tradução", + "images": "Imagens", + "name": "Nome", "category": "Categoria", - "equipment": "Equipamento", - "muscles": "Músculos", - "notEnoughRightsHeader": "Você não pode contribuir com exercícios", - "variations": "Variações", - "deleteTranslation": "Deletar traduçao", - "deleteExerciseFull": "Excluir exercício completo", - "changeExerciseLanguage": "Mudar linguagem do exercício", - "basics": "Básico", - "newNote": "Nova nota", - "cacheWarning": "Devido ao caching, pode levar algum tempo até que as alterações sejam visíveis durante todo o processo de aplicação.", - "identicalExercise": "Evitar exercícios duplicados", - "notesHelpText": "As notas são breves comentários sobre como realizar o exercício, tais como \"manter o corpo direito\"", - "deleteExerciseBody": "Quer apagar o exercício \"{{nome}}\"? Pode apagar a tradução atual {{{língua}} ou o exercício completo com todas as traduções, imagens, etc.", - "notEnoughRights": "Você só pode contribuir com exercícios se sua conta tiver mais de {{days}} dias e tiver verificado seu e-mail", - "whatVariationsExist": "Que variações deste exercício existem, se é que existem?", - "filterVariations": "Introduzir o nome do exercício para filtrar variações", - "identicalExercisePleaseDiscard": "Se notar um exercício que seja idêntico ao que está a acrescentar, por favor descarte o seu rascunho e em vez disso edite esse exercício.", - "translateExerciseNow": "Traduza esse exercício agora", - "compatibleImagesCC": "As imagens devem ser compatíveis com a licença CC BY SA. Em caso de dúvida, carregue apenas fotografias que você mesmo tenha tirado.", - "alternativeNames": "Nomes alternativos", - "checkInformationBeforeSubmitting": "Verifique se a informação que introduziu está certa antes de submeter o exercício", - "submitExercise": "Enviar exercício", - "successfullyUpdated": "O exercício foi atualizado com sucesso. Devido ao caching, poderá levar algum tempo até que as alterações sejam visíveis ao longo de toda a aplicação.", - "exerciseNotTranslated": "Sem traduções disponíveis", - "exerciseNotTranslatedBody": "Este exercício não está atualmente disponível na língua atualmente selecionada. Quer contribuir com uma tradução?", - "step1HeaderBasics": "Conceitos básicos em inglês", - "replacementsInfoText": "Opcionalmente, você também pode selecionar um exercício que deva substituir este (por exemplo, porque foi enviado duas vezes ou algo semelhante). Isso substituirá o exercício nas rotinas e também nos registros de treinamento, em vez de apenas excluí-lo. Essas alterações também serão propagadas para qualquer instância que sincronize os exercícios desta.", - "replacements": "Substituições", - "replacementsSearch": "Procure um exercício ou copie e cole um ID conhecido no campo e clique no botão “carregar”.", - "noReplacementSelected": " Nenhum exercício selecionado para substituição", - "deleteExerciseReplace": "Excluir e substituir", - "imageStylePhoto": "Foto", - "imageStyle3D": "3D", - "imageStyleLine": "Linha", - "imageStyleLowPoly": "Baixa Poligonalidade", - "imageStyleOther": "Outro", - "imageDetails": "Detalhes da Imagem", - "swapExercise": "Trocar exercício", - "addImage": "Adicionar imagem" - }, - "noResults": "Sem resultados", - "noResultsDescription": "Nenhum resultado encontrado para essa consulta, considere reduzir o número de filtros.", - "loading": "Carregando...", - "overview": "Panorama", - "preferences": "Preferências", - "continue": "Continuar", - "goBack": "Desça novamente", - "forms": { - "fieldRequired": "Esse campo é obrigatório", - "supportedImageFormats": "São aceitos somente JPEG, PNG, WEBP e AVIF menores de 20Mb", - "valueTooShort": "O valor é muito curto", - "valueTooLong": "O valor é muito longo", - "minValue": "O valor para esse campo deve ser maior que {{value}}", - "maxLength": "Por favor, entre com menos de {{chars}} caracteres", - "minLength": "Por favor, use mais que {{chars}} caracteres", - "maxValue": "O valor para esse campo deve ser menor que {{value}}", - "enterNumber": "Favor inserir um número válido", - "enterInteger": "Favor inserir um número inteiro", - "maxLessThanMin": "O valor máximo deve ser maior que o mínimo", - "endBeforeStart": "O valor de fim não pode anteceder o início" - }, - "cannotBeUndone": "Essa ação é irreversível.", - "server": { - "back": "Costas", - "abs": "Abdominal", - "sz_bar": "Barra SZ", - "pull_up_bar": "Puxar barra", - "kettlebell": "Kettlebell", - "biceps": "Bíceps", - "triceps": "Tríceps", - "quads": "Quadríceps", - "miles": "Milhas", - "minutes": "Minutos", - "kilometers": "Quilômetros", - "arms": "Braços", - "until_failure": "Até falhar", - "gym_mat": "Tapete de ginástica", - "cardio": "Cardio", - "incline_bench": "Supino inclinado", - "dumbbell": "Haltere", - "barbell": "Barra", - "swiss_ball": "Bola suiça", - "shoulders": "Ombros", - "legs": "Pernas", - "repetitions": "Repetições", - "seconds": "Segundos", - "bench": "Supino", - "hamstrings": "Isquiotibiais", - "none__bodyweight_exercise_": "Nenhum (exercício corporal)", - "lower_back": "Lombar", - "calves": "Panturrilha", - "chest": "Peito", - "lats": "Dorsal", - "glutes": "Glúteos", - "body_weight": "Peso corporal", - "miles_per_hour": "Milhas por hora", - "kilometers_per_hour": "Quilômetros por hora", - "kg": "kg", - "lb": "lb", - "plates": "Pratos", - "max_reps": "Número máximo de repetições" - }, - "description": "Descrição", - "translation": "Tradução", - "images": "Imagens", - "name": "Nome", - "category": "Categoria", - "English": "Inglês", - "language": "Idioma", - "save": "Salvar", - "success": "Sucesso!", - "videos": "Vídeos", - "cancel": "Cancelar", - "routines": { - "addDay": "Adicionar dia de treino", - "addWeightLog": "Adicionar registro de treino", - "addLogToDay": "Adicionar registro para este dia", - "routine": "Rotina", - "routines": "Rotinas", - "logsFilterNote": "Note que apenas entradas com uma unidade de massa de kg ou lb e repetições aparecem no gráfico. Outras combinações tais como tempo ou até falha são ignoradas aqui", - "logsHeader": "Registro de peso para treino", - "rir": "ReR", - "sets": "Séries", - "intensity": "Intensidade", - "currentRoutine": "Rotina atual", - "weekly": "Semanal", - "daily": "Diária", - "restTime": "Tempo de repouso", - "backToRoutine": "Voltar para rotina", - "reps": "Repetições", - "volume": "Volume", - "iteration": "Iteração", - "workoutNr": "Treino n.º {{number}}", - "weekNr": "Semana {{number}}", - "minLengthRoutine": "A rotina tem de ser, pelo menos, de {{number}} semanas", - "maxLengthRoutine": "A rotina pode ser, no máximo, de {{number}} semanas", - "resultingRoutine": "Rotina resultante", - "deleteDayConfirmation": "Isto removerá todas as regras de séries, exercícios e progressões", - "routineHasNoDays": "A rotina não tem dias", - "setHasNoExercises": "Este conjunto não tem exercícios", - "fitDaysInWeek": "Plano semanal fixo", - "needsLogsToAdvance": "Precisa de registo para avançar", - "needsLogsToAdvanceHelpText": "Se escolher esta opção, a rotina só progredirá para o próximo dia agendado se registou um treino para o dia corrente. Se não estiver selecionada, a rotina avançará um dia independentemente de ter registado um treino ou não.", - "addSuperset": "Juntar superset", - "addExercise": "Adicionar exercício", - "exerciseNr": "Exercício {{number}}", - "supersetNr": "Super série {{number}}", - "editProgression": "Editar a progressão", - "progressionNeedsReplace": "Uma das entradas anteriores precisa duma operação de substituição", - "exerciseHasProgression": "Este exercício tem regras de progressão e não pode ser editado aqui. Para o fazer, pressione o botão.", - "defaultRounding": "Arredondamento por defeito", - "rounding": "Arredondamento (este exercício)", - "roundingHelp": "Regista o arredondamento por defeito para peso e repetições (isto é especialmente útil quando usando percentagens no valor do aumento nas progressões). Isto aplicar-se-á a todas as novas séries, mas pode ser alterado individualmente no formulário de progressões. Deixa vazio para desativar arredondamentos.", - "weightLogNotPlanned": "Registando numa data para a qual não estava planeado um treino.", - "logsOverview": "Panorama de registos", - "alsoShowLogs": "Também mostra registos", - "statsOverview": "Estatística", - "simpleMode": "Modo simples", - "confirmRestDay": "Confirma a mudança do dia de descanço", - "restDay": "Dia de descanço", - "confirmRestDayHelpText": "Por favor, repara que todas as repetições e exercícios serão removidos quando marcas um dia como dia de descanso.", - "duplicate": "Duplicar rotina", - "downloadPdfLogs": "Descarrega PDF (registos)", - "downloadPdfTable": "Descarrega PDF (tabela)", - "downloadIcal": "Descarrega ficheiro iCal", - "impression": "Impressão geral", - "impressionGood": "Bom", - "impressionNeutral": "Neutro", - "impressionBad": "Mau", - "impressionHelpText": "Este formulário regista os resultados dos teus treinos (repetições, pesos, etc.) para cada exercício. Alterações feitas aqui, como remover ou trocar exercícios, só afetam este registo específico e não ateram a tua rotina planeada. Só linhas com valores para peso ou repetições são registadas.", - "addAdditionalLog": "Adicionar registo adicional", - "operation": "Operação", - "requirements": "Requisitos", - "requirementsHelpText": "Selecione o resultado do treino (de registos anteriores) que devam ser atingidos para ativar esta regra", - "step": "Passo", - "repeatHelpText": "Marca a caixa de verificação se quiseres que esta regra continue a aplicar-se a treinos posteriores até que definas uma nova", - "markAsTemplate": "Gere modelo", - "template": "Modelo", - "publicTemplates": "Modelos públicos", - "workoutSession": "Sessão de treino", - "templates": "Modelos", - "publicTemplate": "Modelo público", - "fitDaysInWeekHelpText": "Esta opção controla a forma com é agendada a tua rotina ao longo de várias semanas. Se marcada, os dias repetir-se-ão ao longo duma semana. Por exemplo: uma rotina com treinos à segunda, quarta e sexta continuará este padrão na próxima segunda, quarta e sexta. Se desmarcada, os dias seguir-se-ão de forma sequencial independentemente do início duma nova semana. Isto é útil para rotinas que não seguem uma rotina estritamente semanal.", - "repeat": "Repetir regra", - "newDay": "Novo dia", - "templatesHelpText": "Os modelos são uma forma de salvar sua rotina para uso posterior e como ponto de partida para outras rotinas. Você não pode editar modelos, mas pode duplicá-los e fazer alterações na cópia (além de convertê-los de volta à rotina normal, é claro).", - "publicTemplateHelpText": "Os modelos públicos estão disponíveis para todos os usuários.", - "copyAndUseTemplate": "Copie e utilize o modelo", - "set": { - "type": "Tipo", - "normalSet": "Série normal", - "dropSet": "Série descendente", - "myo": "MYO", - "partial": "Parcial", - "forced": "Forçado", - "tut": "Tempo sob tensão", - "iso": "Posição isométrica", - "jump": "Pular", - "warmup": "Aquecimento" + "English": "Inglês", + "language": "Idioma", + "save": "Salvar", + "success": "Sucesso!", + "videos": "Vídeos", + "cancel": "Cancelar", + "routines": { + "addDay": "Adicionar dia de treino", + "addWeightLog": "Adicionar registro de treino", + "addLogToDay": "Adicionar registro para este dia", + "routine": "Rotina", + "routines": "Rotinas", + "logsFilterNote": "Note que apenas entradas com uma unidade de massa de kg ou lb e repetições aparecem no gráfico. Outras combinações tais como tempo ou até falha são ignoradas aqui", + "logsHeader": "Registro de peso para treino", + "rir": "ReR", + "sets": "Séries", + "intensity": "Intensidade", + "currentRoutine": "Rotina atual", + "weekly": "Semanal", + "daily": "Diária", + "restTime": "Tempo de repouso", + "backToRoutine": "Voltar para rotina", + "reps": "Repetições", + "volume": "Volume", + "iteration": "Iteração", + "workoutNr": "Treino n.º {{number}}", + "weekNr": "Semana {{number}}", + "minLengthRoutine": "A rotina tem de ser, pelo menos, de {{number}} semanas", + "maxLengthRoutine": "A rotina pode ser, no máximo, de {{number}} semanas", + "resultingRoutine": "Rotina resultante", + "deleteDayConfirmation": "Isto removerá todas as regras de séries, exercícios e progressões", + "routineHasNoDays": "A rotina não tem dias", + "setHasNoExercises": "Este conjunto não tem exercícios", + "fitDaysInWeek": "Plano semanal fixo", + "needsLogsToAdvance": "Precisa de registo para avançar", + "needsLogsToAdvanceHelpText": "Se escolher esta opção, a rotina só progredirá para o próximo dia agendado se registou um treino para o dia corrente. Se não estiver selecionada, a rotina avançará um dia independentemente de ter registado um treino ou não.", + "addSuperset": "Juntar superset", + "addExercise": "Adicionar exercício", + "exerciseNr": "Exercício {{number}}", + "supersetNr": "Super série {{number}}", + "editProgression": "Editar a progressão", + "progressionNeedsReplace": "Uma das entradas anteriores precisa duma operação de substituição", + "exerciseHasProgression": "Este exercício tem regras de progressão e não pode ser editado aqui. Para o fazer, pressione o botão.", + "defaultRounding": "Arredondamento por defeito", + "rounding": "Arredondamento (este exercício)", + "roundingHelp": "Regista o arredondamento por defeito para peso e repetições (isto é especialmente útil quando usando percentagens no valor do aumento nas progressões). Isto aplicar-se-á a todas as novas séries, mas pode ser alterado individualmente no formulário de progressões. Deixa vazio para desativar arredondamentos.", + "weightLogNotPlanned": "Registando numa data para a qual não estava planeado um treino.", + "logsOverview": "Panorama de registos", + "alsoShowLogs": "Também mostra registos", + "statsOverview": "Estatística", + "simpleMode": "Modo simples", + "confirmRestDay": "Confirma a mudança do dia de descanço", + "restDay": "Dia de descanço", + "confirmRestDayHelpText": "Por favor, repara que todas as repetições e exercícios serão removidos quando marcas um dia como dia de descanso.", + "duplicate": "Duplicar rotina", + "downloadPdfLogs": "Descarrega PDF (registos)", + "downloadPdfTable": "Descarrega PDF (tabela)", + "downloadIcal": "Descarrega ficheiro iCal", + "impression": "Impressão geral", + "impressionGood": "Bom", + "impressionNeutral": "Neutro", + "impressionBad": "Mau", + "impressionHelpText": "Este formulário regista os resultados dos teus treinos (repetições, pesos, etc.) para cada exercício. Alterações feitas aqui, como remover ou trocar exercícios, só afetam este registo específico e não ateram a tua rotina planeada. Só linhas com valores para peso ou repetições são registadas.", + "addAdditionalLog": "Adicionar registo adicional", + "operation": "Operação", + "requirements": "Requisitos", + "requirementsHelpText": "Selecione o resultado do treino (de registos anteriores) que devam ser atingidos para ativar esta regra", + "step": "Passo", + "repeatHelpText": "Marca a caixa de verificação se quiseres que esta regra continue a aplicar-se a treinos posteriores até que definas uma nova", + "markAsTemplate": "Gere modelo", + "template": "Modelo", + "publicTemplates": "Modelos públicos", + "workoutSession": "Sessão de treino", + "templates": "Modelos", + "publicTemplate": "Modelo público", + "fitDaysInWeekHelpText": "Esta opção controla a forma com é agendada a tua rotina ao longo de várias semanas. Se marcada, os dias repetir-se-ão ao longo duma semana. Por exemplo: uma rotina com treinos à segunda, quarta e sexta continuará este padrão na próxima segunda, quarta e sexta. Se desmarcada, os dias seguir-se-ão de forma sequencial independentemente do início duma nova semana. Isto é útil para rotinas que não seguem uma rotina estritamente semanal.", + "repeat": "Repetir regra", + "newDay": "Novo dia", + "templatesHelpText": "Os modelos são uma forma de salvar sua rotina para uso posterior e como ponto de partida para outras rotinas. Você não pode editar modelos, mas pode duplicá-los e fazer alterações na cópia (além de convertê-los de volta à rotina normal, é claro).", + "publicTemplateHelpText": "Os modelos públicos estão disponíveis para todos os usuários.", + "copyAndUseTemplate": "Copie e utilize o modelo", + "set": { + "type": "Tipo", + "normalSet": "Série normal", + "dropSet": "Série descendente", + "myo": "MYO", + "partial": "Parcial", + "forced": "Forçado", + "tut": "Tempo sob tensão", + "iso": "Posição isométrica", + "jump": "Pular", + "warmup": "Aquecimento" + }, + "day": { + "custom": "Personalizado", + "enom": "Dê minuto em minuto", + "amrap": "O máximo de rodadas possível", + "hiit": "Treinamento intervalado de alta intensidade", + "tabata": "Tabata", + "edt": "Treinamento de densidade crescente", + "rft": "Rodadas por tempo", + "afap": "O mais rápido possível" + }, + "addSet": "Adicionar uma série", + "setNr": "Série {{number}}" }, - "day": { - "custom": "Personalizado", - "enom": "Dê minuto em minuto", - "amrap": "O máximo de rodadas possível", - "hiit": "Treinamento intervalado de alta intensidade", - "tabata": "Tabata", - "edt": "Treinamento de densidade crescente", - "rft": "Rodadas por tempo", - "afap": "O mais rápido possível" + "measurements": { + "measurements": "Medidas", + "unitFormHelpText": "A unidade de medida a ser usada para a categoria, ex. cm ou %", + "deleteInfo": "Isso vai apagar a categoria e todas as suas entradas" }, - "addSet": "Adicionar uma série", - "setNr": "Série {{number}}" - }, - "measurements": { - "measurements": "Medidas", - "unitFormHelpText": "A unidade de medida a ser usada para a categoria, ex. cm ou %", - "deleteInfo": "Isso vai apagar a categoria e todas as suas entradas" - }, - "deleteConfirmation": "Tem certeza que deseja deletar \"{{name}}\"?", - "seeDetails": "Ver detalhes", - "actions": "Ações", - "notes": "Notas", - "value": "Valor", - "unit": "Unidade", - "nutrition": { - "percentEnergy": "Percentual de energia", - "fibres": "Fibras", - "saturatedFat": "Gordura saturada", - "goalsTitle": "Metas", - "addMealItem": "Adicionar ingredientes à refeição", - "sugar": "Açúcar", - "goalEnergy": "Meta energética", - "valueEnergyKcal": "{{value}} kcal", - "plan": "Plano nutricional", - "kcal": "kcal", - "planDeleteInfo": "Os diários nutricionais também serão deletados", - "copyPlan": "Copiar plano", - "plans": "Planos nutricionais", - "others": "Outros", - "protein": "Proteína", - "today": "Hoje", - "fat": "Gordura", - "goalProtein": "Meta de proteínas", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "goalFat": "Meta de Gordura", - "meal": "Refeição", - "goalCarbohydrates": "Meta de Carboidratos", - "energy": "Energia", - "useGoalsHelpText": "Adicionar metas ao plano", - "addMeal": "Adicionar refeição", - "carbohydrates": "Carboidratos", - "searchIngredientName": "Procurar pelo nome do ingrediente", - "sodium": "Sódio", - "onlyLoggingHelpText": "Apenas rastreie calorias. Marque a caixa se você deseja apenas registrar suas calorias e não quer configurar um plano nutricional detalhado com refeições específicas", - "ofWhichSugars": "dos quais açúcares", - "ofWhichSaturated": "dos quais saturadas", - "pseudoMealTitle": "Outros registros", - "diaryEntrySaved": "Entrada do diário salva com sucesso", - "logThisMeal": "Registrar esta refeição como está no diário nutricional", - "valueRemaining": "lembrando", - "valueTooMany": "muitos", - "useGoalsHelpTextLong": "Isso permite que você defina metas gerais para energia, proteínas, carboidratos ou gordura para o plano. Observe que se você configurar um plano de refeições detalhado, esses valores terão prioridade.", - "addNutritionalDiary": "Adicionar entrada no diário nutricional", - "nutritionalDiary": "Diário nutricional", - "gramShort": "g", - "macronutrient": "Macronutriente", - "planned": "Planejado", - "gPerBodyKg": "g por kilo de peso", - "logged": "Registrado", - "loggedToday": "Registrado hoje", - "difference": "Diferença", - "7dayAvg": "Média de 7 dias", - "logThisMealItem": "Registrar este ingrediente como está no diário nutricional", - "mealDeleteInfo": "As entradas do diário nutricional para esta refeição não serão excluídas e aparecerão em 'outros registros'", - "goalFiber": "Meta de fibra", - "filterVegetarian": "Vegetariano", - "languageFilterCurrentOnly": "Somente no idioma atual ({{lang}})", - "languageFilterCurrentAndEnglish": "Idioma atual ({{lang}}) & English", - "languageFilterAll": "Todos os idiomas", - "filterVegan": "Vegano", - "filterNutriscore": "Filtro Nutri-Score", - "filterNutriscoreOff": "Desligado", - "filterNutriscoreNoFilter": "Sem filtro", - "filterNutriscoreOrBetter": "{{grade}} ou melhor" - }, - "downloadAsPdf": "Download como PDF", - "nothingHereYet": "Nada aqui por enquanto...", - "total": "Total", - "alsoSearchEnglish": "Também procure por nomes em Inglês", - "timeOfDay": "Hora do dia", - "nothingHereYetAction": "Pressione o botão de ação para começar", - "copyToClipboard": "Copia para a memória", - "licenses": { - "authorProfile": "Link para o perfil ou website do autor, caso exista", - "authors": "Autor(a)", - "derivativeSourceUrl": "Link para a fonte origial, caso for derivado", - "originalTitle": "Titulo", - "derivativeSourceUrlHelper": "Observe que uma obra derivada é aquela que não apenas se baseia em uma obra anterior, mas que também contém conteúdo novo e criativo suficiente para lhe garantir seu próprio direito autoral.", - "originalObjectUrl": "Link para o site de origem, se disponível" - }, - "filters": "Filtros", - "height": "Altura", - "cm": "cm", - "all": "Todos", - "lastYear": "Ano passado", - "lastHalfYear": "Últimos 6 meses", - "lastMonth": "Último mês", - "lastWeek": "Última semana", - "bmi": { - "calculator": "Calculadora de IMC", - "overweight": "Sobrepeso", - "obese": "Obeso", - "normal": "Peso normal", - "underweight": "Subpeso", - "result": "Seu IMC é {{value}}" - }, - "entries": "Entradas", - "calendar": "Calendário", - "no_entries_for_day": "Não há entradas para este dia", - "start": "Iniciar", - "comment": "Comentário", - "editName": "Editar {{name}}", - "undo": "Desfazer", - "successfullyDeleted": "Apagado com sucesso", - "end": "Fim", - "min": "Min", - "max": "Máximo", - "durationWeeks": "{{number}} semanas", - "durationWeeksDays": "{{nrWeeks}} semanas, {{nrDays}} dias", - "dashboard": { - "customizeDashboard": "Personalize o painel de controle", - "dragWidgetsHelp": "Arraste os widgets para reposicioná-los ou redimensioná-los usando o canto inferior direito.", - "resetLayout": "Restaurar o layout padrão" - }, - "core": { - "exitEditMode": "Sair do modo de edição", - "customize": "Personalizar" - }, - "trophies": { - "trophies": "Troféus" - }, - "private": "Privado", - "public": "Público", - "totalChange": "Variação total", - "preview": "Ensaio", - "useMarkdownHint": "Podes usar markdown básico para formatar o texto: *itálico*, **negrigo**, - lista" + "deleteConfirmation": "Tem certeza que deseja deletar \"{{name}}\"?", + "seeDetails": "Ver detalhes", + "actions": "Ações", + "notes": "Notas", + "value": "Valor", + "unit": "Unidade", + "nutrition": { + "percentEnergy": "Percentual de energia", + "fibres": "Fibras", + "saturatedFat": "Gordura saturada", + "goalsTitle": "Metas", + "addMealItem": "Adicionar ingredientes à refeição", + "sugar": "Açúcar", + "goalEnergy": "Meta energética", + "valueEnergyKcal": "{{value}} kcal", + "plan": "Plano nutricional", + "kcal": "kcal", + "planDeleteInfo": "Os diários nutricionais também serão deletados", + "copyPlan": "Copiar plano", + "plans": "Planos nutricionais", + "others": "Outros", + "protein": "Proteína", + "today": "Hoje", + "fat": "Gordura", + "goalProtein": "Meta de proteínas", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "goalFat": "Meta de Gordura", + "meal": "Refeição", + "goalCarbohydrates": "Meta de Carboidratos", + "energy": "Energia", + "useGoalsHelpText": "Adicionar metas ao plano", + "addMeal": "Adicionar refeição", + "carbohydrates": "Carboidratos", + "searchIngredientName": "Procurar pelo nome do ingrediente", + "sodium": "Sódio", + "onlyLoggingHelpText": "Apenas rastreie calorias. Marque a caixa se você deseja apenas registrar suas calorias e não quer configurar um plano nutricional detalhado com refeições específicas", + "ofWhichSugars": "dos quais açúcares", + "ofWhichSaturated": "dos quais saturadas", + "pseudoMealTitle": "Outros registros", + "diaryEntrySaved": "Entrada do diário salva com sucesso", + "logThisMeal": "Registrar esta refeição como está no diário nutricional", + "valueRemaining": "lembrando", + "valueTooMany": "muitos", + "useGoalsHelpTextLong": "Isso permite que você defina metas gerais para energia, proteínas, carboidratos ou gordura para o plano. Observe que se você configurar um plano de refeições detalhado, esses valores terão prioridade.", + "addNutritionalDiary": "Adicionar entrada no diário nutricional", + "nutritionalDiary": "Diário nutricional", + "gramShort": "g", + "macronutrient": "Macronutriente", + "planned": "Planejado", + "gPerBodyKg": "g por kilo de peso", + "logged": "Registrado", + "loggedToday": "Registrado hoje", + "difference": "Diferença", + "7dayAvg": "Média de 7 dias", + "logThisMealItem": "Registrar este ingrediente como está no diário nutricional", + "mealDeleteInfo": "As entradas do diário nutricional para esta refeição não serão excluídas e aparecerão em 'outros registros'", + "goalFiber": "Meta de fibra", + "filterVegetarian": "Vegetariano", + "languageFilterCurrentOnly": "Somente no idioma atual ({{lang}})", + "languageFilterCurrentAndEnglish": "Idioma atual ({{lang}}) & English", + "languageFilterAll": "Todos os idiomas", + "filterVegan": "Vegano", + "filterNutriscore": "Filtro Nutri-Score", + "filterNutriscoreOff": "Desligado", + "filterNutriscoreNoFilter": "Sem filtro", + "filterNutriscoreOrBetter": "{{grade}} ou melhor" + }, + "downloadAsPdf": "Download como PDF", + "nothingHereYet": "Nada aqui por enquanto...", + "total": "Total", + "alsoSearchEnglish": "Também procure por nomes em Inglês", + "timeOfDay": "Hora do dia", + "nothingHereYetAction": "Pressione o botão de ação para começar", + "copyToClipboard": "Copia para a memória", + "licenses": { + "authorProfile": "Link para o perfil ou website do autor, caso exista", + "authors": "Autor(a)", + "derivativeSourceUrl": "Link para a fonte origial, caso for derivado", + "originalTitle": "Titulo", + "derivativeSourceUrlHelper": "Observe que uma obra derivada é aquela que não apenas se baseia em uma obra anterior, mas que também contém conteúdo novo e criativo suficiente para lhe garantir seu próprio direito autoral.", + "originalObjectUrl": "Link para o site de origem, se disponível" + }, + "filters": "Filtros", + "height": "Altura", + "cm": "cm", + "all": "Todos", + "lastYear": "Ano passado", + "lastHalfYear": "Últimos 6 meses", + "lastMonth": "Último mês", + "lastWeek": "Última semana", + "bmi": { + "calculator": "Calculadora de IMC", + "overweight": "Sobrepeso", + "obese": "Obeso", + "normal": "Peso normal", + "underweight": "Subpeso", + "result": "Seu IMC é {{value}}" + }, + "entries": "Entradas", + "calendar": "Calendário", + "no_entries_for_day": "Não há entradas para este dia", + "start": "Iniciar", + "comment": "Comentário", + "editName": "Editar {{name}}", + "undo": "Desfazer", + "successfullyDeleted": "Apagado com sucesso", + "end": "Fim", + "min": "Min", + "max": "Máximo", + "durationWeeks": "{{number}} semanas", + "durationWeeksDays": "{{nrWeeks}} semanas, {{nrDays}} dias", + "dashboard": { + "customizeDashboard": "Personalize o painel de controle", + "dragWidgetsHelp": "Arraste os widgets para reposicioná-los ou redimensioná-los usando o canto inferior direito.", + "resetLayout": "Restaurar o layout padrão" + }, + "core": { + "exitEditMode": "Sair do modo de edição", + "customize": "Personalizar" + }, + "trophies": { + "trophies": "Troféus" + }, + "private": "Privado", + "public": "Público", + "totalChange": "Variação total", + "preview": "Ensaio", + "useMarkdownHint": "Podes usar markdown básico para formatar o texto: *itálico*, **negrigo**, - lista" } diff --git a/public/locales/pt_BR/translation.json b/public/locales/pt_BR/translation.json index 41a7ee333..144d2f638 100644 --- a/public/locales/pt_BR/translation.json +++ b/public/locales/pt_BR/translation.json @@ -1,382 +1,382 @@ { - "routines": { - "rir": "Repetições em reserva(RIR)", - "routine": "Rotina", - "routines": "Rotinas", - "addDay": "Adicionar dia de treinamento", - "addWeightLog": "Adicionar registro de treino", - "logsHeader": "Registro de exercícios para treino", - "logsFilterNote": "Observe que somente as entradas com uma unidade de peso de kg ou lb e repetições são registradas; outras combinações, como tempo ou até a falha, são ignoradas aqui", - "addLogToDay": "Adicionar registro a este dia", - "intensity": "Intensidade", - "currentRoutine": "Rotina atual", - "volume": "Volume", - "weekNr": "Semana {{number}}", - "sets": "Séries", - "reps": "Repetições", - "iteration": "iteração", - "weekly": "Semanalmente", - "daily": "Diariamente", - "restTime": "Tempo de descanso", - "workoutNr": "Treino Nr. {{number}}", - "backToRoutine": "Voltar para a rotina", - "minLengthRoutine": "A rotina precisa durar pelo menos {{number}} semanas", - "maxLengthRoutine": "A rotina pode durar no máximo {{number}} semanas", - "resultingRoutine": "Rotina resultante", - "deleteDayConfirmation": "Isso removerá todas as séries, exercícios e regras de progressão", - "routineHasNoDays": "A rotina não tem dias", - "setHasNoExercises": "Esta série não tem exercícios", - "fitDaysInWeek": "Cronograma semanal fixo", - "fitDaysInWeekHelpText": "Esta configuração controla como os dias da sua rotina são agendados ao longo de múltiplas semanas. Se ativada, os dias se repetirão em um ciclo semanal. Por exemplo, uma rotina com treinos na Segunda, Quarta e Sexta continuará este padrão nas segundas, quartas e sextas seguintes. Se desativada, os dias seguirão sequencialmente sem considerar o início de uma nova semana. Isso é útil para rotinas que não seguem um cronograma semanal rigoroso.", - "needsLogsToAdvance": "Precisa de registros para avançar", - "needsLogsToAdvanceHelpText": "Se você selecionar esta opção, a rotina somente progredirá para o próximo dia agendado se você tiver registrado um treino para o dia atual. Se esta opção não estiver selecionada, a rotina avançará automaticamente para o próximo dia, independentemente de você ter registrado um treino ou não.", - "addSuperset": "Adicionar supersérie", - "addExercise": "Adicionar exercício", - "exerciseNr": "Exercício {{number}}", - "supersetNr": "Supersérie {{number}}", - "editProgression": "Editar progressão", - "progressionNeedsReplace": "Uma das entradas anteriores deve ter uma operação de substituição", - "exerciseHasProgression": "Este exercício possui regras de progressão e não pode ser editado aqui. Para fazer isso, clique no botão.", - "defaultRounding": "Arredondamento padrão", - "rounding": "Arredondamento (este exercício)", - "roundingHelp": "Defina o arredondamento padrão para peso e repetições (isso é especialmente útil ao usar a etapa de aumento percentual na progressão). Isso se aplicará a todas as novas séries, mas pode ser alterado individualmente no formulário de progressão. Deixe vazio para desativar o arredondamento.", - "newDay": "Novo dia", - "weightLogNotPlanned": "Salvando registros em uma data para a qual nenhum treino foi planejado.", - "logsOverview": "Visão geral dos registros", - "alsoShowLogs": "Mostrar também os registros", - "statsOverview": "Estatística", - "simpleMode": "Modo simples", - "workoutSession": "Sessão de treino", - "restDay": "Dia de descanso", - "confirmRestDay": "Confirmar alteração do dia de descanso", - "confirmRestDayHelpText": "Observe que todas as séries e exercícios serão removidos quando você marcar um dia como dia de descanso.", - "duplicate": "Rotina duplicada", - "downloadPdfTable": "Baixar PDF (tabela)", - "downloadPdfLogs": "Baixar PDF (registros)", - "downloadIcal": "Baixar arquivo iCal", - "impression": "Impressão geral", - "impressionGood": "Bom", - "impressionNeutral": "Neutro", - "impressionBad": "Ruim", - "impressionHelpText": "Este formulário registra os resultados do seu treino (repetições, peso, etc.) para cada exercício. Alterações que você fizer aqui, como remover ou trocar exercícios, afetam apenas os registros específicos que você salva e não mudarão sua rotina geral. Apenas as linhas com valores para peso ou repetições são salvas.", - "addAdditionalLog": "Adicionar registro adicional", - "operation": "Operação", - "step": "Etapa", - "requirements": "Requerimento", - "requirementsHelpText": "Selecione os resultados do treino (de registros anteriores) que devem ser atendidos para que esta regra entre em vigor", - "repeat": "Repetir regra", - "repeatHelpText": "Marque a caixa de seleção se desejar que esta regra continue a ser aplicada aos treinos subsequentes até que você defina uma nova", - "markAsTemplate": "Gerenciar modelo", - "template": "Modelo", - "templates": "Modelos", - "publicTemplate": "Modelo público", - "publicTemplates": "Modelos públicos", - "templatesHelpText": "Os modelos são uma forma de salvar sua rotina para uso posterior e como ponto de partida para rotinas futuras. Você não pode editar modelos, mas pode duplicá-los e fazer alterações na cópia (além de convertê-los novamente em uma rotina normal, é claro).", - "publicTemplateHelpText": "Os modelos públicos estão disponíveis para todos os usuários.", - "copyAndUseTemplate": "Copie e use o modelo", - "set": { - "type": "Tipo", - "normalSet": "série normal", - "dropSet": "Drop set", - "partial": "Parcial", - "forced": "Forçado", - "tut": "Tempo sob tensão", - "iso": "Fixação isométrica", - "jump": "Pular", - "myo": "MYO", - "warmup": "Aquecimento" + "routines": { + "rir": "Repetições em reserva(RIR)", + "routine": "Rotina", + "routines": "Rotinas", + "addDay": "Adicionar dia de treinamento", + "addWeightLog": "Adicionar registro de treino", + "logsHeader": "Registro de exercícios para treino", + "logsFilterNote": "Observe que somente as entradas com uma unidade de peso de kg ou lb e repetições são registradas; outras combinações, como tempo ou até a falha, são ignoradas aqui", + "addLogToDay": "Adicionar registro a este dia", + "intensity": "Intensidade", + "currentRoutine": "Rotina atual", + "volume": "Volume", + "weekNr": "Semana {{number}}", + "sets": "Séries", + "reps": "Repetições", + "iteration": "iteração", + "weekly": "Semanalmente", + "daily": "Diariamente", + "restTime": "Tempo de descanso", + "workoutNr": "Treino Nr. {{number}}", + "backToRoutine": "Voltar para a rotina", + "minLengthRoutine": "A rotina precisa durar pelo menos {{number}} semanas", + "maxLengthRoutine": "A rotina pode durar no máximo {{number}} semanas", + "resultingRoutine": "Rotina resultante", + "deleteDayConfirmation": "Isso removerá todas as séries, exercícios e regras de progressão", + "routineHasNoDays": "A rotina não tem dias", + "setHasNoExercises": "Esta série não tem exercícios", + "fitDaysInWeek": "Cronograma semanal fixo", + "fitDaysInWeekHelpText": "Esta configuração controla como os dias da sua rotina são agendados ao longo de múltiplas semanas. Se ativada, os dias se repetirão em um ciclo semanal. Por exemplo, uma rotina com treinos na Segunda, Quarta e Sexta continuará este padrão nas segundas, quartas e sextas seguintes. Se desativada, os dias seguirão sequencialmente sem considerar o início de uma nova semana. Isso é útil para rotinas que não seguem um cronograma semanal rigoroso.", + "needsLogsToAdvance": "Precisa de registros para avançar", + "needsLogsToAdvanceHelpText": "Se você selecionar esta opção, a rotina somente progredirá para o próximo dia agendado se você tiver registrado um treino para o dia atual. Se esta opção não estiver selecionada, a rotina avançará automaticamente para o próximo dia, independentemente de você ter registrado um treino ou não.", + "addSuperset": "Adicionar supersérie", + "addExercise": "Adicionar exercício", + "exerciseNr": "Exercício {{number}}", + "supersetNr": "Supersérie {{number}}", + "editProgression": "Editar progressão", + "progressionNeedsReplace": "Uma das entradas anteriores deve ter uma operação de substituição", + "exerciseHasProgression": "Este exercício possui regras de progressão e não pode ser editado aqui. Para fazer isso, clique no botão.", + "defaultRounding": "Arredondamento padrão", + "rounding": "Arredondamento (este exercício)", + "roundingHelp": "Defina o arredondamento padrão para peso e repetições (isso é especialmente útil ao usar a etapa de aumento percentual na progressão). Isso se aplicará a todas as novas séries, mas pode ser alterado individualmente no formulário de progressão. Deixe vazio para desativar o arredondamento.", + "newDay": "Novo dia", + "weightLogNotPlanned": "Salvando registros em uma data para a qual nenhum treino foi planejado.", + "logsOverview": "Visão geral dos registros", + "alsoShowLogs": "Mostrar também os registros", + "statsOverview": "Estatística", + "simpleMode": "Modo simples", + "workoutSession": "Sessão de treino", + "restDay": "Dia de descanso", + "confirmRestDay": "Confirmar alteração do dia de descanso", + "confirmRestDayHelpText": "Observe que todas as séries e exercícios serão removidos quando você marcar um dia como dia de descanso.", + "duplicate": "Rotina duplicada", + "downloadPdfTable": "Baixar PDF (tabela)", + "downloadPdfLogs": "Baixar PDF (registros)", + "downloadIcal": "Baixar arquivo iCal", + "impression": "Impressão geral", + "impressionGood": "Bom", + "impressionNeutral": "Neutro", + "impressionBad": "Ruim", + "impressionHelpText": "Este formulário registra os resultados do seu treino (repetições, peso, etc.) para cada exercício. Alterações que você fizer aqui, como remover ou trocar exercícios, afetam apenas os registros específicos que você salva e não mudarão sua rotina geral. Apenas as linhas com valores para peso ou repetições são salvas.", + "addAdditionalLog": "Adicionar registro adicional", + "operation": "Operação", + "step": "Etapa", + "requirements": "Requerimento", + "requirementsHelpText": "Selecione os resultados do treino (de registros anteriores) que devem ser atendidos para que esta regra entre em vigor", + "repeat": "Repetir regra", + "repeatHelpText": "Marque a caixa de seleção se desejar que esta regra continue a ser aplicada aos treinos subsequentes até que você defina uma nova", + "markAsTemplate": "Gerenciar modelo", + "template": "Modelo", + "templates": "Modelos", + "publicTemplate": "Modelo público", + "publicTemplates": "Modelos públicos", + "templatesHelpText": "Os modelos são uma forma de salvar sua rotina para uso posterior e como ponto de partida para rotinas futuras. Você não pode editar modelos, mas pode duplicá-los e fazer alterações na cópia (além de convertê-los novamente em uma rotina normal, é claro).", + "publicTemplateHelpText": "Os modelos públicos estão disponíveis para todos os usuários.", + "copyAndUseTemplate": "Copie e use o modelo", + "set": { + "type": "Tipo", + "normalSet": "série normal", + "dropSet": "Drop set", + "partial": "Parcial", + "forced": "Forçado", + "tut": "Tempo sob tensão", + "iso": "Fixação isométrica", + "jump": "Pular", + "myo": "MYO", + "warmup": "Aquecimento" + }, + "day": { + "custom": "Personalizado", + "enom": "A cada minuto (EMOM)", + "amrap": "AMRAP - O máximo de rodadas possível", + "hiit": "HIIT - Treinamento intervalado de alta intensidade", + "edt": "EDT - Treinamento de densidade crescente", + "rft": "RFT - Rodadas por tempo", + "afap": "AFAP - O mais rápido possível", + "tabata": "Tabata" + }, + "addSet": "Adicionar série", + "setNr": "Série {{number}}" }, - "day": { - "custom": "Personalizado", - "enom": "A cada minuto (EMOM)", - "amrap": "AMRAP - O máximo de rodadas possível", - "hiit": "HIIT - Treinamento intervalado de alta intensidade", - "edt": "EDT - Treinamento de densidade crescente", - "rft": "RFT - Rodadas por tempo", - "afap": "AFAP - O mais rápido possível", - "tabata": "Tabata" + "server": { + "glutes": "Glúteos", + "gym_mat": "Tapete de academia", + "hamstrings": "Isquiotibiais", + "abs": "Abs", + "arms": "Braços", + "back": "Voltar", + "barbell": "Barra", + "bench": "Supino", + "biceps": "Bíceps", + "calves": "Panturrilha", + "cardio": "Cardio", + "chest": "Peitoral", + "dumbbell": "Haltere", + "body_weight": "Peso corporal", + "incline_bench": "Supino inclinado", + "kg": "kg", + "none__bodyweight_exercise_": "nenhum (exercício com peso corporal)", + "lb": "lb", + "miles_per_hour": "Milhas por hora", + "kilometers_per_hour": "Kilômetros por hora", + "triceps": "Trícepes", + "kilometers": "Kilômetros", + "max_reps": "Máximo de repetições", + "seconds": "Segundos", + "shoulders": "Ombros", + "swiss_ball": "Bola de pilates", + "until_failure": "Até a falha", + "kettlebell": "Kettlebell", + "lats": "Costas", + "miles": "Milhas", + "minutes": "Minutos", + "plates": "Pesos", + "pull_up_bar": "Barra de pull-up", + "quads": "Quadríceps", + "repetitions": "Repetições", + "sz_bar": "Barra Z", + "legs": "Pernas" }, - "addSet": "Adicionar série", - "setNr": "Série {{number}}" - }, - "server": { - "glutes": "Glúteos", - "gym_mat": "Tapete de academia", - "hamstrings": "Isquiotibiais", - "abs": "Abs", - "arms": "Braços", - "back": "Voltar", - "barbell": "Barra", - "bench": "Supino", - "biceps": "Bíceps", - "calves": "Panturrilha", - "cardio": "Cardio", - "chest": "Peitoral", - "dumbbell": "Haltere", - "body_weight": "Peso corporal", - "incline_bench": "Supino inclinado", - "kg": "kg", - "none__bodyweight_exercise_": "nenhum (exercício com peso corporal)", - "lb": "lb", - "miles_per_hour": "Milhas por hora", - "kilometers_per_hour": "Kilômetros por hora", - "triceps": "Trícepes", - "kilometers": "Kilômetros", - "max_reps": "Máximo de repetições", - "seconds": "Segundos", - "shoulders": "Ombros", - "swiss_ball": "Bola de pilates", - "until_failure": "Até a falha", - "kettlebell": "Kettlebell", - "lats": "Costas", - "miles": "Milhas", - "minutes": "Minutos", - "plates": "Pesos", - "pull_up_bar": "Barra de pull-up", - "quads": "Quadríceps", - "repetitions": "Repetições", - "sz_bar": "Barra Z", - "legs": "Pernas" - }, - "forms": { - "maxLength": "Insira menos de {{chars}} caracteres", - "minValue": "O valor desse campo deve ser maior que {{value}}", - "minLength": "Insira mais de {{chars}} caracteres", - "maxValue": "O valor desse campo deve ser menor que {{value}}", - "valueTooShort": "O valor é muito pequeno", - "supportedImageFormats": "Apenas são suportados arquivos JPEG, PNG, WEBP e AVIF com menos de 20Mb", - "valueTooLong": "O valor é muito longo", - "fieldRequired": "Este campo é obrigatório", - "enterNumber": "Por favor, insira um número válido", - "enterInteger": "Por favor, insira um número inteiro", - "maxLessThanMin": "O valor máximo deve ser maior que o valor mínimo", - "endBeforeStart": "O valor final não pode ser anterior ao inicial" - }, - "translation": "Tradução", - "name": "Nome", - "cancel": "Cancelar", - "noResults": "Sem resultados", - "measurements": { - "unitFormHelpText": "A unidade na qual a categoria será medida, como cm ou %", - "measurements": "Medições", - "deleteInfo": "Isso excluirá a categoria, bem como todas as suas entradas" - }, - "category": "Categoria", - "success": "Concluído com Sucesso!", - "English": "Inglês", - "save": "Salvar", - "videos": "Vídeos", - "cannotBeUndone": "Essa ação não pode ser desfeita.", - "images": "Imagens", - "overview": "visão global", - "preferences": "Preferências", - "continue": "Continuar", - "goBack": "Retornar", - "language": "Linguagem", - "noResultsDescription": "Não foram encontrados resultados para essa consulta, considere a possibilidade de reduzir o número de filtros.", - "exercises": { - "notEnoughRights": "Você só pode contribuir com exercícios se sua conta tiver mais de {{days}} dias e seu e-mail tiver sido verificado", - "notEnoughRightsHeader": "Você não pode contribuir com exercícios", - "translateExerciseNow": "Traduza este exercício agora", - "alternativeNames": "Nomes alternativos", - "identicalExercisePleaseDiscard": "Se você perceber que um exercício é idêntico ao que está adicionando, por favor, descarte o seu rascunho e edite aquele exercício em vez disso.", - "checkInformationBeforeSubmitting": "Por favor, verifique se as informações que você inseriu estão corretas antes de enviar o exercício", - "notes": "Notas", - "equipment": "Equipamento", - "submitExercise": "Enviar exercício", - "successfullyUpdated": "O exercício foi atualizado com sucesso. Devido ao armazenamento em cache, pode levar algum tempo até que as alterações sejam visíveis em toda a aplicação.", + "forms": { + "maxLength": "Insira menos de {{chars}} caracteres", + "minValue": "O valor desse campo deve ser maior que {{value}}", + "minLength": "Insira mais de {{chars}} caracteres", + "maxValue": "O valor desse campo deve ser menor que {{value}}", + "valueTooShort": "O valor é muito pequeno", + "supportedImageFormats": "Apenas são suportados arquivos JPEG, PNG, WEBP e AVIF com menos de 20Mb", + "valueTooLong": "O valor é muito longo", + "fieldRequired": "Este campo é obrigatório", + "enterNumber": "Por favor, insira um número válido", + "enterInteger": "Por favor, insira um número inteiro", + "maxLessThanMin": "O valor máximo deve ser maior que o valor mínimo", + "endBeforeStart": "O valor final não pode ser anterior ao inicial" + }, + "translation": "Tradução", + "name": "Nome", + "cancel": "Cancelar", + "noResults": "Sem resultados", + "measurements": { + "unitFormHelpText": "A unidade na qual a categoria será medida, como cm ou %", + "measurements": "Medições", + "deleteInfo": "Isso excluirá a categoria, bem como todas as suas entradas" + }, + "category": "Categoria", + "success": "Concluído com Sucesso!", + "English": "Inglês", + "save": "Salvar", + "videos": "Vídeos", + "cannotBeUndone": "Essa ação não pode ser desfeita.", + "images": "Imagens", + "overview": "visão global", + "preferences": "Preferências", + "continue": "Continuar", + "goBack": "Retornar", + "language": "Linguagem", + "noResultsDescription": "Não foram encontrados resultados para essa consulta, considere a possibilidade de reduzir o número de filtros.", + "exercises": { + "notEnoughRights": "Você só pode contribuir com exercícios se sua conta tiver mais de {{days}} dias e seu e-mail tiver sido verificado", + "notEnoughRightsHeader": "Você não pode contribuir com exercícios", + "translateExerciseNow": "Traduza este exercício agora", + "alternativeNames": "Nomes alternativos", + "identicalExercisePleaseDiscard": "Se você perceber que um exercício é idêntico ao que está adicionando, por favor, descarte o seu rascunho e edite aquele exercício em vez disso.", + "checkInformationBeforeSubmitting": "Por favor, verifique se as informações que você inseriu estão corretas antes de enviar o exercício", + "notes": "Notas", + "equipment": "Equipamento", + "submitExercise": "Enviar exercício", + "successfullyUpdated": "O exercício foi atualizado com sucesso. Devido ao armazenamento em cache, pode levar algum tempo até que as alterações sejam visíveis em toda a aplicação.", + "description": "Descrição", + "cacheWarning": "Devido ao armazenamento em cache, pode levar algum tempo até que as alterações sejam visíveis em toda a aplicação.", + "missingExerciseDescription": "Ajude a comunidade contribuindo com ele!", + "searchExerciseName": "Buscar por nome do exercício", + "newNote": "Nova nota", + "notesHelpText": "Notas são comentários curtos sobre como realizar o exercício, como \"mantenha seu corpo reto\"", + "whatVariationsExist": "Quais variações deste exercício existem, se houver alguma?", + "filterVariations": "Digite o nome do exercício para filtrar variações", + "identicalExercise": "Evite duplicar exercícios", + "basics": "Noções básicas", + "exerciseNotTranslated": "Tradução não disponível", + "alsoKnownAs": "Também conhecido como:", + "primaryMuscles": "Músculos primários", + "noEquipment": "Sem equipamento", + "missingExercise": "Falta algum exercício específico?", + "contributeExercise": "Contribua com um exercício", + "step1HeaderBasics": "Básico em Inglês", + "variations": "Variações", + "muscles": "Músculos", + "deleteExerciseBody": "Você deseja excluir o exercício \"{{name}}\"? Você pode excluir a tradução atual em {{language}} ou o exercício completo, incluindo todas as traduções, imagens, etc.", + "deleteTranslation": "Excluir tradução", + "deleteExerciseFull": "Excluir exercício completo", + "exercises": "Exercícios", + "changeExerciseLanguage": "Alterar o idioma deste exercício", + "secondaryMuscles": "Músculos secundários", + "compatibleImagesCC": "As imagens devem ser compatíveis com a licença CC BY SA. Em caso de dúvida, faça o upload apenas de fotos tiradas por você mesmo.", + "exerciseNotTranslatedBody": "Este exercício não está disponível no idioma atualmente selecionado. Você deseja contribuir com uma tradução?", + "replacements": "Substituições", + "imageStylePhoto": "Foto", + "replacementsSearch": "Procure por um exercício ou copie e cole um ID conhecido no campo e clique no botão \"carregar\".", + "noReplacementSelected": " Nenhum exercício selecionado para substituição", + "imageStyle3D": "3D", + "imageStyleLine": "Linha", + "imageStyleLowPoly": "Polia Baixa", + "imageStyleOther": "Outros", + "imageDetails": "Detalhes da Imagem", + "replacementsInfoText": "Opcionalmente, você pode também selecionar um exercício que pode substituir esse (ex: porque foi substituído duas vezes, ou similar). Isso irá substituir o exercício em rotinas e também logs de treinos, ao invés de apenas excluí-lo. Essas mudanças irão também ser propagadas para qualquer instancia que sincroniza os exercícios a partir desse.", + "deleteExerciseReplace": "Delete e substitua", + "swapExercise": "Substituir exercício", + "exactMatch": "Correspondência exata", + "replacementCannotBeSame": "O exercício substituto não pode ser o mesmo que está sendo excluído.", + "transferMediaLabel": "Transfira os meios de comunicação para o exercício de substituição", + "transferTranslationsLabel": "Transferir traduções para o idioma substituto (ignora idiomas já presentes)", + "imageIsAiGenerated": "A imagem foi gerada com IA", + "dropOrClickImage": "Arraste e solte uma imagem aqui ou clique para selecionar", + "addImage": "Adicionar imagem" + }, + "notes": "Comentários", + "value": "Valor", + "unit": "Unidade", "description": "Descrição", - "cacheWarning": "Devido ao armazenamento em cache, pode levar algum tempo até que as alterações sejam visíveis em toda a aplicação.", - "missingExerciseDescription": "Ajude a comunidade contribuindo com ele!", - "searchExerciseName": "Buscar por nome do exercício", - "newNote": "Nova nota", - "notesHelpText": "Notas são comentários curtos sobre como realizar o exercício, como \"mantenha seu corpo reto\"", - "whatVariationsExist": "Quais variações deste exercício existem, se houver alguma?", - "filterVariations": "Digite o nome do exercício para filtrar variações", - "identicalExercise": "Evite duplicar exercícios", - "basics": "Noções básicas", - "exerciseNotTranslated": "Tradução não disponível", - "alsoKnownAs": "Também conhecido como:", - "primaryMuscles": "Músculos primários", - "noEquipment": "Sem equipamento", - "missingExercise": "Falta algum exercício específico?", - "contributeExercise": "Contribua com um exercício", - "step1HeaderBasics": "Básico em Inglês", - "variations": "Variações", - "muscles": "Músculos", - "deleteExerciseBody": "Você deseja excluir o exercício \"{{name}}\"? Você pode excluir a tradução atual em {{language}} ou o exercício completo, incluindo todas as traduções, imagens, etc.", - "deleteTranslation": "Excluir tradução", - "deleteExerciseFull": "Excluir exercício completo", - "exercises": "Exercícios", - "changeExerciseLanguage": "Alterar o idioma deste exercício", - "secondaryMuscles": "Músculos secundários", - "compatibleImagesCC": "As imagens devem ser compatíveis com a licença CC BY SA. Em caso de dúvida, faça o upload apenas de fotos tiradas por você mesmo.", - "exerciseNotTranslatedBody": "Este exercício não está disponível no idioma atualmente selecionado. Você deseja contribuir com uma tradução?", - "replacements": "Substituições", - "imageStylePhoto": "Foto", - "replacementsSearch": "Procure por um exercício ou copie e cole um ID conhecido no campo e clique no botão \"carregar\".", - "noReplacementSelected": " Nenhum exercício selecionado para substituição", - "imageStyle3D": "3D", - "imageStyleLine": "Linha", - "imageStyleLowPoly": "Polia Baixa", - "imageStyleOther": "Outros", - "imageDetails": "Detalhes da Imagem", - "replacementsInfoText": "Opcionalmente, você pode também selecionar um exercício que pode substituir esse (ex: porque foi substituído duas vezes, ou similar). Isso irá substituir o exercício em rotinas e também logs de treinos, ao invés de apenas excluí-lo. Essas mudanças irão também ser propagadas para qualquer instancia que sincroniza os exercícios a partir desse.", - "deleteExerciseReplace": "Delete e substitua", - "swapExercise": "Substituir exercício", - "exactMatch": "Correspondência exata", - "replacementCannotBeSame": "O exercício substituto não pode ser o mesmo que está sendo excluído.", - "transferMediaLabel": "Transfira os meios de comunicação para o exercício de substituição", - "transferTranslationsLabel": "Transferir traduções para o idioma substituto (ignora idiomas já presentes)", - "imageIsAiGenerated": "A imagem foi gerada com IA", - "dropOrClickImage": "Arraste e solte uma imagem aqui ou clique para selecionar", - "addImage": "Adicionar imagem" - }, - "notes": "Comentários", - "value": "Valor", - "unit": "Unidade", - "description": "Descrição", - "seeDetails": "Veja detalhes", - "actions": "Ações", - "difference": "Diferença", - "days": "Dias", - "loading": "Carregando...", - "nutritionalPlan": "Plano nutricional", - "addEntry": "Adicionar item", - "currentWeight": "Peso atual", - "workout": "Treino", - "delete": "Excluir", - "weight": "Peso", - "date": "Data", - "submit": "Enviar", - "edit": "Editar", - "add": "Adicionar", - "deleteConfirmation": "Tem certeza que deseja apagar \"{{name}}\"?", - "close": "Fechar", - "total": "Total", - "alsoSearchEnglish": "Pesquise também por nomes em inglês", - "timeOfDay": "Hora do dia", - "licenses": { - "authors": "Autor(es)", - "authorProfile": "Link para o website ou profile do autor, se disponível", - "originalTitle": "Título", - "derivativeSourceUrl": "Link para o conteúdo original, se isso é um trabalho derivativo", - "originalObjectUrl": "Link ao website de origem, se disponível", - "derivativeSourceUrlHelper": "Observe que um trabalho derivado é aquele que não se baseia apenas em um trabalho anterior, mas que também contém conteúdo novo e criativo suficiente para ter direito aos seus próprios direitos autorais." - }, - "filters": "Filtros", - "nothingHereYet": "Nada por aqui ainda...", - "nothingHereYetAction": "Pressione o botão de ação para iniciar", - "copyToClipboard": "Copiar ao clipboard", - "nutrition": { - "goalFat": "Objetivo de gordura", - "addMeal": "Adicionar alimentação", - "addNutritionalDiary": "Adicionar registro no diário alimentar", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "plan": "Plano nutricional", - "addMealItem": "Adicione ingrediente ou alimentação", - "valueEnergyKcal": "{{value}} kcal", - "searchIngredientName": "Procure pelo nome do ingrediente", - "macronutrient": "Macronutriente", - "loggedToday": "Logado hoje", + "seeDetails": "Veja detalhes", + "actions": "Ações", "difference": "Diferença", - "today": "Hoje", - "sugar": "Açúcar", - "ofWhichSugars": "dos quais açúcares", - "fat": "Gordura", - "valueTooMany": "muitos", - "goalFiber": "Objetivo de fibras", - "plans": "Planos nutricionais", - "goalsTitle": "Objetivos", - "useGoalsHelpText": "Adicione objetivos a esse plano", - "goalEnergy": "Objetivo energético", - "goalProtein": "Objetivo proteico", - "goalCarbohydrates": "Objetivo de carboidratos", - "nutritionalDiary": "Nutrição diária", - "gramShort": "g", - "kcal": "kcal", - "planned": "Planejado", - "logged": "Logado", - "percentEnergy": "Porcentagem de energia", - "gPerBodyKg": "g por kg-corpo", - "7dayAvg": "Média em 7-dias", - "ofWhichSaturated": "dos quais saturados", - "saturatedFat": "Gordura saturada", - "pseudoMealTitle": "Outros registros", - "others": "Outros", - "fibres": "Fibras", - "planDeleteInfo": "Isso também apagará todas as entradas do diário alimentar.", - "sodium": "Sódio", - "mealDeleteInfo": "Os registros do diário alimentar referentes a esta refeição não serão excluídos e aparecerão em \"outros registros\".", - "diaryEntrySaved": "Entrada do diário salvo com sucesso", - "logThisMealItem": "Registre este ingrediente tal como está no diário nutricional.", - "valueRemaining": "restantes", - "energy": "Energia", - "carbohydrates": "Carboidratos", - "logThisMeal": "Registre esta refeição tal como está no diário alimentar.", - "copyPlan": "Faça uma cópia deste plano", - "onlyLoggingHelpText": "Monitore apenas calorias. Marque a caixa se quiser apenas registrar suas calorias e não quiser montar um plano nutricional detalhado com refeições específicas", - "useGoalsHelpTextLong": "Isto permite que você defina objetivos gerais para energia, proteína, carboidratos ou gorduras para o plano. Note que se você iniciar um plano alimentar detalhado, estes valores tem precedência.", - "protein": "Proteína", - "meal": "Alimentação", - "languageFilterCurrentOnly": "Apenas no idioma atual ({{lang}})", - "languageFilterCurrentAndEnglish": "Idioma atual ({{lang}}) & inglês", - "languageFilterAll": "Todos os idiomas", - "filterVegan": "Vegano", - "filterVegetarian": "Vegetariano", - "filterNutriscore": "Filtro Nutri-Score", - "filterNutriscoreOff": "Desligado", - "filterNutriscoreNoFilter": "Sem filtro", - "filterNutriscoreOrBetter": "{{grade}} ou melhor" - }, - "downloadAsPdf": "Baixar como PDF", - "height": "Altura", - "cm": "cm", - "all": "Tudo", - "lastYear": "Último Ano", - "lastHalfYear": "Últimos 6 meses", - "lastMonth": "Mês passado", - "lastWeek": "Semana passada", - "bmi": { - "calculator": "Calculadora IMC", - "overweight": "Sobrepeso", - "obese": "Obeso", - "normal": "Peso Normal", - "underweight": "Abaixo do peso", - "result": "Seu IMC é {{value}}" - }, - "calendar": "Calendário", - "entries": "Registros", - "no_entries_for_day": "Sem registros para este dia", - "comment": "Comentário", - "editName": "Editar {{name}}", - "min": "Min", - "max": "Max", - "successfullyDeleted": "Excluído com sucesso.", - "undo": "Desfazer", - "public": "Público", - "private": "Privado", - "durationWeeks": "{{number}} semanas", - "durationWeeksDays": "{{nrWeeks}} semanas, {{nrDays}} dias", - "start": "Iniciar", - "end": "Fim", - "dashboard": { - "customizeDashboard": "Personalizar painel", - "dragWidgetsHelp": "Arraste widgets para reposicioná-los ou redimensione usando o canto inferior direito.", - "resetLayout": "Redefinir para o layout padrão" - }, - "core": { - "exitEditMode": "Sair do modo de edição", - "customize": "Personalizar" - }, - "trophies": { - "trophies": "Troféus" - }, - "totalChange": "Variação total", - "preview": "Pré-visualização", - "useMarkdownHint": "Você pode usar Markdown básico para formatar o texto: *itálico*, **negrito**, - lista", - "currentTrend": "Tendência atual", - "mean": "Significar", - "trend": "Tendência", - "variance": "Variância" + "days": "Dias", + "loading": "Carregando...", + "nutritionalPlan": "Plano nutricional", + "addEntry": "Adicionar item", + "currentWeight": "Peso atual", + "workout": "Treino", + "delete": "Excluir", + "weight": "Peso", + "date": "Data", + "submit": "Enviar", + "edit": "Editar", + "add": "Adicionar", + "deleteConfirmation": "Tem certeza que deseja apagar \"{{name}}\"?", + "close": "Fechar", + "total": "Total", + "alsoSearchEnglish": "Pesquise também por nomes em inglês", + "timeOfDay": "Hora do dia", + "licenses": { + "authors": "Autor(es)", + "authorProfile": "Link para o website ou profile do autor, se disponível", + "originalTitle": "Título", + "derivativeSourceUrl": "Link para o conteúdo original, se isso é um trabalho derivativo", + "originalObjectUrl": "Link ao website de origem, se disponível", + "derivativeSourceUrlHelper": "Observe que um trabalho derivado é aquele que não se baseia apenas em um trabalho anterior, mas que também contém conteúdo novo e criativo suficiente para ter direito aos seus próprios direitos autorais." + }, + "filters": "Filtros", + "nothingHereYet": "Nada por aqui ainda...", + "nothingHereYetAction": "Pressione o botão de ação para iniciar", + "copyToClipboard": "Copiar ao clipboard", + "nutrition": { + "goalFat": "Objetivo de gordura", + "addMeal": "Adicionar alimentação", + "addNutritionalDiary": "Adicionar registro no diário alimentar", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "plan": "Plano nutricional", + "addMealItem": "Adicione ingrediente ou alimentação", + "valueEnergyKcal": "{{value}} kcal", + "searchIngredientName": "Procure pelo nome do ingrediente", + "macronutrient": "Macronutriente", + "loggedToday": "Logado hoje", + "difference": "Diferença", + "today": "Hoje", + "sugar": "Açúcar", + "ofWhichSugars": "dos quais açúcares", + "fat": "Gordura", + "valueTooMany": "muitos", + "goalFiber": "Objetivo de fibras", + "plans": "Planos nutricionais", + "goalsTitle": "Objetivos", + "useGoalsHelpText": "Adicione objetivos a esse plano", + "goalEnergy": "Objetivo energético", + "goalProtein": "Objetivo proteico", + "goalCarbohydrates": "Objetivo de carboidratos", + "nutritionalDiary": "Nutrição diária", + "gramShort": "g", + "kcal": "kcal", + "planned": "Planejado", + "logged": "Logado", + "percentEnergy": "Porcentagem de energia", + "gPerBodyKg": "g por kg-corpo", + "7dayAvg": "Média em 7-dias", + "ofWhichSaturated": "dos quais saturados", + "saturatedFat": "Gordura saturada", + "pseudoMealTitle": "Outros registros", + "others": "Outros", + "fibres": "Fibras", + "planDeleteInfo": "Isso também apagará todas as entradas do diário alimentar.", + "sodium": "Sódio", + "mealDeleteInfo": "Os registros do diário alimentar referentes a esta refeição não serão excluídos e aparecerão em \"outros registros\".", + "diaryEntrySaved": "Entrada do diário salvo com sucesso", + "logThisMealItem": "Registre este ingrediente tal como está no diário nutricional.", + "valueRemaining": "restantes", + "energy": "Energia", + "carbohydrates": "Carboidratos", + "logThisMeal": "Registre esta refeição tal como está no diário alimentar.", + "copyPlan": "Faça uma cópia deste plano", + "onlyLoggingHelpText": "Monitore apenas calorias. Marque a caixa se quiser apenas registrar suas calorias e não quiser montar um plano nutricional detalhado com refeições específicas", + "useGoalsHelpTextLong": "Isto permite que você defina objetivos gerais para energia, proteína, carboidratos ou gorduras para o plano. Note que se você iniciar um plano alimentar detalhado, estes valores tem precedência.", + "protein": "Proteína", + "meal": "Alimentação", + "languageFilterCurrentOnly": "Apenas no idioma atual ({{lang}})", + "languageFilterCurrentAndEnglish": "Idioma atual ({{lang}}) & inglês", + "languageFilterAll": "Todos os idiomas", + "filterVegan": "Vegano", + "filterVegetarian": "Vegetariano", + "filterNutriscore": "Filtro Nutri-Score", + "filterNutriscoreOff": "Desligado", + "filterNutriscoreNoFilter": "Sem filtro", + "filterNutriscoreOrBetter": "{{grade}} ou melhor" + }, + "downloadAsPdf": "Baixar como PDF", + "height": "Altura", + "cm": "cm", + "all": "Tudo", + "lastYear": "Último Ano", + "lastHalfYear": "Últimos 6 meses", + "lastMonth": "Mês passado", + "lastWeek": "Semana passada", + "bmi": { + "calculator": "Calculadora IMC", + "overweight": "Sobrepeso", + "obese": "Obeso", + "normal": "Peso Normal", + "underweight": "Abaixo do peso", + "result": "Seu IMC é {{value}}" + }, + "calendar": "Calendário", + "entries": "Registros", + "no_entries_for_day": "Sem registros para este dia", + "comment": "Comentário", + "editName": "Editar {{name}}", + "min": "Min", + "max": "Max", + "successfullyDeleted": "Excluído com sucesso.", + "undo": "Desfazer", + "public": "Público", + "private": "Privado", + "durationWeeks": "{{number}} semanas", + "durationWeeksDays": "{{nrWeeks}} semanas, {{nrDays}} dias", + "start": "Iniciar", + "end": "Fim", + "dashboard": { + "customizeDashboard": "Personalizar painel", + "dragWidgetsHelp": "Arraste widgets para reposicioná-los ou redimensione usando o canto inferior direito.", + "resetLayout": "Redefinir para o layout padrão" + }, + "core": { + "exitEditMode": "Sair do modo de edição", + "customize": "Personalizar" + }, + "trophies": { + "trophies": "Troféus" + }, + "totalChange": "Variação total", + "preview": "Pré-visualização", + "useMarkdownHint": "Você pode usar Markdown básico para formatar o texto: *itálico*, **negrito**, - lista", + "currentTrend": "Tendência atual", + "mean": "Significar", + "trend": "Tendência", + "variance": "Variância" } diff --git a/public/locales/sr/translation.json b/public/locales/sr/translation.json index 16cccb89e..d76afa044 100644 --- a/public/locales/sr/translation.json +++ b/public/locales/sr/translation.json @@ -1,240 +1,240 @@ { - "alsoSearchEnglish": "Такође претражи имена на енглеском језику", - "close": "Затвори", - "exercises": { - "identicalExercisePleaseDiscard": "Ако приметите вежбу која је идентична овој коју додајете, молимо одустаните од вашег нацрта и уместо тога измените постојећу вежбу.", - "cacheWarning": "Због кеширања, може потрајати док промене не постану видљиве у апликацији.", - "replacements": "Замене", - "replacementsSearch": "Претражи вежбу или пејстуј познати ИД у поље, па притисни дугме \"Учитај\".", - "noReplacementSelected": " Нема вежбе која би могла заменити", - "contributeExercise": "Допринеси вежбу", - "step1HeaderBasics": "Основе на енглеском", - "variations": "Варијације", - "notEnoughRightsHeader": "Не можете допринети вежбом", - "notEnoughRights": "Можете допринети вежбом само ако је ваш налог старији од {{days}} дана и имате верификовану е-мејл адресу", - "muscles": "Мишићи", - "secondaryMuscles": "Секундарни мишићи", - "whatVariationsExist": "Које варијације ове вежбе постоје, ако их има?", - "filterVariations": "Унесите име вежбе за филтрирање варијација", - "identicalExercise": "Извегавајте додавање дупликата", - "translateExerciseNow": "Преведите ову вежбу сада", - "compatibleImagesCC": "Слике морају бити компатибилне са \"CC BY SA\" лиценцом. Ако нисте сигурни, додајте само слике које сте сами усликали.", - "alternativeNames": "Алтернативни називи", + "alsoSearchEnglish": "Такође претражи имена на енглеском језику", + "close": "Затвори", + "exercises": { + "identicalExercisePleaseDiscard": "Ако приметите вежбу која је идентична овој коју додајете, молимо одустаните од вашег нацрта и уместо тога измените постојећу вежбу.", + "cacheWarning": "Због кеширања, може потрајати док промене не постану видљиве у апликацији.", + "replacements": "Замене", + "replacementsSearch": "Претражи вежбу или пејстуј познати ИД у поље, па притисни дугме \"Учитај\".", + "noReplacementSelected": " Нема вежбе која би могла заменити", + "contributeExercise": "Допринеси вежбу", + "step1HeaderBasics": "Основе на енглеском", + "variations": "Варијације", + "notEnoughRightsHeader": "Не можете допринети вежбом", + "notEnoughRights": "Можете допринети вежбом само ако је ваш налог старији од {{days}} дана и имате верификовану е-мејл адресу", + "muscles": "Мишићи", + "secondaryMuscles": "Секундарни мишићи", + "whatVariationsExist": "Које варијације ове вежбе постоје, ако их има?", + "filterVariations": "Унесите име вежбе за филтрирање варијација", + "identicalExercise": "Извегавајте додавање дупликата", + "translateExerciseNow": "Преведите ову вежбу сада", + "compatibleImagesCC": "Слике морају бити компатибилне са \"CC BY SA\" лиценцом. Ако нисте сигурни, додајте само слике које сте сами усликали.", + "alternativeNames": "Алтернативни називи", + "notes": "Белешке", + "equipment": "Опрема", + "checkInformationBeforeSubmitting": "Молимо проверите да ли су информације које сте унели тачне пре слања вежбе", + "submitExercise": "Пошаљи вежбу", + "description": "Опис", + "basics": "Основе", + "exerciseNotTranslated": "Нема доступног превода", + "replacementsInfoText": "Опционо, можете изабрати вежбе које могу заменити ову(нпр. зато што је послата два пута или друго). Ово ће заменити ову вежбу у списку рутина, као и у дневнику тренинга, уместо да је избрише. Ове промене ће се пропагирати на све уређаје који се сихронизују са овим.", + "successfullyUpdated": "Вежба је успешно уплоадована. Звог кеширања, може проћи неко време пре него што промене постану видљиве на апликацији.", + "imageStylePhoto": "Фотографија", + "exerciseNotTranslatedBody": "Ова вежба тренутно није доступна у изабраном језику. Да ли желите да допринесете тако што ћете направити превод?", + "alsoKnownAs": "Такође познат(а) и као:", + "primaryMuscles": "Примарни мишићи", + "deleteTranslation": "Избриши превод", + "deleteExerciseFull": "Избриши целу вежбу", + "deleteExerciseReplace": "Избрижи и замени", + "exercises": "Вежбе", + "changeExerciseLanguage": "Измени језик ове вежбе", + "missingExercise": "Недостаје одређена вежба?", + "newNote": "Нова велешка", + "notesHelpText": "Белешке су кратки коментари о томе како изводити вежбу, попут \"држите тело усправно\"", + "imageStyle3D": "3Д", + "imageStyleLine": "Линија", + "imageStyleLowPoly": "Мало-полигони", + "imageStyleOther": "Остало", + "imageDetails": "Детаљи слике", + "noEquipment": "Без опреме", + "searchExerciseName": "Претражи вежбу по имену", + "deleteExerciseBody": "Дал и желите да избришете вежбу \"{{name}}\"? Можете да избришете било само тренутни превод ( {{language}} ), или да избришете целу вежбу са свим преводима, сликама и осталим подацима...", + "missingExerciseDescription": "Помози нашој заједници својим доприносом!" + }, + "submit": "Пошаљи", + "lastMonth": "Прошли месец", + "weight": "Тежина", + "date": "Датум", + "licenses": { + "derivativeSourceUrlHelper": "Изведени рад који се не темељи само на претходном садржају, те садржи довољно новог, креативног садржаја да би се могло сматрати властитим ауторским делом.", + "derivativeSourceUrl": "Линк ка оригиналном извору, ако је ово изведено дело", + "authors": "Аутор(и)", + "authorProfile": "Линк ка аутору сајта или профила, ако је доступан", + "originalObjectUrl": "Линк ка изворном сајту, ако је доступан", + "originalTitle": "Наслов" + }, + "height": "Висина", + "cm": "цм", + "timeOfDay": "Време у дану", + "edit": "Измени", + "delete": "Избриши", + "deleteConfirmation": "Да ли сте сигурни да желите да избришете \"{{name}}\"?", + "add": "Додај", + "difference": "Разлика", + "days": "Дани", + "all": "Све", + "lastYear": "Прошла година", + "lastHalfYear": "Последњих 6 месеци", + "lastWeek": "Прошла недеља", + "loading": "Учитавање...", + "nutritionalPlan": "План исхране", + "addEntry": "Додај унос", + "currentWeight": "Тренутна тежина", + "workout": "Тренинг", + "seeDetails": "Погледај детаље", + "actions": "Акције", + "nothingHereYet": "За сада нема ничега овде...", + "nothingHereYetAction": "Започни притиском на дугме", "notes": "Белешке", - "equipment": "Опрема", - "checkInformationBeforeSubmitting": "Молимо проверите да ли су информације које сте унели тачне пре слања вежбе", - "submitExercise": "Пошаљи вежбу", + "value": "Вредност", + "copyToClipboard": "Копирај у клипборд", + "filters": "Филтери", + "unit": "Јединица", + "forms": { + "valueTooLong": "Вредност је превише дугачка", + "supportedImageFormats": "Подржани су само JPEG, PNG, WEBP и AVIF фајлови испод 20Mb", + "valueTooShort": "Вредност је сувише кратка", + "fieldRequired": "Ово је обавезно поље", + "maxLength": "Молимо унесите манје од {{chars}} карактера", + "minLength": "Молимо унесите барем {{chars}} карактера", + "maxValue": "Вредност за ово поље мора бити мања од {{value}}", + "minValue": "Вредност за ово поље мора бити већа од {{value}}" + }, + "category": "Категорија", + "routines": { + "logsFilterNote": "Напомена: само уноси са тежином у кг или лб се узимају у обзир, остале комбинације попут оних са временом или фалинкама су игнорисана овде", + "addDay": "Додај дан тренинга", + "addWeightLog": "Додај дневник тренинга", + "logsHeader": "Унос за тренинг", + "addLogToDay": "Додај унос за овај дан", + "routine": "Рутина", + "routines": "Рутине", + "rir": "ПУР" + }, + "nutrition": { + "useGoalsHelpTextLong": "Ово омогућава постављање општих циљева за енергијом, протеином, угљеним хидратима или мастима за план. Напомена: Ако поставите и детаљан план оброка, ове вредности ће бити већег приоритета.", + "today": "Данас", + "useGoalsHelpText": "Додај циљеве у овај план", + "plans": "Планови исхране", + "copyPlan": "Направи копију овог плана", + "plan": "План исхране", + "onlyLoggingHelpText": "Прати само калорије. Изавери ово поље ако желиш да се прате само твоје калорије и не желиш додатни план исхране са специфичним оброцима", + "goalsTitle": "Циљеви", + "goalCarbohydrates": "Циљ за угљене хидрате", + "goalFiber": "Циљ за влакна", + "goalEnergy": "Циљана енергија", + "goalProtein": "Циљани протеини", + "addNutritionalDiary": "Додај унос у дневних исхране", + "addMeal": "Додај оброк", + "addMealItem": "Додај састојке у оброк", + "nutritionalDiary": "Дневних исхране", + "gramShort": "г", + "kcal": "kcal", + "valueEnergyKcal": "{{value}} kcal", + "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", + "searchIngredientName": "Претражи по састојку", + "macronutrient": "Макронутријент", + "percentEnergy": "Проценат енергије", + "gPerBodyKg": "грама по кг тежине", + "loggedToday": "Записано данас", + "difference": "Разлика", + "7dayAvg": "Седмодневни просек", + "energy": "Енергија", + "protein": "Протеини", + "carbohydrates": "Угљени хидрати", + "sugar": "Шећер", + "ofWhichSugars": "од којих шећери", + "ofWhichSaturated": "од којих засићене", + "saturatedFat": "Засићене масти", + "others": "Остали", + "fibres": "Влакна", + "mealDeleteInfo": "Уноси у дневник исхране за овај оброк неће бити избрисани и могу се појавити у одељку \"остали записи\"", + "diaryEntrySaved": "Унос у дневник је успешно сачуван", + "logThisMealItem": "Забележи овај састојак у дневник прехране", + "valueRemaining": "преостало", + "valueTooMany": "превише", + "goalFat": "Циљане масти", + "logThisMeal": "Забележи овај оброк у дневник исхране", + "meal": "Оброк", + "logged": "Записано", + "sodium": "Натријум", + "planned": "Планирано", + "fat": "Масти", + "pseudoMealTitle": "Други записи", + "planDeleteInfo": "Ово ће избрисати и све уносе у дневнику исхране" + }, + "bmi": { + "obese": "Гојазност", + "overweight": "Прекомерна тежина", + "normal": "Нормална тежина", + "underweight": "Испод нормалне тежине", + "result": "Ваш BMI је {{value}}", + "calculator": "BMI калкулатор" + }, + "downloadAsPdf": "Преузми као ПДФ", + "total": "Укупно", "description": "Опис", - "basics": "Основе", - "exerciseNotTranslated": "Нема доступног превода", - "replacementsInfoText": "Опционо, можете изабрати вежбе које могу заменити ову(нпр. зато што је послата два пута или друго). Ово ће заменити ову вежбу у списку рутина, као и у дневнику тренинга, уместо да је избрише. Ове промене ће се пропагирати на све уређаје који се сихронизују са овим.", - "successfullyUpdated": "Вежба је успешно уплоадована. Звог кеширања, може проћи неко време пре него што промене постану видљиве на апликацији.", - "imageStylePhoto": "Фотографија", - "exerciseNotTranslatedBody": "Ова вежба тренутно није доступна у изабраном језику. Да ли желите да допринесете тако што ћете направити превод?", - "alsoKnownAs": "Такође познат(а) и као:", - "primaryMuscles": "Примарни мишићи", - "deleteTranslation": "Избриши превод", - "deleteExerciseFull": "Избриши целу вежбу", - "deleteExerciseReplace": "Избрижи и замени", - "exercises": "Вежбе", - "changeExerciseLanguage": "Измени језик ове вежбе", - "missingExercise": "Недостаје одређена вежба?", - "newNote": "Нова велешка", - "notesHelpText": "Белешке су кратки коментари о томе како изводити вежбу, попут \"држите тело усправно\"", - "imageStyle3D": "3Д", - "imageStyleLine": "Линија", - "imageStyleLowPoly": "Мало-полигони", - "imageStyleOther": "Остало", - "imageDetails": "Детаљи слике", - "noEquipment": "Без опреме", - "searchExerciseName": "Претражи вежбу по имену", - "deleteExerciseBody": "Дал и желите да избришете вежбу \"{{name}}\"? Можете да избришете било само тренутни превод ( {{language}} ), или да избришете целу вежбу са свим преводима, сликама и осталим подацима...", - "missingExerciseDescription": "Помози нашој заједници својим доприносом!" - }, - "submit": "Пошаљи", - "lastMonth": "Прошли месец", - "weight": "Тежина", - "date": "Датум", - "licenses": { - "derivativeSourceUrlHelper": "Изведени рад који се не темељи само на претходном садржају, те садржи довољно новог, креативног садржаја да би се могло сматрати властитим ауторским делом.", - "derivativeSourceUrl": "Линк ка оригиналном извору, ако је ово изведено дело", - "authors": "Аутор(и)", - "authorProfile": "Линк ка аутору сајта или профила, ако је доступан", - "originalObjectUrl": "Линк ка изворном сајту, ако је доступан", - "originalTitle": "Наслов" - }, - "height": "Висина", - "cm": "цм", - "timeOfDay": "Време у дану", - "edit": "Измени", - "delete": "Избриши", - "deleteConfirmation": "Да ли сте сигурни да желите да избришете \"{{name}}\"?", - "add": "Додај", - "difference": "Разлика", - "days": "Дани", - "all": "Све", - "lastYear": "Прошла година", - "lastHalfYear": "Последњих 6 месеци", - "lastWeek": "Прошла недеља", - "loading": "Учитавање...", - "nutritionalPlan": "План исхране", - "addEntry": "Додај унос", - "currentWeight": "Тренутна тежина", - "workout": "Тренинг", - "seeDetails": "Погледај детаље", - "actions": "Акције", - "nothingHereYet": "За сада нема ничега овде...", - "nothingHereYetAction": "Започни притиском на дугме", - "notes": "Белешке", - "value": "Вредност", - "copyToClipboard": "Копирај у клипборд", - "filters": "Филтери", - "unit": "Јединица", - "forms": { - "valueTooLong": "Вредност је превише дугачка", - "supportedImageFormats": "Подржани су само JPEG, PNG, WEBP и AVIF фајлови испод 20Mb", - "valueTooShort": "Вредност је сувише кратка", - "fieldRequired": "Ово је обавезно поље", - "maxLength": "Молимо унесите манје од {{chars}} карактера", - "minLength": "Молимо унесите барем {{chars}} карактера", - "maxValue": "Вредност за ово поље мора бити мања од {{value}}", - "minValue": "Вредност за ово поље мора бити већа од {{value}}" - }, - "category": "Категорија", - "routines": { - "logsFilterNote": "Напомена: само уноси са тежином у кг или лб се узимају у обзир, остале комбинације попут оних са временом или фалинкама су игнорисана овде", - "addDay": "Додај дан тренинга", - "addWeightLog": "Додај дневник тренинга", - "logsHeader": "Унос за тренинг", - "addLogToDay": "Додај унос за овај дан", - "routine": "Рутина", - "routines": "Рутине", - "rir": "ПУР" - }, - "nutrition": { - "useGoalsHelpTextLong": "Ово омогућава постављање општих циљева за енергијом, протеином, угљеним хидратима или мастима за план. Напомена: Ако поставите и детаљан план оброка, ове вредности ће бити већег приоритета.", - "today": "Данас", - "useGoalsHelpText": "Додај циљеве у овај план", - "plans": "Планови исхране", - "copyPlan": "Направи копију овог плана", - "plan": "План исхране", - "onlyLoggingHelpText": "Прати само калорије. Изавери ово поље ако желиш да се прате само твоје калорије и не желиш додатни план исхране са специфичним оброцима", - "goalsTitle": "Циљеви", - "goalCarbohydrates": "Циљ за угљене хидрате", - "goalFiber": "Циљ за влакна", - "goalEnergy": "Циљана енергија", - "goalProtein": "Циљани протеини", - "addNutritionalDiary": "Додај унос у дневних исхране", - "addMeal": "Додај оброк", - "addMealItem": "Додај састојке у оброк", - "nutritionalDiary": "Дневних исхране", - "gramShort": "г", - "kcal": "kcal", - "valueEnergyKcal": "{{value}} kcal", - "valueEnergyKcalKj": "{{kcal}} kcal / {{kj}} kJ", - "searchIngredientName": "Претражи по састојку", - "macronutrient": "Макронутријент", - "percentEnergy": "Проценат енергије", - "gPerBodyKg": "грама по кг тежине", - "loggedToday": "Записано данас", - "difference": "Разлика", - "7dayAvg": "Седмодневни просек", - "energy": "Енергија", - "protein": "Протеини", - "carbohydrates": "Угљени хидрати", - "sugar": "Шећер", - "ofWhichSugars": "од којих шећери", - "ofWhichSaturated": "од којих засићене", - "saturatedFat": "Засићене масти", - "others": "Остали", - "fibres": "Влакна", - "mealDeleteInfo": "Уноси у дневник исхране за овај оброк неће бити избрисани и могу се појавити у одељку \"остали записи\"", - "diaryEntrySaved": "Унос у дневник је успешно сачуван", - "logThisMealItem": "Забележи овај састојак у дневник прехране", - "valueRemaining": "преостало", - "valueTooMany": "превише", - "goalFat": "Циљане масти", - "logThisMeal": "Забележи овај оброк у дневник исхране", - "meal": "Оброк", - "logged": "Записано", - "sodium": "Натријум", - "planned": "Планирано", - "fat": "Масти", - "pseudoMealTitle": "Други записи", - "planDeleteInfo": "Ово ће избрисати и све уносе у дневнику исхране" - }, - "bmi": { - "obese": "Гојазност", - "overweight": "Прекомерна тежина", - "normal": "Нормална тежина", - "underweight": "Испод нормалне тежине", - "result": "Ваш BMI је {{value}}", - "calculator": "BMI калкулатор" - }, - "downloadAsPdf": "Преузми као ПДФ", - "total": "Укупно", - "description": "Опис", - "images": "Слике", - "overview": "Преглед", - "preferences": "Подешавања", - "continue": "Настави", - "goBack": "Назад", - "language": "Језик", - "name": "Име", - "success": "Успешно!", - "English": "Енглески", - "videos": "Видео", - "cancel": "Одустани", - "noResults": "Нема резултата", - "measurements": { - "measurements": "Мерења", - "deleteInfo": "Ово ће избрисати категорију и све њене уносе", - "unitFormHelpText": "Јединица за мерење категорије, нпр. цм или %" - }, - "server": { - "arms": "Руке", - "back": "Леђа", - "barbell": "Шипка", - "bench": "Клупа", - "biceps": "Бицепси", - "body_weight": "Телесна тежина", - "calves": "Листови", - "cardio": "Кардио", - "chest": "Груди", - "dumbbell": "Бучице", - "glutes": "Задњица", - "gym_mat": "Подлога за тренирање", - "hamstrings": "Тетиве", - "incline_bench": "Коса клупа", - "kilometers": "Километара", - "lats": "Леђни мишићи", - "legs": "Ноге", - "max_reps": "Максимални бр. понављања", - "miles_per_hour": "Миља на сат", - "minutes": "Минута", - "plates": "Плочице", - "quads": "Квадрицепс", - "repetitions": "Понављања", - "sz_bar": "Закривљена шипка", - "seconds": "Секунде", - "shoulders": "Рамена", - "swiss_ball": "Гимнастичарска лопта", - "triceps": "Трицепси", - "until_failure": "До неуспеха", - "kg": "кг", - "lb": "лб", - "none__bodyweight_exercise_": "ништа (вежба телесне тежине)", - "miles": "Миље", - "abs": "Трбушњаци", - "kilometers_per_hour": "Километара на сат", - "kettlebell": "Звоно", - "pull_up_bar": "Пречка" - }, - "calendar": "Календар", - "entries": "Уноси", - "no_entries_for_day": "Нема уноса за овај дан", - "noResultsDescription": "Нема резултата за дату претрагу. Покушајте да смањите број филтера.", - "cannotBeUndone": "Ова акција не може бити поништена.", - "translation": "Превод", - "save": "Сачувај" + "images": "Слике", + "overview": "Преглед", + "preferences": "Подешавања", + "continue": "Настави", + "goBack": "Назад", + "language": "Језик", + "name": "Име", + "success": "Успешно!", + "English": "Енглески", + "videos": "Видео", + "cancel": "Одустани", + "noResults": "Нема резултата", + "measurements": { + "measurements": "Мерења", + "deleteInfo": "Ово ће избрисати категорију и све њене уносе", + "unitFormHelpText": "Јединица за мерење категорије, нпр. цм или %" + }, + "server": { + "arms": "Руке", + "back": "Леђа", + "barbell": "Шипка", + "bench": "Клупа", + "biceps": "Бицепси", + "body_weight": "Телесна тежина", + "calves": "Листови", + "cardio": "Кардио", + "chest": "Груди", + "dumbbell": "Бучице", + "glutes": "Задњица", + "gym_mat": "Подлога за тренирање", + "hamstrings": "Тетиве", + "incline_bench": "Коса клупа", + "kilometers": "Километара", + "lats": "Леђни мишићи", + "legs": "Ноге", + "max_reps": "Максимални бр. понављања", + "miles_per_hour": "Миља на сат", + "minutes": "Минута", + "plates": "Плочице", + "quads": "Квадрицепс", + "repetitions": "Понављања", + "sz_bar": "Закривљена шипка", + "seconds": "Секунде", + "shoulders": "Рамена", + "swiss_ball": "Гимнастичарска лопта", + "triceps": "Трицепси", + "until_failure": "До неуспеха", + "kg": "кг", + "lb": "лб", + "none__bodyweight_exercise_": "ништа (вежба телесне тежине)", + "miles": "Миље", + "abs": "Трбушњаци", + "kilometers_per_hour": "Километара на сат", + "kettlebell": "Звоно", + "pull_up_bar": "Пречка" + }, + "calendar": "Календар", + "entries": "Уноси", + "no_entries_for_day": "Нема уноса за овај дан", + "noResultsDescription": "Нема резултата за дату претрагу. Покушајте да смањите број филтера.", + "cannotBeUndone": "Ова акција не може бити поништена.", + "translation": "Превод", + "save": "Сачувај" } diff --git a/public/locales/sv/translation.json b/public/locales/sv/translation.json index 35d19df03..8e4243f46 100644 --- a/public/locales/sv/translation.json +++ b/public/locales/sv/translation.json @@ -1,165 +1,165 @@ { - "weight": "Vikt", - "timeOfDay": "Tid på dygnet", - "height": "Längd", - "date": "Datum", - "cm": "cm", - "edit": "Ändra", - "delete": "Ta bort", - "deleteConfirmation": "Är du säker på att du vill ta bort \"{{name}}\"?", - "add": "Lägg till", - "difference": "Skillnad", - "days": "Dagar", - "all": "Alla", - "lastYear": "Förra året", - "lastHalfYear": "Senaste 6 månaderna", - "lastMonth": "Förra månaden", - "lastWeek": "Förra veckan", - "close": "Stäng", - "submit": "Skicka", - "licenses": { - "derivativeSourceUrl": "Länk till original, om detta är ett härlett verk", - "originalObjectUrl": "Länk till källa, om sådan finns", - "originalTitle": "Rubrik", - "authors": "Författare", - "authorProfile": "Länk till författares websida eller profil, om tillgänglig", - "derivativeSourceUrlHelper": "Observera att ett verk som inte bara är baserat på ett tidigare verk, utan som också innehåller tillräckligt med nytt, kreativt innehåll kan ge det rätt till sin egen upphovsrätt." - }, - "workout": "Träningspass", - "loading": "Laddar...", - "nutritionalPlan": "Kostplan", - "addEntry": "Registrera", - "currentWeight": "Nuvarande vikt", - "seeDetails": "Visa detaljer", - "actions": "Åtgärder", - "nothingHereYet": "Här var det tomt...", - "nothingHereYetAction": "Tryck på knappen för att fortsätta", - "notes": "Anteckningar", - "value": "Värde", - "unit": "Enhet", - "alsoSearchEnglish": "Sök även efter namn på engelska", - "copyToClipboard": "Kopiera till urklipp", - "filters": "Filter", - "exercises": { - "replacements": "Ersättningar", - "noReplacementSelected": " Ingen övning vald", - "contributeExercise": "Lägg till en övning", - "step1HeaderBasics": "Grunder på engelska", - "variations": "Variationer", - "notEnoughRightsHeader": "Du kan inte lägga till övningar", - "replacementsSearch": "Sök efter en övning eller klistra in ett ID i fältet och klicka på knappen \"hämta\".", - "notEnoughRights": "Du kan bara bidra med övningar om ditt konto är äldre än {{days}} dagar och att du har verifierat din e-post", - "muscles": "Muskler", - "whatVariationsExist": "Vilka andra varianter finns det?", - "identicalExercise": "Undvik upprepade övningar", - "translateExerciseNow": "Översätt denna övning nu", - "compatibleImagesCC": "Bilderna måste vara kompatibla med CC BY SA-licensen. Om du är osäker kan du bara ladda upp foton som du har tagit själv.", - "alternativeNames": "Alternativa namn", - "notes": "Noteringar", - "equipment": "Utrustning", - "checkInformationBeforeSubmitting": "Kontrollera att de uppgifter du angett är korrekta innan du skickar in övningen", - "identicalExercisePleaseDiscard": "Om du upptäcker en övning som är identiskt med den du försöker lägga till, vänligen använd den befintliga istället.", - "replacementsInfoText": "Alternativt kan du också välja en övning som ska ersätta den här (t.ex. för att den har lämnats in två gånger eller liknande). Detta kommer att ersätta träningen i rutiner samt träningsloggar, istället för att bara radera den. Dessa ändringar kommer också att spridas till alla instanser som synkroniserar övningarna från den här.", - "basics": "Grunderna", - "deleteTranslation": "Radera översättning", - "deleteExerciseReplace": "Radera och ersätt", - "exercises": "Övningar", - "newNote": "Ny notering", - "secondaryMuscles": "Sekundära muskler", - "submitExercise": "Skicka in övning", - "description": "Beskrivning", - "imageStyle3D": "3D", - "imageStyleLine": "Linje", - "imageDetails": "Bild detaljer", - "noEquipment": "Ingen utrustning", - "imageStyleLowPoly": "Lågpoly", - "primaryMuscles": "Primära muskler", - "exerciseNotTranslated": "Ingen översättning tillgänglig", - "imageStylePhoto": "Bild" - }, - "description": "Beskrivning", - "translation": "Översättning", - "images": "Bilder", - "overview": "Överblick", - "preferences": "Inställningar", - "continue": "Fortsätt", - "goBack": "Gå tillbaka", - "language": "Språk", - "forms": { - "supportedImageFormats": "Endast JPEG, PNG, WEBP och AVIF med en storlek under 20MB stöds", - "valueTooShort": "Värdet är för kort", - "valueTooLong": "Värdet är för långt", - "fieldRequired": "Detta fält är obligatoriskt", - "maxLength": "Ange färre än {{chars}} tecken", - "minLength": "Ange fler än {{chars}} tecken", - "minValue": "Värdet för detta fält måste överstiga {{value}}", - "maxValue": "Värdet för detta fält måste vara mindre än {{value}}" - }, - "name": "Namn", - "category": "Kategori", - "success": "Lyckat!", - "English": "Engelska", - "save": "Spara", - "videos": "Videos", - "cannotBeUndone": "Denna åtgärd kan inte ångras.", - "cancel": "Avbryt", - "noResults": "Inga resultat", - "noResultsDescription": "Inga resultat hittades för den här frågan, överväg att minska antalet filter.", - "routines": { - "addDay": "Lägg till träningsdag", - "addWeightLog": "Lägg till tränings logg", - "logsHeader": "Logg för träningspass", - "logsFilterNote": "Observera att endast poster med en viktenhet på kg eller lb och repetitioner kartläggs, andra kombinationer som tid eller tills fel ignoreras här", - "volume": "Volym", - "intensity": "Intensitet", - "currentRoutine": "Nuvarande rutin", - "iteration": "Iteration", - "daily": "Daglig", - "weekNr": "Vecka {{number}}", - "addExercise": "Lägg till övning", - "exerciseNr": "Övning {{number}}", - "newDay": "Ny dag", - "statsOverview": "Statistik", - "duplicate": "Duplicera rutin", - "downloadPdfTable": "Ladda ned PDF (tabell)", - "downloadIcal": "Ladda ned iCal fil", - "impressionGood": "Bra", - "impressionNeutral": "Neutral", - "step": "Steg", - "template": "Mall", - "templates": "Mallar", - "routines": "Rutiner", - "routine": "Rutin" - }, - "editName": "Ändra {{namn}}", - "start": "Start", - "end": "Slut", - "nutrition": { - "addMeal": "Lägg till måltid", - "addMealItem": "Lägg till ingredienser till måltid", - "gramShort": "g", - "kcal": "kcal", - "valueEnergyKcal": "{{value}} kcal", - "planned": "Planerad", + "weight": "Vikt", + "timeOfDay": "Tid på dygnet", + "height": "Längd", + "date": "Datum", + "cm": "cm", + "edit": "Ändra", + "delete": "Ta bort", + "deleteConfirmation": "Är du säker på att du vill ta bort \"{{name}}\"?", + "add": "Lägg till", "difference": "Skillnad", - "energy": "Energi", - "today": "Idag", - "fat": "Fett", - "meal": "Måltid", - "goalsTitle": "Mål", - "protein": "Protein", - "copyPlan": "Skapa en kopia av planen", - "sugar": "Socker" - }, - "bmi": { - "result": "Ditt BMI är {{value}}", - "overweight": "Överviktig", - "normal": "Normal vikt", - "underweight": "Underviktig", - "calculator": "BMI kalkylator" - }, - "durationWeeks": "{{number}} veckor", - "durationWeeksDays": "{{nrWeeks}} veckor, {{nrDays}} dagar", - "downloadAsPdf": "Ladda ned som PDF", - "comment": "Kommentar" + "days": "Dagar", + "all": "Alla", + "lastYear": "Förra året", + "lastHalfYear": "Senaste 6 månaderna", + "lastMonth": "Förra månaden", + "lastWeek": "Förra veckan", + "close": "Stäng", + "submit": "Skicka", + "licenses": { + "derivativeSourceUrl": "Länk till original, om detta är ett härlett verk", + "originalObjectUrl": "Länk till källa, om sådan finns", + "originalTitle": "Rubrik", + "authors": "Författare", + "authorProfile": "Länk till författares websida eller profil, om tillgänglig", + "derivativeSourceUrlHelper": "Observera att ett verk som inte bara är baserat på ett tidigare verk, utan som också innehåller tillräckligt med nytt, kreativt innehåll kan ge det rätt till sin egen upphovsrätt." + }, + "workout": "Träningspass", + "loading": "Laddar...", + "nutritionalPlan": "Kostplan", + "addEntry": "Registrera", + "currentWeight": "Nuvarande vikt", + "seeDetails": "Visa detaljer", + "actions": "Åtgärder", + "nothingHereYet": "Här var det tomt...", + "nothingHereYetAction": "Tryck på knappen för att fortsätta", + "notes": "Anteckningar", + "value": "Värde", + "unit": "Enhet", + "alsoSearchEnglish": "Sök även efter namn på engelska", + "copyToClipboard": "Kopiera till urklipp", + "filters": "Filter", + "exercises": { + "replacements": "Ersättningar", + "noReplacementSelected": " Ingen övning vald", + "contributeExercise": "Lägg till en övning", + "step1HeaderBasics": "Grunder på engelska", + "variations": "Variationer", + "notEnoughRightsHeader": "Du kan inte lägga till övningar", + "replacementsSearch": "Sök efter en övning eller klistra in ett ID i fältet och klicka på knappen \"hämta\".", + "notEnoughRights": "Du kan bara bidra med övningar om ditt konto är äldre än {{days}} dagar och att du har verifierat din e-post", + "muscles": "Muskler", + "whatVariationsExist": "Vilka andra varianter finns det?", + "identicalExercise": "Undvik upprepade övningar", + "translateExerciseNow": "Översätt denna övning nu", + "compatibleImagesCC": "Bilderna måste vara kompatibla med CC BY SA-licensen. Om du är osäker kan du bara ladda upp foton som du har tagit själv.", + "alternativeNames": "Alternativa namn", + "notes": "Noteringar", + "equipment": "Utrustning", + "checkInformationBeforeSubmitting": "Kontrollera att de uppgifter du angett är korrekta innan du skickar in övningen", + "identicalExercisePleaseDiscard": "Om du upptäcker en övning som är identiskt med den du försöker lägga till, vänligen använd den befintliga istället.", + "replacementsInfoText": "Alternativt kan du också välja en övning som ska ersätta den här (t.ex. för att den har lämnats in två gånger eller liknande). Detta kommer att ersätta träningen i rutiner samt träningsloggar, istället för att bara radera den. Dessa ändringar kommer också att spridas till alla instanser som synkroniserar övningarna från den här.", + "basics": "Grunderna", + "deleteTranslation": "Radera översättning", + "deleteExerciseReplace": "Radera och ersätt", + "exercises": "Övningar", + "newNote": "Ny notering", + "secondaryMuscles": "Sekundära muskler", + "submitExercise": "Skicka in övning", + "description": "Beskrivning", + "imageStyle3D": "3D", + "imageStyleLine": "Linje", + "imageDetails": "Bild detaljer", + "noEquipment": "Ingen utrustning", + "imageStyleLowPoly": "Lågpoly", + "primaryMuscles": "Primära muskler", + "exerciseNotTranslated": "Ingen översättning tillgänglig", + "imageStylePhoto": "Bild" + }, + "description": "Beskrivning", + "translation": "Översättning", + "images": "Bilder", + "overview": "Överblick", + "preferences": "Inställningar", + "continue": "Fortsätt", + "goBack": "Gå tillbaka", + "language": "Språk", + "forms": { + "supportedImageFormats": "Endast JPEG, PNG, WEBP och AVIF med en storlek under 20MB stöds", + "valueTooShort": "Värdet är för kort", + "valueTooLong": "Värdet är för långt", + "fieldRequired": "Detta fält är obligatoriskt", + "maxLength": "Ange färre än {{chars}} tecken", + "minLength": "Ange fler än {{chars}} tecken", + "minValue": "Värdet för detta fält måste överstiga {{value}}", + "maxValue": "Värdet för detta fält måste vara mindre än {{value}}" + }, + "name": "Namn", + "category": "Kategori", + "success": "Lyckat!", + "English": "Engelska", + "save": "Spara", + "videos": "Videos", + "cannotBeUndone": "Denna åtgärd kan inte ångras.", + "cancel": "Avbryt", + "noResults": "Inga resultat", + "noResultsDescription": "Inga resultat hittades för den här frågan, överväg att minska antalet filter.", + "routines": { + "addDay": "Lägg till träningsdag", + "addWeightLog": "Lägg till tränings logg", + "logsHeader": "Logg för träningspass", + "logsFilterNote": "Observera att endast poster med en viktenhet på kg eller lb och repetitioner kartläggs, andra kombinationer som tid eller tills fel ignoreras här", + "volume": "Volym", + "intensity": "Intensitet", + "currentRoutine": "Nuvarande rutin", + "iteration": "Iteration", + "daily": "Daglig", + "weekNr": "Vecka {{number}}", + "addExercise": "Lägg till övning", + "exerciseNr": "Övning {{number}}", + "newDay": "Ny dag", + "statsOverview": "Statistik", + "duplicate": "Duplicera rutin", + "downloadPdfTable": "Ladda ned PDF (tabell)", + "downloadIcal": "Ladda ned iCal fil", + "impressionGood": "Bra", + "impressionNeutral": "Neutral", + "step": "Steg", + "template": "Mall", + "templates": "Mallar", + "routines": "Rutiner", + "routine": "Rutin" + }, + "editName": "Ändra {{namn}}", + "start": "Start", + "end": "Slut", + "nutrition": { + "addMeal": "Lägg till måltid", + "addMealItem": "Lägg till ingredienser till måltid", + "gramShort": "g", + "kcal": "kcal", + "valueEnergyKcal": "{{value}} kcal", + "planned": "Planerad", + "difference": "Skillnad", + "energy": "Energi", + "today": "Idag", + "fat": "Fett", + "meal": "Måltid", + "goalsTitle": "Mål", + "protein": "Protein", + "copyPlan": "Skapa en kopia av planen", + "sugar": "Socker" + }, + "bmi": { + "result": "Ditt BMI är {{value}}", + "overweight": "Överviktig", + "normal": "Normal vikt", + "underweight": "Underviktig", + "calculator": "BMI kalkylator" + }, + "durationWeeks": "{{number}} veckor", + "durationWeeksDays": "{{nrWeeks}} veckor, {{nrDays}} dagar", + "downloadAsPdf": "Ladda ned som PDF", + "comment": "Kommentar" } diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index ee7b9af7b..46e157b0a 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -1,238 +1,238 @@ { - "add": "Ekle", - "addEntry": "Giriş ekle", - "close": "Kapat", - "currentWeight": "Şu anki ağırlık", - "date": "Tarih", - "days": "Gün", - "delete": "Sil", - "difference": "Fark", - "edit": "Düzenle", - "exercises": { - "alsoKnownAs": "Ayrıca şöyle bilinir:", + "add": "Ekle", + "addEntry": "Giriş ekle", + "close": "Kapat", + "currentWeight": "Şu anki ağırlık", + "date": "Tarih", + "days": "Gün", + "delete": "Sil", + "difference": "Fark", + "edit": "Düzenle", + "exercises": { + "alsoKnownAs": "Ayrıca şöyle bilinir:", + "category": "Kategori", + "contributeExercise": "Bir egzersize katkıda bulunun", + "equipment": "Ekipman", + "exercises": "Egzersizler", + "missingExercise": "Bir egzersiz mi eksik?", + "missingExerciseDescription": "Katkıda bulunarak topluluğa yardım edin!", + "muscles": "Kaslar", + "noEquipment": "Ekipman yok", + "notes": "Notlar", + "primaryMuscles": "Birincil kaslar", + "searchExerciseName": "Egzersiz adına göre ara", + "secondaryMuscles": "İkincil kaslar", + "variations": "Varyasyonlar", + "deleteTranslation": "Çeviriyi sil", + "deleteExerciseFull": "Tüm egzersizi sil", + "newNote": "Yeni not", + "basics": "Temeller", + "exerciseNotTranslatedBody": "Seçtiğiniz egzersiz şu anda dilinde mevcut değil. Çeviriye katkıda bulunmak ister misiniz?", + "changeExerciseLanguage": "Egzersizin dilini değiştir", + "exerciseNotTranslated": "Çeviri mevcut değil", + "notEnoughRights": "Yalnızca hesabınız {{days}} günden eskiyse ve e-posta adresinizi doğruladıysanız egzersizlere katkıda bulunabilirsiniz", + "description": "Açıklama", + "notEnoughRightsHeader": "Egzersizlere katkıda bulunamazsın", + "translateExerciseNow": "Bu egzersizi şimdi çevir", + "checkInformationBeforeSubmitting": "Lütfen egzersinizi göndermeden önce girdiğiniz bilgilerin doğru olduğunu kontrol edin", + "submitExercise": "Egzersizi gönder", + "successfullyUpdated": "Egzersiz başarıyla güncellendi. Önbelleğe alma nedeniyle, değişikliklerin uygulama genelinde görünmesi biraz zaman alabilir.", + "alternativeNames": "Alternatif isimler", + "compatibleImagesCC": "Görseller CC BY SA lisansı ile uyumlu olmalıdır. Emin değilseniz, yalnızca kendi çektiğiniz fotoğrafları yükleyin.", + "whatVariationsExist": "Varsa, bu alıştırmanın hangi varyasyonları mevcuttur?", + "notesHelpText": "Notlar \"vücudunuzu dik tutun\" gibi egzersizin nasıl yapılacağına dair kısa yorumlardır", + "filterVariations": "Varyasyonları filtrelemek için egzersiz adı girin", + "deleteExerciseBody": "\"{{name}}\" egzersizini silmek istiyor musunuz? İster {{language}} çeviriyi silebilirsiniz, isterseniz alıştırmanın tamamını silebilirsiniz tüm çeviriler, resimler vb.", + "step1HeaderBasics": "İngilizce'de temel bilgiler", + "identicalExercisePleaseDiscard": "Eklediğiniz egzersizle aynı olan bir egzersiz fark ederseniz, lütfen taslağınızı atın ve bunun yerine o egzersizi düzenleyin.", + "identicalExercise": "Yinelenen egzersizlerden kaçın", + "cacheWarning": "Önbelleğe alma nedeniyle değişikliklerin uygulama genelinde görünür olması biraz zaman alabilir.", + "replacements": "Değişimler", + "replacementsInfoText": "İsteğe bağlı olarak, bunun yerine geçmesi gereken bir egzersiz de seçebilirsiniz (örneğin, iki kez gönderildiği için veya benzeri). Bu, egzersizi sadece silmek yerine programlarda ve antrenman günlüklerinde değiştirecektir. Bu değişiklikler, egzersizleri bununla eşzamanlayan diğer sunuculara da yayılacaktır.", + "imageStyle3D": "3B", + "imageStyleOther": "Diğer", + "replacementsSearch": "Bir egzersiz arayın veya bilinen bir kimliği kopyalayıp alana yapıştırın ve \"yükle\" düğmesine tıklayın.", + "noReplacementSelected": " Değişim için egzersiz seçilmedi", + "deleteExerciseReplace": "Sil ve değiştir", + "imageStylePhoto": "Fotoğraf", + "imageStyleLine": "Çizgi", + "imageStyleLowPoly": "Düşük poli", + "imageDetails": "Resim ayrıntıları" + }, + "noResults": "Sonuç yok", + "noResultsDescription": "Bu sorgu için sonuç bulunamadı, filtre sayısını azaltmayı düşünün.", + "nutritionalPlan": "Beslenme planı", + "server": { + "arms": "Kollar", + "back": "Sırt", + "barbell": "Halter", + "bench": "Benç", + "calves": "Baldırlar", + "chest": "Göğüs", + "description": "Açıklama", + "dumbbell": "Dambıl", + "gym_mat": "Spor paspası", + "incline_bench": "Eğim tezgahı", + "kettlebell": "Kettlebell", + "kilometers": "Kilometre", + "legs": "Bacaklar", + "miles": "Mil", + "minutes": "Dakika", + "none_(bodyweight_exercise)": "hiçbiri (vücut ağırlığı egzersizi)", + "pull-up_bar": "Barfiks çubuğu", + "repetitions": "Tekrarlar", + "seconds": "Saniye", + "shoulders": "Omuzlar", + "swiss_ball": "Egzersiz topu", + "sz-bar": "SZ çubuğu", + "until_failure": "Başarısızlığa kadar", + "abs": "Karın", + "lats": "Lat kasları", + "glutes": "Kalça kasları", + "biceps": "Pazılar", + "lower_back": "Alt sırt", + "hamstrings": "Hamstringler", + "quads": "Quad kasları", + "none__bodyweight_exercise_": "yok (vücut ağırlığı egzersizi)", + "sz_bar": "Z bar", + "pull_up_bar": "Barfiks çubuğu", + "triceps": "Tricep kasları", + "cardio": "Kardiyo", + "miles_per_hour": "Mil/saat", + "plates": "Tabaklar", + "kg": "kg", + "kilometers_per_hour": "Kilometre/saat", + "max_reps": "Azami tekrar sayısı", + "body_weight": "Vücut ağırlığı", + "lb": "paunt" + }, + "submit": "Gönder", + "weight": "Ağırlık", + "workout": "Antrenman", "category": "Kategori", - "contributeExercise": "Bir egzersize katkıda bulunun", - "equipment": "Ekipman", - "exercises": "Egzersizler", - "missingExercise": "Bir egzersiz mi eksik?", - "missingExerciseDescription": "Katkıda bulunarak topluluğa yardım edin!", - "muscles": "Kaslar", - "noEquipment": "Ekipman yok", - "notes": "Notlar", - "primaryMuscles": "Birincil kaslar", - "searchExerciseName": "Egzersiz adına göre ara", - "secondaryMuscles": "İkincil kaslar", - "variations": "Varyasyonlar", - "deleteTranslation": "Çeviriyi sil", - "deleteExerciseFull": "Tüm egzersizi sil", - "newNote": "Yeni not", - "basics": "Temeller", - "exerciseNotTranslatedBody": "Seçtiğiniz egzersiz şu anda dilinde mevcut değil. Çeviriye katkıda bulunmak ister misiniz?", - "changeExerciseLanguage": "Egzersizin dilini değiştir", - "exerciseNotTranslated": "Çeviri mevcut değil", - "notEnoughRights": "Yalnızca hesabınız {{days}} günden eskiyse ve e-posta adresinizi doğruladıysanız egzersizlere katkıda bulunabilirsiniz", - "description": "Açıklama", - "notEnoughRightsHeader": "Egzersizlere katkıda bulunamazsın", - "translateExerciseNow": "Bu egzersizi şimdi çevir", - "checkInformationBeforeSubmitting": "Lütfen egzersinizi göndermeden önce girdiğiniz bilgilerin doğru olduğunu kontrol edin", - "submitExercise": "Egzersizi gönder", - "successfullyUpdated": "Egzersiz başarıyla güncellendi. Önbelleğe alma nedeniyle, değişikliklerin uygulama genelinde görünmesi biraz zaman alabilir.", - "alternativeNames": "Alternatif isimler", - "compatibleImagesCC": "Görseller CC BY SA lisansı ile uyumlu olmalıdır. Emin değilseniz, yalnızca kendi çektiğiniz fotoğrafları yükleyin.", - "whatVariationsExist": "Varsa, bu alıştırmanın hangi varyasyonları mevcuttur?", - "notesHelpText": "Notlar \"vücudunuzu dik tutun\" gibi egzersizin nasıl yapılacağına dair kısa yorumlardır", - "filterVariations": "Varyasyonları filtrelemek için egzersiz adı girin", - "deleteExerciseBody": "\"{{name}}\" egzersizini silmek istiyor musunuz? İster {{language}} çeviriyi silebilirsiniz, isterseniz alıştırmanın tamamını silebilirsiniz tüm çeviriler, resimler vb.", - "step1HeaderBasics": "İngilizce'de temel bilgiler", - "identicalExercisePleaseDiscard": "Eklediğiniz egzersizle aynı olan bir egzersiz fark ederseniz, lütfen taslağınızı atın ve bunun yerine o egzersizi düzenleyin.", - "identicalExercise": "Yinelenen egzersizlerden kaçın", - "cacheWarning": "Önbelleğe alma nedeniyle değişikliklerin uygulama genelinde görünür olması biraz zaman alabilir.", - "replacements": "Değişimler", - "replacementsInfoText": "İsteğe bağlı olarak, bunun yerine geçmesi gereken bir egzersiz de seçebilirsiniz (örneğin, iki kez gönderildiği için veya benzeri). Bu, egzersizi sadece silmek yerine programlarda ve antrenman günlüklerinde değiştirecektir. Bu değişiklikler, egzersizleri bununla eşzamanlayan diğer sunuculara da yayılacaktır.", - "imageStyle3D": "3B", - "imageStyleOther": "Diğer", - "replacementsSearch": "Bir egzersiz arayın veya bilinen bir kimliği kopyalayıp alana yapıştırın ve \"yükle\" düğmesine tıklayın.", - "noReplacementSelected": " Değişim için egzersiz seçilmedi", - "deleteExerciseReplace": "Sil ve değiştir", - "imageStylePhoto": "Fotoğraf", - "imageStyleLine": "Çizgi", - "imageStyleLowPoly": "Düşük poli", - "imageDetails": "Resim ayrıntıları" - }, - "noResults": "Sonuç yok", - "noResultsDescription": "Bu sorgu için sonuç bulunamadı, filtre sayısını azaltmayı düşünün.", - "nutritionalPlan": "Beslenme planı", - "server": { - "arms": "Kollar", - "back": "Sırt", - "barbell": "Halter", - "bench": "Benç", - "calves": "Baldırlar", - "chest": "Göğüs", "description": "Açıklama", - "dumbbell": "Dambıl", - "gym_mat": "Spor paspası", - "incline_bench": "Eğim tezgahı", - "kettlebell": "Kettlebell", - "kilometers": "Kilometre", - "legs": "Bacaklar", - "miles": "Mil", - "minutes": "Dakika", - "none_(bodyweight_exercise)": "hiçbiri (vücut ağırlığı egzersizi)", - "pull-up_bar": "Barfiks çubuğu", - "repetitions": "Tekrarlar", - "seconds": "Saniye", - "shoulders": "Omuzlar", - "swiss_ball": "Egzersiz topu", - "sz-bar": "SZ çubuğu", - "until_failure": "Başarısızlığa kadar", - "abs": "Karın", - "lats": "Lat kasları", - "glutes": "Kalça kasları", - "biceps": "Pazılar", - "lower_back": "Alt sırt", - "hamstrings": "Hamstringler", - "quads": "Quad kasları", - "none__bodyweight_exercise_": "yok (vücut ağırlığı egzersizi)", - "sz_bar": "Z bar", - "pull_up_bar": "Barfiks çubuğu", - "triceps": "Tricep kasları", - "cardio": "Kardiyo", - "miles_per_hour": "Mil/saat", - "plates": "Tabaklar", - "kg": "kg", - "kilometers_per_hour": "Kilometre/saat", - "max_reps": "Azami tekrar sayısı", - "body_weight": "Vücut ağırlığı", - "lb": "paunt" - }, - "submit": "Gönder", - "weight": "Ağırlık", - "workout": "Antrenman", - "category": "Kategori", - "description": "Açıklama", - "name": "İsim", - "save": "Kaydet", - "loading": "Yükleniyor...", - "language": "Dil", - "forms": { - "supportedImageFormats": "Sadece 20 Mb'ın altındaki JPEG, PNG, WEBP ve AVIF dosyaları desteklenir", - "valueTooShort": "Değer çok kısa", - "valueTooLong": "Değer çok uzun", - "fieldRequired": "Bu alan gereklidir", - "maxLength": "Lütfen {{chars}} karakterden daha az girin", - "minLength": "Lütfen {{chars}} karakterden daha fazla girin", - "minValue": "Bu alanın değeri {{value}} değerinden fazla olmalıdır", - "maxValue": "Bu alanın değeri {{value}} değerinden az olmalıdır" - }, - "preferences": "Tercihler", - "continue": "Devam et", - "overview": "Genel Bakış", - "images": "Resimler", - "English": "İngilizce", - "goBack": "Sırt", - "videos": "Videolar", - "cancel": "İptal", - "cannotBeUndone": "Bu eylem geri alınamaz.", - "translation": "Çeviri", - "success": "Başarılı!", - "nutrition": { - "goalProtein": "Protein hedefi", - "searchIngredientName": "Malzeme adına göre ara", - "protein": "Protein", - "fibres": "Lifler", - "valueRemaining": "kalan", - "plans": "Beslenme planları", - "useGoalsHelpText": "Bu plana hedefler ekleyin", - "onlyLoggingHelpText": "Yalnızca kalori takibi yapın. Yalnızca kalorilerinizi kaydetmek istiyorsanız ve belirli öğünler içeren ayrıntılı bir beslenme planı oluşturmak istemiyorsanız kutuyu işaretleyin", - "goalsTitle": "Hedefler", - "goalEnergy": "Enerji hedefi", - "goalCarbohydrates": "Karbonhidrat hedefi", - "goalFat": "Yağ hedefi", - "meal": "Yemek", - "addNutritionalDiary": "Beslenme günlüğü girişi ekle", - "addMeal": "Yemek ekle", - "addMealItem": "Yemeğe malzeme ekle", - "nutritionalDiary": "Beslenme günlüğü", - "gramShort": "g", - "kcal": "kilokalori", - "valueEnergyKcal": "{{value}} kilokalori", - "valueEnergyKcalKj": "{{kcal}} kilokalori / {{kj}} kJ", - "7dayAvg": "7 günlük ortalama", - "energy": "Enerji", - "carbohydrates": "Karbonhidratlar", - "sugar": "Şeker", - "fat": "Yağ", - "ofWhichSaturated": "kadarı doymuş", - "saturatedFat": "Doymuş yağ", - "sodium": "Sodyum", - "pseudoMealTitle": "Diğer günlükler", - "others": "Diğerleri", - "diaryEntrySaved": "Günlük girişi başarıyla kaydedildi", - "logThisMeal": "Bu öğünü olduğu gibi beslenme günlüğüne kaydet", - "logThisMealItem": "Bu malzemeyi olduğu gibi beslenme günlüğüne kaydet", - "valueTooMany": "çok fazla", - "copyPlan": "Bu planın bir kopyasını oluştur", - "plan": "Beslenme planı", - "useGoalsHelpTextLong": "Bu, plan için enerji, protein, karbonhidrat veya yağ için genel hedefler belirlemenize olanak tanır. Ayrıntılı bir öğün planı ayarlarsanız, bu değerlerin öncelikli olacağını unutmayın.", - "macronutrient": "Makro besin", - "percentEnergy": "Enerji yüzdesi", - "gPerBodyKg": "vücut ağırlığı-kg başına g", - "planned": "Planlı", - "logged": "Kaydedildi", - "loggedToday": "Bugün kaydedildi", - "difference": "Fark", - "today": "Bugün", - "ofWhichSugars": "kadarı şeker", - "planDeleteInfo": "Bu, tüm beslenme günlüğü kayıtlarını da silecektir", - "mealDeleteInfo": "Bu öğüne ait beslenme günlüğü kayıtları silinmeyecek ve \"diğer günlükler\" altında görünecektir", - "goalFiber": "Lif hedefi" - }, - "measurements": { - "unitFormHelpText": "Kategorinin ölçüleceği birim, örneğin cm veya %", - "measurements": "Ölçümler", - "deleteInfo": "Bu, kategoriyi ve tüm girişlerini silecektir" - }, - "licenses": { - "derivativeSourceUrlHelper": "Türev bir çalışmanın yalnızca önceki bir çalışmaya dayanmakla kalmayıp, aynı zamanda kendi telif hakkına hak kazanması için yeterli yeni, yaratıcı içerik içeren bir çalışma olduğunu unutmayın.", - "authors": "Yazar(lar)", - "authorProfile": "Varsa yazarın web sitesinin veya profilinin bağlantısı", - "derivativeSourceUrl": "Bu türev bir çalışma ise asıl kaynağın bağlantısı", - "originalObjectUrl": "Varsa kaynak web sitesinin bağlantısı", - "originalTitle": "Başlık" - }, - "actions": "Hareketler", - "value": "Değer", - "nothingHereYet": "Burada henüz bir şey yok...", - "nothingHereYetAction": "Başlamak için eylem düğmesine basın", - "unit": "Birim", - "alsoSearchEnglish": "Ayrıca İngilizce adları da arayın", - "copyToClipboard": "Panoya kopyala", - "routines": { - "logsFilterNote": "Yalnızca kg veya paunt ağırlık birimi ve tekrarlar içeren girişlerin çizelgelendiğini, süre veya başarısızlığa kadar gibi diğer birleşimlerin burada göz ardı edildiğini unutmayın", - "addLogToDay": "Bu güne günlük ekle", - "routine": "Program", - "routines": "Programlar", - "rir": "RiR", - "addDay": "Eğitim günü ekle", - "addWeightLog": "Eğitim günlüğü ekle", - "logsHeader": "Antrenman için eğitim günlüğü" - }, - "timeOfDay": "Günün saati", - "notes": "Notlar", - "seeDetails": "Ayrıntıları gör", - "total": "Toplam", - "deleteConfirmation": "\"{{name}}\" silmek istediğinizden emin misiniz?", - "downloadAsPdf": "PDF olarak indir", - "filters": "Filtreler", - "all": "Hepsi", - "lastYear": "Geçen Yıl", - "lastHalfYear": "Son 6 Ay", - "lastMonth": "Geçen Ay", - "height": "Boy", - "cm": "cm", - "lastWeek": "Geçen Hafta", - "bmi": { - "calculator": "VKE Hesaplayıcı" - } + "name": "İsim", + "save": "Kaydet", + "loading": "Yükleniyor...", + "language": "Dil", + "forms": { + "supportedImageFormats": "Sadece 20 Mb'ın altındaki JPEG, PNG, WEBP ve AVIF dosyaları desteklenir", + "valueTooShort": "Değer çok kısa", + "valueTooLong": "Değer çok uzun", + "fieldRequired": "Bu alan gereklidir", + "maxLength": "Lütfen {{chars}} karakterden daha az girin", + "minLength": "Lütfen {{chars}} karakterden daha fazla girin", + "minValue": "Bu alanın değeri {{value}} değerinden fazla olmalıdır", + "maxValue": "Bu alanın değeri {{value}} değerinden az olmalıdır" + }, + "preferences": "Tercihler", + "continue": "Devam et", + "overview": "Genel Bakış", + "images": "Resimler", + "English": "İngilizce", + "goBack": "Sırt", + "videos": "Videolar", + "cancel": "İptal", + "cannotBeUndone": "Bu eylem geri alınamaz.", + "translation": "Çeviri", + "success": "Başarılı!", + "nutrition": { + "goalProtein": "Protein hedefi", + "searchIngredientName": "Malzeme adına göre ara", + "protein": "Protein", + "fibres": "Lifler", + "valueRemaining": "kalan", + "plans": "Beslenme planları", + "useGoalsHelpText": "Bu plana hedefler ekleyin", + "onlyLoggingHelpText": "Yalnızca kalori takibi yapın. Yalnızca kalorilerinizi kaydetmek istiyorsanız ve belirli öğünler içeren ayrıntılı bir beslenme planı oluşturmak istemiyorsanız kutuyu işaretleyin", + "goalsTitle": "Hedefler", + "goalEnergy": "Enerji hedefi", + "goalCarbohydrates": "Karbonhidrat hedefi", + "goalFat": "Yağ hedefi", + "meal": "Yemek", + "addNutritionalDiary": "Beslenme günlüğü girişi ekle", + "addMeal": "Yemek ekle", + "addMealItem": "Yemeğe malzeme ekle", + "nutritionalDiary": "Beslenme günlüğü", + "gramShort": "g", + "kcal": "kilokalori", + "valueEnergyKcal": "{{value}} kilokalori", + "valueEnergyKcalKj": "{{kcal}} kilokalori / {{kj}} kJ", + "7dayAvg": "7 günlük ortalama", + "energy": "Enerji", + "carbohydrates": "Karbonhidratlar", + "sugar": "Şeker", + "fat": "Yağ", + "ofWhichSaturated": "kadarı doymuş", + "saturatedFat": "Doymuş yağ", + "sodium": "Sodyum", + "pseudoMealTitle": "Diğer günlükler", + "others": "Diğerleri", + "diaryEntrySaved": "Günlük girişi başarıyla kaydedildi", + "logThisMeal": "Bu öğünü olduğu gibi beslenme günlüğüne kaydet", + "logThisMealItem": "Bu malzemeyi olduğu gibi beslenme günlüğüne kaydet", + "valueTooMany": "çok fazla", + "copyPlan": "Bu planın bir kopyasını oluştur", + "plan": "Beslenme planı", + "useGoalsHelpTextLong": "Bu, plan için enerji, protein, karbonhidrat veya yağ için genel hedefler belirlemenize olanak tanır. Ayrıntılı bir öğün planı ayarlarsanız, bu değerlerin öncelikli olacağını unutmayın.", + "macronutrient": "Makro besin", + "percentEnergy": "Enerji yüzdesi", + "gPerBodyKg": "vücut ağırlığı-kg başına g", + "planned": "Planlı", + "logged": "Kaydedildi", + "loggedToday": "Bugün kaydedildi", + "difference": "Fark", + "today": "Bugün", + "ofWhichSugars": "kadarı şeker", + "planDeleteInfo": "Bu, tüm beslenme günlüğü kayıtlarını da silecektir", + "mealDeleteInfo": "Bu öğüne ait beslenme günlüğü kayıtları silinmeyecek ve \"diğer günlükler\" altında görünecektir", + "goalFiber": "Lif hedefi" + }, + "measurements": { + "unitFormHelpText": "Kategorinin ölçüleceği birim, örneğin cm veya %", + "measurements": "Ölçümler", + "deleteInfo": "Bu, kategoriyi ve tüm girişlerini silecektir" + }, + "licenses": { + "derivativeSourceUrlHelper": "Türev bir çalışmanın yalnızca önceki bir çalışmaya dayanmakla kalmayıp, aynı zamanda kendi telif hakkına hak kazanması için yeterli yeni, yaratıcı içerik içeren bir çalışma olduğunu unutmayın.", + "authors": "Yazar(lar)", + "authorProfile": "Varsa yazarın web sitesinin veya profilinin bağlantısı", + "derivativeSourceUrl": "Bu türev bir çalışma ise asıl kaynağın bağlantısı", + "originalObjectUrl": "Varsa kaynak web sitesinin bağlantısı", + "originalTitle": "Başlık" + }, + "actions": "Hareketler", + "value": "Değer", + "nothingHereYet": "Burada henüz bir şey yok...", + "nothingHereYetAction": "Başlamak için eylem düğmesine basın", + "unit": "Birim", + "alsoSearchEnglish": "Ayrıca İngilizce adları da arayın", + "copyToClipboard": "Panoya kopyala", + "routines": { + "logsFilterNote": "Yalnızca kg veya paunt ağırlık birimi ve tekrarlar içeren girişlerin çizelgelendiğini, süre veya başarısızlığa kadar gibi diğer birleşimlerin burada göz ardı edildiğini unutmayın", + "addLogToDay": "Bu güne günlük ekle", + "routine": "Program", + "routines": "Programlar", + "rir": "RiR", + "addDay": "Eğitim günü ekle", + "addWeightLog": "Eğitim günlüğü ekle", + "logsHeader": "Antrenman için eğitim günlüğü" + }, + "timeOfDay": "Günün saati", + "notes": "Notlar", + "seeDetails": "Ayrıntıları gör", + "total": "Toplam", + "deleteConfirmation": "\"{{name}}\" silmek istediğinizden emin misiniz?", + "downloadAsPdf": "PDF olarak indir", + "filters": "Filtreler", + "all": "Hepsi", + "lastYear": "Geçen Yıl", + "lastHalfYear": "Son 6 Ay", + "lastMonth": "Geçen Ay", + "height": "Boy", + "cm": "cm", + "lastWeek": "Geçen Hafta", + "bmi": { + "calculator": "VKE Hesaplayıcı" + } } diff --git a/public/locales/zh_Hant/translation.json b/public/locales/zh_Hant/translation.json index 5c68ac448..99b2c8163 100644 --- a/public/locales/zh_Hant/translation.json +++ b/public/locales/zh_Hant/translation.json @@ -66,9 +66,9 @@ "imageStyle3D": "3D", "imageStyleLine": "行", "imageStyleOther": "其它", - "imageDetails": "圖片詳細資訊", - "exactMatch": "完全符合", - "swapExercise": "替換動作" + "imageDetails": "圖片詳細資訊", + "exactMatch": "完全符合", + "swapExercise": "替換動作" }, "nutrition": { "plans": "營養計劃", @@ -120,15 +120,15 @@ "planDeleteInfo": "這也會刪除所有營養日記條目", "mealDeleteInfo": "本餐的營養日記條目不會被刪除,並會顯示在「其他日誌」下", "ofWhichSugars": "哪種糖", - "goalFiber": "纖維目標", - "languageFilterAll": "所有語言", - "filterVegetarian": "素食主義", - "languageFilterCurrentOnly": "僅顯示當前語言({{lang}})", - "languageFilterCurrentAndEnglish": "當前語言({{lang}}) 與英文", - "filterVegan": "純素主義", - "filterNutriscore": "依營養分數(Nutri-Score )篩選", - "filterNutriscoreOff": "關閉", - "filterNutriscoreNoFilter": "不套用篩選" + "goalFiber": "纖維目標", + "languageFilterAll": "所有語言", + "filterVegetarian": "素食主義", + "languageFilterCurrentOnly": "僅顯示當前語言({{lang}})", + "languageFilterCurrentAndEnglish": "當前語言({{lang}}) 與英文", + "filterVegan": "純素主義", + "filterNutriscore": "依營養分數(Nutri-Score )篩選", + "filterNutriscoreOff": "關閉", + "filterNutriscoreNoFilter": "不套用篩選" }, "images": "圖片", "language": "語言", @@ -136,7 +136,7 @@ "downloadAsPdf": "下載成 PDF", "total": "總計", "description": "描述", - "overview": "概述", + "overview": "概述", "preferences": "偏好", "category": "類別", "success": "成功!", @@ -152,9 +152,9 @@ "supportedImageFormats": "僅支援 20Mb 以下的 JPEG、PNG、WEBP 和 AVIF 文件", "maxValue": "此欄位的值必須小於 {{value}}", "enterNumber": "請輸入有效數字", - "maxLessThanMin": "最大值必須大於最小值", - "enterInteger": "請輸入整數", - "endBeforeStart": "結束值不得小於起始值" + "maxLessThanMin": "最大值必須大於最小值", + "enterInteger": "請輸入整數", + "endBeforeStart": "結束值不得小於起始值" }, "save": "儲存", "videos": "影片", @@ -171,80 +171,80 @@ "addWeightLog": "增加訓練日誌", "routine": "常規項目", "routines": "常規項目", - "restTime": "休息時間", - "intensity": "強度", - "weekly": "每週", - "daily": "每天", - "statsOverview": "統計", - "restDay": "休息日", - "publicTemplates": "公開模板", - "set": { - "jump": "跳", - "warmup": "暖身", - "type": "類型", - "tut": "肌肉受壓力時間" - }, - "copyAndUseTemplate": "複製並使用範本", - "template": "範本", - "templates": "範本", - "publicTemplate": "公開模板", - "day": { - "edt": "逐步增加訓練密度", - "rft": "限時完成指定次數", - "afap": "越快越好" - }, - "markAsTemplate": "管理模板", - "sets": "組數", - "reps": "次數", - "volume": "訓練量", - "currentRoutine": "目前訓練計畫", - "iteration": "輪次", - "workoutNr": "第 {{number}} 次訓練", - "weekNr": "第 {{number}} 週", - "backToRoutine": "返回訓練計畫", - "minLengthRoutine": "訓練計畫至少需持續 {{number}} 週", - "maxLengthRoutine": "訓練計畫最多只能持續 {{number}} 週", - "resultingRoutine": "產生的訓練計畫", - "deleteDayConfirmation": "這會移除所有組數、動作與漸進規則。", - "routineHasNoDays": "此訓練計畫尚未設定任何訓練日", - "setHasNoExercises": "此組未包含任何訓練動作", - "fitDaysInWeek": "固定每週排程", - "fitDaysInWeekHelpText": "此設定會控制訓練計畫的日期如何跨週安排。啟用後,訓練日會以每週循環的方式重複。例如,若訓練計畫安排在週一、週三和週五訓練,下一週也會延續相同模式。停用後,訓練日會依序前進,不受新的一週開始影響。此設定適合不採固定週期安排的訓練計畫。", - "needsLogsToAdvance": "需有訓練紀錄才會前進", - "needsLogsToAdvanceHelpText": "若啟用此選項,只有在當天已記錄訓練時,訓練計畫才會前進到下一個排定的訓練日。若未啟用,無論是否有記錄訓練,訓練計畫都會自動前進到下一天。", - "addSuperset": "新增超級組", - "addExercise": "新增訓練動作", - "addSet": "新增組數", - "exerciseNr": "第 {{number}} 個動作", - "supersetNr": "第 {{number}} 個超級組", - "setNr": "第 {{number}} 組", - "editProgression": "編輯漸進規則", - "progressionNeedsReplace": "前面的項目中必須至少有一項為替換操作", - "exerciseHasProgression": "此動作設有漸進規則,無法在此進行編輯。若要編輯,請點擊按鈕。", - "defaultRounding": "預設取整方式", - "rounding": "取整方式(此動作)", - "roundingHelp": "設定重量與次數的預設取整方式(在漸進設定中使用百分比增加步驟時特別有用)。此設定會套用到之後新增的所有組數,但仍可在漸進設定中個別調整。留空則停用取整功能。", - "newDay": "新增訓練日", - "weightLogNotPlanned": "將訓練紀錄儲存到未安排訓練的日期。", - "logsOverview": "訓練紀錄總覽", - "alsoShowLogs": "同時顯示訓練紀錄", - "simpleMode": "簡易模式", - "workoutSession": "訓練課程", - "confirmRestDay": "確認調整休息日", - "confirmRestDayHelpText": "請注意,將某天標記為休息日後,當天所有的組數與動作都會被刪除。", - "duplicate": "複製訓練計畫", - "downloadPdfTable": "下載 PDF(表格)", - "downloadPdfLogs": "下載 PDF(訓練紀錄)", - "downloadIcal": "下載 iCal 檔案", - "impression": "整體感受", - "impressionGood": "良好", - "impressionNeutral": "一般", - "impressionBad": "不佳", - "impressionHelpText": "此表單會記錄每個動作的訓練結果(如次數、重量等)。你在這裡所做的變更,例如刪除或替換動作,只會影響這筆紀錄,不會改動原本的課表。只有填寫重量或次數的列才會被儲存。", - "addAdditionalLog": "新增額外訓練紀錄", - "operation": "操作", - "step": "步驟", - "requirements": "條件" + "restTime": "休息時間", + "intensity": "強度", + "weekly": "每週", + "daily": "每天", + "statsOverview": "統計", + "restDay": "休息日", + "publicTemplates": "公開模板", + "set": { + "jump": "跳", + "warmup": "暖身", + "type": "類型", + "tut": "肌肉受壓力時間" + }, + "copyAndUseTemplate": "複製並使用範本", + "template": "範本", + "templates": "範本", + "publicTemplate": "公開模板", + "day": { + "edt": "逐步增加訓練密度", + "rft": "限時完成指定次數", + "afap": "越快越好" + }, + "markAsTemplate": "管理模板", + "sets": "組數", + "reps": "次數", + "volume": "訓練量", + "currentRoutine": "目前訓練計畫", + "iteration": "輪次", + "workoutNr": "第 {{number}} 次訓練", + "weekNr": "第 {{number}} 週", + "backToRoutine": "返回訓練計畫", + "minLengthRoutine": "訓練計畫至少需持續 {{number}} 週", + "maxLengthRoutine": "訓練計畫最多只能持續 {{number}} 週", + "resultingRoutine": "產生的訓練計畫", + "deleteDayConfirmation": "這會移除所有組數、動作與漸進規則。", + "routineHasNoDays": "此訓練計畫尚未設定任何訓練日", + "setHasNoExercises": "此組未包含任何訓練動作", + "fitDaysInWeek": "固定每週排程", + "fitDaysInWeekHelpText": "此設定會控制訓練計畫的日期如何跨週安排。啟用後,訓練日會以每週循環的方式重複。例如,若訓練計畫安排在週一、週三和週五訓練,下一週也會延續相同模式。停用後,訓練日會依序前進,不受新的一週開始影響。此設定適合不採固定週期安排的訓練計畫。", + "needsLogsToAdvance": "需有訓練紀錄才會前進", + "needsLogsToAdvanceHelpText": "若啟用此選項,只有在當天已記錄訓練時,訓練計畫才會前進到下一個排定的訓練日。若未啟用,無論是否有記錄訓練,訓練計畫都會自動前進到下一天。", + "addSuperset": "新增超級組", + "addExercise": "新增訓練動作", + "addSet": "新增組數", + "exerciseNr": "第 {{number}} 個動作", + "supersetNr": "第 {{number}} 個超級組", + "setNr": "第 {{number}} 組", + "editProgression": "編輯漸進規則", + "progressionNeedsReplace": "前面的項目中必須至少有一項為替換操作", + "exerciseHasProgression": "此動作設有漸進規則,無法在此進行編輯。若要編輯,請點擊按鈕。", + "defaultRounding": "預設取整方式", + "rounding": "取整方式(此動作)", + "roundingHelp": "設定重量與次數的預設取整方式(在漸進設定中使用百分比增加步驟時特別有用)。此設定會套用到之後新增的所有組數,但仍可在漸進設定中個別調整。留空則停用取整功能。", + "newDay": "新增訓練日", + "weightLogNotPlanned": "將訓練紀錄儲存到未安排訓練的日期。", + "logsOverview": "訓練紀錄總覽", + "alsoShowLogs": "同時顯示訓練紀錄", + "simpleMode": "簡易模式", + "workoutSession": "訓練課程", + "confirmRestDay": "確認調整休息日", + "confirmRestDayHelpText": "請注意,將某天標記為休息日後,當天所有的組數與動作都會被刪除。", + "duplicate": "複製訓練計畫", + "downloadPdfTable": "下載 PDF(表格)", + "downloadPdfLogs": "下載 PDF(訓練紀錄)", + "downloadIcal": "下載 iCal 檔案", + "impression": "整體感受", + "impressionGood": "良好", + "impressionNeutral": "一般", + "impressionBad": "不佳", + "impressionHelpText": "此表單會記錄每個動作的訓練結果(如次數、重量等)。你在這裡所做的變更,例如刪除或替換動作,只會影響這筆紀錄,不會改動原本的課表。只有填寫重量或次數的列才會被儲存。", + "addAdditionalLog": "新增額外訓練紀錄", + "operation": "操作", + "step": "步驟", + "requirements": "條件" }, "server": { "arms": "手臂", @@ -306,7 +306,7 @@ "copyToClipboard": "複製到剪貼簿", "filters": "過濾器", "continue": "繼續", - "goBack": "返回", + "goBack": "返回", "lastMonth": "上個月", "lastYear": "去年", "height": "身高", @@ -341,12 +341,12 @@ "durationWeeksDays": "{{nrWeeks}} 週, {{nrDays}} 天", "undo": "復原", "preview": "預覽", - "useMarkdownHint": "您可以使用基本的 Markdown 來格式化文字:*斜體*、**粗體**、-清單", + "useMarkdownHint": "您可以使用基本的 Markdown 來格式化文字:*斜體*、**粗體**、-清單", "start": "開始", "end": "結束", "totalChange": "總變化", "private": "私人", - "public": "公開", - "min": "最小", - "max": "最大" + "public": "公開", + "min": "最小", + "max": "最大" }