feat(assistant): expense, payment and settle-up cards, and expense links into Costs

This commit is contained in:
Maurice
2026-10-22 15:50:49 +02:00
parent c94545419b
commit b52990bf27
65 changed files with 4763 additions and 95 deletions
@@ -0,0 +1,154 @@
import { ASSISTANT_CHANGE_VERB_KEYS, assistantAppliedSchema, assistantChangePreviewSchema } from '../assistant.schema';
import { BUDGET_APPLIED_ENTITIES, BUDGET_CARD_SCHEMAS, BUDGET_VERB_KEYS } from './budget.contract';
import { costPerPersonCardSchema, type CostPerPersonCard } from './cost-per-person.card';
import { EXPENSE_PEOPLE_MAX, expensesCardSchema, type CardExpense, type ExpensesCard } from './expenses.card';
import { storedTrekCardSchema, trekCardSchema } from './index';
import { paymentsCardSchema, type PaymentsCard } from './payments.card';
import { settlementCardSchema, type SettlementCard } from './settlement.card';
import { describe, expect, it } from 'vitest';
const ana = { id: 7, name: 'Ana', avatarKey: 'ana.png' };
const ben = { id: 8, name: 'Ben', avatarKey: null };
const dinner: CardExpense = {
id: 31,
name: 'Dinner at Lokanta',
category: 'food',
amount: { amount: 84, currency: 'EUR' },
tripAmount: null,
date: '2026-06-03',
place: { id: 12, name: 'Lokanta' },
payers: [{ person: ana, amount: 84 }],
split: 'equal',
shares: [
{ person: ana, amount: 42, paid: true },
{ person: ben, amount: 42, paid: false },
],
moreShares: 0,
note: null,
receipts: 2,
before: null,
highlight: [],
change: 'none',
};
const expenses: ExpensesCard = {
kind: 'expenses',
rows: [dinner],
offset: 0,
more: 13,
total: { amount: 1204.5, currency: 'EUR' },
unconverted: 1,
};
const payments: PaymentsCard = {
kind: 'payments',
rows: [
{
id: null,
from: ben,
to: ana,
amount: { amount: 42.5, currency: 'EUR' },
date: '2026-06-07',
note: 'Bank transfer',
before: { from: ana, to: null, amount: { amount: 40, currency: 'EUR' } },
change: 'changed',
},
],
more: 0,
};
const settlement: SettlementCard = {
kind: 'settlement',
currency: 'EUR',
flows: [{ from: ben, to: ana, amount: 42.5 }],
moreFlows: 0,
balances: [
{ person: ana, balance: 42.5 },
{ person: ben, balance: -42.5 },
],
moreBalances: 0,
recorded: 3,
unconverted: { entries: 2, currencies: ['USD'] },
};
const perPerson: CostPerPersonCard = {
kind: 'costPerPerson',
currency: 'EUR',
rows: [{ person: ana, share: 69, paid: 45, count: 2 }],
more: 0,
};
describe('budget cards', () => {
it('CARDS-BUD-001: the four kinds join the card union and read back as built', () => {
expect(BUDGET_CARD_SCHEMAS).toEqual([
expensesCardSchema,
paymentsCardSchema,
settlementCardSchema,
costPerPersonCardSchema,
]);
for (const card of [expenses, payments, settlement, perPerson]) {
expect(trekCardSchema.parse(card)).toEqual(card);
expect(storedTrekCardSchema.parse(card)).toEqual(card);
}
});
it('CARDS-BUD-002: a waiting change states what it replaces and whom it is about', () => {
const update: CardExpense = {
...dinner,
amount: { amount: 96, currency: 'EUR' },
before: { name: null, amount: { amount: 84, currency: 'EUR' }, category: null, date: null, split: 'custom' },
highlight: [8],
change: 'changed',
};
expect(expensesCardSchema.parse({ ...expenses, rows: [update], total: null }).rows[0]).toEqual(update);
expect(expensesCardSchema.safeParse({ ...expenses, rows: [{ ...update, change: 'moved' }] }).success).toBe(false);
// A refund is a negative amount; nothing past a billion is.
const refund = { ...dinner, amount: { amount: -20, currency: 'EUR' } };
expect(expensesCardSchema.safeParse({ ...expenses, rows: [refund] }).success).toBe(true);
expect(expensesCardSchema.safeParse({ ...expenses, total: { amount: 2e9, currency: 'EUR' } }).success).toBe(false);
});
it('CARDS-BUD-003: lists and splits are bounded, and a card past a bound reads as no card', () => {
const many = Array.from({ length: EXPENSE_PEOPLE_MAX + 1 }, (_, i) => ({
person: { ...ben, id: 100 + i },
amount: 1,
paid: false,
}));
expect(storedTrekCardSchema.parse({ ...expenses, rows: [{ ...dinner, shares: many }] })).toBeNull();
expect(storedTrekCardSchema.parse({ ...expenses, rows: Array.from({ length: 13 }, () => dinner) })).toBeNull();
expect(storedTrekCardSchema.parse({ ...expenses, rows: [] })).toBeNull();
expect(storedTrekCardSchema.parse({ ...expenses, offset: -1 })).toBeNull();
const free = { ...payments.rows[0], amount: { amount: 0, currency: 'EUR' } };
expect(storedTrekCardSchema.parse({ ...payments, rows: [free] })).toBeNull();
expect(storedTrekCardSchema.parse({ ...settlement, currency: 'euro' })).toBeNull();
expect(storedTrekCardSchema.parse({ ...perPerson, rows: [] })).toBeNull();
});
it('CARDS-BUD-004: people carry a stored file name only, never an address', () => {
const linked = { ...ana, avatarKey: 'https://sso.example/ana.png' };
expect(storedTrekCardSchema.parse({ ...perPerson, rows: [{ ...perPerson.rows[0], person: linked }] })).toBeNull();
const upward = { from: ana, to: { ...ben, avatarKey: '../x' }, amount: 1 };
expect(storedTrekCardSchema.parse({ ...settlement, flows: [upward] })).toBeNull();
});
it('CARDS-BUD-005: a payment change reads its verb, and a payment receipt its own entity', () => {
expect(BUDGET_VERB_KEYS).toEqual(['addPayment', 'updatePayment']);
for (const verb of BUDGET_VERB_KEYS) expect(ASSISTANT_CHANGE_VERB_KEYS).toContain(verb);
const preview = {
toolCallId: 'c1',
verbKey: 'addPayment',
subject: 'Ben → Ana',
rows: [],
dayId: null,
placeIds: [],
undoable: true,
card: payments,
};
expect(assistantChangePreviewSchema.parse(preview)).toMatchObject({ verbKey: 'addPayment', card: payments });
expect(BUDGET_APPLIED_ENTITIES).toEqual(['settlement']);
const receipt = { toolCallId: 'c1', entity: 'settlement', ids: [5], dayId: null, undoUntil: null };
expect(assistantAppliedSchema.parse(receipt).entity).toBe('settlement');
});
});
@@ -21,5 +21,7 @@ export const BUDGET_CARD_SCHEMAS = [
settlementCardSchema,
costPerPersonCardSchema,
] as const;
export const BUDGET_VERB_KEYS = [] as const;
export const BUDGET_APPLIED_ENTITIES = [] as const;
/** A settle-up payment recorded or changed; removing one is a plain removal. */
export const BUDGET_VERB_KEYS = ['addPayment', 'updatePayment'] as const;
/** A settle-up payment: the receipt opens the Costs tab, where the payments are listed. */
export const BUDGET_APPLIED_ENTITIES = ['settlement'] as const;
@@ -1,5 +1,30 @@
import { cardCurrencySchema, cardPersonSchema } from './card-parts';
import { z } from 'zod';
/** What the trip costs each traveller. Only its kind so far; the budget cards give it its fields. */
export const costPerPersonCardSchema = z.object({ kind: z.literal('costPerPerson') });
/**
* What the trip's expenses come to for each traveller, in the trip
* currency: the sum of their shares, how much of that is marked paid, and in
* how many expenses they take part. Largest share first.
*/
/** Travellers one card names; the rest are counted in `more`. */
export const COST_PER_PERSON_ROWS_MAX = 20;
export const costPerPersonCardSchema = z.object({
kind: z.literal('costPerPerson'),
currency: cardCurrencySchema,
rows: z
.array(
z.object({
person: cardPersonSchema,
share: z.number().min(-1e9).max(1e9),
paid: z.number().min(-1e9).max(1e9),
count: z.number().int().min(0).max(100_000),
}),
)
.min(1)
.max(COST_PER_PERSON_ROWS_MAX),
more: z.number().int().min(0).max(1000),
});
export type CostPerPersonCard = z.infer<typeof costPerPersonCardSchema>;
+97 -3
View File
@@ -1,8 +1,102 @@
import { idSchema } from '../../common/primitives.schema';
import { cardDateSchema, cardMoneySchema, cardPersonSchema, cardText } from './card-parts';
import { z } from 'zod';
/**
* Expenses of the trip, with who paid and who shares them. Only its kind so far; the budget cards give
* it its fields.
* Expenses of the trip as the Costs page shows them: the name, the amount in
* the currency it was paid in (and in the trip currency when that differs and
* a rate is known), the day, the place it belongs to, who paid how much and
* who shares it. One card serves the expense list (`list_budget_items`) and
* every change to a single expense: the row of a change carries what it
* replaces (`before`), the people it is about (`highlight`) and what happens
* to it (`change`). Amounts are numbers with a currency code; the client
* writes them the way the Costs page does.
*/
export const expensesCardSchema = z.object({ kind: z.literal('expenses') });
/** Rows one expenses card lists; the rest are counted in `more`. */
export const EXPENSE_ROWS_MAX = 12;
/** Payers or shares one row names; the rest of a split are counted in `moreShares`. */
export const EXPENSE_PEOPLE_MAX = 20;
/** A signed amount: a refund is negative (#2176). */
const cardAmountSchema = z.number().min(-1e9).max(1e9);
/** How an expense is shared: evenly, in amounts of its own per person, or by nobody (planning only). */
export const expenseSplitSchema = z.enum(['equal', 'custom', 'none']);
/** What a change does to a row; an answer's rows are `none`. */
export const expenseChangeSchema = z.enum(['none', 'new', 'changed', 'willDelete']);
/** One person's part of an expense, and whether they have paid it. */
export const cardExpenseShareSchema = z.object({
person: cardPersonSchema,
amount: cardAmountSchema,
paid: z.boolean(),
});
/** Someone who paid for the expense, and how much. */
export const cardExpensePayerSchema = z.object({ person: cardPersonSchema, amount: cardAmountSchema });
/**
* The values a waiting update replaces, each null where the update leaves it
* alone: a category or a date that was empty before reads as unchanged.
*/
export const cardExpenseBeforeSchema = z.object({
name: cardText(120).nullable(),
amount: cardMoneySchema.nullable(),
category: z.string().max(60).nullable(),
date: cardDateSchema.nullable(),
split: expenseSplitSchema.nullable(),
});
export const cardExpenseSchema = z.object({
/** Null while a new expense waits for its decision. */
id: idSchema.nullable(),
name: cardText(120),
/** As stored; the client maps it to a Costs category, legacy free text included. */
category: z.string().max(60).nullable(),
/** The total in the currency it was entered in (the trip's when it names none). */
amount: cardMoneySchema,
/** The total in the trip currency, only when that differs and a rate converts it. */
tripAmount: cardMoneySchema.nullable(),
date: cardDateSchema.nullable(),
place: z.object({ id: idSchema, name: cardText(120) }).nullable(),
payers: z.array(cardExpensePayerSchema).max(EXPENSE_PEOPLE_MAX),
split: expenseSplitSchema,
shares: z.array(cardExpenseShareSchema).max(EXPENSE_PEOPLE_MAX),
/** Shares of the split past the ones named. */
moreShares: z.number().int().min(0).max(1000),
/** A change row's note; list rows leave it out. */
note: cardText(160).nullable(),
/** How many receipts are attached; never the files themselves. */
receipts: z.number().int().min(0).max(999),
before: cardExpenseBeforeSchema.nullable(),
/** The people the change is about: a paid tick set, someone joining the split. */
highlight: z.array(idSchema).max(EXPENSE_PEOPLE_MAX),
change: expenseChangeSchema,
});
export const expensesCardSchema = z.object({
kind: z.literal('expenses'),
rows: z.array(cardExpenseSchema).min(1).max(EXPENSE_ROWS_MAX),
/**
* Where in the trip's list the rows start: a later page of the list starts
* past 0, so two pages read as one list only where they meet. 0 on a change.
*/
offset: z.number().int().min(0).max(100_000),
/** Expenses of the trip the card leaves out. */
more: z.number().int().min(0).max(100_000),
/** The list's total over every expense, in the trip currency; null on a change. */
total: cardMoneySchema.nullable(),
/** Expenses the total leaves out: foreign ones no rate converts yet. */
unconverted: z.number().int().min(0).max(100_000),
});
export type ExpensesCard = z.infer<typeof expensesCardSchema>;
export type CardExpense = z.infer<typeof cardExpenseSchema>;
export type CardExpenseShare = z.infer<typeof cardExpenseShareSchema>;
export type CardExpensePayer = z.infer<typeof cardExpensePayerSchema>;
export type CardExpenseBefore = z.infer<typeof cardExpenseBeforeSchema>;
export type ExpenseSplit = z.infer<typeof expenseSplitSchema>;
export type ExpenseChange = z.infer<typeof expenseChangeSchema>;
+48 -2
View File
@@ -1,5 +1,51 @@
import { idSchema } from '../../common/primitives.schema';
import { cardCurrencySchema, cardDateSchema, cardPersonSchema, cardText } from './card-parts';
import { expenseChangeSchema } from './expenses.card';
import { z } from 'zod';
/** Payments between the travellers. Only its kind so far; the budget cards give it its fields. */
export const paymentsCardSchema = z.object({ kind: z.literal('payments') });
/**
* Settle-up payments between the travellers, as the Costs page lists them
* under its payment history: who paid whom, how much, on which day, with the
* note it carries. One card serves the list (`list_settlements`) and every
* change to one payment; a waiting change names what it replaces in `before`.
*/
/** Payments one card lists; the rest are counted in `more`. */
export const PAYMENT_ROWS_MAX = 12;
/** What one payment moved: always more than nothing. */
export const cardPaymentMoneySchema = z.object({
amount: z.number().positive().max(1e9),
currency: cardCurrencySchema,
});
/** The values a waiting update of a payment replaces, each null where it stays. */
export const cardPaymentBeforeSchema = z.object({
from: cardPersonSchema.nullable(),
to: cardPersonSchema.nullable(),
amount: cardPaymentMoneySchema.nullable(),
});
export const cardPaymentSchema = z.object({
/** Null while a new payment waits for its decision. */
id: idSchema.nullable(),
from: cardPersonSchema,
to: cardPersonSchema,
amount: cardPaymentMoneySchema,
/** The day it was paid, else the day it was recorded. */
date: cardDateSchema.nullable(),
note: cardText(120).nullable(),
before: cardPaymentBeforeSchema.nullable(),
change: expenseChangeSchema,
});
export const paymentsCardSchema = z.object({
kind: z.literal('payments'),
rows: z.array(cardPaymentSchema).min(1).max(PAYMENT_ROWS_MAX),
more: z.number().int().min(0).max(100_000),
});
export type PaymentsCard = z.infer<typeof paymentsCardSchema>;
export type CardPayment = z.infer<typeof cardPaymentSchema>;
export type CardPaymentMoney = z.infer<typeof cardPaymentMoneySchema>;
+33 -2
View File
@@ -1,5 +1,36 @@
import { cardCurrencySchema, cardPersonSchema } from './card-parts';
import { z } from 'zod';
/** Who pays whom to settle up. Only its kind so far; the budget cards give it its fields. */
export const settlementCardSchema = z.object({ kind: z.literal('settlement') });
/**
* Settle up as the Costs page shows it: the payments that would square the
* trip (who pays whom), each traveller's balance (positive is owed money,
* negative owes it), how many payments were already recorded, and the
* entries no exchange rate converts yet, which count in no figure. Every
* amount is in `currency`.
*/
/** Suggested payments one card names; the rest are counted in `moreFlows`. */
export const SETTLEMENT_FLOWS_MAX = 12;
/** Balances one card names; the rest are counted in `moreBalances`. */
export const SETTLEMENT_BALANCES_MAX = 20;
export const settlementCardSchema = z.object({
kind: z.literal('settlement'),
currency: cardCurrencySchema,
flows: z
.array(z.object({ from: cardPersonSchema, to: cardPersonSchema, amount: z.number().positive().max(1e9) }))
.max(SETTLEMENT_FLOWS_MAX),
moreFlows: z.number().int().min(0).max(1000),
balances: z
.array(z.object({ person: cardPersonSchema, balance: z.number().min(-1e9).max(1e9) }))
.max(SETTLEMENT_BALANCES_MAX),
moreBalances: z.number().int().min(0).max(1000),
/** Payments already recorded. */
recorded: z.number().int().min(0).max(100_000),
unconverted: z.object({
entries: z.number().int().min(0).max(100_000),
currencies: z.array(cardCurrencySchema).max(6),
}),
});
export type SettlementCard = z.infer<typeof settlementCardSchema>;
+39 -1
View File
@@ -1,4 +1,42 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'تسجيل دفعة',
'assistant.change.verb.updatePayment': 'تغيير دفعة',
'assistant.tool.create_budget_item_with_members': 'إضافة مصروف',
'assistant.tool.set_budget_item_members': 'تغيير من يتقاسم التكلفة',
'assistant.tool.toggle_budget_member_paid': 'تحديث من دفع',
'assistant.tool.create_settlement': 'تسجيل دفعة',
'assistant.tool.update_settlement': 'تغيير هذه الدفعة',
'assistant.tool.delete_settlement': 'حذف هذه الدفعة',
'assistant.tool.freeze_budget_rates': 'تثبيت أسعار الصرف لليوم',
'assistant.followUp.whoOwes': 'من يدين لمن؟',
'assistant.followUp.recordPayments': 'تسجيل هذه الدفعات',
'assistant.card.budget.open': 'فتح في التكاليف',
'assistant.card.budget.paidBy': 'دفع {name}',
'assistant.card.budget.notPaid': 'غير مدفوع',
'assistant.card.budget.split.equal': 'مقسوم بالتساوي',
'assistant.card.budget.split.custom': 'مقسوم بمبالغ مختلفة',
'assistant.card.budget.split.none': 'للتخطيط فقط، دون تقسيم',
'assistant.card.budget.together': 'المجموع {amount}',
'assistant.card.budget.markedPaid': '{amount} معلَّم كمدفوع',
'assistant.card.budget.receipts': '{count} إيصال',
'assistant.card.budget.receipts.zero': '{count} إيصال',
'assistant.card.budget.receipts.one': '{count} إيصال',
'assistant.card.budget.receipts.two': '{count} إيصالان',
'assistant.card.budget.receipts.few': '{count} إيصالات',
'assistant.card.budget.receipts.many': '{count} إيصالًا',
'assistant.card.budget.leftOut': '{count} مصروف بعملة أجنبية خارج المجموع: لا يوجد سعر صرف بعد.',
'assistant.card.budget.leftOut.zero': '{count} مصروف بعملة أجنبية خارج المجموع: لا يوجد سعر صرف بعد.',
'assistant.card.budget.leftOut.one': '{count} مصروف بعملة أجنبية خارج المجموع: لا يوجد سعر صرف بعد.',
'assistant.card.budget.leftOut.two': '{count} مصروفان بعملة أجنبية خارج المجموع: لا يوجد سعر صرف بعد.',
'assistant.card.budget.leftOut.few': '{count} مصاريف بعملة أجنبية خارج المجموع: لا يوجد سعر صرف بعد.',
'assistant.card.budget.leftOut.many': '{count} مصروفًا بعملة أجنبية خارج المجموع: لا يوجد سعر صرف بعد.',
'assistant.card.budget.unconverted': '{count} قيد بعملة {currencies} لا يُحتسب: لا يوجد سعر صرف بعد.',
'assistant.card.budget.unconverted.zero': '{count} قيد بعملة {currencies} لا يُحتسب: لا يوجد سعر صرف بعد.',
'assistant.card.budget.unconverted.one': '{count} قيد بعملة {currencies} لا يُحتسب: لا يوجد سعر صرف بعد.',
'assistant.card.budget.unconverted.two': '{count} قيدان بعملة {currencies} لا يُحتسبان: لا يوجد سعر صرف بعد.',
'assistant.card.budget.unconverted.few': '{count} قيود بعملة {currencies} لا تُحتسب: لا يوجد سعر صرف بعد.',
'assistant.card.budget.unconverted.many': '{count} قيدًا بعملة {currencies} لا يُحتسب: لا يوجد سعر صرف بعد.',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Ödəniş qeyd et',
'assistant.change.verb.updatePayment': 'Ödənişi dəyiş',
'assistant.tool.create_budget_item_with_members': 'Xərc əlavə et',
'assistant.tool.set_budget_item_members': 'Xərci kimlərin bölüşdüyünü dəyiş',
'assistant.tool.toggle_budget_member_paid': 'Kimin ödədiyini yenilə',
'assistant.tool.create_settlement': 'Ödəniş qeyd et',
'assistant.tool.update_settlement': 'Bu ödənişi dəyiş',
'assistant.tool.delete_settlement': 'Bu ödənişi sil',
'assistant.tool.freeze_budget_rates': 'Bugünkü valyuta məzənnələrini sabitlə',
'assistant.followUp.whoOwes': 'Kim kimə borcludur?',
'assistant.followUp.recordPayments': 'Bu ödənişləri qeyd et',
'assistant.card.budget.open': 'Xərclər bölməsində aç',
'assistant.card.budget.paidBy': '{name} ödədi',
'assistant.card.budget.notPaid': 'Ödənilməyib',
'assistant.card.budget.split.equal': 'Bərabər bölünüb',
'assistant.card.budget.split.custom': 'Fərqli məbləğlərlə bölünüb',
'assistant.card.budget.split.none': 'Yalnız planlaşdırma, bölünməyib',
'assistant.card.budget.together': 'Cəmi {amount}',
'assistant.card.budget.markedPaid': '{amount} ödənilmiş kimi qeyd olunub',
'assistant.card.budget.receipts': '{count} qəbz',
'assistant.card.budget.receipts.one': '{count} qəbz',
'assistant.card.budget.leftOut': 'Xarici valyutada {count} xərc cəmə daxil edilmir: hələ məzənnə yoxdur.',
'assistant.card.budget.leftOut.one': 'Xarici valyutada {count} xərc cəmə daxil edilmir: hələ məzənnə yoxdur.',
'assistant.card.budget.unconverted': '{currencies} ilə {count} qeyd hesablanmır: hələ məzənnə yoxdur.',
'assistant.card.budget.unconverted.one': '{currencies} ilə {count} qeyd hesablanmır: hələ məzənnə yoxdur.',
};
export default assistantBudget;
+31 -1
View File
@@ -1,4 +1,34 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Registrar um pagamento',
'assistant.change.verb.updatePayment': 'Alterar um pagamento',
'assistant.tool.create_budget_item_with_members': 'Adicionar despesa',
'assistant.tool.set_budget_item_members': 'Alterar quem divide o custo',
'assistant.tool.toggle_budget_member_paid': 'Atualizar quem já pagou',
'assistant.tool.create_settlement': 'Registrar um pagamento',
'assistant.tool.update_settlement': 'Alterar o pagamento',
'assistant.tool.delete_settlement': 'Excluir o pagamento',
'assistant.tool.freeze_budget_rates': 'Fixar as taxas de câmbio de hoje',
'assistant.followUp.whoOwes': 'Quem deve a quem?',
'assistant.followUp.recordPayments': 'Registrar estes pagamentos',
'assistant.card.budget.open': 'Abrir em Custos',
'assistant.card.budget.paidBy': '{name} pagou',
'assistant.card.budget.notPaid': 'Não pago',
'assistant.card.budget.split.equal': 'Dividido igualmente',
'assistant.card.budget.split.custom': 'Dividido de forma desigual',
'assistant.card.budget.split.none': 'Só planejamento, sem divisão',
'assistant.card.budget.together': 'No total {amount}',
'assistant.card.budget.markedPaid': '{amount} marcado como pago',
'assistant.card.budget.receipts': '{count} recibos',
'assistant.card.budget.receipts.one': '{count} recibo',
'assistant.card.budget.leftOut':
'{count} despesas em moeda estrangeira ficam fora do total: ainda sem taxa de câmbio.',
'assistant.card.budget.leftOut.one':
'{count} despesa em moeda estrangeira fica fora do total: ainda sem taxa de câmbio.',
'assistant.card.budget.unconverted':
'{count} lançamentos em {currencies} não são contados: ainda sem taxa de câmbio.',
'assistant.card.budget.unconverted.one':
'{count} lançamento em {currencies} não é contado: ainda sem taxa de câmbio.',
};
export default assistantBudget;
+31 -1
View File
@@ -1,4 +1,34 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Registra un pagament',
'assistant.change.verb.updatePayment': 'Canvia un pagament',
'assistant.tool.create_budget_item_with_members': 'Afegeix una despesa',
'assistant.tool.set_budget_item_members': 'Canvia qui comparteix la despesa',
'assistant.tool.toggle_budget_member_paid': 'Actualitza qui ha pagat',
'assistant.tool.create_settlement': 'Registra un pagament',
'assistant.tool.update_settlement': 'Canvia el pagament',
'assistant.tool.delete_settlement': 'Elimina el pagament',
'assistant.tool.freeze_budget_rates': "Fixa els tipus de canvi d'avui",
'assistant.followUp.whoOwes': 'Qui deu a qui?',
'assistant.followUp.recordPayments': 'Registra aquests pagaments',
'assistant.card.budget.open': 'Obre a Despeses',
'assistant.card.budget.paidBy': '{name} ha pagat',
'assistant.card.budget.notPaid': 'No pagat',
'assistant.card.budget.split.equal': 'Repartit a parts iguals',
'assistant.card.budget.split.custom': 'Repartit de manera desigual',
'assistant.card.budget.split.none': 'Només planificació, sense repartir',
'assistant.card.budget.together': 'En total {amount}',
'assistant.card.budget.markedPaid': '{amount} marcat com a pagat',
'assistant.card.budget.receipts': '{count} rebuts',
'assistant.card.budget.receipts.one': '{count} rebut',
'assistant.card.budget.leftOut':
'{count} despeses en moneda estrangera no es compten al total: encara no hi ha tipus de canvi.',
'assistant.card.budget.leftOut.one':
'{count} despesa en moneda estrangera no es compta al total: encara no hi ha tipus de canvi.',
'assistant.card.budget.unconverted':
'{count} entrades en {currencies} no es compten: encara no hi ha tipus de canvi.',
'assistant.card.budget.unconverted.one':
'{count} entrada en {currencies} no es compta: encara no hi ha tipus de canvi.',
};
export default assistantBudget;
+31 -1
View File
@@ -1,4 +1,34 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Zaznamenat platbu',
'assistant.change.verb.updatePayment': 'Změnit platbu',
'assistant.tool.create_budget_item_with_members': 'Přidat výdaj',
'assistant.tool.set_budget_item_members': 'Změnit, kdo se dělí o náklad',
'assistant.tool.toggle_budget_member_paid': 'Aktualizovat, kdo zaplatil',
'assistant.tool.create_settlement': 'Zaznamenat platbu',
'assistant.tool.update_settlement': 'Změnit tuto platbu',
'assistant.tool.delete_settlement': 'Smazat tuto platbu',
'assistant.tool.freeze_budget_rates': 'Zafixovat dnešní směnné kurzy',
'assistant.followUp.whoOwes': 'Kdo dluží komu?',
'assistant.followUp.recordPayments': 'Zaznamenat tyto platby',
'assistant.card.budget.open': 'Otevřít v Nákladech',
'assistant.card.budget.paidBy': '{name} zaplatil(a)',
'assistant.card.budget.notPaid': 'Nezaplaceno',
'assistant.card.budget.split.equal': 'Rozděleno rovným dílem',
'assistant.card.budget.split.custom': 'Rozděleno nerovným dílem',
'assistant.card.budget.split.none': 'Jen plánování, nerozděleno',
'assistant.card.budget.together': 'Celkem {amount}',
'assistant.card.budget.markedPaid': '{amount} označeno jako zaplaceno',
'assistant.card.budget.receipts': '{count} účtenek',
'assistant.card.budget.receipts.one': '{count} účtenka',
'assistant.card.budget.receipts.few': '{count} účtenky',
'assistant.card.budget.leftOut': '{count} výdajů v cizí měně se nezapočítává do součtu: zatím chybí směnný kurz.',
'assistant.card.budget.leftOut.one': '{count} výdaj v cizí měně se nezapočítává do součtu: zatím chybí směnný kurz.',
'assistant.card.budget.leftOut.few':
'{count} výdaje v cizí měně se nezapočítávají do součtu: zatím chybí směnný kurz.',
'assistant.card.budget.unconverted': '{count} položek v {currencies} se nezapočítává: zatím chybí směnný kurz.',
'assistant.card.budget.unconverted.one': '{count} položka v {currencies} se nezapočítává: zatím chybí směnný kurz.',
'assistant.card.budget.unconverted.few': '{count} položky v {currencies} se nezapočítávají: zatím chybí směnný kurz.',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Zahlung erfassen',
'assistant.change.verb.updatePayment': 'Zahlung ändern',
'assistant.tool.create_budget_item_with_members': 'Ausgabe hinzufügen',
'assistant.tool.set_budget_item_members': 'Ändern, wer die Kosten teilt',
'assistant.tool.toggle_budget_member_paid': 'Aktualisieren, wer bezahlt hat',
'assistant.tool.create_settlement': 'Zahlung erfassen',
'assistant.tool.update_settlement': 'Die Zahlung ändern',
'assistant.tool.delete_settlement': 'Die Zahlung löschen',
'assistant.tool.freeze_budget_rates': 'Heutige Wechselkurse festschreiben',
'assistant.followUp.whoOwes': 'Wer schuldet wem was?',
'assistant.followUp.recordPayments': 'Diese Zahlungen erfassen',
'assistant.card.budget.open': 'In Kosten öffnen',
'assistant.card.budget.paidBy': '{name} hat bezahlt',
'assistant.card.budget.notPaid': 'Nicht bezahlt',
'assistant.card.budget.split.equal': 'Gleich aufgeteilt',
'assistant.card.budget.split.custom': 'Ungleich aufgeteilt',
'assistant.card.budget.split.none': 'Nur Planung, nicht aufgeteilt',
'assistant.card.budget.together': 'Zusammen {amount}',
'assistant.card.budget.markedPaid': '{amount} als bezahlt markiert',
'assistant.card.budget.receipts': '{count} Belege',
'assistant.card.budget.receipts.one': '{count} Beleg',
'assistant.card.budget.leftOut': '{count} Ausgaben in Fremdwährung fehlen in der Summe: noch kein Wechselkurs.',
'assistant.card.budget.leftOut.one': '{count} Ausgabe in Fremdwährung fehlt in der Summe: noch kein Wechselkurs.',
'assistant.card.budget.unconverted': '{count} Einträge in {currencies} werden nicht gezählt: noch kein Wechselkurs.',
'assistant.card.budget.unconverted.one': '{count} Eintrag in {currencies} wird nicht gezählt: noch kein Wechselkurs.',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Record a payment',
'assistant.change.verb.updatePayment': 'Change a payment',
'assistant.tool.create_budget_item_with_members': 'Add expense',
'assistant.tool.set_budget_item_members': 'Change who shares the cost',
'assistant.tool.toggle_budget_member_paid': 'Update who has paid',
'assistant.tool.create_settlement': 'Record a payment',
'assistant.tool.update_settlement': 'Change the payment',
'assistant.tool.delete_settlement': 'Delete the payment',
'assistant.tool.freeze_budget_rates': "Pin today's exchange rates",
'assistant.followUp.whoOwes': 'Who owes whom?',
'assistant.followUp.recordPayments': 'Record these payments',
'assistant.card.budget.open': 'Open in Costs',
'assistant.card.budget.paidBy': '{name} paid',
'assistant.card.budget.notPaid': 'Not paid',
'assistant.card.budget.split.equal': 'Split evenly',
'assistant.card.budget.split.custom': 'Split unevenly',
'assistant.card.budget.split.none': 'Planning only, not split',
'assistant.card.budget.together': 'Together {amount}',
'assistant.card.budget.markedPaid': '{amount} marked paid',
'assistant.card.budget.receipts': '{count} receipts',
'assistant.card.budget.receipts.one': '{count} receipt',
'assistant.card.budget.leftOut': '{count} foreign expenses are left out of the total: no exchange rate yet.',
'assistant.card.budget.leftOut.one': '{count} foreign expense is left out of the total: no exchange rate yet.',
'assistant.card.budget.unconverted': '{count} entries in {currencies} are not counted: no exchange rate yet.',
'assistant.card.budget.unconverted.one': '{count} entry in {currencies} is not counted: no exchange rate yet.',
};
export default assistantBudget;
+29 -1
View File
@@ -1,4 +1,32 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Registrar un pago',
'assistant.change.verb.updatePayment': 'Cambiar un pago',
'assistant.tool.create_budget_item_with_members': 'Añadir gasto',
'assistant.tool.set_budget_item_members': 'Cambiar quién comparte el gasto',
'assistant.tool.toggle_budget_member_paid': 'Actualizar quién ha pagado',
'assistant.tool.create_settlement': 'Registrar un pago',
'assistant.tool.update_settlement': 'Cambiar el pago',
'assistant.tool.delete_settlement': 'Eliminar el pago',
'assistant.tool.freeze_budget_rates': 'Fijar los tipos de cambio de hoy',
'assistant.followUp.whoOwes': '¿Quién debe a quién?',
'assistant.followUp.recordPayments': 'Registrar estos pagos',
'assistant.card.budget.open': 'Abrir en Costes',
'assistant.card.budget.paidBy': '{name} pagó',
'assistant.card.budget.notPaid': 'No pagado',
'assistant.card.budget.split.equal': 'Repartido a partes iguales',
'assistant.card.budget.split.custom': 'Repartido de forma desigual',
'assistant.card.budget.split.none': 'Solo planificación, sin repartir',
'assistant.card.budget.together': 'En total {amount}',
'assistant.card.budget.markedPaid': '{amount} marcado como pagado',
'assistant.card.budget.receipts': '{count} recibos',
'assistant.card.budget.receipts.one': '{count} recibo',
'assistant.card.budget.leftOut':
'{count} gastos en moneda extranjera no se incluyen en el total: aún no hay tipo de cambio.',
'assistant.card.budget.leftOut.one':
'{count} gasto en moneda extranjera no se incluye en el total: aún no hay tipo de cambio.',
'assistant.card.budget.unconverted': '{count} entradas en {currencies} no se cuentan: aún no hay tipo de cambio.',
'assistant.card.budget.unconverted.one': '{count} entrada en {currencies} no se cuenta: aún no hay tipo de cambio.',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Registreeri makse',
'assistant.change.verb.updatePayment': 'Muuda makset',
'assistant.tool.create_budget_item_with_members': 'Lisa kulu',
'assistant.tool.set_budget_item_members': 'Muuda, kes kulu jagab',
'assistant.tool.toggle_budget_member_paid': 'Uuenda, kes on maksnud',
'assistant.tool.create_settlement': 'Registreeri makse',
'assistant.tool.update_settlement': 'Muuda seda makset',
'assistant.tool.delete_settlement': 'Kustuta see makse',
'assistant.tool.freeze_budget_rates': 'Kinnita tänased vahetuskursid',
'assistant.followUp.whoOwes': 'Kes võlgneb kellele?',
'assistant.followUp.recordPayments': 'Registreeri need maksed',
'assistant.card.budget.open': 'Ava kuludes',
'assistant.card.budget.paidBy': '{name} maksis',
'assistant.card.budget.notPaid': 'Maksmata',
'assistant.card.budget.split.equal': 'Jagatud võrdselt',
'assistant.card.budget.split.custom': 'Jagatud ebavõrdselt',
'assistant.card.budget.split.none': 'Ainult planeerimine, jagamata',
'assistant.card.budget.together': 'Kokku {amount}',
'assistant.card.budget.markedPaid': '{amount} märgitud makstuks',
'assistant.card.budget.receipts': '{count} kviitungit',
'assistant.card.budget.receipts.one': '{count} kviitung',
'assistant.card.budget.leftOut': '{count} välisvaluutas kulu ei ole summas: vahetuskurssi veel pole.',
'assistant.card.budget.leftOut.one': '{count} välisvaluutas kulu ei ole summas: vahetuskurssi veel pole.',
'assistant.card.budget.unconverted': '{count} kirjet valuutas {currencies} ei arvestata: vahetuskurssi veel pole.',
'assistant.card.budget.unconverted.one': '{count} kirje valuutas {currencies} ei arvestata: vahetuskurssi veel pole.',
};
export default assistantBudget;
+31 -1
View File
@@ -1,4 +1,34 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Enregistrer un paiement',
'assistant.change.verb.updatePayment': 'Modifier un paiement',
'assistant.tool.create_budget_item_with_members': 'Ajouter une dépense',
'assistant.tool.set_budget_item_members': 'Modifier qui partage la dépense',
'assistant.tool.toggle_budget_member_paid': 'Mettre à jour qui a payé',
'assistant.tool.create_settlement': 'Enregistrer un paiement',
'assistant.tool.update_settlement': 'Modifier le paiement',
'assistant.tool.delete_settlement': 'Supprimer le paiement',
'assistant.tool.freeze_budget_rates': 'Figer les taux de change du jour',
'assistant.followUp.whoOwes': 'Qui doit combien à qui ?',
'assistant.followUp.recordPayments': 'Enregistrer ces paiements',
'assistant.card.budget.open': 'Ouvrir dans Coûts',
'assistant.card.budget.paidBy': '{name} a payé',
'assistant.card.budget.notPaid': 'Non payé',
'assistant.card.budget.split.equal': 'Partagé à parts égales',
'assistant.card.budget.split.custom': 'Partagé à parts inégales',
'assistant.card.budget.split.none': 'Prévision seulement, non partagé',
'assistant.card.budget.together': 'Au total {amount}',
'assistant.card.budget.markedPaid': '{amount} marqué comme payé',
'assistant.card.budget.receipts': '{count} justificatifs',
'assistant.card.budget.receipts.one': '{count} justificatif',
'assistant.card.budget.leftOut':
'{count} dépenses en devise étrangère ne sont pas comptées dans le total : pas encore de taux de change.',
'assistant.card.budget.leftOut.one':
"{count} dépense en devise étrangère n'est pas comptée dans le total : pas encore de taux de change.",
'assistant.card.budget.unconverted':
'{count} entrées en {currencies} ne sont pas comptées : pas encore de taux de change.',
'assistant.card.budget.unconverted.one':
"{count} entrée en {currencies} n'est pas comptée : pas encore de taux de change.",
};
export default assistantBudget;
+30 -1
View File
@@ -1,4 +1,33 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Καταγραφή πληρωμής',
'assistant.change.verb.updatePayment': 'Αλλαγή πληρωμής',
'assistant.tool.create_budget_item_with_members': 'Προσθήκη εξόδου',
'assistant.tool.set_budget_item_members': 'Αλλαγή του ποιοι μοιράζονται το κόστος',
'assistant.tool.toggle_budget_member_paid': 'Ενημέρωση του ποιος έχει πληρώσει',
'assistant.tool.create_settlement': 'Καταγραφή πληρωμής',
'assistant.tool.update_settlement': 'Αλλαγή της πληρωμής',
'assistant.tool.delete_settlement': 'Διαγραφή της πληρωμής',
'assistant.tool.freeze_budget_rates': 'Κλείδωμα των σημερινών ισοτιμιών',
'assistant.followUp.whoOwes': 'Ποιος χρωστάει σε ποιον;',
'assistant.followUp.recordPayments': 'Καταγραφή αυτών των πληρωμών',
'assistant.card.budget.open': 'Άνοιγμα στα Κόστη',
'assistant.card.budget.paidBy': '{name} πλήρωσε',
'assistant.card.budget.notPaid': 'Απλήρωτο',
'assistant.card.budget.split.equal': 'Μοιρασμένο ισόποσα',
'assistant.card.budget.split.custom': 'Μοιρασμένο άνισα',
'assistant.card.budget.split.none': 'Μόνο σχεδιασμός, χωρίς μοιρασιά',
'assistant.card.budget.together': 'Συνολικά {amount}',
'assistant.card.budget.markedPaid': '{amount} σημειωμένα ως πληρωμένα',
'assistant.card.budget.receipts': '{count} αποδείξεις',
'assistant.card.budget.receipts.one': '{count} απόδειξη',
'assistant.card.budget.leftOut': '{count} έξοδα σε ξένο νόμισμα δεν μετρούν στο σύνολο: δεν υπάρχει ακόμη ισοτιμία.',
'assistant.card.budget.leftOut.one':
'{count} έξοδο σε ξένο νόμισμα δεν μετράει στο σύνολο: δεν υπάρχει ακόμη ισοτιμία.',
'assistant.card.budget.unconverted':
'{count} καταχωρίσεις σε {currencies} δεν υπολογίζονται: δεν υπάρχει ακόμη ισοτιμία.',
'assistant.card.budget.unconverted.one':
'{count} καταχώριση σε {currencies} δεν υπολογίζεται: δεν υπάρχει ακόμη ισοτιμία.',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Fizetés rögzítése',
'assistant.change.verb.updatePayment': 'Fizetés módosítása',
'assistant.tool.create_budget_item_with_members': 'Kiadás hozzáadása',
'assistant.tool.set_budget_item_members': 'Annak módosítása, kik osztoznak a költségen',
'assistant.tool.toggle_budget_member_paid': 'Annak frissítése, ki fizetett',
'assistant.tool.create_settlement': 'Fizetés rögzítése',
'assistant.tool.update_settlement': 'A fizetés módosítása',
'assistant.tool.delete_settlement': 'A fizetés törlése',
'assistant.tool.freeze_budget_rates': 'A mai árfolyamok rögzítése',
'assistant.followUp.whoOwes': 'Ki kinek tartozik?',
'assistant.followUp.recordPayments': 'Ezeknek a fizetéseknek a rögzítése',
'assistant.card.budget.open': 'Megnyitás a Költségekben',
'assistant.card.budget.paidBy': '{name} fizetett',
'assistant.card.budget.notPaid': 'Nincs fizetve',
'assistant.card.budget.split.equal': 'Egyenlően elosztva',
'assistant.card.budget.split.custom': 'Nem egyenlően elosztva',
'assistant.card.budget.split.none': 'Csak tervezés, nincs elosztva',
'assistant.card.budget.together': 'Összesen {amount}',
'assistant.card.budget.markedPaid': '{amount} fizetettként jelölve',
'assistant.card.budget.receipts': '{count} bizonylat',
'assistant.card.budget.receipts.one': '{count} bizonylat',
'assistant.card.budget.leftOut': '{count} devizás kiadás nem számít bele az összegbe: még nincs árfolyam.',
'assistant.card.budget.leftOut.one': '{count} devizás kiadás nem számít bele az összegbe: még nincs árfolyam.',
'assistant.card.budget.unconverted': '{count} tétel {currencies} pénznemben nem számít bele: még nincs árfolyam.',
'assistant.card.budget.unconverted.one': '{count} tétel {currencies} pénznemben nem számít bele: még nincs árfolyam.',
};
export default assistantBudget;
+24 -1
View File
@@ -1,4 +1,27 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Catat pembayaran',
'assistant.change.verb.updatePayment': 'Ubah pembayaran',
'assistant.tool.create_budget_item_with_members': 'Tambah pengeluaran',
'assistant.tool.set_budget_item_members': 'Ubah siapa yang berbagi biaya',
'assistant.tool.toggle_budget_member_paid': 'Perbarui siapa yang sudah membayar',
'assistant.tool.create_settlement': 'Catat pembayaran',
'assistant.tool.update_settlement': 'Ubah pembayaran ini',
'assistant.tool.delete_settlement': 'Hapus pembayaran ini',
'assistant.tool.freeze_budget_rates': 'Kunci kurs hari ini',
'assistant.followUp.whoOwes': 'Siapa berutang kepada siapa?',
'assistant.followUp.recordPayments': 'Catat semua pembayaran ini',
'assistant.card.budget.open': 'Buka di Biaya',
'assistant.card.budget.paidBy': '{name} membayar',
'assistant.card.budget.notPaid': 'Belum dibayar',
'assistant.card.budget.split.equal': 'Dibagi rata',
'assistant.card.budget.split.custom': 'Dibagi dengan jumlah berbeda',
'assistant.card.budget.split.none': 'Hanya perencanaan, tidak dibagi',
'assistant.card.budget.together': 'Semuanya {amount}',
'assistant.card.budget.markedPaid': '{amount} ditandai sudah dibayar',
'assistant.card.budget.receipts': '{count} struk',
'assistant.card.budget.leftOut': '{count} pengeluaran dalam mata uang asing tidak masuk total: belum ada kurs.',
'assistant.card.budget.unconverted': '{count} entri dalam {currencies} tidak dihitung: belum ada kurs.',
};
export default assistantBudget;
+30 -1
View File
@@ -1,4 +1,33 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Registra un pagamento',
'assistant.change.verb.updatePayment': 'Modifica un pagamento',
'assistant.tool.create_budget_item_with_members': 'Aggiungi spesa',
'assistant.tool.set_budget_item_members': 'Cambia chi divide la spesa',
'assistant.tool.toggle_budget_member_paid': 'Aggiorna chi ha pagato',
'assistant.tool.create_settlement': 'Registra un pagamento',
'assistant.tool.update_settlement': 'Modifica il pagamento',
'assistant.tool.delete_settlement': 'Elimina il pagamento',
'assistant.tool.freeze_budget_rates': 'Blocca i tassi di cambio di oggi',
'assistant.followUp.whoOwes': 'Chi deve quanto a chi?',
'assistant.followUp.recordPayments': 'Registra questi pagamenti',
'assistant.card.budget.open': 'Apri in Costi',
'assistant.card.budget.paidBy': '{name} ha pagato',
'assistant.card.budget.notPaid': 'Non pagato',
'assistant.card.budget.split.equal': 'Diviso in parti uguali',
'assistant.card.budget.split.custom': 'Diviso in parti diverse',
'assistant.card.budget.split.none': 'Solo pianificazione, non divisa',
'assistant.card.budget.together': 'In tutto {amount}',
'assistant.card.budget.markedPaid': '{amount} segnato come pagato',
'assistant.card.budget.receipts': '{count} ricevute',
'assistant.card.budget.receipts.one': '{count} ricevuta',
'assistant.card.budget.leftOut': '{count} spese in valuta estera non sono nel totale: ancora nessun tasso di cambio.',
'assistant.card.budget.leftOut.one':
'{count} spesa in valuta estera non è nel totale: ancora nessun tasso di cambio.',
'assistant.card.budget.unconverted':
'{count} voci in {currencies} non sono conteggiate: ancora nessun tasso di cambio.',
'assistant.card.budget.unconverted.one':
'{count} voce in {currencies} non è conteggiata: ancora nessun tasso di cambio.',
};
export default assistantBudget;
+25 -1
View File
@@ -1,4 +1,28 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': '支払いを記録',
'assistant.change.verb.updatePayment': '支払いを変更',
'assistant.tool.create_budget_item_with_members': '支出を追加',
'assistant.tool.set_budget_item_members': '費用を分け合う人を変更',
'assistant.tool.toggle_budget_member_paid': '支払い済みの人を更新',
'assistant.tool.create_settlement': '支払いを記録',
'assistant.tool.update_settlement': 'この支払いを変更',
'assistant.tool.delete_settlement': 'この支払いを削除',
'assistant.tool.freeze_budget_rates': '今日の為替レートで固定',
'assistant.followUp.whoOwes': '誰が誰にいくら借りている?',
'assistant.followUp.recordPayments': 'これらの支払いを記録',
'assistant.card.budget.open': '費用で開く',
'assistant.card.budget.paidBy': '{name}が支払い',
'assistant.card.budget.notPaid': '未払い',
'assistant.card.budget.split.equal': '均等に分割',
'assistant.card.budget.split.custom': '金額を指定して分割',
'assistant.card.budget.split.none': '計画のみ、分割なし',
'assistant.card.budget.together': '合計 {amount}',
'assistant.card.budget.markedPaid': '{amount} 支払い済み',
'assistant.card.budget.receipts': '領収書 {count} 件',
'assistant.card.budget.leftOut': '外貨の支出 {count} 件は合計に含まれていません。為替レートがまだありません。',
'assistant.card.budget.unconverted':
'{currencies} の {count} 件は計算に含まれていません。為替レートがまだありません。',
};
export default assistantBudget;
+24 -1
View File
@@ -1,4 +1,27 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': '결제 기록',
'assistant.change.verb.updatePayment': '결제 변경',
'assistant.tool.create_budget_item_with_members': '지출 추가',
'assistant.tool.set_budget_item_members': '비용을 나누는 사람 변경',
'assistant.tool.toggle_budget_member_paid': '지불한 사람 업데이트',
'assistant.tool.create_settlement': '결제 기록',
'assistant.tool.update_settlement': '이 결제 변경',
'assistant.tool.delete_settlement': '이 결제 삭제',
'assistant.tool.freeze_budget_rates': '오늘 환율로 고정',
'assistant.followUp.whoOwes': '누가 누구에게 얼마를 빚졌나요?',
'assistant.followUp.recordPayments': '이 결제들 기록',
'assistant.card.budget.open': '비용에서 열기',
'assistant.card.budget.paidBy': '{name} 님이 지불',
'assistant.card.budget.notPaid': '미결제',
'assistant.card.budget.split.equal': '균등 분할',
'assistant.card.budget.split.custom': '금액별 분할',
'assistant.card.budget.split.none': '계획만, 분할 안 함',
'assistant.card.budget.together': '합계 {amount}',
'assistant.card.budget.markedPaid': '{amount} 지불 완료로 표시됨',
'assistant.card.budget.receipts': '영수증 {count}개',
'assistant.card.budget.leftOut': '외화 지출 {count}건이 합계에서 빠졌습니다: 아직 환율이 없습니다.',
'assistant.card.budget.unconverted': '{currencies} 항목 {count}건이 계산되지 않습니다: 아직 환율이 없습니다.',
};
export default assistantBudget;
+29 -1
View File
@@ -1,4 +1,32 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Betaling vastleggen',
'assistant.change.verb.updatePayment': 'Betaling wijzigen',
'assistant.tool.create_budget_item_with_members': 'Uitgave toevoegen',
'assistant.tool.set_budget_item_members': 'Wijzigen wie de kosten deelt',
'assistant.tool.toggle_budget_member_paid': 'Bijwerken wie heeft betaald',
'assistant.tool.create_settlement': 'Betaling vastleggen',
'assistant.tool.update_settlement': 'De betaling wijzigen',
'assistant.tool.delete_settlement': 'De betaling verwijderen',
'assistant.tool.freeze_budget_rates': 'Wisselkoersen van vandaag vastzetten',
'assistant.followUp.whoOwes': 'Wie is wie wat schuldig?',
'assistant.followUp.recordPayments': 'Deze betalingen vastleggen',
'assistant.card.budget.open': 'Openen in Onkosten',
'assistant.card.budget.paidBy': '{name} heeft betaald',
'assistant.card.budget.notPaid': 'Niet betaald',
'assistant.card.budget.split.equal': 'Gelijk verdeeld',
'assistant.card.budget.split.custom': 'Ongelijk verdeeld',
'assistant.card.budget.split.none': 'Alleen planning, niet verdeeld',
'assistant.card.budget.together': 'Samen {amount}',
'assistant.card.budget.markedPaid': '{amount} als betaald gemarkeerd',
'assistant.card.budget.receipts': '{count} bonnen',
'assistant.card.budget.receipts.one': '{count} bon',
'assistant.card.budget.leftOut':
'{count} uitgaven in vreemde valuta tellen niet mee in het totaal: nog geen wisselkoers.',
'assistant.card.budget.leftOut.one':
'{count} uitgave in vreemde valuta telt niet mee in het totaal: nog geen wisselkoers.',
'assistant.card.budget.unconverted': '{count} posten in {currencies} tellen niet mee: nog geen wisselkoers.',
'assistant.card.budget.unconverted.one': '{count} post in {currencies} telt niet mee: nog geen wisselkoers.',
};
export default assistantBudget;
+38 -1
View File
@@ -1,4 +1,41 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Zapisz płatność',
'assistant.change.verb.updatePayment': 'Zmień płatność',
'assistant.tool.create_budget_item_with_members': 'Dodaj wydatek',
'assistant.tool.set_budget_item_members': 'Zmień, kto dzieli koszt',
'assistant.tool.toggle_budget_member_paid': 'Zaktualizuj, kto zapłacił',
'assistant.tool.create_settlement': 'Zapisz płatność',
'assistant.tool.update_settlement': 'Zmień tę płatność',
'assistant.tool.delete_settlement': 'Usuń tę płatność',
'assistant.tool.freeze_budget_rates': 'Zablokuj dzisiejsze kursy walut',
'assistant.followUp.whoOwes': 'Kto komu jest winien?',
'assistant.followUp.recordPayments': 'Zapisz te płatności',
'assistant.card.budget.open': 'Otwórz w Kosztach',
'assistant.card.budget.paidBy': '{name} zapłacił(a)',
'assistant.card.budget.notPaid': 'Niezapłacone',
'assistant.card.budget.split.equal': 'Podzielone po równo',
'assistant.card.budget.split.custom': 'Podzielone nierówno',
'assistant.card.budget.split.none': 'Tylko planowanie, bez podziału',
'assistant.card.budget.together': 'Razem {amount}',
'assistant.card.budget.markedPaid': '{amount} oznaczono jako zapłacone',
'assistant.card.budget.receipts': '{count} paragonu',
'assistant.card.budget.receipts.one': '{count} paragon',
'assistant.card.budget.receipts.few': '{count} paragony',
'assistant.card.budget.receipts.many': '{count} paragonów',
'assistant.card.budget.leftOut': '{count} wydatku w obcej walucie nie liczy się do sumy: brak jeszcze kursu wymiany.',
'assistant.card.budget.leftOut.one':
'{count} wydatek w obcej walucie nie liczy się do sumy: brak jeszcze kursu wymiany.',
'assistant.card.budget.leftOut.few':
'{count} wydatki w obcej walucie nie liczą się do sumy: brak jeszcze kursu wymiany.',
'assistant.card.budget.leftOut.many':
'{count} wydatków w obcej walucie nie liczy się do sumy: brak jeszcze kursu wymiany.',
'assistant.card.budget.unconverted': '{count} pozycji w {currencies} nie jest liczone: brak jeszcze kursu wymiany.',
'assistant.card.budget.unconverted.one':
'{count} pozycja w {currencies} nie jest liczona: brak jeszcze kursu wymiany.',
'assistant.card.budget.unconverted.few': '{count} pozycje w {currencies} nie są liczone: brak jeszcze kursu wymiany.',
'assistant.card.budget.unconverted.many':
'{count} pozycji w {currencies} nie jest liczonych: brak jeszcze kursu wymiany.',
};
export default assistantBudget;
+33 -1
View File
@@ -1,4 +1,36 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Записать платёж',
'assistant.change.verb.updatePayment': 'Изменить платёж',
'assistant.tool.create_budget_item_with_members': 'Добавить расход',
'assistant.tool.set_budget_item_members': 'Изменить, кто делит расход',
'assistant.tool.toggle_budget_member_paid': 'Обновить, кто заплатил',
'assistant.tool.create_settlement': 'Записать платёж',
'assistant.tool.update_settlement': 'Изменить этот платёж',
'assistant.tool.delete_settlement': 'Удалить этот платёж',
'assistant.tool.freeze_budget_rates': 'Зафиксировать сегодняшние курсы валют',
'assistant.followUp.whoOwes': 'Кто кому должен?',
'assistant.followUp.recordPayments': 'Записать эти платежи',
'assistant.card.budget.open': 'Открыть в разделе «Расходы»',
'assistant.card.budget.paidBy': '{name} заплатил(а)',
'assistant.card.budget.notPaid': 'Не оплачено',
'assistant.card.budget.split.equal': 'Поровну',
'assistant.card.budget.split.custom': 'Не поровну',
'assistant.card.budget.split.none': 'Только план, без разделения',
'assistant.card.budget.together': 'Вместе {amount}',
'assistant.card.budget.markedPaid': '{amount} отмечено как оплаченное',
'assistant.card.budget.receipts': '{count} чека',
'assistant.card.budget.receipts.one': '{count} чек',
'assistant.card.budget.receipts.few': '{count} чека',
'assistant.card.budget.receipts.many': '{count} чеков',
'assistant.card.budget.leftOut': '{count} расхода в иностранной валюте не входят в итог: курса пока нет.',
'assistant.card.budget.leftOut.one': '{count} расход в иностранной валюте не входит в итог: курса пока нет.',
'assistant.card.budget.leftOut.few': '{count} расхода в иностранной валюте не входят в итог: курса пока нет.',
'assistant.card.budget.leftOut.many': '{count} расходов в иностранной валюте не входят в итог: курса пока нет.',
'assistant.card.budget.unconverted': '{count} записи в {currencies} не учитываются: курса пока нет.',
'assistant.card.budget.unconverted.one': '{count} запись в {currencies} не учитывается: курса пока нет.',
'assistant.card.budget.unconverted.few': '{count} записи в {currencies} не учитываются: курса пока нет.',
'assistant.card.budget.unconverted.many': '{count} записей в {currencies} не учитываются: курса пока нет.',
};
export default assistantBudget;
+34 -1
View File
@@ -1,4 +1,37 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Zaznamenať platbu',
'assistant.change.verb.updatePayment': 'Zmeniť platbu',
'assistant.tool.create_budget_item_with_members': 'Pridať výdavok',
'assistant.tool.set_budget_item_members': 'Zmeniť, kto sa delí o náklad',
'assistant.tool.toggle_budget_member_paid': 'Aktualizovať, kto zaplatil',
'assistant.tool.create_settlement': 'Zaznamenať platbu',
'assistant.tool.update_settlement': 'Zmeniť túto platbu',
'assistant.tool.delete_settlement': 'Odstrániť túto platbu',
'assistant.tool.freeze_budget_rates': 'Zafixovať dnešné výmenné kurzy',
'assistant.followUp.whoOwes': 'Kto komu dlhuje?',
'assistant.followUp.recordPayments': 'Zaznamenať tieto platby',
'assistant.card.budget.open': 'Otvoriť v Nákladoch',
'assistant.card.budget.paidBy': '{name} zaplatil(a)',
'assistant.card.budget.notPaid': 'Nezaplatené',
'assistant.card.budget.split.equal': 'Rozdelené rovnakým dielom',
'assistant.card.budget.split.custom': 'Rozdelené nerovnakým dielom',
'assistant.card.budget.split.none': 'Len plánovanie, nerozdelené',
'assistant.card.budget.together': 'Spolu {amount}',
'assistant.card.budget.markedPaid': '{amount} označené ako zaplatené',
'assistant.card.budget.receipts': '{count} účteniek',
'assistant.card.budget.receipts.one': '{count} účtenka',
'assistant.card.budget.receipts.few': '{count} účtenky',
'assistant.card.budget.leftOut':
'{count} výdavkov v cudzej mene sa nezapočítava do súčtu: zatiaľ chýba výmenný kurz.',
'assistant.card.budget.leftOut.one':
'{count} výdavok v cudzej mene sa nezapočítava do súčtu: zatiaľ chýba výmenný kurz.',
'assistant.card.budget.leftOut.few':
'{count} výdavky v cudzej mene sa nezapočítavajú do súčtu: zatiaľ chýba výmenný kurz.',
'assistant.card.budget.unconverted': '{count} položiek v {currencies} sa nezapočítava: zatiaľ chýba výmenný kurz.',
'assistant.card.budget.unconverted.one': '{count} položka v {currencies} sa nezapočítava: zatiaľ chýba výmenný kurz.',
'assistant.card.budget.unconverted.few':
'{count} položky v {currencies} sa nezapočítavajú: zatiaľ chýba výmenný kurz.',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Registrera en betalning',
'assistant.change.verb.updatePayment': 'Ändra en betalning',
'assistant.tool.create_budget_item_with_members': 'Lägg till utgift',
'assistant.tool.set_budget_item_members': 'Ändra vem som delar kostnaden',
'assistant.tool.toggle_budget_member_paid': 'Uppdatera vem som har betalat',
'assistant.tool.create_settlement': 'Registrera en betalning',
'assistant.tool.update_settlement': 'Ändra betalningen',
'assistant.tool.delete_settlement': 'Ta bort betalningen',
'assistant.tool.freeze_budget_rates': 'Lås dagens växelkurser',
'assistant.followUp.whoOwes': 'Vem är skyldig vem?',
'assistant.followUp.recordPayments': 'Registrera de här betalningarna',
'assistant.card.budget.open': 'Öppna i Kostnader',
'assistant.card.budget.paidBy': '{name} betalade',
'assistant.card.budget.notPaid': 'Inte betald',
'assistant.card.budget.split.equal': 'Delad lika',
'assistant.card.budget.split.custom': 'Delad ojämnt',
'assistant.card.budget.split.none': 'Bara planering, inte delad',
'assistant.card.budget.together': 'Totalt {amount}',
'assistant.card.budget.markedPaid': '{amount} markerat som betalt',
'assistant.card.budget.receipts': '{count} kvitton',
'assistant.card.budget.receipts.one': '{count} kvitto',
'assistant.card.budget.leftOut': '{count} utgifter i utländsk valuta räknas inte i summan: ingen växelkurs än.',
'assistant.card.budget.leftOut.one': '{count} utgift i utländsk valuta räknas inte i summan: ingen växelkurs än.',
'assistant.card.budget.unconverted': '{count} poster i {currencies} räknas inte: ingen växelkurs än.',
'assistant.card.budget.unconverted.one': '{count} post i {currencies} räknas inte: ingen växelkurs än.',
};
export default assistantBudget;
+25 -1
View File
@@ -1,4 +1,28 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'บันทึกการชำระเงิน',
'assistant.change.verb.updatePayment': 'เปลี่ยนการชำระเงิน',
'assistant.tool.create_budget_item_with_members': 'เพิ่มค่าใช้จ่าย',
'assistant.tool.set_budget_item_members': 'เปลี่ยนผู้ที่หารค่าใช้จ่าย',
'assistant.tool.toggle_budget_member_paid': 'อัปเดตผู้ที่จ่ายแล้ว',
'assistant.tool.create_settlement': 'บันทึกการชำระเงิน',
'assistant.tool.update_settlement': 'เปลี่ยนการชำระเงินนี้',
'assistant.tool.delete_settlement': 'ลบการชำระเงินนี้',
'assistant.tool.freeze_budget_rates': 'ล็อกอัตราแลกเปลี่ยนของวันนี้',
'assistant.followUp.whoOwes': 'ใครติดเงินใคร?',
'assistant.followUp.recordPayments': 'บันทึกการชำระเงินเหล่านี้',
'assistant.card.budget.open': 'เปิดในค่าใช้จ่าย',
'assistant.card.budget.paidBy': '{name} จ่ายแล้ว',
'assistant.card.budget.notPaid': 'ยังไม่จ่าย',
'assistant.card.budget.split.equal': 'หารเท่ากัน',
'assistant.card.budget.split.custom': 'หารตามจำนวนที่กำหนด',
'assistant.card.budget.split.none': 'วางแผนเท่านั้น ไม่หาร',
'assistant.card.budget.together': 'รวม {amount}',
'assistant.card.budget.markedPaid': '{amount} ทำเครื่องหมายว่าจ่ายแล้ว',
'assistant.card.budget.receipts': 'ใบเสร็จ {count} ใบ',
'assistant.card.budget.leftOut':
'ค่าใช้จ่ายสกุลเงินต่างประเทศ {count} รายการไม่ได้รวมในยอดรวม: ยังไม่มีอัตราแลกเปลี่ยน',
'assistant.card.budget.unconverted': 'รายการใน {currencies} จำนวน {count} รายการไม่ถูกนับ: ยังไม่มีอัตราแลกเปลี่ยน',
};
export default assistantBudget;
+27 -1
View File
@@ -1,4 +1,30 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Ödeme kaydet',
'assistant.change.verb.updatePayment': 'Ödemeyi değiştir',
'assistant.tool.create_budget_item_with_members': 'Harcama ekle',
'assistant.tool.set_budget_item_members': 'Masrafı kimlerin paylaştığını değiştir',
'assistant.tool.toggle_budget_member_paid': 'Kimin ödediğini güncelle',
'assistant.tool.create_settlement': 'Ödeme kaydet',
'assistant.tool.update_settlement': 'Bu ödemeyi değiştir',
'assistant.tool.delete_settlement': 'Bu ödemeyi sil',
'assistant.tool.freeze_budget_rates': 'Bugünkü döviz kurlarını sabitle',
'assistant.followUp.whoOwes': 'Kim kime borçlu?',
'assistant.followUp.recordPayments': 'Bu ödemeleri kaydet',
'assistant.card.budget.open': 'Maliyetler içinde aç',
'assistant.card.budget.paidBy': '{name} ödedi',
'assistant.card.budget.notPaid': 'Ödenmedi',
'assistant.card.budget.split.equal': 'Eşit bölündü',
'assistant.card.budget.split.custom': 'Farklı tutarlarla bölündü',
'assistant.card.budget.split.none': 'Yalnızca planlama, bölünmedi',
'assistant.card.budget.together': 'Toplam {amount}',
'assistant.card.budget.markedPaid': '{amount} ödendi olarak işaretlendi',
'assistant.card.budget.receipts': '{count} fiş',
'assistant.card.budget.receipts.one': '{count} fiş',
'assistant.card.budget.leftOut': '{count} yabancı para harcaması toplama dahil değil: henüz döviz kuru yok.',
'assistant.card.budget.leftOut.one': '{count} yabancı para harcaması toplama dahil değil: henüz döviz kuru yok.',
'assistant.card.budget.unconverted': '{currencies} cinsinden {count} kayıt sayılmıyor: henüz döviz kuru yok.',
'assistant.card.budget.unconverted.one': '{currencies} cinsinden {count} kayıt sayılmıyor: henüz döviz kuru yok.',
};
export default assistantBudget;
+33 -1
View File
@@ -1,4 +1,36 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Записати платіж',
'assistant.change.verb.updatePayment': 'Змінити платіж',
'assistant.tool.create_budget_item_with_members': 'Додати витрату',
'assistant.tool.set_budget_item_members': 'Змінити, хто ділить витрату',
'assistant.tool.toggle_budget_member_paid': 'Оновити, хто заплатив',
'assistant.tool.create_settlement': 'Записати платіж',
'assistant.tool.update_settlement': 'Змінити цей платіж',
'assistant.tool.delete_settlement': 'Видалити цей платіж',
'assistant.tool.freeze_budget_rates': 'Зафіксувати сьогоднішні курси валют',
'assistant.followUp.whoOwes': 'Хто кому винен?',
'assistant.followUp.recordPayments': 'Записати ці платежі',
'assistant.card.budget.open': 'Відкрити в розділі «Витрати»',
'assistant.card.budget.paidBy': '{name} заплатив(ла)',
'assistant.card.budget.notPaid': 'Не сплачено',
'assistant.card.budget.split.equal': 'Порівну',
'assistant.card.budget.split.custom': 'Не порівну',
'assistant.card.budget.split.none': 'Лише план, без поділу',
'assistant.card.budget.together': 'Разом {amount}',
'assistant.card.budget.markedPaid': '{amount} позначено як оплачене',
'assistant.card.budget.receipts': '{count} чека',
'assistant.card.budget.receipts.one': '{count} чек',
'assistant.card.budget.receipts.few': '{count} чеки',
'assistant.card.budget.receipts.many': '{count} чеків',
'assistant.card.budget.leftOut': '{count} витрати в іноземній валюті не входять у підсумок: курсу ще немає.',
'assistant.card.budget.leftOut.one': '{count} витрата в іноземній валюті не входить у підсумок: курсу ще немає.',
'assistant.card.budget.leftOut.few': '{count} витрати в іноземній валюті не входять у підсумок: курсу ще немає.',
'assistant.card.budget.leftOut.many': '{count} витрат в іноземній валюті не входять у підсумок: курсу ще немає.',
'assistant.card.budget.unconverted': '{count} записи в {currencies} не враховуються: курсу ще немає.',
'assistant.card.budget.unconverted.one': '{count} запис в {currencies} не враховується: курсу ще немає.',
'assistant.card.budget.unconverted.few': '{count} записи в {currencies} не враховуються: курсу ще немає.',
'assistant.card.budget.unconverted.many': '{count} записів в {currencies} не враховуються: курсу ще немає.',
};
export default assistantBudget;
+24 -1
View File
@@ -1,4 +1,27 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': 'Ghi nhận một khoản thanh toán',
'assistant.change.verb.updatePayment': 'Sửa một khoản thanh toán',
'assistant.tool.create_budget_item_with_members': 'Thêm khoản chi',
'assistant.tool.set_budget_item_members': 'Đổi người cùng chia chi phí',
'assistant.tool.toggle_budget_member_paid': 'Cập nhật ai đã trả',
'assistant.tool.create_settlement': 'Ghi nhận một khoản thanh toán',
'assistant.tool.update_settlement': 'Sửa khoản thanh toán này',
'assistant.tool.delete_settlement': 'Xóa khoản thanh toán này',
'assistant.tool.freeze_budget_rates': 'Chốt tỷ giá hôm nay',
'assistant.followUp.whoOwes': 'Ai nợ ai?',
'assistant.followUp.recordPayments': 'Ghi nhận các khoản thanh toán này',
'assistant.card.budget.open': 'Mở trong Chi phí',
'assistant.card.budget.paidBy': '{name} đã trả',
'assistant.card.budget.notPaid': 'Chưa trả',
'assistant.card.budget.split.equal': 'Chia đều',
'assistant.card.budget.split.custom': 'Chia theo số tiền riêng',
'assistant.card.budget.split.none': 'Chỉ để lên kế hoạch, không chia',
'assistant.card.budget.together': 'Tổng cộng {amount}',
'assistant.card.budget.markedPaid': '{amount} đã đánh dấu là đã trả',
'assistant.card.budget.receipts': '{count} hóa đơn',
'assistant.card.budget.leftOut': '{count} khoản chi ngoại tệ không được tính vào tổng: chưa có tỷ giá.',
'assistant.card.budget.unconverted': '{count} mục bằng {currencies} không được tính: chưa có tỷ giá.',
};
export default assistantBudget;
+24 -1
View File
@@ -1,4 +1,27 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': '記錄一筆付款',
'assistant.change.verb.updatePayment': '修改付款',
'assistant.tool.create_budget_item_with_members': '新增支出',
'assistant.tool.set_budget_item_members': '變更分攤費用的人',
'assistant.tool.toggle_budget_member_paid': '更新已付款的人',
'assistant.tool.create_settlement': '記錄一筆付款',
'assistant.tool.update_settlement': '修改這筆付款',
'assistant.tool.delete_settlement': '刪除這筆付款',
'assistant.tool.freeze_budget_rates': '鎖定今天的匯率',
'assistant.followUp.whoOwes': '誰欠誰多少?',
'assistant.followUp.recordPayments': '記錄這些付款',
'assistant.card.budget.open': '在費用中開啟',
'assistant.card.budget.paidBy': '{name} 已付款',
'assistant.card.budget.notPaid': '未付',
'assistant.card.budget.split.equal': '平均分攤',
'assistant.card.budget.split.custom': '按金額分攤',
'assistant.card.budget.split.none': '僅供規劃,不分攤',
'assistant.card.budget.together': '合計 {amount}',
'assistant.card.budget.markedPaid': '{amount} 已標記為已付',
'assistant.card.budget.receipts': '{count} 張收據',
'assistant.card.budget.leftOut': '{count} 筆外幣支出未計入總額:尚無匯率。',
'assistant.card.budget.unconverted': '{currencies} 的 {count} 筆紀錄未計入:尚無匯率。',
};
export default assistantBudget;
+24 -1
View File
@@ -1,4 +1,27 @@
import type { TranslationStrings } from '../types';
const assistantBudget: TranslationStrings = {};
const assistantBudget: TranslationStrings = {
'assistant.change.verb.addPayment': '记录一笔付款',
'assistant.change.verb.updatePayment': '修改付款',
'assistant.tool.create_budget_item_with_members': '添加支出',
'assistant.tool.set_budget_item_members': '更改分摊费用的人',
'assistant.tool.toggle_budget_member_paid': '更新已付款的人',
'assistant.tool.create_settlement': '记录一笔付款',
'assistant.tool.update_settlement': '修改这笔付款',
'assistant.tool.delete_settlement': '删除这笔付款',
'assistant.tool.freeze_budget_rates': '锁定今天的汇率',
'assistant.followUp.whoOwes': '谁欠谁多少?',
'assistant.followUp.recordPayments': '记录这些付款',
'assistant.card.budget.open': '在费用中打开',
'assistant.card.budget.paidBy': '{name} 已付款',
'assistant.card.budget.notPaid': '未付',
'assistant.card.budget.split.equal': '平均分摊',
'assistant.card.budget.split.custom': '按金额分摊',
'assistant.card.budget.split.none': '仅用于计划,不分摊',
'assistant.card.budget.together': '合计 {amount}',
'assistant.card.budget.markedPaid': '{amount} 已标记为已付',
'assistant.card.budget.receipts': '{count} 张收据',
'assistant.card.budget.leftOut': '{count} 笔外币支出未计入总额:暂无汇率。',
'assistant.card.budget.unconverted': '{currencies} 的 {count} 条记录未计入:暂无汇率。',
};
export default assistantBudget;