diff --git a/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-1-chromium-linux.png b/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-1-chromium-linux.png index 4c86c135f63..47f634662c4 100644 Binary files a/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-1-chromium-linux.png and b/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-2-chromium-linux.png b/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-2-chromium-linux.png index da91ec0a42e..d42dab83e0e 100644 Binary files a/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-2-chromium-linux.png and b/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-3-chromium-linux.png b/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-3-chromium-linux.png index f6dea23498d..f369fcb2e33 100644 Binary files a/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-3-chromium-linux.png and b/packages/desktop-client/e2e/settings.mobile.test.js-snapshots/Mobile-Settings-checks-that-settings-page-can-be-opened-3-chromium-linux.png differ diff --git a/packages/desktop-client/src/components/App.tsx b/packages/desktop-client/src/components/App.tsx index 1051fce30e0..74000f5d37c 100644 --- a/packages/desktop-client/src/components/App.tsx +++ b/packages/desktop-client/src/components/App.tsx @@ -137,9 +137,9 @@ function AppInner() { id: 'login-expired', title: t('Login expired'), sticky: true, - message: t('Login expired, please login again.'), + message: t('Login expired, please log in again.'), button: { - title: t('Go to login'), + title: t('Go to log in'), action: () => dispatch(signOut()), }, }), diff --git a/packages/desktop-client/src/components/accounts/Account.tsx b/packages/desktop-client/src/components/accounts/Account.tsx index bc6331e269b..c08aac2f9c7 100644 --- a/packages/desktop-client/src/components/accounts/Account.tsx +++ b/packages/desktop-client/src/components/accounts/Account.tsx @@ -645,7 +645,7 @@ class AccountInternal extends PureComponent< const res = await window.Actual.openFileDialog({ filters: [ { - name: t('Financial Files'), + name: t('Financial files'), extensions: ['qif', 'ofx', 'qfx', 'csv', 'tsv', 'xml'], }, ], @@ -680,7 +680,7 @@ class AccountInternal extends PureComponent< window.Actual.saveFile( exportedTransactions, filename, - t('Export Transactions'), + t('Export transactions'), ); }; diff --git a/packages/desktop-client/src/components/accounts/Reconcile.tsx b/packages/desktop-client/src/components/accounts/Reconcile.tsx index e3136bea02f..6d52b7bebca 100644 --- a/packages/desktop-client/src/components/accounts/Reconcile.tsx +++ b/packages/desktop-client/src/components/accounts/Reconcile.tsx @@ -5,6 +5,7 @@ import * as queries from 'loot-core/src/client/queries'; import { type Query } from 'loot-core/src/shared/query'; import { currencyToInteger } from 'loot-core/src/shared/util'; import { type AccountEntity } from 'loot-core/types/models'; +import { type TransObjectLiteral } from 'loot-core/types/util'; import { SvgCheckCircle1 } from '../../icons/v2'; import { styles, theme } from '../../style'; @@ -82,23 +83,27 @@ export function ReconcilingMessage({ - Your cleared balance {clearedBalance} needs{' '} - {difference} to match + Your cleared balance{' '} + {{ clearedBalance } as TransObjectLiteral}{' '} + needs {{ difference } as TransObjectLiteral} to + match
your bank's balance of{' '} - {bankBalance} + + {{ bankBalance } as TransObjectLiteral} +
)} {targetDiff !== 0 && ( )} diff --git a/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx b/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx index f29b7c5dc01..60cd3e207d7 100644 --- a/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx +++ b/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx @@ -531,7 +531,7 @@ export function CreatePayeeButton({ style={{ marginRight: 5, display: 'inline-block' }} /> )} - Create Payee “{{ payeeName }}” + Create payee “{{ payeeName }}” ); } diff --git a/packages/desktop-client/src/components/budget/BalanceWithCarryover.tsx b/packages/desktop-client/src/components/budget/BalanceWithCarryover.tsx index a1bd0f28a4d..320c29dc7be 100644 --- a/packages/desktop-client/src/components/budget/BalanceWithCarryover.tsx +++ b/packages/desktop-client/src/components/budget/BalanceWithCarryover.tsx @@ -5,10 +5,12 @@ import React, { type CSSProperties, useCallback, } from 'react'; -import { useTranslation } from 'react-i18next'; +import { useTranslation, Trans } from 'react-i18next'; import { css } from '@emotion/css'; +import { type TransObjectLiteral } from 'loot-core/types/util'; + import { useFeatureFlag } from '../../hooks/useFeatureFlag'; import { SvgArrowThinRight } from '../../icons/v1'; import { theme, styles } from '../../style'; @@ -148,47 +150,86 @@ export function BalanceWithCarryover({ {getDifferenceToGoal(balanceValue) === 0 ? ( - {t('Fully funded')} + Fully funded ) : getDifferenceToGoal(balanceValue) > 0 ? ( - {t('Overfunded ({{amount}})', { - amount: format( - getDifferenceToGoal(balanceValue), - 'financial', - ), - })} + + Overfunded ( + {{ + amount: format( + getDifferenceToGoal(balanceValue), + 'financial', + ), + }} + ) + ) : ( - {t('Underfunded ({{amount}})', { - amount: format( - getDifferenceToGoal(balanceValue), - 'financial', - ), - })} + + Underfunded ( + {{ + amount: format( + getDifferenceToGoal(balanceValue), + 'financial', + ), + }} + ) + )} -
{t('Goal Type:')}
-
{longGoalValue === 1 ? t('Long') : t('Template')}
+ +
Goal Type:
+
+ { + { + type: + longGoalValue === 1 + ? t('Long', { context: 'noun' }) + : t('Template'), + } as TransObjectLiteral + } +
+
-
{t('Goal:')}
-
{format(goalValue, 'financial')}
+ +
Goal:
+
+ { + { + amount: format(goalValue, 'financial'), + } as TransObjectLiteral + } +
+
{longGoalValue !== 1 ? ( - <> -
{t('Budgeted:')}
-
{format(budgetedValue, 'financial')}
- + +
Budgeted:
+
+ { + { + amount: format(budgetedValue, 'financial'), + } as TransObjectLiteral + } +
+
) : ( - <> -
{t('Balance:')}
-
{format(balanceValue, type)}
- + +
Balance:
+
+ { + { + amount: format(balanceValue, type), + } as TransObjectLiteral + } +
+
)}
diff --git a/packages/desktop-client/src/components/budget/SidebarCategory.tsx b/packages/desktop-client/src/components/budget/SidebarCategory.tsx index bdd3f55a54d..02373dcfca8 100644 --- a/packages/desktop-client/src/components/budget/SidebarCategory.tsx +++ b/packages/desktop-client/src/components/budget/SidebarCategory.tsx @@ -192,7 +192,7 @@ export function SidebarCategory({ onBlur={() => onEditName(null)} style={{ paddingLeft: 13, ...(isLast && { borderBottomWidth: 0 }) }} inputProps={{ - placeholder: temporary ? t('New Category Name') : '', + placeholder: temporary ? t('New category name') : '', }} /> diff --git a/packages/desktop-client/src/components/budget/SidebarGroup.tsx b/packages/desktop-client/src/components/budget/SidebarGroup.tsx index 87e6eaad4d2..c2109682bf0 100644 --- a/packages/desktop-client/src/components/budget/SidebarGroup.tsx +++ b/packages/desktop-client/src/components/budget/SidebarGroup.tsx @@ -228,7 +228,7 @@ export function SidebarGroup({ style={{ fontWeight: 600 }} inputProps={{ style: { marginLeft: 20 }, - placeholder: temporary ? t('New Group Name') : '', + placeholder: temporary ? t('New group name') : '', }} /> diff --git a/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx b/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx index 5c810c17cd9..47414c28e7a 100644 --- a/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx +++ b/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx @@ -48,7 +48,7 @@ export function CoverMenu({ return ( - Cover from category: + Cover from a category: diff --git a/packages/desktop-client/src/components/budget/index.tsx b/packages/desktop-client/src/components/budget/index.tsx index ff07f7cdb82..1c29d819eb2 100644 --- a/packages/desktop-client/src/components/budget/index.tsx +++ b/packages/desktop-client/src/components/budget/index.tsx @@ -177,7 +177,7 @@ function BudgetInner(props: BudgetInnerProps) { addNotification({ type: 'error', message: t( - 'Category ‘{{name}}‘ already exists in group (May be Hidden)', + 'Category “{{name}}” already exists in group (it may be hidden)', { name }, ), }), diff --git a/packages/desktop-client/src/components/budget/tracking/budgetsummary/BudgetTotal.tsx b/packages/desktop-client/src/components/budget/tracking/budgetsummary/BudgetTotal.tsx index 2fb18beec00..7e65d730e25 100644 --- a/packages/desktop-client/src/components/budget/tracking/budgetsummary/BudgetTotal.tsx +++ b/packages/desktop-client/src/components/budget/tracking/budgetsummary/BudgetTotal.tsx @@ -4,7 +4,7 @@ import React, { type ComponentType, type ReactNode, } from 'react'; -import { useTranslation } from 'react-i18next'; +import { Trans } from 'react-i18next'; import { theme, styles } from '../../../../style'; import { Text } from '../../../common/Text'; @@ -32,7 +32,6 @@ export function BudgetTotal< ProgressComponent, style, }: BudgetTotalProps) { - const { t } = useTranslation(); return ( - - - {' '} - {t('of')}{' '} - - {props => } - - + , + italic: ( + + ), + totalAmount: ( + + {props => ( + + )} + + ), + }} + /> diff --git a/packages/desktop-client/src/components/filters/NameFilter.tsx b/packages/desktop-client/src/components/filters/NameFilter.tsx index 77fb85132ac..827b15fe860 100644 --- a/packages/desktop-client/src/components/filters/NameFilter.tsx +++ b/packages/desktop-client/src/components/filters/NameFilter.tsx @@ -50,7 +50,7 @@ export function NameFilter({ > diff --git a/packages/desktop-client/src/components/manager/subscribe/Login.tsx b/packages/desktop-client/src/components/manager/subscribe/Login.tsx index b9f117fd647..299c284002a 100644 --- a/packages/desktop-client/src/components/manager/subscribe/Login.tsx +++ b/packages/desktop-client/src/components/manager/subscribe/Login.tsx @@ -187,7 +187,7 @@ function HeaderLogin({ error }) { style={{ fontSize: 15 }} to={'/login/password?error=' + error} > - Login with Password + Log in with password ) : ( diff --git a/packages/desktop-client/src/components/manager/subscribe/OpenIdForm.tsx b/packages/desktop-client/src/components/manager/subscribe/OpenIdForm.tsx index 238f5319a1a..3a59f525b1f 100644 --- a/packages/desktop-client/src/components/manager/subscribe/OpenIdForm.tsx +++ b/packages/desktop-client/src/components/manager/subscribe/OpenIdForm.tsx @@ -379,7 +379,7 @@ const openIdProviders: (OpenIdProviderOption | typeof Menu.line)[] = [ variant="external" to="https://docs.goauthentik.io/integrations/services/actual-budget/" > - Configure OAuth2 Provider + Configure OAuth2 provider ), @@ -434,7 +434,7 @@ function OpenIdProviderSelector({ return ( - + - + )} diff --git a/packages/desktop-client/src/components/spreadsheet/CellValue.tsx b/packages/desktop-client/src/components/spreadsheet/CellValue.tsx index 2171d99406c..579a80ff000 100644 --- a/packages/desktop-client/src/components/spreadsheet/CellValue.tsx +++ b/packages/desktop-client/src/components/spreadsheet/CellValue.tsx @@ -44,7 +44,7 @@ export function CellValue< const { fullSheetName } = useSheetName(binding); const sheetValue = useSheetValue(binding); - return children ? ( + return typeof children === 'function' ? ( <>{children({ type, name: fullSheetName, value: sheetValue })} ) : ( - {account?.name || 'No account'} + + {account?.name || t('No account')} ); case 'notes': @@ -165,7 +171,6 @@ export function SimpleTransactionsTable({ fields = ['date', 'payee', 'amount'], style, }: SimpleTransactionsTableProps) { - const { t } = useTranslation(); const dateFormat = useDateFormat() || 'MM/dd/yyyy'; const selectedItems = useSelectedItems(); const dispatchSelected = useSelectedDispatch(); @@ -212,43 +217,43 @@ export function SimpleTransactionsTable({ case 'date': return ( - {t('Date')} + Date ); case 'imported_payee': return ( - {t('Imported payee')} + Imported payee ); case 'payee': return ( - {t('Payee')} + Payee ); case 'category': return ( - {t('Category')} + Category ); case 'account': return ( - {t('Account')} + Account ); case 'notes': return ( - {t('Notes')} + Notes ); case 'amount': return ( - {t('Amount')} + Amount ); default: diff --git a/packages/loot-core/src/client/actions/budgets.ts b/packages/loot-core/src/client/actions/budgets.ts index ab549a23510..e5eab6e3f50 100644 --- a/packages/loot-core/src/client/actions/budgets.ts +++ b/packages/loot-core/src/client/actions/budgets.ts @@ -181,7 +181,7 @@ export function duplicateBudget({ try { dispatch( setAppState({ - loadingText: t('Duplicating: {{oldName}} -- to: {{newName}}', { + loadingText: t('Duplicating: {{oldName}} to: {{newName}}', { oldName, newName, }), diff --git a/packages/loot-core/src/server/main.ts b/packages/loot-core/src/server/main.ts index e5e96bac5d4..7657dbd8289 100644 --- a/packages/loot-core/src/server/main.ts +++ b/packages/loot-core/src/server/main.ts @@ -2032,7 +2032,7 @@ handlers['duplicate-budget'] = async function ({ await fs.removeDirRecursively(newBudgetDir); } } catch {} // Ignore cleanup errors - throw new Error(`Failed to duplicate budget: ${error.message}`); + throw new Error(`Failed to duplicate budget file: ${error.message}`); } // load in and validate diff --git a/packages/loot-core/src/shared/errors.ts b/packages/loot-core/src/shared/errors.ts index 6718952e07f..615c810d388 100644 --- a/packages/loot-core/src/shared/errors.ts +++ b/packages/loot-core/src/shared/errors.ts @@ -101,7 +101,7 @@ export function getSyncError(error, id) { return t('This budget cannot be loaded with this version of the app.'); } else if (error === 'budget-not-found') { return t( - 'Budget “{id}” not found. Check the id of your budget in the Advanced section of the settings page.', + 'Budget “{{id}}” not found. Check the ID of your budget in the Advanced section of the settings page.', { id }, ); } else { diff --git a/upcoming-release-notes/4154.md b/upcoming-release-notes/4154.md new file mode 100644 index 00000000000..0bfed882768 --- /dev/null +++ b/upcoming-release-notes/4154.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [matt-fidd] +--- + +Improve translation strings and update some wording