Compare commits

..

44 Commits

Author SHA1 Message Date
MaysWind ab38d33e31 remove deprecated International Monetary Fund exchange rate data source 2026-01-31 00:30:55 +08:00
MaysWind 0020f4ede9 support importing camt.052 bank statement file 2026-01-31 00:20:40 +08:00
MaysWind b470cb63b7 replace ambiguous names with clearer names 2026-01-30 23:35:37 +08:00
MaysWind 32f2eaef3c when pasting date time, if multiple formats match and one matches the current display order, use that format for parsing 2026-01-30 22:40:41 +08:00
MaysWind a7fc3c78eb fix incorrect style 2026-01-30 21:25:28 +08:00
MaysWind d42b3ecb5e fix the continue button was missing during two-factor authentication on the desktop version when both two-factor authentication and third-party login are enabled both 2026-01-30 21:05:45 +08:00
MaysWind 2d4a603d11 automatically focus to the passcode input when a passcode is required 2026-01-30 21:02:54 +08:00
MaysWind 7a369328b6 support date formats that use dashes as separators and date formats without leading zeros 2026-01-26 23:59:37 +08:00
MaysWind 545667e502 update the text display style for AI image recognition on the desktop version 2026-01-25 21:15:21 +08:00
MaysWind 8387a81a59 fix the incorrect line-wrapping of the third-pary login separator line on the login page in the Korean locale 2026-01-24 23:55:14 +08:00
MaysWind 1e3087ccf0 bump version to 1.3.2 2026-01-24 23:49:20 +08:00
MaysWind bee7772bfd add refresh accounts, categories and tags button on import dialog 2026-01-24 23:21:02 +08:00
MaysWind a8b6f72ee6 update translation 2026-01-24 23:02:33 +08:00
MaysWind 9484cf514d show more accurate status messages when reloading all account, category and tag data 2026-01-24 22:53:56 +08:00
MaysWind 70958c00d3 limit the maximum height of the add button dropdown menu on the desktop transaction list page 2026-01-24 22:06:45 +08:00
MaysWind 9467335536 hide change tag group display order button when there are fewer than two tag groups 2026-01-24 21:57:42 +08:00
MaysWind f916fdff06 disable the move tag button when there are fewer than two tag groups 2026-01-24 21:55:45 +08:00
MaysWind ced346506e format translation file 2026-01-24 21:44:16 +08:00
MaysWind e0cd96f87e format code 2026-01-24 21:41:44 +08:00
Minhyung Park ed7e906903 Update Korean translation 2026-01-24 21:41:22 +08:00
MaysWind 3bb7f5abf4 support exporting data when checking pending import data 2026-01-22 23:58:04 +08:00
MaysWind 5d801a2343 remove redundant code 2026-01-22 23:15:36 +08:00
MaysWind 0d9e59dad9 fix the import dialog sometimes fails to automatically remember the last selected type 2026-01-22 22:23:05 +08:00
MaysWind 5fd1396b5c fix wrong mime type 2026-01-22 22:02:52 +08:00
MaysWind b3b9d9293b support semicolon-separated data when importing delimiter-separated values files / data (#458) 2026-01-22 22:01:59 +08:00
MaysWind 8b405e513f add new contributor 2026-01-22 00:00:17 +08:00
MaysWind 2bfcfbf03d update translation 2026-01-21 23:59:12 +08:00
MaysWind 10388a5ffa improved Chinese translation 2026-01-21 23:33:41 +08:00
MaysWind a127a381cc remove unused entries 2026-01-21 23:33:15 +08:00
MaysWind 4aa0dc20af update translation 2026-01-21 23:32:40 +08:00
Diego Fernández Criado 012cc04107 Update ES locales 2026-01-21 23:31:33 +08:00
MaysWind 25a84ad3af add new contributor 2026-01-21 22:30:29 +08:00
MaysWind c0036d230a update locale default settings 2026-01-21 22:30:03 +08:00
Harsh Vardan 869970a4ab refactor(locale): remove wrongfully formatted fsl translation file by ide 2026-01-21 11:06:02 +08:00
Harsh Vardan 42f8aa410c refactor(locale): proper import order in locales index.ts file 2026-01-21 11:06:02 +08:00
Harsh Vardan 80e1223505 feat(locale): add Tamil translation 2026-01-21 11:06:02 +08:00
MaysWind fc9581580c fix the system paste button appears again after the user tap outside 2026-01-19 22:23:24 +08:00
MaysWind b0e6764bfe do not allow switching tag groups before saving changes to the tag order 2026-01-19 01:02:46 +08:00
MaysWind 03fef81414 fix no error message is shown when a tag cannot be moved 2026-01-19 00:56:07 +08:00
MaysWind 8dcb8648a5 support tag group for transaction tags in the import transaction tool 2026-01-19 00:55:34 +08:00
MaysWind 50b4c96a99 fix the placeholder values in "root_url" cannot be resolved using values from environment variables, and do not allow placeholders in other options 2026-01-19 00:29:08 +08:00
MaysWind c9b894fdbe add new contributor 2026-01-18 13:42:11 +08:00
Andres Teller a2f1d944ad fix: correct typo in Spanish translation 2026-01-18 13:32:53 +08:00
MaysWind be4ec2bcce bump version to 1.3.1 2026-01-18 13:26:27 +08:00
74 changed files with 4901 additions and 2090 deletions
+2 -1
View File
@@ -129,7 +129,7 @@ Currently available translations:
| --- | --- | --- |
| de | Deutsch | [@chrgm](https://github.com/chrgm) |
| en | English | / |
| es | Español | [@Miguelonlonlon](https://github.com/Miguelonlonlon), [@abrugues](https://github.com/abrugues) |
| es | Español | [@Miguelonlonlon](https://github.com/Miguelonlonlon), [@abrugues](https://github.com/abrugues), [@AndresTeller](https://github.com/AndresTeller), [@diegofercri](https://github.com/diegofercri) |
| fr | Français | [@brieucdlf](https://github.com/brieucdlf) |
| it | Italiano | [@waron97](https://github.com/waron97) |
| ja | 日本語 | [@tkymmm](https://github.com/tkymmm) |
@@ -139,6 +139,7 @@ Currently available translations:
| pt-BR | Português (Brasil) | [@thecodergus](https://github.com/thecodergus) |
| ru | Русский | [@artegoser](https://github.com/artegoser) |
| sl | Slovenščina | [@thehijacker](https://github.com/thehijacker) |
| ta | தமிழ் | [@hhharsha36](https://github.com/hhharsha36) |
| th | ไทย | [@natthavat28](https://github.com/natthavat28) |
| tr | Türkçe | [@aydnykn](https://github.com/aydnykn) |
| uk | Українська | [@nktlitvinenko](https://github.com/nktlitvinenko) |
+1 -2
View File
@@ -15,7 +15,7 @@ http_port = 8080
# The domain name used to access ezBookkeeping
domain = localhost
# The full url used to access ezBookkeeping in browser
# The full url used to access ezBookkeeping in browser, supports placeholders: %(protocol)s, %(domain)s, %(http_port)s
root_url = %(protocol)s://%(domain)s:%(http_port)s/
# https certification and its key file
@@ -509,7 +509,6 @@ custom_map_tile_server_default_zoom_level = 14
# "swiss_national_bank": https://www.snb.ch/en/the-snb/mandates-goals/statistics/statistics-pub/current_interest_exchange_rates
# "national_bank_of_ukraine": https://bank.gov.ua/ua/markets/exchangerates
# "central_bank_of_uzbekistan": https://cbu.uz/en/arkhiv-kursov-valyut/
# "international_monetary_fund": https://www.imf.org/external/np/fin/data/param_rms_mth.aspx
# "user_custom": users set their own exchange rates data in the UI
data_source = euro_central_bank
+6 -1
View File
@@ -18,7 +18,9 @@
"en": [],
"es": [
"Miguelonlonlon",
"abrugues"
"abrugues",
"AndresTeller",
"diegofercri"
],
"fr": [
"brieucdlf"
@@ -47,6 +49,9 @@
"sl": [
"thehijacker"
],
"ta": [
"hhharsha36"
],
"th": [
"natthavat28"
],
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "ezbookkeeping",
"version": "1.3.0",
"version": "1.3.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ezbookkeeping",
"version": "1.3.0",
"version": "1.3.2",
"license": "MIT",
"dependencies": {
"@mdi/js": "^7.4.47",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "ezbookkeeping",
"version": "1.3.0",
"version": "1.3.2",
"private": true,
"repository": {
"type": "git",
+9
View File
@@ -9,11 +9,20 @@ const (
CAMT_INDICATOR_DEBIT camtCreditDebitIndicator = "DBIT"
)
type camt052File struct {
XMLName xml.Name `xml:"Document"`
BankToCustomerAccountReport *camtBankToCustomerAccountReport `xml:"BkToCstmrAcctRpt"`
}
type camt053File struct {
XMLName xml.Name `xml:"Document"`
BankToCustomerStatement *camtBankToCustomerStatement `xml:"BkToCstmrStmt"`
}
type camtBankToCustomerAccountReport struct {
Statements []*camtStatement `xml:"Rpt"`
}
type camtBankToCustomerStatement struct {
Statements []*camtStatement `xml:"Stmt"`
}
+32
View File
@@ -10,11 +10,30 @@ import (
"github.com/mayswind/ezbookkeeping/pkg/errs"
)
// camt052FileReader defines the structure of camt.052 file reader
type camt052FileReader struct {
xmlDecoder *xml.Decoder
}
// camt053FileReader defines the structure of camt.053 file reader
type camt053FileReader struct {
xmlDecoder *xml.Decoder
}
// read returns the imported camt.052 data
// Reference: https://www.iso20022.org/message-set/1196/download
func (r *camt052FileReader) read(ctx core.Context) (*camt052File, error) {
file := &camt052File{}
err := r.xmlDecoder.Decode(&file)
if err != nil {
return nil, err
}
return file, nil
}
// read returns the imported camt.053 data
// Reference: https://www.iso20022.org/message-set/1196/download
func (r *camt053FileReader) read(ctx core.Context) (*camt053File, error) {
@@ -29,6 +48,19 @@ func (r *camt053FileReader) read(ctx core.Context) (*camt053File, error) {
return file, nil
}
func createNewCamt052FileReader(data []byte) (*camt052FileReader, error) {
if len(data) > 5 && data[0] == 0x3C && data[1] == 0x3F && data[2] == 0x78 && data[3] == 0x6D && data[4] == 0x6C { // <?xml
xmlDecoder := xml.NewDecoder(bytes.NewReader(data))
xmlDecoder.CharsetReader = charset.NewReaderLabel
return &camt052FileReader{
xmlDecoder: xmlDecoder,
}, nil
}
return nil, errs.ErrInvalidXmlFile
}
func createNewCamt053FileReader(data []byte) (*camt053FileReader, error) {
if len(data) > 5 && data[0] == 0x3C && data[1] == 0x3F && data[2] == 0x78 && data[3] == 0x6D && data[4] == 0x6C { // <?xml
xmlDecoder := xml.NewDecoder(bytes.NewReader(data))
@@ -303,12 +303,12 @@ func (t *camtStatementTransactionDataRowIterator) parseTransaction(ctx core.Cont
return data, nil
}
func createNewCamtStatementTransactionDataTable(file *camt053File) (*camtStatementTransactionDataTable, error) {
if file == nil || file.BankToCustomerStatement == nil || len(file.BankToCustomerStatement.Statements) == 0 {
func createNewCamtStatementTransactionDataTable(camtStatements []*camtStatement) (*camtStatementTransactionDataTable, error) {
if len(camtStatements) == 0 {
return nil, errs.ErrNotFoundTransactionDataInFile
}
return &camtStatementTransactionDataTable{
allStatements: file.BankToCustomerStatement.Statements,
allStatements: camtStatements,
}, nil
}
@@ -5,6 +5,7 @@ import (
"github.com/mayswind/ezbookkeeping/pkg/converters/converter"
"github.com/mayswind/ezbookkeeping/pkg/core"
"github.com/mayswind/ezbookkeeping/pkg/errs"
"github.com/mayswind/ezbookkeeping/pkg/models"
"github.com/mayswind/ezbookkeeping/pkg/utils"
)
@@ -15,15 +16,49 @@ var camtTransactionTypeNameMapping = map[models.TransactionType]string{
models.TRANSACTION_TYPE_TRANSFER: utils.IntToString(int(models.TRANSACTION_TYPE_TRANSFER)),
}
// camt052TransactionDataImporter defines the structure of camt.052 file importer for transaction data
type camt052TransactionDataImporter struct {
}
// camt053TransactionDataImporter defines the structure of camt.053 file importer for transaction data
type camt053TransactionDataImporter struct {
}
// Initialize a camt.053 transaction data importer singleton instance
// Initialize camt.052 and camt.053 transaction data importer singleton instances
var (
Camt052TransactionDataImporter = &camt052TransactionDataImporter{}
Camt053TransactionDataImporter = &camt053TransactionDataImporter{}
)
// ParseImportedData returns the imported data by parsing the camt.052 file transaction data
func (c *camt052TransactionDataImporter) ParseImportedData(ctx core.Context, user *models.User, data []byte, defaultTimezone *time.Location, additionalOptions converter.TransactionDataImporterOptions, accountMap map[string]*models.Account, expenseCategoryMap map[string]map[string]*models.TransactionCategory, incomeCategoryMap map[string]map[string]*models.TransactionCategory, transferCategoryMap map[string]map[string]*models.TransactionCategory, tagMap map[string]*models.TransactionTag) (models.ImportedTransactionSlice, []*models.Account, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionTag, error) {
camt052DataReader, err := createNewCamt052FileReader(data)
if err != nil {
return nil, nil, nil, nil, nil, nil, err
}
camt052Data, err := camt052DataReader.read(ctx)
if err != nil {
return nil, nil, nil, nil, nil, nil, err
}
if camt052Data.BankToCustomerAccountReport == nil || camt052Data.BankToCustomerAccountReport.Statements == nil {
return nil, nil, nil, nil, nil, nil, errs.ErrNotFoundTransactionDataInFile
}
transactionDataTable, err := createNewCamtStatementTransactionDataTable(camt052Data.BankToCustomerAccountReport.Statements)
if err != nil {
return nil, nil, nil, nil, nil, nil, err
}
dataTableImporter := converter.CreateNewSimpleImporterWithTypeNameMapping(camtTransactionTypeNameMapping)
return dataTableImporter.ParseImportedData(ctx, user, transactionDataTable, defaultTimezone, additionalOptions, accountMap, expenseCategoryMap, incomeCategoryMap, transferCategoryMap, tagMap)
}
// ParseImportedData returns the imported data by parsing the camt.053 file transaction data
func (c *camt053TransactionDataImporter) ParseImportedData(ctx core.Context, user *models.User, data []byte, defaultTimezone *time.Location, additionalOptions converter.TransactionDataImporterOptions, accountMap map[string]*models.Account, expenseCategoryMap map[string]map[string]*models.TransactionCategory, incomeCategoryMap map[string]map[string]*models.TransactionCategory, transferCategoryMap map[string]map[string]*models.TransactionCategory, tagMap map[string]*models.TransactionTag) (models.ImportedTransactionSlice, []*models.Account, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionTag, error) {
camt053DataReader, err := createNewCamt053FileReader(data)
@@ -38,7 +73,11 @@ func (c *camt053TransactionDataImporter) ParseImportedData(ctx core.Context, use
return nil, nil, nil, nil, nil, nil, err
}
transactionDataTable, err := createNewCamtStatementTransactionDataTable(camt053Data)
if camt053Data.BankToCustomerStatement == nil || camt053Data.BankToCustomerStatement.Statements == nil {
return nil, nil, nil, nil, nil, nil, errs.ErrNotFoundTransactionDataInFile
}
transactionDataTable, err := createNewCamtStatementTransactionDataTable(camt053Data.BankToCustomerStatement.Statements)
if err != nil {
return nil, nil, nil, nil, nil, nil, err
@@ -13,6 +13,109 @@ import (
"github.com/mayswind/ezbookkeeping/pkg/utils"
)
func TestCamt052TransactionDataFileParseImportedData_MinimumValidData(t *testing.T) {
importer := Camt052TransactionDataImporter
context := core.NewNullContext()
user := &models.User{
Uid: 1234567890,
DefaultCurrency: "CNY",
}
allNewTransactions, allNewAccounts, allNewSubExpenseCategories, allNewSubIncomeCategories, allNewSubTransferCategories, allNewTags, err := importer.ParseImportedData(context, user, []byte(
`<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.02">
<BkToCstmrAcctRpt>
<Rpt>
<Acct>
<Id>
<IBAN>123</IBAN>
</Id>
<Ccy>CNY</Ccy>
</Acct>
<Ntry>
<BookgDt>
<DtTm>2024-09-01T01:23:45+08:00</DtTm>
</BookgDt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Amt Ccy="CNY">123.45</Amt>
</Ntry>
<Ntry>
<BookgDt>
<DtTm>2024-09-01T12:34:56+08:00</DtTm>
</BookgDt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Amt Ccy="CNY">0.12</Amt>
</Ntry>
</Rpt>
<Rpt>
<Acct>
<Id>
<Othr>
<Id>456</Id>
</Othr>
</Id>
<Ccy>USD</Ccy>
</Acct>
<Ntry>
<BookgDt>
<DtTm>2024-09-01T23:59:59+08:00</DtTm>
</BookgDt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Amt Ccy="USD">1.23</Amt>
</Ntry>
</Rpt>
</BkToCstmrAcctRpt>
</Document>`), time.UTC, converter.DefaultImporterOptions, nil, nil, nil, nil, nil)
assert.Nil(t, err)
assert.Equal(t, 3, len(allNewTransactions))
assert.Equal(t, 2, len(allNewAccounts))
assert.Equal(t, 1, len(allNewSubExpenseCategories))
assert.Equal(t, 1, len(allNewSubIncomeCategories))
assert.Equal(t, 0, len(allNewSubTransferCategories))
assert.Equal(t, 0, len(allNewTags))
assert.Equal(t, int64(1234567890), allNewTransactions[0].Uid)
assert.Equal(t, models.TRANSACTION_DB_TYPE_INCOME, allNewTransactions[0].Type)
assert.Equal(t, int64(1725125025), utils.GetUnixTimeFromTransactionTime(allNewTransactions[0].TransactionTime))
assert.Equal(t, int64(12345), allNewTransactions[0].Amount)
assert.Equal(t, "123", allNewTransactions[0].OriginalSourceAccountName)
assert.Equal(t, "CNY", allNewTransactions[0].OriginalSourceAccountCurrency)
assert.Equal(t, "", allNewTransactions[0].OriginalCategoryName)
assert.Equal(t, int64(1234567890), allNewTransactions[1].Uid)
assert.Equal(t, models.TRANSACTION_DB_TYPE_EXPENSE, allNewTransactions[1].Type)
assert.Equal(t, int64(1725165296), utils.GetUnixTimeFromTransactionTime(allNewTransactions[1].TransactionTime))
assert.Equal(t, int64(12), allNewTransactions[1].Amount)
assert.Equal(t, "123", allNewTransactions[1].OriginalSourceAccountName)
assert.Equal(t, "CNY", allNewTransactions[1].OriginalSourceAccountCurrency)
assert.Equal(t, "", allNewTransactions[1].OriginalCategoryName)
assert.Equal(t, int64(1234567890), allNewTransactions[2].Uid)
assert.Equal(t, models.TRANSACTION_DB_TYPE_INCOME, allNewTransactions[2].Type)
assert.Equal(t, int64(1725206399), utils.GetUnixTimeFromTransactionTime(allNewTransactions[2].TransactionTime))
assert.Equal(t, int64(123), allNewTransactions[2].Amount)
assert.Equal(t, "456", allNewTransactions[2].OriginalSourceAccountName)
assert.Equal(t, "USD", allNewTransactions[2].OriginalSourceAccountCurrency)
assert.Equal(t, "", allNewTransactions[2].OriginalCategoryName)
assert.Equal(t, int64(1234567890), allNewAccounts[0].Uid)
assert.Equal(t, "123", allNewAccounts[0].Name)
assert.Equal(t, "CNY", allNewAccounts[0].Currency)
assert.Equal(t, int64(1234567890), allNewAccounts[1].Uid)
assert.Equal(t, "456", allNewAccounts[1].Name)
assert.Equal(t, "USD", allNewAccounts[1].Currency)
assert.Equal(t, int64(1234567890), allNewSubExpenseCategories[0].Uid)
assert.Equal(t, "", allNewSubExpenseCategories[0].Name)
assert.Equal(t, int64(1234567890), allNewSubIncomeCategories[0].Uid)
assert.Equal(t, "", allNewSubIncomeCategories[0].Name)
}
func TestCamt053TransactionDataFileParseImportedData_MinimumValidData(t *testing.T) {
importer := Camt053TransactionDataImporter
context := core.NewNullContext()
@@ -29,6 +29,7 @@ import (
var supportedFileTypeSeparators = map[string]rune{
"custom_csv": ',',
"custom_tsv": '\t',
"custom_ssv": ';',
}
var supportedFileEncodings = map[string]encoding.Encoding{
@@ -17,10 +17,12 @@ import (
func TestIsDelimiterSeparatedValuesFileType(t *testing.T) {
assert.True(t, IsDelimiterSeparatedValuesFileType("custom_csv"))
assert.True(t, IsDelimiterSeparatedValuesFileType("custom_tsv"))
assert.True(t, IsDelimiterSeparatedValuesFileType("custom_ssv"))
assert.False(t, IsDelimiterSeparatedValuesFileType("dsv"))
assert.False(t, IsDelimiterSeparatedValuesFileType("csv"))
assert.False(t, IsDelimiterSeparatedValuesFileType("tsv"))
assert.False(t, IsDelimiterSeparatedValuesFileType("ssv"))
}
func TestCustomTransactionDataDsvFileParser_ParseDsvFileLines(t *testing.T) {
@@ -65,6 +67,26 @@ func TestCustomTransactionDataDsvFileParser_ParseDsvFileLines(t *testing.T) {
assert.Equal(t, "2024-09-01 23:59:59", allLines[1][0])
assert.Equal(t, "T", allLines[1][1])
assert.Equal(t, "0.05", allLines[1][2])
importer, err = CreateNewCustomTransactionDataDsvFileParser("custom_ssv", "utf-8")
assert.Nil(t, err)
allLines, err = importer.ParseDsvFileLines(context, []byte(
"2024-09-01 12:34:56;E;1.00\n"+
"2024-09-01 23:59:59;T;0.05"))
assert.Nil(t, err)
assert.Equal(t, 2, len(allLines))
assert.Equal(t, 3, len(allLines[0]))
assert.Equal(t, "2024-09-01 12:34:56", allLines[0][0])
assert.Equal(t, "E", allLines[0][1])
assert.Equal(t, "1.00", allLines[0][2])
assert.Equal(t, 3, len(allLines[1]))
assert.Equal(t, "2024-09-01 23:59:59", allLines[1][0])
assert.Equal(t, "T", allLines[1][1])
assert.Equal(t, "0.05", allLines[1][2])
}
func TestCustomTransactionDataDsvFileImporter_MinimumValidData(t *testing.T) {
@@ -52,6 +52,8 @@ func GetTransactionDataImporter(fileType string) (converter.TransactionDataImpor
return qif.QifDayMonthYearTransactionDataImporter, nil
} else if fileType == "iif" {
return iif.IifTransactionDataFileImporter, nil
} else if fileType == "camt052" {
return camt.Camt052TransactionDataImporter, nil
} else if fileType == "camt053" {
return camt.Camt053TransactionDataImporter, nil
} else if fileType == "mt940" {
@@ -295,22 +295,6 @@ func TestExchangeRatesApiLatestExchangeRateHandler_CentralBankOfUzbekistanDataSo
checkExchangeRatesHaveSpecifiedCurrencies(t, exchangeRateResponse.BaseCurrency, supportedCurrencyCodes, exchangeRateResponse.ExchangeRates)
}
func TestExchangeRatesApiLatestExchangeRateHandler_InternationalMonetaryFundDataSource(t *testing.T) {
exchangeRateResponse := executeLatestExchangeRateHandler(t, settings.InternationalMonetaryFundDataSource)
if exchangeRateResponse == nil {
return
}
assert.Equal(t, "USD", exchangeRateResponse.BaseCurrency)
supportedCurrencyCodes := []string{"AED", "AUD", "BND", "BRL", "BWP", "CAD", "CHF", "CLP", "CNY", "CZK",
"DKK", "DZD", "EUR", "GBP", "ILS", "INR", "JPY", "KRW", "KWD", "MUR", "MXN", "MYR", "NOK", "NZD",
"OMR", "PEN", "PHP", "PLN", "QAR", "SAR", "SEK", "SGD", "THB", "TTD", "UYU"}
checkExchangeRatesHaveSpecifiedCurrencies(t, exchangeRateResponse.BaseCurrency, supportedCurrencyCodes, exchangeRateResponse.ExchangeRates)
}
func executeLatestExchangeRateHandler(t *testing.T, dataSourceType string) *models.LatestExchangeRateResponse {
if os.Getenv("BUILD_PIPELINE") == "1" && os.Getenv("CHECK_3RD_API") != "1" {
return nil
@@ -67,9 +67,6 @@ func InitializeExchangeRatesDataSource(config *settings.Config) error {
} else if config.ExchangeRatesDataSource == settings.CentralBankOfUzbekistanDataSource {
Container.current = newCommonHttpExchangeRatesDataProvider(config, &CentralBankOfUzbekistanDataSource{})
return nil
} else if config.ExchangeRatesDataSource == settings.InternationalMonetaryFundDataSource {
Container.current = newCommonHttpExchangeRatesDataProvider(config, &InternationalMonetaryFundDataSource{})
return nil
} else if config.ExchangeRatesDataSource == settings.UserCustomExchangeRatesDataSource {
Container.current = newUserCustomExchangeRatesDataProvider()
return nil
@@ -1,238 +0,0 @@
package exchangerates
import (
"net/http"
"strings"
"time"
orderedmap "github.com/wk8/go-ordered-map/v2"
"github.com/mayswind/ezbookkeeping/pkg/core"
"github.com/mayswind/ezbookkeeping/pkg/errs"
"github.com/mayswind/ezbookkeeping/pkg/log"
"github.com/mayswind/ezbookkeeping/pkg/models"
"github.com/mayswind/ezbookkeeping/pkg/utils"
"github.com/mayswind/ezbookkeeping/pkg/validators"
)
const internationalMonetaryFundExchangeRateUrl = "https://www.imf.org/external/np/fin/data/rms_five.aspx?tsvflag=Y"
const internationalMonetaryFundExchangeRateReferenceUrl = "https://www.imf.org/external/np/fin/data/param_rms_mth.aspx"
const internationalMonetaryFundDataSource = "International Monetary Fund"
const internationalMonetaryFundBaseCurrency = "USD"
const internationalMonetaryFundDataUpdateDateFormat = "January 02, 2006 15:04"
const internationalMonetaryFundDataUpdateDateTimezone = "America/New_York"
var internationalMonetaryFundCurrencyNameCodeMap map[string]string
// InternationalMonetaryFundDataSource defines the structure of exchange rates data source of international monetary fund
type InternationalMonetaryFundDataSource struct {
HttpExchangeRatesDataSource
}
func init() {
internationalMonetaryFundCurrencyNameCodeMap = make(map[string]string, 38)
internationalMonetaryFundCurrencyNameCodeMap["Chinese yuan"] = "CNY"
internationalMonetaryFundCurrencyNameCodeMap["Euro"] = "EUR"
internationalMonetaryFundCurrencyNameCodeMap["Japanese yen"] = "JPY"
internationalMonetaryFundCurrencyNameCodeMap["U.K. pound"] = "GBP"
internationalMonetaryFundCurrencyNameCodeMap["U.S. dollar"] = "USD"
internationalMonetaryFundCurrencyNameCodeMap["Algerian dinar"] = "DZD"
internationalMonetaryFundCurrencyNameCodeMap["Australian dollar"] = "AUD"
internationalMonetaryFundCurrencyNameCodeMap["Botswana pula"] = "BWP"
internationalMonetaryFundCurrencyNameCodeMap["Brazilian real"] = "BRL"
internationalMonetaryFundCurrencyNameCodeMap["Brunei dollar"] = "BND"
internationalMonetaryFundCurrencyNameCodeMap["Canadian dollar"] = "CAD"
internationalMonetaryFundCurrencyNameCodeMap["Chilean peso"] = "CLP"
internationalMonetaryFundCurrencyNameCodeMap["Czech koruna"] = "CZK"
internationalMonetaryFundCurrencyNameCodeMap["Danish krone"] = "DKK"
internationalMonetaryFundCurrencyNameCodeMap["Indian rupee"] = "INR"
internationalMonetaryFundCurrencyNameCodeMap["Israeli New Shekel"] = "ILS"
internationalMonetaryFundCurrencyNameCodeMap["Korean won"] = "KRW"
internationalMonetaryFundCurrencyNameCodeMap["Kuwaiti dinar"] = "KWD"
internationalMonetaryFundCurrencyNameCodeMap["Malaysian ringgit"] = "MYR"
internationalMonetaryFundCurrencyNameCodeMap["Mauritian rupee"] = "MUR"
internationalMonetaryFundCurrencyNameCodeMap["Mexican peso"] = "MXN"
internationalMonetaryFundCurrencyNameCodeMap["New Zealand dollar"] = "NZD"
internationalMonetaryFundCurrencyNameCodeMap["Norwegian krone"] = "NOK"
internationalMonetaryFundCurrencyNameCodeMap["Omani rial"] = "OMR"
internationalMonetaryFundCurrencyNameCodeMap["Peruvian sol"] = "PEN"
internationalMonetaryFundCurrencyNameCodeMap["Philippine peso"] = "PHP"
internationalMonetaryFundCurrencyNameCodeMap["Polish zloty"] = "PLN"
internationalMonetaryFundCurrencyNameCodeMap["Qatari riyal"] = "QAR"
internationalMonetaryFundCurrencyNameCodeMap["Saudi Arabian riyal"] = "SAR"
internationalMonetaryFundCurrencyNameCodeMap["Singapore dollar"] = "SGD"
internationalMonetaryFundCurrencyNameCodeMap["Swedish krona"] = "SEK"
internationalMonetaryFundCurrencyNameCodeMap["Swiss franc"] = "CHF"
internationalMonetaryFundCurrencyNameCodeMap["Thai baht"] = "THB"
internationalMonetaryFundCurrencyNameCodeMap["Trinidadian dollar"] = "TTD"
internationalMonetaryFundCurrencyNameCodeMap["U.A.E. dirham"] = "AED"
internationalMonetaryFundCurrencyNameCodeMap["Uruguayan peso"] = "UYU"
}
// BuildRequests returns the international monetary fund exchange rates http requests
func (e *InternationalMonetaryFundDataSource) BuildRequests() ([]*http.Request, error) {
req, err := http.NewRequest("GET", internationalMonetaryFundExchangeRateUrl, nil)
if err != nil {
return nil, err
}
req.Header.Set("User-Agent", "") // Do not set custom user agent
return []*http.Request{req}, nil
}
// Parse returns the common response entity according to the international monetary fund data source raw response
func (e *InternationalMonetaryFundDataSource) Parse(c core.Context, content []byte) (*models.LatestExchangeRateResponse, error) {
lines := strings.Split(string(content), "\n")
if len(lines) < 1 {
log.Errorf(c, "[international_monetary_fund_datasource.Parse] content is invalid, content is %s", string(content))
return nil, errs.ErrFailedToRequestRemoteApi
}
exchangeRatesToSDR := orderedmap.New[string, float64]()
latestUpdateDate := ""
findSDRsPerCurrencyUnitLine := false
findExchangeRateDataHeader := false
for i := 0; i < len(lines); i++ {
line := lines[i]
if line == "" {
continue
}
line = strings.ReplaceAll(line, "\r", "")
if strings.Index(line, "Currency units per SDR") == 0 {
break
}
if strings.Index(line, "SDRs per Currency unit") == 0 {
findSDRsPerCurrencyUnitLine = true
continue
}
if findExchangeRateDataHeader {
items := strings.Split(line, "\t")
if len(items) != 6 {
continue
}
currencyCode, exchangeRate := e.parseExchangeRate(c, line, items)
if currencyCode != nil && exchangeRate != nil {
exchangeRatesToSDR.Set(*currencyCode, *exchangeRate)
}
continue
}
if findSDRsPerCurrencyUnitLine {
items := strings.Split(line, "\t")
if len(items) != 6 {
continue
}
if items[0] == "Currency" {
findExchangeRateDataHeader = true
latestUpdateDate = items[1]
continue
}
}
}
if latestUpdateDate == "" {
log.Errorf(c, "[international_monetary_fund_datasource.Parse] latest update date is empty")
return nil, errs.ErrFailedToRequestRemoteApi
}
if exchangeRatesToSDR.Len() < 1 {
log.Errorf(c, "[international_monetary_fund_datasource.Parse] exchange rates date is empty")
return nil, errs.ErrFailedToRequestRemoteApi
}
defaultCurrencyExchangeRateToSDR, exists := exchangeRatesToSDR.Get(internationalMonetaryFundBaseCurrency)
if !exists {
log.Errorf(c, "[international_monetary_fund_datasource.Parse] exchange rates date does not have default currency \"%s\"", internationalMonetaryFundBaseCurrency)
return nil, errs.ErrFailedToRequestRemoteApi
}
exchangeRates := make(models.LatestExchangeRateSlice, 0, exchangeRatesToSDR.Len())
for pair := exchangeRatesToSDR.Oldest(); pair != nil; pair = pair.Next() {
exchangeRates = append(exchangeRates, &models.LatestExchangeRate{
Currency: pair.Key,
Rate: utils.Float64ToString(defaultCurrencyExchangeRateToSDR / pair.Value),
})
}
timezone, err := time.LoadLocation(internationalMonetaryFundDataUpdateDateTimezone)
if err != nil {
log.Errorf(c, "[international_monetary_fund_datasource.Parse] failed to get timezone, timezone name is %s", internationalMonetaryFundDataUpdateDateTimezone)
return nil, errs.ErrFailedToRequestRemoteApi
}
updateDateTime := latestUpdateDate + " 11:00" // The IMF posts Representative and SDR exchange rates every 20 minutes from 11:00 AM to 6:00 PM U.S. EST Monday to Friday except for these holidays
updateTime, err := time.ParseInLocation(internationalMonetaryFundDataUpdateDateFormat, updateDateTime, timezone)
if err != nil {
log.Errorf(c, "[international_monetary_fund_datasource.Parse] failed to parse update date, datetime is %s", updateDateTime)
return nil, errs.ErrFailedToRequestRemoteApi
}
latestExchangeRateResp := &models.LatestExchangeRateResponse{
DataSource: internationalMonetaryFundDataSource,
ReferenceUrl: internationalMonetaryFundExchangeRateReferenceUrl,
UpdateTime: updateTime.Unix(),
BaseCurrency: internationalMonetaryFundBaseCurrency,
ExchangeRates: exchangeRates,
}
return latestExchangeRateResp, nil
}
func (e *InternationalMonetaryFundDataSource) parseExchangeRate(c core.Context, line string, lineItems []string) (*string, *float64) {
currencyCode, exists := internationalMonetaryFundCurrencyNameCodeMap[lineItems[0]]
if !exists {
log.Warnf(c, "[international_monetary_fund_datasource.parseExchangeRate] unknown currency name %s, line is %s", lineItems[0], line)
return nil, nil
}
if _, exists := validators.AllCurrencyNames[currencyCode]; !exists {
return nil, nil
}
for i := 1; i < 6; i++ {
item := lineItems[i]
if item == "" {
continue
}
rate, err := utils.StringToFloat64(item)
if err != nil {
log.Warnf(c, "[international_monetary_fund_datasource.parseExchangeRate] failed to parse rate, line is %s", line)
return nil, nil
}
if rate <= 0 {
log.Warnf(c, "[international_monetary_fund_datasource.parseExchangeRate] rate is invalid, line is %s", line)
return nil, nil
}
return &currencyCode, &rate
}
log.Warnf(c, "[international_monetary_fund_datasource.parseExchangeRate] no exchange rate data exists for currency \"%s\", line is %s", currencyCode, line)
return nil, nil
}
@@ -1,188 +0,0 @@
package exchangerates
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/mayswind/ezbookkeeping/pkg/core"
"github.com/mayswind/ezbookkeeping/pkg/models"
)
const internationalMonetaryFundMinimumRequiredContent = "SDRs per Currency unit and Currency units per SDR (1)\n" +
"last five days\n" +
"SDRs per Currency unit (2)\n" +
"\n" +
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n" +
"Chinese yuan\t0.1040520000\t0.1039250000\t0.1040370000\t0.1040850000\t0.1040570000\n" +
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"
func TestInternationalMonetaryFundDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(internationalMonetaryFundMinimumRequiredContent))
assert.Equal(t, nil, err)
assert.Equal(t, "USD", actualLatestExchangeRateResponse.BaseCurrency)
}
func TestInternationalMonetaryFundDataSource_StandardDataExtractUpdateTime(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(internationalMonetaryFundMinimumRequiredContent))
assert.Equal(t, nil, err)
assert.Equal(t, int64(1724857200), actualLatestExchangeRateResponse.UpdateTime)
}
func TestInternationalMonetaryFundDataSource_StandardDataExtractExchangeRates(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(internationalMonetaryFundMinimumRequiredContent))
assert.Equal(t, nil, err)
assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
Currency: "USD",
Rate: "1",
})
assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
Currency: "CNY",
Rate: "7.128474224426247",
})
}
func TestInternationalMonetaryFundDataSource_BlankContent(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
_, err := dataSource.Parse(context, []byte(""))
assert.NotEqual(t, nil, err)
}
func TestInternationalMonetaryFundDataSource_OnlyHeader(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
_, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)"))
assert.NotEqual(t, nil, err)
}
func TestInternationalMonetaryFundDataSource_OnlyHeaderAndTitle(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
_, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"))
assert.NotEqual(t, nil, err)
}
func TestInternationalMonetaryFundDataSource_MissingHeader(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
_, err := dataSource.Parse(context, []byte("Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Chinese yuan\t0.1040520000\t0.1039250000\t0.1040370000\t0.1040850000\t0.1040570000\n"+
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"))
assert.NotEqual(t, nil, err)
}
func TestInternationalMonetaryFundDataSource_MissingDefaultCurrencyData(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
_, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Chinese yuan\t0.1040520000\t0.1039250000\t0.1040370000\t0.1040850000\t0.1040570000\n"))
assert.NotEqual(t, nil, err)
}
func TestInternationalMonetaryFundDataSource_DefaultCurrencyDataInvalid(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
_, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Chinese yuan\t0.1040520000\t0.1039250000\t0.1040370000\t0.1040850000\t0.1040570000\n"+
"U.S. dollar\t0\t0\t0\t0\t0\n"))
assert.NotEqual(t, nil, err)
}
func TestInternationalMonetaryFundDataSource_InvalidCurrency(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Foo bar\t0.1040520000\t0.1039250000\t0.1040370000\t0.1040850000\t0.1040570000\n"+
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"))
assert.Equal(t, nil, err)
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 1)
}
func TestInternationalMonetaryFundDataSource_InvalidRate(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Chinese yuan\tnull\tnull\tnull\tnull\tnull\n"+
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"))
assert.Equal(t, nil, err)
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 1)
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Chinese yuan\t0\t0\t0\t0\t0\n"+
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"))
assert.Equal(t, nil, err)
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 1)
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"Chinese yuan\t\t\t\t\t\n"+
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"))
assert.Equal(t, nil, err)
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 1)
}
func TestInternationalMonetaryFundDataSource_LatestDateNotHasRate(t *testing.T) {
dataSource := &InternationalMonetaryFundDataSource{}
context := core.NewNullContext()
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("SDRs per Currency unit and Currency units per SDR (1)\n"+
"last five days\n"+
"SDRs per Currency unit (2)\n"+
"\n"+
"Currency\tAugust 28, 2024\tAugust 27, 2024\tAugust 26, 2024\tAugust 23, 2024\tAugust 22, 2024\n"+
"U.S. dollar\t0.7417320000\t0.7410250000\t0.7408270000\t0.7429280000\t0.7423020000\n"+
"U.A.E. dirham\t\t0.2017770000\t0.2017230000\t\t0.2021240000\n"))
assert.Equal(t, nil, err)
assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
Currency: "AED",
Rate: "3.675998751096507",
})
}
+5 -2
View File
@@ -39,9 +39,12 @@ var AllLanguages = map[string]*LocaleInfo{
"ru": {
Content: ru,
},
"sl": {
"sl": {
Content: sl,
},
},
"ta": {
Content: ta,
},
"th": {
Content: th,
},
+33
View File
@@ -0,0 +1,33 @@
package locales
import (
"github.com/mayswind/ezbookkeeping/pkg/core"
)
var ta = &LocaleTextItems{
GlobalTextItems: &GlobalTextItems{
AppName: "ezBookkeeping",
},
DefaultTypes: &DefaultTypes{
DecimalSeparator: core.DECIMAL_SEPARATOR_DOT,
DigitGroupingSymbol: core.DIGIT_GROUPING_SYMBOL_COMMA,
},
DataConverterTextItems: &DataConverterTextItems{
Alipay: "Alipay",
WeChatWallet: "Wallet",
},
VerifyEmailTextItems: &VerifyEmailTextItems{
Title: "மின்னஞ்சல் சரிபார்ப்பு",
SalutationFormat: "வணக்கம் %s,",
DescriptionAboveBtn: "உங்கள் மின்னஞ்சல் முகவரியை உறுதிப்படுத்த கீழே உள்ள இணைப்பைக் கிளிக் செய்யவும்.",
VerifyEmail: "மின்னஞ்சலை சரிபார்க்கவும்",
DescriptionBelowBtnFormat: "நீங்கள் %s கணக்கிற்கு பதிவு செய்யவில்லை என்றால், இந்த மின்னஞ்சலை புறக்கணிக்கவும். மேலே உள்ள இணைப்பைக் கிளிக் செய்ய முடியவில்லை என்றால், மேலே உள்ள URL ஐ நகலெடுத்து உங்கள் உலாவியில் ஒட்டவும். மின்னஞ்சல் சரிபார்ப்பு இணைப்பு %v நிமிடங்களுக்குப் பிறகு காலாவதியாகும்.",
},
ForgetPasswordMailTextItems: &ForgetPasswordMailTextItems{
Title: "உங்கள் கடவுச்சொல்லை மீட்டமைக்கவும்",
SalutationFormat: "வணக்கம் %s,",
DescriptionAboveBtn: "உங்கள் கடவுச்சொல்லை மீட்டமைக்க சமீபத்தில் கோரிக்கை பெற்றோம். உங்கள் கடவுச்சொல்லை மீட்டமைக்க கீழே உள்ள இணைப்பைக் கிளிக் செய்யவும்.",
ResetPassword: "கடவுச்சொல்லை மீட்டமை",
DescriptionBelowBtnFormat: "உங்கள் கடவுச்சொல்லை மீட்டமைக்க நீங்கள் கோரவில்லை என்றால், இந்த மின்னஞ்சலை புறக்கணிக்கவும். மேலே உள்ள இணைப்பைக் கிளிக் செய்ய முடியவில்லை என்றால், மேலே உள்ள URL ஐ நகலெடுத்து உங்கள் உலாவியில் ஒட்டவும். கடவுச்சொல் மீட்டமைப்பு இணைப்பு %v நிமிடங்களுக்குப் பிறகு காலாவதியாகும்.",
},
}
+38 -28
View File
@@ -20,6 +20,7 @@ const (
ebkConfigItemValueEnvNamePrefix = "EBK"
ebkConfigItemFilePathEnvNamePrefix = "EBKCFP"
defaultConfigPath = "/conf/ezbookkeeping.ini"
defaultRootUrl = "%(protocol)s://%(domain)s:%(http_port)s/"
defaultStaticRootPath = "public"
)
@@ -124,24 +125,23 @@ const (
// Exchange rates data source types
const (
ReserveBankOfAustraliaDataSource string = "reserve_bank_of_australia"
BankOfCanadaDataSource string = "bank_of_canada"
CzechNationalBankDataSource string = "czech_national_bank"
DanmarksNationalbankDataSource string = "danmarks_national_bank"
EuroCentralBankDataSource string = "euro_central_bank"
NationalBankOfGeorgiaDataSource string = "national_bank_of_georgia"
CentralBankOfHungaryDataSource string = "central_bank_of_hungary"
BankOfIsraelDataSource string = "bank_of_israel"
CentralBankOfMyanmarDataSource string = "central_bank_of_myanmar"
NorgesBankDataSource string = "norges_bank"
NationalBankOfPolandDataSource string = "national_bank_of_poland"
NationalBankOfRomaniaDataSource string = "national_bank_of_romania"
BankOfRussiaDataSource string = "bank_of_russia"
SwissNationalBankDataSource string = "swiss_national_bank"
NationalBankOfUkraineDataSource string = "national_bank_of_ukraine"
CentralBankOfUzbekistanDataSource string = "central_bank_of_uzbekistan"
InternationalMonetaryFundDataSource string = "international_monetary_fund"
UserCustomExchangeRatesDataSource string = "user_custom"
ReserveBankOfAustraliaDataSource string = "reserve_bank_of_australia"
BankOfCanadaDataSource string = "bank_of_canada"
CzechNationalBankDataSource string = "czech_national_bank"
DanmarksNationalbankDataSource string = "danmarks_national_bank"
EuroCentralBankDataSource string = "euro_central_bank"
NationalBankOfGeorgiaDataSource string = "national_bank_of_georgia"
CentralBankOfHungaryDataSource string = "central_bank_of_hungary"
BankOfIsraelDataSource string = "bank_of_israel"
CentralBankOfMyanmarDataSource string = "central_bank_of_myanmar"
NorgesBankDataSource string = "norges_bank"
NationalBankOfPolandDataSource string = "national_bank_of_poland"
NationalBankOfRomaniaDataSource string = "national_bank_of_romania"
BankOfRussiaDataSource string = "bank_of_russia"
SwissNationalBankDataSource string = "swiss_national_bank"
NationalBankOfUkraineDataSource string = "national_bank_of_ukraine"
CentralBankOfUzbekistanDataSource string = "central_bank_of_uzbekistan"
UserCustomExchangeRatesDataSource string = "user_custom"
)
const (
@@ -627,7 +627,10 @@ func loadServerConfiguration(config *Config, configFile *ini.File, sectionName s
}
config.Domain = getConfigItemStringValue(configFile, sectionName, "domain", defaultDomain)
config.RootUrl = getConfigItemStringValue(configFile, sectionName, "root_url", fmt.Sprintf("%s://%s:%d/", string(config.Protocol), config.Domain, config.HttpPort))
config.RootUrl = getConfigItemStringValue(configFile, sectionName, "root_url", defaultRootUrl)
config.RootUrl = strings.ReplaceAll(config.RootUrl, "%(protocol)s", string(config.Protocol))
config.RootUrl = strings.ReplaceAll(config.RootUrl, "%(domain)s", config.Domain)
config.RootUrl = strings.ReplaceAll(config.RootUrl, "%(http_port)s", strconv.Itoa(int(config.HttpPort)))
if config.RootUrl[len(config.RootUrl)-1] != '/' {
config.RootUrl += "/"
@@ -1176,7 +1179,6 @@ func loadExchangeRatesConfiguration(config *Config, configFile *ini.File, sectio
dataSource == SwissNationalBankDataSource ||
dataSource == NationalBankOfUkraineDataSource ||
dataSource == CentralBankOfUzbekistanDataSource ||
dataSource == InternationalMonetaryFundDataSource ||
dataSource == UserCustomExchangeRatesDataSource {
config.ExchangeRatesDataSource = dataSource
} else {
@@ -1259,7 +1261,7 @@ func getConfigItemIsSet(configFile *ini.File, sectionName string, itemName strin
return false
}
return section.Key(itemName).String() != ""
return section.Key(itemName).Value() != ""
}
func getConfigItemStringValue(configFile *ini.File, sectionName string, itemName string, defaultValue ...string) string {
@@ -1270,11 +1272,13 @@ func getConfigItemStringValue(configFile *ini.File, sectionName string, itemName
}
section := configFile.Section(sectionName)
key := section.Key(itemName)
value := key.Value()
if len(defaultValue) > 0 {
return section.Key(itemName).MustString(defaultValue[0])
if len(value) == 0 && len(defaultValue) > 0 {
return defaultValue[0]
} else {
return section.Key(itemName).String()
return value
}
}
@@ -1290,7 +1294,7 @@ func getConfigItemUint8Value(configFile *ini.File, sectionName string, itemName
}
section := configFile.Section(sectionName)
value, err := strconv.ParseUint(section.Key(itemName).String(), 10, 8)
value, err := strconv.ParseUint(section.Key(itemName).Value(), 10, 8)
if err == nil {
return uint8(value)
@@ -1311,7 +1315,7 @@ func getConfigItemUint16Value(configFile *ini.File, sectionName string, itemName
}
section := configFile.Section(sectionName)
value, err := strconv.ParseUint(section.Key(itemName).String(), 10, 16)
value, err := strconv.ParseUint(section.Key(itemName).Value(), 10, 16)
if err == nil {
return uint16(value)
@@ -1332,7 +1336,7 @@ func getConfigItemUint32Value(configFile *ini.File, sectionName string, itemName
}
section := configFile.Section(sectionName)
value, err := strconv.ParseUint(section.Key(itemName).String(), 10, 32)
value, err := strconv.ParseUint(section.Key(itemName).Value(), 10, 32)
if err == nil {
return uint32(value)
@@ -1353,7 +1357,13 @@ func getConfigItemBoolValue(configFile *ini.File, sectionName string, itemName s
}
section := configFile.Section(sectionName)
return section.Key(itemName).MustBool(defaultValue)
value, err := strconv.ParseBool(section.Key(itemName).Value())
if err == nil {
return value
}
return defaultValue
}
func getConfigItemValueFromEnvironment(sectionName string, itemName string) string {
+7 -2
View File
@@ -89,6 +89,7 @@ import { ThemeType } from '@/core/theme.ts';
import { NumeralSystem } from '@/core/numeral.ts';
import {
type DateTime,
type DateFormatOrder,
MeridiemIndicator,
KnownDateTimeFormat
} from '@/core/datetime.ts';
@@ -120,6 +121,8 @@ const theme = useTheme();
const {
tt,
getCurrentNumeralSystemType,
getLongDateFormatOrder,
getShortDateFormatOrder,
parseDateTimeFromLongDateTime,
parseDateTimeFromShortDateTime,
formatDateTimeToLongDateTime
@@ -144,6 +147,8 @@ const secondInput = useTemplateRef<VAutocomplete>('secondInput');
const isDarkMode = computed<boolean>(() => theme.global.name.value === ThemeType.Dark);
const numeralSystem = computed<NumeralSystem>(() => getCurrentNumeralSystemType());
const longDateFormatOrder = computed<DateFormatOrder>(() => getLongDateFormatOrder());
const shortDateFormatOrder = computed<DateFormatOrder>(() => getShortDateFormatOrder());
const dateTime = computed<Date>({
get: () => {
@@ -245,10 +250,10 @@ function onPaste(event: ClipboardEvent): void {
text = text.trim();
const formats = KnownDateTimeFormat.detect(text);
const formats = KnownDateTimeFormat.detect(text, longDateFormatOrder.value, shortDateFormatOrder.value);
let dt: DateTime | undefined = undefined;
if (formats && formats.length === 1) {
if (formats && (formats.length === 1 || (formats.length > 1 && formats[0]!.type === longDateFormatOrder.value && formats[0]!.type === shortDateFormatOrder.value))) {
dt = parseDateTimeFromKnownDateTimeFormat(text, formats[0] as KnownDateTimeFormat);
if (dt) {
+2 -1
View File
@@ -365,7 +365,8 @@ function paste(): void {
currentValue.value = getStringValue(parsedAmount, false);
}).catch(error => {
pastingAmount.value = false;
// Do not set pastingAmount to false here
// In iOS, system will show the paste context menu, if user click outside, the paste action should not be triggered again
logger.error('failed to read clipboard text', error);
});
}
+15
View File
@@ -141,6 +141,11 @@ export const SUPPORTED_IMPORT_FILE_CATEGORY_AND_TYPES: ImportFileCategoryAndType
type: 'custom_tsv',
name: 'TSV (Tab-separated values) File',
extensions: '.tsv,.txt',
},
{
type: 'custom_ssv',
name: 'SSV (Semicolon-separated values) File',
extensions: '.txt',
}
],
supportedEncodings: SUPPORTED_FILE_ENCODINGS,
@@ -163,6 +168,11 @@ export const SUPPORTED_IMPORT_FILE_CATEGORY_AND_TYPES: ImportFileCategoryAndType
type: 'custom_tsv',
name: 'TSV (Tab-separated values) File',
extensions: '.tsv,.txt',
},
{
type: 'custom_ssv',
name: 'SSV (Semicolon-separated values) File',
extensions: '.txt',
}
],
dataFromTextbox: true,
@@ -219,6 +229,11 @@ export const SUPPORTED_IMPORT_FILE_CATEGORY_AND_TYPES: ImportFileCategoryAndType
{
categoryName: 'General Bank Statement Format',
fileTypes: [
{
type: 'camt052',
name: 'Camt.052 Bank to Customer Statement File',
extensions: '.xml'
},
{
type: 'camt053',
name: 'Camt.053 Bank to Customer Statement File',
+193 -117
View File
@@ -345,116 +345,41 @@ export class MeridiemIndicator {
}
}
export class KnownDateTimeFormat {
private static readonly allInstances: KnownDateTimeFormat[] = [];
public static readonly DefaultDateTime = new KnownDateTimeFormat('YYYY-MM-DD HH:mm:ss', /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly DefaultDateTimeWithTimezone = new KnownDateTimeFormat('YYYY-MM-DD HH:mm:ssZ', /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](Z|[+-](0[0-9]|1[0-4]):[0-5][0-9])$/);
public static readonly DefaultDateTimeWithoutSecond = new KnownDateTimeFormat('YYYY-MM-DD HH:mm', /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]$/);
public static readonly DefaultDate = new KnownDateTimeFormat('YYYY-MM-DD', /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly RFC3339 = new KnownDateTimeFormat('YYYY-MM-DDTHH:mm:ssZ', /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](Z|[+-](0[0-9]|1[0-4]):[0-5][0-9])$/);
public static readonly YYYYMMDDSlashWithTime = new KnownDateTimeFormat('YYYY/MM/DD HH:mm:ss', /^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly MMDDYYSlashWithTime = new KnownDateTimeFormat('MM/DD/YYYY HH:mm:ss', /^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly DDMMYYSlashWithTime = new KnownDateTimeFormat('DD/MM/YYYY HH:mm:ss', /^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly YYYYMMDDDotWithTime = new KnownDateTimeFormat('YYYY.MM.DD HH:mm:ss', /^\d{4}\.(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly MMDDYYDotWithTime = new KnownDateTimeFormat('MM.DD.YYYY HH:mm:ss', /^(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1])\.\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly DDMMYYDotWithTime = new KnownDateTimeFormat('DD.MM.YYYY HH:mm:ss', /^(0[1-9]|[1-2][0-9]|3[0-1])\.(0[1-9]|1[0-2])\.\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly YYYYMMDDSlash = new KnownDateTimeFormat('YYYY/MM/DD', /^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly MMDDYYSlash = new KnownDateTimeFormat('MM/DD/YYYY', /^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/\d{4}$/);
public static readonly DDMMYYSlash = new KnownDateTimeFormat('DD/MM/YYYY', /^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4}$/);
public static readonly YYYYMMDDDot = new KnownDateTimeFormat('YYYY.MM.DD', /^\d{4}\.(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly MMDDYYDot = new KnownDateTimeFormat('MM.DD.YYYY', /^(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1])\.\d{4}$/);
public static readonly DDMMYYDot = new KnownDateTimeFormat('DD.MM.YYYY', /^(0[1-9]|[1-2][0-9]|3[0-1])\.(0[1-9]|1[0-2])\.\d{4}$/);
public static readonly YYYYMMDD = new KnownDateTimeFormat('YYYYMMDD', /^\d{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$/);
public readonly format: string;
private readonly regex: RegExp;
private constructor(format: string, regex: RegExp) {
this.format = format;
this.regex = regex;
KnownDateTimeFormat.allInstances.push(this);
}
public isValid(dateTime: string): boolean {
return this.regex.test(dateTime);
}
public static values(): KnownDateTimeFormat[] {
return KnownDateTimeFormat.allInstances;
}
public static detect(dateTime: string): KnownDateTimeFormat[] | undefined {
const result: KnownDateTimeFormat[] = [];
for (const format of KnownDateTimeFormat.allInstances) {
if (format.isValid(dateTime)) {
result.push(format);
}
}
return result.length > 0 ? result : undefined;
}
public static detectMulti(dateTimes: string[]): KnownDateTimeFormat[] | undefined {
const detectedCounts: Record<string, number> = {};
for (const dateTime of dateTimes) {
const detectedFormats = KnownDateTimeFormat.detect(dateTime);
if (detectedFormats) {
for (const format of detectedFormats) {
detectedCounts[format.format] = (detectedCounts[format.format] || 0) + 1;
}
} else {
return undefined;
}
}
const result: KnownDateTimeFormat[] = [];
for (const format of KnownDateTimeFormat.allInstances) {
if (detectedCounts[format.format] === dateTimes.length) {
result.push(format);
}
}
return result.length > 0 ? result : undefined;
}
}
export const LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE: number = 0;
export enum DateFormatOrder {
YMD = 1,
MDY = 2,
DMY = 3
}
export interface DateFormat {
readonly type: number;
readonly key: string;
readonly isMonthAfterYear: boolean;
readonly typeName: string;
readonly order: DateFormatOrder;
}
type DateFormatTypeName = 'YYYYMMDD' | 'MMDDYYYY' | 'DDMMYYYY';
type DateFormatTypeName = 'YearMonthDay' | 'MonthDayYear' | 'DayMonthYear';
export class LongDateFormat implements DateFormat {
private static readonly allInstances: LongDateFormat[] = [];
private static readonly allInstancesByType: Record<number, LongDateFormat> = {};
private static readonly allInstancesByTypeName: Record<string, LongDateFormat> = {};
public static readonly YYYYMMDD = new LongDateFormat(1, 'YYYYMMDD', 'yyyy_mm_dd', true);
public static readonly MMDDYYYY = new LongDateFormat(2, 'MMDDYYYY', 'mm_dd_yyyy', false);
public static readonly DDMMYYYY = new LongDateFormat(3, 'DDMMYYYY', 'dd_mm_yyyy', false);
public static readonly YearMonthDay = new LongDateFormat(1, 'YearMonthDay', DateFormatOrder.YMD);
public static readonly MonthDayYear = new LongDateFormat(2, 'MonthDayYear', DateFormatOrder.MDY);
public static readonly DayMonthYear = new LongDateFormat(3, 'DayMonthYear', DateFormatOrder.DMY);
public static readonly Default = LongDateFormat.YYYYMMDD;
public static readonly Default = LongDateFormat.YearMonthDay;
public readonly type: number;
public readonly typeName: string;
public readonly key: string;
public readonly isMonthAfterYear: boolean;
public readonly order: DateFormatOrder;
private constructor(type: number, typeName: DateFormatTypeName, key: string, isMonthAfterYear: boolean) {
private constructor(type: number, typeName: DateFormatTypeName, order: DateFormatOrder) {
this.type = type;
this.typeName = typeName;
this.key = key;
this.isMonthAfterYear = isMonthAfterYear;
this.order = order;
LongDateFormat.allInstances.push(this);
LongDateFormat.allInstancesByType[type] = this;
@@ -479,22 +404,20 @@ export class ShortDateFormat implements DateFormat {
private static readonly allInstancesByType: Record<number, ShortDateFormat> = {};
private static readonly allInstancesByTypeName: Record<string, ShortDateFormat> = {};
public static readonly YYYYMMDD = new ShortDateFormat(1, 'YYYYMMDD', 'yyyy_mm_dd', true);
public static readonly MMDDYYYY = new ShortDateFormat(2, 'MMDDYYYY', 'mm_dd_yyyy', false);
public static readonly DDMMYYYY = new ShortDateFormat(3, 'DDMMYYYY', 'dd_mm_yyyy', false);
public static readonly YearMonthDay = new ShortDateFormat(1, 'YearMonthDay', DateFormatOrder.YMD);
public static readonly MonthDayYear = new ShortDateFormat(2, 'MonthDayYear', DateFormatOrder.MDY);
public static readonly DayMonthYear = new ShortDateFormat(3, 'DayMonthYear', DateFormatOrder.DMY);
public static readonly Default = ShortDateFormat.YYYYMMDD;
public static readonly Default = ShortDateFormat.YearMonthDay;
public readonly type: number;
public readonly typeName: string;
public readonly key: string;
public readonly isMonthAfterYear: boolean;
public readonly order: DateFormatOrder;
private constructor(type: number, typeName: DateFormatTypeName, key: string, isMonthAfterYear: boolean) {
private constructor(type: number, typeName: DateFormatTypeName, order: DateFormatOrder) {
this.type = type;
this.typeName = typeName;
this.key = key;
this.isMonthAfterYear = isMonthAfterYear;
this.order = order;
ShortDateFormat.allInstances.push(this);
ShortDateFormat.allInstancesByType[type] = this;
@@ -516,34 +439,32 @@ export class ShortDateFormat implements DateFormat {
export interface TimeFormat {
readonly type: number;
readonly key: string;
readonly typeName: string;
readonly is24HourFormat: boolean;
readonly isMeridiemIndicatorFirst: boolean | null;
}
export type LongTimeFormatTypeName = 'HHMMSS' | 'AHHMMSS' | 'HHMMSSA';
export type LongTimeFormatTypeName = 'HourMinuteSecond' | 'MeridiemIndicatorHourMinuteSecond' | 'HourMinuteSecondMeridiemIndicator';
export class LongTimeFormat implements TimeFormat {
private static readonly allInstances: LongTimeFormat[] = [];
private static readonly allInstancesByType: Record<number, LongTimeFormat> = {};
private static readonly allInstancesByTypeName: Record<string, LongTimeFormat> = {};
public static readonly HHMMSS = new LongTimeFormat(1, 'HHMMSS', 'hh_mm_ss', true, null);
public static readonly AHHMMSS = new LongTimeFormat(2, 'AHHMMSS', 'a_hh_mm_ss', false, true);
public static readonly HHMMSSA = new LongTimeFormat(3, 'HHMMSSA', 'hh_mm_ss_a', false, false);
public static readonly HourMinuteSecond = new LongTimeFormat(1, 'HourMinuteSecond', true, null);
public static readonly MeridiemIndicatorHourMinuteSecond = new LongTimeFormat(2, 'MeridiemIndicatorHourMinuteSecond', false, true);
public static readonly HourMinuteSecondMeridiemIndicator = new LongTimeFormat(3, 'HourMinuteSecondMeridiemIndicator', false, false);
public static readonly Default = LongTimeFormat.HHMMSS;
public static readonly Default = LongTimeFormat.HourMinuteSecond;
public readonly type: number;
public readonly typeName: string;
public readonly key: string;
public readonly is24HourFormat: boolean;
public readonly isMeridiemIndicatorFirst: boolean | null;
private constructor(type: number, typeName: LongTimeFormatTypeName, key: string, is24HourFormat: boolean, isMeridiemIndicatorFirst: boolean | null) {
private constructor(type: number, typeName: LongTimeFormatTypeName, is24HourFormat: boolean, isMeridiemIndicatorFirst: boolean | null) {
this.type = type;
this.typeName = typeName;
this.key = key;
this.is24HourFormat = is24HourFormat;
this.isMeridiemIndicatorFirst = isMeridiemIndicatorFirst;
@@ -565,29 +486,27 @@ export class LongTimeFormat implements TimeFormat {
}
}
export type ShortTimeFormatTypeName = 'HHMM' | 'AHHMM' | 'HHMMA';
export type ShortTimeFormatTypeName = 'HourMinute' | 'MeridiemIndicatorHourMinute' | 'HourMinuteMeridiemIndicator';
export class ShortTimeFormat implements TimeFormat {
private static readonly allInstances: ShortTimeFormat[] = [];
private static readonly allInstancesByType: Record<number, ShortTimeFormat> = {};
private static readonly allInstancesByTypeName: Record<string, ShortTimeFormat> = {};
public static readonly HHMM = new ShortTimeFormat(1, 'HHMM', 'hh_mm', true, null);
public static readonly AHHMM = new ShortTimeFormat(2, 'AHHMM', 'a_hh_mm', false, true);
public static readonly HHMMA = new ShortTimeFormat(3, 'HHMMA', 'hh_mm_a', false, false);
public static readonly HourMinute = new ShortTimeFormat(1, 'HourMinute', true, null);
public static readonly MeridiemIndicatorHourMinute = new ShortTimeFormat(2, 'MeridiemIndicatorHourMinute', false, true);
public static readonly HourMinuteMeridiemIndicator = new ShortTimeFormat(3, 'HourMinuteMeridiemIndicator', false, false);
public static readonly Default = ShortTimeFormat.HHMM;
public static readonly Default = ShortTimeFormat.HourMinute;
public readonly type: number;
public readonly typeName: string;
public readonly key: string;
public readonly is24HourFormat: boolean;
public readonly isMeridiemIndicatorFirst: boolean | null;
private constructor(type: number, typeName: ShortTimeFormatTypeName, key: string, is24HourFormat: boolean, isMeridiemIndicatorFirst: boolean | null) {
private constructor(type: number, typeName: ShortTimeFormatTypeName, is24HourFormat: boolean, isMeridiemIndicatorFirst: boolean | null) {
this.type = type;
this.typeName = typeName;
this.key = key;
this.is24HourFormat = is24HourFormat;
this.isMeridiemIndicatorFirst = isMeridiemIndicatorFirst;
@@ -609,6 +528,163 @@ export class ShortTimeFormat implements TimeFormat {
}
}
export class KnownDateTimeFormat {
private static readonly allInstances: KnownDateTimeFormat[] = [];
private static readonly allYMDInstances: KnownDateTimeFormat[] = [];
private static readonly allMDYInstances: KnownDateTimeFormat[] = [];
private static readonly allDMYInstances: KnownDateTimeFormat[] = [];
public static readonly DefaultDateTime = new KnownDateTimeFormat('YYYY-MM-DD HH:mm:ss', DateFormatOrder.YMD, /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly DefaultDateTimeWithTimezone = new KnownDateTimeFormat('YYYY-MM-DD HH:mm:ssZ', DateFormatOrder.YMD, /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](Z|[+-](0[0-9]|1[0-4]):[0-5][0-9])$/);
public static readonly DefaultDateTimeWithoutSecond = new KnownDateTimeFormat('YYYY-MM-DD HH:mm', DateFormatOrder.YMD, /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]$/);
public static readonly DefaultDate = new KnownDateTimeFormat('YYYY-MM-DD', DateFormatOrder.YMD, /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly RFC3339 = new KnownDateTimeFormat('YYYY-MM-DDTHH:mm:ssZ', DateFormatOrder.YMD, /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](Z|[+-](0[0-9]|1[0-4]):[0-5][0-9])$/);
public static readonly YYYYMMDDSlashWithTime = new KnownDateTimeFormat('YYYY/MM/DD HH:mm:ss', DateFormatOrder.YMD, /^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly MMDDYYYYSlashWithTime = new KnownDateTimeFormat('MM/DD/YYYY HH:mm:ss', DateFormatOrder.MDY, /^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly DDMMYYYYSlashWithTime = new KnownDateTimeFormat('DD/MM/YYYY HH:mm:ss', DateFormatOrder.DMY, /^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly YYYYMMDDDotWithTime = new KnownDateTimeFormat('YYYY.MM.DD HH:mm:ss', DateFormatOrder.YMD, /^\d{4}\.(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly MMDDYYYYDotWithTime = new KnownDateTimeFormat('MM.DD.YYYY HH:mm:ss', DateFormatOrder.MDY, /^(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1])\.\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly DDMMYYYYDotWithTime = new KnownDateTimeFormat('DD.MM.YYYY HH:mm:ss', DateFormatOrder.DMY, /^(0[1-9]|[1-2][0-9]|3[0-1])\.(0[1-9]|1[0-2])\.\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/);
public static readonly MMDDYYYYDash = new KnownDateTimeFormat('MM-DD-YYYY', DateFormatOrder.MDY, /^(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])-\d{4}$/);
public static readonly DDMMYYYYDash = new KnownDateTimeFormat('DD-MM-YYYY', DateFormatOrder.DMY, /^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-\d{4}$/);
public static readonly YYYYMMDDSlash = new KnownDateTimeFormat('YYYY/MM/DD', DateFormatOrder.YMD, /^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly MMDDYYYYSlash = new KnownDateTimeFormat('MM/DD/YYYY', DateFormatOrder.MDY, /^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/\d{4}$/);
public static readonly DDMMYYYYSlash = new KnownDateTimeFormat('DD/MM/YYYY', DateFormatOrder.DMY, /^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4}$/);
public static readonly YYYYMDSlash = new KnownDateTimeFormat('YYYY/M/D', DateFormatOrder.YMD, /^\d{4}\/([1-9]|1[0-2])\/([1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly MDYYYYSlash = new KnownDateTimeFormat('M/D/YYYY', DateFormatOrder.MDY, /^([1-9]|1[0-2])\/([1-9]|[1-2][0-9]|3[0-1])\/\d{4}$/);
public static readonly DMYYYYSlash = new KnownDateTimeFormat('D/M/YYYY', DateFormatOrder.DMY, /^([1-9]|[1-2][0-9]|3[0-1])\/([1-9]|1[0-2])\/\d{4}$/);
public static readonly YYYYMMDDDot = new KnownDateTimeFormat('YYYY.MM.DD', DateFormatOrder.YMD, /^\d{4}\.(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly MMDDYYYYDot = new KnownDateTimeFormat('MM.DD.YYYY', DateFormatOrder.MDY, /^(0[1-9]|1[0-2])\.(0[1-9]|[1-2][0-9]|3[0-1])\.\d{4}$/);
public static readonly DDMMYYYYDot = new KnownDateTimeFormat('DD.MM.YYYY', DateFormatOrder.DMY, /^(0[1-9]|[1-2][0-9]|3[0-1])\.(0[1-9]|1[0-2])\.\d{4}$/);
public static readonly YYYYMDDot = new KnownDateTimeFormat('YYYY.M.D', DateFormatOrder.YMD, /^\d{4}\.([1-9]|1[0-2])\.([1-9]|[1-2][0-9]|3[0-1])$/);
public static readonly MDYYYYDot = new KnownDateTimeFormat('M.D.YYYY', DateFormatOrder.MDY, /^([1-9]|1[0-2])\.([1-9]|[1-2][0-9]|3[0-1])\.\d{4}$/);
public static readonly DMYYYYDot = new KnownDateTimeFormat('D.M.YYYY', DateFormatOrder.DMY, /^([1-9]|[1-2][0-9]|3[0-1])\.([1-9]|1[0-2])\.\d{4}$/);
public static readonly YYYYMMDD = new KnownDateTimeFormat('YYYYMMDD', DateFormatOrder.YMD, /^\d{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$/);
public readonly format: string;
public readonly type: DateFormatOrder;
private readonly regex: RegExp;
private constructor(format: string, type: DateFormatOrder, regex: RegExp) {
this.format = format;
this.type = type;
this.regex = regex;
if (type === DateFormatOrder.YMD) {
KnownDateTimeFormat.allYMDInstances.push(this);
} else if (type === DateFormatOrder.MDY) {
KnownDateTimeFormat.allMDYInstances.push(this);
} else if (type === DateFormatOrder.DMY) {
KnownDateTimeFormat.allDMYInstances.push(this);
}
KnownDateTimeFormat.allInstances.push(this);
}
public isValid(dateTime: string): boolean {
return this.regex.test(dateTime);
}
public static values(): KnownDateTimeFormat[] {
return KnownDateTimeFormat.allInstances;
}
public static detect(dateTime: string, longDateTimeFormatOrder: DateFormatOrder, shortDateTimeFormatOrder: DateFormatOrder): KnownDateTimeFormat[] | undefined {
const allFormats: KnownDateTimeFormat[] = KnownDateTimeFormat.getAllFormatsByOrder(longDateTimeFormatOrder, shortDateTimeFormatOrder);
return KnownDateTimeFormat.detectSingle(dateTime, allFormats);
}
public static detectMulti(dateTimes: string[], longDateTimeFormatOrder: DateFormatOrder, shortDateTimeFormatOrder: DateFormatOrder): KnownDateTimeFormat[] | undefined {
const detectedCounts: Record<string, number> = {};
const allFormats: KnownDateTimeFormat[] = KnownDateTimeFormat.getAllFormatsByOrder(longDateTimeFormatOrder, shortDateTimeFormatOrder);
for (const dateTime of dateTimes) {
const detectedFormats = KnownDateTimeFormat.detectSingle(dateTime, allFormats);
if (detectedFormats) {
for (const format of detectedFormats) {
detectedCounts[format.format] = (detectedCounts[format.format] || 0) + 1;
}
} else {
return undefined;
}
}
const result: KnownDateTimeFormat[] = [];
for (const format of KnownDateTimeFormat.allInstances) {
if (detectedCounts[format.format] === dateTimes.length) {
result.push(format);
}
}
return result.length > 0 ? result : undefined;
}
private static detectSingle(dateTime: string, allFormats: KnownDateTimeFormat[]): KnownDateTimeFormat[] | undefined {
const result: KnownDateTimeFormat[] = [];
for (const format of allFormats) {
if (format.isValid(dateTime)) {
result.push(format);
}
}
return result.length > 0 ? result : undefined;
}
private static getAllFormatsByOrder(longDateTimeFormatOrder: DateFormatOrder, shortDateTimeFormatOrder: DateFormatOrder): KnownDateTimeFormat[] {
if (longDateTimeFormatOrder === DateFormatOrder.YMD && (shortDateTimeFormatOrder === DateFormatOrder.YMD || shortDateTimeFormatOrder === DateFormatOrder.MDY)) {
return [
...KnownDateTimeFormat.allYMDInstances,
...KnownDateTimeFormat.allMDYInstances,
...KnownDateTimeFormat.allDMYInstances
];
} else if (longDateTimeFormatOrder === DateFormatOrder.YMD && shortDateTimeFormatOrder === DateFormatOrder.DMY) {
return [
...KnownDateTimeFormat.allYMDInstances,
...KnownDateTimeFormat.allDMYInstances,
...KnownDateTimeFormat.allMDYInstances
];
} else if (longDateTimeFormatOrder === DateFormatOrder.MDY && (shortDateTimeFormatOrder === DateFormatOrder.MDY || shortDateTimeFormatOrder === DateFormatOrder.YMD)) {
return [
...KnownDateTimeFormat.allMDYInstances,
...KnownDateTimeFormat.allYMDInstances,
...KnownDateTimeFormat.allDMYInstances
];
} else if (longDateTimeFormatOrder === DateFormatOrder.MDY && shortDateTimeFormatOrder === DateFormatOrder.DMY) {
return [
...KnownDateTimeFormat.allMDYInstances,
...KnownDateTimeFormat.allDMYInstances,
...KnownDateTimeFormat.allYMDInstances
];
} else if (longDateTimeFormatOrder === DateFormatOrder.DMY && (shortDateTimeFormatOrder === DateFormatOrder.DMY || shortDateTimeFormatOrder === DateFormatOrder.YMD)) {
return [
...KnownDateTimeFormat.allDMYInstances,
...KnownDateTimeFormat.allYMDInstances,
...KnownDateTimeFormat.allMDYInstances
];
} else if (longDateTimeFormatOrder === DateFormatOrder.DMY && shortDateTimeFormatOrder === DateFormatOrder.MDY) {
return [
...KnownDateTimeFormat.allDMYInstances,
...KnownDateTimeFormat.allMDYInstances,
...KnownDateTimeFormat.allYMDInstances
];
} else {
return KnownDateTimeFormat.allInstances;
}
}
}
export enum DateRangeScene {
Normal = 0,
TrendAnalysis = 1,
+1 -1
View File
@@ -4,7 +4,7 @@ export class KnownFileType {
public static readonly JSON = new KnownFileType('json', 'application/json');
public static readonly CSV = new KnownFileType('csv', 'text/csv');
public static readonly TSV = new KnownFileType('tsv', 'text/tab-separated-values');
public static readonly TXT = new KnownFileType('txt', 'text/text');
public static readonly TXT = new KnownFileType('txt', 'text/plain');
public static readonly MARKDOWN = new KnownFileType('md', 'text/markdown');
public static readonly JS = new KnownFileType('js', 'application/javascript');
public static readonly JPG = new KnownFileType('jpg', 'image/jpeg');
+3 -3
View File
@@ -1,6 +1,6 @@
import { type TypeAndName, type TypeAndDisplayName, entries, keys } from './base.ts';
import { KnownAmountFormat } from './numeral.ts';
import { KnownDateTimeFormat } from './datetime.ts';
import { type DateFormatOrder, KnownDateTimeFormat } from './datetime.ts';
import { KnownDateTimezoneFormat } from './timezone.ts';
import { TransactionType } from './transaction.ts';
@@ -165,7 +165,7 @@ export class ImportTransactionDataMapping {
return result;
}
public parseFileAutoDetectedTimeFormat(fileData: string[][] | undefined): string | undefined {
public parseFileAutoDetectedTimeFormat(fileData: string[][] | undefined, longDateTimeFormatOrder: DateFormatOrder, shortDateTimeFormatOrder: DateFormatOrder): string | undefined {
if (!fileData || !fileData.length || !this.isColumnMappingSet(ImportTransactionColumnType.TransactionTime)) {
return undefined;
}
@@ -193,7 +193,7 @@ export class ImportTransactionDataMapping {
}
}
const detectedFormats = KnownDateTimeFormat.detectMulti(allDateTimes);
const detectedFormats = KnownDateTimeFormat.detectMulti(allDateTimes, longDateTimeFormatOrder, shortDateTimeFormatOrder);
if (!detectedFormats || !detectedFormats.length || detectedFormats.length > 1) {
return undefined;
+4 -4
View File
@@ -654,7 +654,7 @@ export function parseDateTimeFromUnixTimeWithTimezoneOffset(unixTime: number, ut
}
export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime | undefined {
const m = moment(dateTime, format.format);
const m = moment(dateTime, format.format, true);
if (!m.isValid()) {
return undefined;
@@ -664,7 +664,7 @@ export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: K
}
export function parseDateTimeFromString(dateTime: string, format: string): DateTime | undefined {
const m = moment(dateTime, format);
const m = moment(dateTime, format, true);
if (!m.isValid()) {
return undefined;
@@ -1128,9 +1128,9 @@ export function getAllDaysStartAndEndUnixTimes(startUnixTime: number, endUnixTim
}
export function getDateTimeFormatType<T extends DateFormat | TimeFormat>(allFormatMap: Record<string, T>, allFormatArray: T[], formatTypeValue: number, languageDefaultTypeName: string, systemDefaultFormatType: T): T {
if (formatTypeValue > LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE && allFormatArray[formatTypeValue - 1] && allFormatArray[formatTypeValue - 1]!.key) {
if (formatTypeValue > LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE && allFormatArray[formatTypeValue - 1] && allFormatArray[formatTypeValue - 1]!.typeName) {
return allFormatArray[formatTypeValue - 1] as T;
} else if (formatTypeValue === LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE && allFormatMap[languageDefaultTypeName] && allFormatMap[languageDefaultTypeName].key) {
} else if (formatTypeValue === LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE && allFormatMap[languageDefaultTypeName] && allFormatMap[languageDefaultTypeName].typeName) {
return allFormatMap[languageDefaultTypeName];
} else {
return systemDefaultFormatType;
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Portugiesisch (Brasilien)",
"Russian": "Russisch",
"Slovenian": "Slowenisch",
"Tamil": "Tamil",
"Thai": "Thailändisch",
"Turkish": "Türkisch",
"Ukrainian": "Ukrainisch",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D. MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D. MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD.MM.YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD.MM.YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D. MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D. MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD.MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD.MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Semicolon",
"Tab": "Tab",
"Vertical Bar": "Vertical Bar",
"Slash": "Slash",
"All Types": "Alle Typen",
"More": "Mehr",
"All": "Alle",
@@ -1595,9 +1596,9 @@
"Select All": "Alle auswählen",
"Select None": "Keine auswählen",
"Invert Selection": "Auswahl umkehren",
"Select All in This Page": "Alle auf dieser Seite auswählen",
"Select None in This Page": "Keine auf dieser Seite auswählen",
"Invert Selection in This Page": "Auswahl auf dieser Seite umkehren",
"Select All on This Page": "Alle auf dieser Seite auswählen",
"Select None on This Page": "Keine auf dieser Seite auswählen",
"Invert Selection on This Page": "Auswahl auf dieser Seite umkehren",
"Select All Valid Items": "Alle gültigen Elemente auswählen",
"Select All Invalid Items": "Alle ungültigen Elemente auswählen",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Transaktion",
"Transactions": "Transaktionen",
"Transaction Pictures": "Transaktionsbilder",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Nicht unterstützter Kartenanbieter",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Bitte aktualisieren Sie die Seite und versuchen Sie es erneut. Wenn der Fehler weiterhin besteht, stellen Sie sicher, dass die Karteneinstellungen des Servers korrekt konfiguriert sind.",
"Import Transactions": "Transaktionen importieren",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Datei hochladen",
"Upload Transaction Data File": "Transaktionsdatendatei hochladen",
"Define Column": "Define Column",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Monat-Tag-Jahr-Format",
"Day-month-year format": "Tag-Monat-Jahr-Format",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF)-Datei",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Transaktionslisten-Seite",
"Transactions Per Page": "Transaktionen pro Seite",
"Show Monthly Total Amount": "Monatlichen Gesamtbetrag anzeigen",
"Show Transaction Tag": "Transaktions-Tag anzeigen",
"Show Transaction Tags": "Transaktions-Tag anzeigen",
"Transaction Edit Page": "Transaktionsbearbeitungsseite",
"Automatically Save Draft": "Entwurf automatisch speichern",
"Show Confirmation Every Time": "Bestätigung jedes mal anzeigen",
"Always Show Confirmation": "Bestätigung jedes mal anzeigen",
"Automatically Add Geolocation": "Geolocation automatisch hinzufügen",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "CSV (Kommagetrennte Werte) Datei",
"TSV (Tab-separated values) File": "TSV (Tabulatorgetrennte Werte) Datei",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Diese Aktion kann NICHT rückgängig gemacht werden. Dies wird Ihre Konten, Kategorien, Tags und Transaktionsdaten löschen. Bitte geben Sie Ihr aktuelles Passwort ein, um zu bestätigen.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Alle Benutzerdaten wurden gelöscht",
"Unable to clear user data": "Benutzerdaten können nicht gelöscht werden",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Geräte & Sitzungen",
"Device Info": "Geräteinformationen",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Geplante Transaktionen",
"Template Name": "Vorlagenname",
"No available template": "Keine verfügbare Vorlage",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Sobald Sie Vorlagen hinzugefügt haben, können Sie die Hinzufügen-Schaltfläche auf der Startseite lange drücken, um schnell eine neue Transaktion hinzuzufügen",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Sobald Sie Vorlagen hinzugefügt haben, können Sie die Hinzufügen-Schaltfläche auf der Startseite lange drücken, um schnell eine neue Transaktion hinzuzufügen",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Keine verfügbare Vorlage. Sobald Sie Vorlagen hinzugefügt haben, können Sie schnell eine neue Transaktion über das Dropdown-Menü der Hinzufügen-Schaltfläche auf der Transaktionslisten-Seite hinzufügen",
"No available scheduled transactions": "Keine verfügbaren geplanten Transaktionen",
"Unable to retrieve template list": "Vorlagenliste kann nicht abgerufen werden",
+58 -54
View File
@@ -11,12 +11,13 @@
"French": "French",
"Italian": "Italian",
"Japanese": "Japanese",
"Dutch": "Dutch",
"Kannada": "Kannada",
"Korean": "Korean",
"Dutch": "Dutch",
"Portuguese (Brazil)": "Portuguese (Brazil)",
"Russian": "Russian",
"Slovenian": "Slovenian",
"Tamil": "Tamil",
"Thai": "Thai",
"Turkish": "Turkish",
"Ukrainian": "Ukrainian",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "MMDDYYYY",
"shortDateFormat": "MMDDYYYY",
"longTimeFormat": "HHMMSSA",
"shortTimeFormat": "HHMMA",
"longDateFormat": "MonthDayYear",
"shortDateFormat": "MonthDayYear",
"longTimeFormat": "HourMinuteSecondMeridiemIndicator",
"shortTimeFormat": "HourMinuteMeridiemIndicator",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D MMMM, YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D MMMM, YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-M-D",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY-M-D",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM, YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM, YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-M",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM, YYYY"
"YearMonthDay": "YYYY-M",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM, YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "M-D",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M-D",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Semicolon",
"Tab": "Tab",
"Vertical Bar": "Vertical Bar",
"Slash": "Slash",
"All Types": "All Types",
"More": "More",
"All": "All",
@@ -1595,9 +1596,9 @@
"Select All": "Select All",
"Select None": "Select None",
"Invert Selection": "Invert Selection",
"Select All in This Page": "Select All in This Page",
"Select None in This Page": "Select None in This Page",
"Invert Selection in This Page": "Invert Selection in This Page",
"Select All on This Page": "Select All on This Page",
"Select None on This Page": "Select None on This Page",
"Invert Selection on This Page": "Invert Selection on This Page",
"Select All Valid Items": "Select All Valid Items",
"Select All Invalid Items": "Select All Invalid Items",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Transaction",
"Transactions": "Transactions",
"Transaction Pictures": "Transaction Pictures",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Unsupported Map Provider",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.",
"Import Transactions": "Import Transactions",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Upload File",
"Upload Transaction Data File": "Upload Transaction Data File",
"Define Column": "Define Column",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Month-day-year format",
"Day-month-year format": "Day-month-year format",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) File",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Transaction List Page",
"Transactions Per Page": "Transactions Per Page",
"Show Monthly Total Amount": "Show Monthly Total Amount",
"Show Transaction Tag": "Show Transaction Tag",
"Show Transaction Tags": "Show Transaction Tags",
"Transaction Edit Page": "Transaction Edit Page",
"Automatically Save Draft": "Automatically Save Draft",
"Show Confirmation Every Time": "Show Confirmation Every Time",
"Always Show Confirmation": "Always Show Confirmation",
"Automatically Add Geolocation": "Automatically Add Geolocation",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "CSV (Comma-separated values) File",
"TSV (Tab-separated values) File": "TSV (Tab-separated values) File",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "All user data has been cleared",
"Unable to clear user data": "Unable to clear user data",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Device & Sessions",
"Device Info": "Device Info",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Scheduled Transactions",
"Template Name": "Template Name",
"No available template": "No available template",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Once you add templates, you can long press the Add button on the home page to quickly add a new transaction",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page",
"No available scheduled transactions": "No available scheduled transactions",
"Unable to retrieve template list": "Unable to retrieve template list",
+224 -220
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Portugués (Brasil)",
"Russian": "Ruso",
"Slovenian": "Esloveno",
"Tamil": "Tamil",
"Thai": "Tailandés",
"Turkish": "Turco",
"Ukrainian": "Ucraniano",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D de MMMM de YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D de MMMM de YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY/MM/DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD/MM/YYYY"
"YearMonthDay": "YYYY/MM/DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD/MM/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM de YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM de YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY/MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM, YYYY"
"YearMonthDay": "YYYY/MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM, YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D de MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D de MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM/DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD/MM"
"YearMonthDay": "MM/DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD/MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "H:mm:ss",
"a_hh_mm_ss": "A h:mm:ss",
"hh_mm_ss_a": "h:mm:ss A"
"HourMinuteSecond": "H:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A h:mm:ss",
"HourMinuteSecondMeridiemIndicator": "h:mm:ss A"
},
"shortTime": {
"hh_mm": "H:mm",
"a_hh_mm": "A h:mm",
"hh_mm_a": "h:mm A"
"HourMinute": "H:mm",
"MeridiemIndicatorHourMinute": "A h:mm",
"HourMinuteMeridiemIndicator": "h:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -107,12 +108,12 @@
"EndYY": "Ejercicio {EndYY}"
},
"misc": {
"nHour": "{n} Hour",
"nHours": "{n} Hours",
"nDay": "{n} Day",
"nDays": "{n} Days",
"nHour": "{n} Hora",
"nHours": "{n} Horas",
"nDay": "{n} Día",
"nDays": "{n} Días",
"multiTextJoinSeparator": ", ",
"loginWithCustomProvider": "Log in with {name}",
"loginWithCustomProvider": "Iniciar sesión con {name}",
"hoursBehindDefaultTimezone": "{hours} hora(s) de retraso en la zona horaria predeterminada",
"hoursAheadOfDefaultTimezone": "{hours} hora(s) por delante de la zona horaria predeterminada",
"hoursMinutesBehindDefaultTimezone": "{hours} hora(s) y {minutes} minutos de retraso en la zona horaria predeterminada",
@@ -125,7 +126,7 @@
"youHaveAccounts": "Has registrado {count} cuentas",
"addNewTag": "Agregar nueva etiqueta \"{tag}\"",
"clickToSelectedFile": "Haz clic para seleccionar el archivo de importación ({extensions})",
"previewCount": "Preview Count: {count}",
"previewCount": "Vista previa del recuento: {count}",
"selectedCount": "Seleccionado {count} de {totalCount}",
"queryIndex": "Query #{index}",
"youHaveUpdatedTransactions": "Has actualizado {count} transacciones",
@@ -136,7 +137,7 @@
"clearTransactionsInAccountTip": "NO PUEDES deshacer esta acción. Se eliminarán todas las transacciones de {account}. Por favor introduce tu contraseña para confirmar.",
"accountActivationAndResendValidationEmailTip": "El enlace de activación de la cuenta se envió a tu dirección de correo electrónico: {email}. Si no recibes el correo, introduce nuevamente la contraseña y haz clic en el botón de abajo para reenviar el correo de validación.",
"resendValidationEmailTip": "Si no recibes el correo, introduce nuevamente la contraseña y haz clic en el botón de abajo para reenviar el correo de validación a: {email}",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
"oauth2bindTip": "Estás iniciando sesión con el usuario {userName} usando {providerName}. Porfavor introduce tu contraseña de ezBookkeeping para verificar."
}
},
"dataExport": {
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregoriano",
@@ -306,7 +308,7 @@
"Apostrophe": "Apóstrofe",
"None": "Ninguno",
"Thousands Separator": "Separador de Miles",
"Indian Number Grouping": "Indian Number Grouping"
"Indian Number Grouping": "Agrupación numérica india"
},
"color": {
"amount": {
@@ -1099,9 +1101,9 @@
"user avatar file extension invalid": "La extensión del archivo de avatar del usuario no es válida",
"exceed the maximum size of user avatar file": "El avatar de usuario subido supera el tamaño de archivo máximo permitido",
"not permitted to perform this action": "No tienes permiso para realizar esta acción.",
"cannot login by password": "You cannot login by password",
"user name is invalid": "User name is invalid",
"nick name is invalid": "User nickname is invalid",
"cannot login by password": "No puede iniciar sesión con contraseña.",
"user name is invalid": "El nombre de usuario no es válido.",
"nick name is invalid": "El apodo de usuario no es válido.",
"unauthorized access": "Acceso no autorizado",
"current token is invalid": "El token actual no es válido",
"current token is expired": "El token actual ha caducado",
@@ -1116,7 +1118,7 @@
"token is empty": "El token está vacío.",
"email verify token is invalid or expired": "El token de verificación de correo electrónico no es válido o ha caducado",
"password reset token is invalid or expired": "El token de restablecimiento de contraseña no es válido o ha caducado",
"api token is not enabled": "API token is not enabled",
"api token is not enabled": "El token API no está habilitado.",
"passcode is invalid": "El código de acceso no es válido",
"two-factor backup code is invalid": "El código de respaldo de dos factores no es válido",
"two-factor is not enabled": "El doble factor no está habilitado",
@@ -1140,11 +1142,11 @@
"account balance time is not set": "La hora del saldo de la cuenta no está establecida",
"cannot set statement date for non credit card account": "No se puede establecer la fecha del extracto para una cuenta que no sea de tarjeta de crédito",
"cannot set statement date for sub account": "No se puede establecer la fecha del estado de cuenta para la subcuenta",
"sub-account not found": "Sub-account is not found",
"sub-account is in use and cannot be deleted": "Sub-account is in use and it cannot be deleted",
"not supported to modify account currency": "Not supported to modify account currency",
"not supported to modify account balance": "Not supported to modify account balance",
"not supported to modify account balance time": "Not supported to modify account balance time",
"sub-account not found": "Sub-cuenta no encontrada",
"sub-account is in use and cannot be deleted": "Sub-cuenta está en uso y no se puede eliminar",
"not supported to modify account currency": "No se admite la modificación de la moneda de la cuenta",
"not supported to modify account balance": "No se admite la modificación del saldo de la cuenta",
"not supported to modify account balance time": "No se admite la modificación del tiempo de saldo de la cuenta",
"transaction id is invalid": "El ID de transacción no es válido",
"transaction not found": "La transacción no se encuentra",
"transaction type is invalid": "El tipo de transacción no es válido",
@@ -1169,7 +1171,7 @@
"cannot use hidden transaction category": "No puede utilizar la categoría de transacción oculta",
"cannot use hidden transaction tag": "No puedes usar una etiqueta de transacción oculta",
"transaction has too many tags": "Hay demasiadas etiquetas en esta transacción",
"transaction has too many pictures": "Hay demasiadas imágenes en esta transacción.",
"transaction has too many pictures": "Hay demasiadas imágenes en esta transacción",
"import file type is empty": "El tipo de archivo de importación está vacío",
"import file type not supported": "El tipo de archivo de importación no es compatible",
"no data to import": "No hay datos para importar",
@@ -1178,14 +1180,14 @@
"transfer transaction amount cannot be less than zero": "El Importe no puede ser menor que 0 para la transacción de transferencia",
"import file encoding is empty": "La codificación del archivo importado está vacía",
"import file encoding not supported": "La codificación de archivo importado no es compatible",
"column mapping invalid": "Column mapping is invalid",
"transaction type mapping invalid": "Transaction type mapping is invalid",
"transaction time format invalid": "Transaction time format is invalid",
"transaction time zone format invalid": "Transaction time zone format is invalid",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"column mapping invalid": "El mapeo de columnas no es válido",
"transaction type mapping invalid": "La asignación del tipo de transacción no es válida",
"transaction time format invalid": "El formato de la hora de la transacción no es válido",
"transaction time zone format invalid": "El formato de la zona horaria de la transacción no es válido",
"cannot move transaction to same account": "No se puede mover la transacción a la misma cuenta",
"cannot move transaction from or to hidden account": "No se puede mover la transacción desde o hacia una cuenta oculta",
"cannot move transaction from or to parent account": "No se puede mover la transacción desde o hacia la cuenta principal",
"cannot move transaction between accounts with different currencies": "No se pueden mover transacciones entre cuentas con diferentes monedas",
"transaction category id is invalid": "El ID de categoría de transacción no es válido",
"transaction category not found": "No se encuentra la categoría de transacción",
"transaction category type is invalid": "El tipo de categoría de transacción no es válido",
@@ -1212,7 +1214,7 @@
"scheduled transaction is not enabled": "La transacción programada no está habilitada",
"scheduled transaction frequency is invalid": "La frecuencia de transacción programada no es válida",
"transaction template has too many tags": "Hay demasiadas etiquetas en esta plantilla de transacción",
"scheduled transaction start date is later than end time": "Scheduled transaction start date is later than end time",
"scheduled transaction start date is later than end time": "No permitir cambiar la categoría principal a la categoría secundaria",
"transaction picture id is invalid": "El ID de la imagen de la transacción no es válido",
"transaction picture not found": "No se encuentra la imagen de la transacción",
"no transaction picture": "No hay ningún archivo de imagen de transacción.",
@@ -1241,58 +1243,58 @@
"invalid iif file": "Archivo IIF no válido",
"invalid ofx file": "Archivo OFX no válido",
"invalid sgml file": "Archivo SGML no válido",
"invalid beancount file": "Invalid Beancount file",
"not support include directive for beancount file": "Not support \"include\" directive for Beancount file",
"invalid amount expression": "Amount expression is invalid",
"invalid beancount file": "Archivo Beancount no válido",
"not support include directive for beancount file": "No se admite la directiva \"include\" para archivos Beancount",
"invalid amount expression": "La expresión de la cantidad no es válida",
"invalid xml file": "Archivo XML no válido",
"invalid mt940 file": "Archivo MT940 no válido",
"invalid json file": "Archivo JSON no válido",
"user custom exchange rate data not found": "User custom exchange rate data is not found",
"cannot update exchange rate data for base currency": "Cannot update exchange rate data for base currency",
"cannot delete exchange rate data for base currency": "Cannot delete exchange rate data for base currency",
"user custom exchange rate data not found": "No se encuentran los datos del tipo de cambio personalizado del usuario",
"cannot update exchange rate data for base currency": "No se pueden actualizar los datos del tipo de cambio para la moneda base",
"cannot delete exchange rate data for base currency": "No se pueden eliminar los datos del tipo de cambio de la moneda base",
"mcp server is not enabled": "El servidor MCP no está activado",
"llm provider is not enabled": "El proveedor de LLM no está activado",
"no image for AI recognition": "No hay imagen para el reconocimiento por IA",
"image for AI recognition is empty": "La imagen para el reconocimiento por IA está vacía",
"exceed the maximum size of image file for AI recognition": "La imagen subida para el reconocimiento por IA excede el tamaño máximo de archivo permitido",
"no transaction information detected": "No transaction information detected",
"user external auth is not found": "User external authentication data not found",
"user external auth already exists": "User external authentication data already exists, please unlink it first",
"user external auth type invalid": "User external authentication type is invalid",
"oauth2 not enabled": "OAuth 2.0 is not enabled",
"oauth2 auto registration not enabled": "OAuth 2.0 auto registration is not enabled",
"invalid oauth2 login request": "Invalid OAuth 2.0 login request",
"invalid oauth2 callback": "Invalid OAuth 2.0 callback",
"missing state in oauth2 callback": "Missing state parameter in OAuth 2.0 callback",
"missing code in oauth2 callback": "Missing code parameter in OAuth 2.0 callback",
"invalid state in oauth2 callback": "Invalid state parameter in OAuth 2.0 callback",
"cannot retrieve oauth2 token": "Cannot retrieve OAuth 2.0 token",
"invalid oauth2 token": "Invalid OAuth 2.0 token",
"cannot retrieve user info from oauth2 provider": "Cannot retrieve user info from OAuth 2.0 provider",
"oauth2 user already bound to another user": "OAuth 2.0 user is already bound to another user",
"user name and email from oauth2 provider are both empty": "User name and email from OAuth 2.0 provider are both empty",
"user name from oauth2 provider is empty": "User name from OAuth 2.0 provider is empty",
"email from oauth2 provider is empty": "Email from OAuth 2.0 provider is empty",
"user name from oauth2 provider is empty, cannot register new user": "User name from OAuth 2.0 provider is empty, cannot register new user",
"email from oauth2 provider is empty, cannot register new user": "Email from OAuth 2.0 provider is empty, cannot register new user",
"explorer id is invalid": "Explorer ID is invalid",
"explorer not found": "Explorer is not found",
"explorer data is invalid": "Explorer data is invalid",
"transaction tag group id is invalid": "Transaction tag group ID is invalid",
"transaction tag group not found": "Transaction tag group is not found",
"transaction tag group is in use and cannot be deleted": "Transaction tag group is in use and it cannot be deleted",
"query items cannot be blank": "There are no query items",
"query items too much": "There are too many query items",
"no transaction information detected": "No se ha detectado información sobre transacciones",
"user external auth is not found": "No se han encontrado datos de autenticación externa del usuario",
"user external auth already exists": "Ya existen datos de autenticación externa del usuario, por favor, desvincúlelos primero",
"user external auth type invalid": "El tipo de autenticación externa del usuario no es válido",
"oauth2 not enabled": "OAuth 2.0 está deshabilitado",
"oauth2 auto registration not enabled": "El registro automático de OAuth 2.0 está deshabilitado",
"invalid oauth2 login request": "Solicitud de inicio de sesión OAuth 2.0 no válida",
"invalid oauth2 callback": "Callback OAuth 2.0 no válido",
"missing state in oauth2 callback": "Falta el parámetro de estado en la devolución de llamada OAuth 2.0",
"missing code in oauth2 callback": "Falta el parámetro de código en la devolución de llamada OAuth 2.0",
"invalid state in oauth2 callback": "Parámetro de estado no válido en la devolución de llamada OAuth 2.0",
"cannot retrieve oauth2 token": "No se puede recuperar el token OAuth 2.0",
"invalid oauth2 token": "Token OAuth 2.0 no válido",
"cannot retrieve user info from oauth2 provider": "No se puede recuperar la información del usuario del proveedor OAuth 2.0",
"oauth2 user already bound to another user": "El usuario de OAuth 2.0 ya está vinculado a otro usuario",
"user name and email from oauth2 provider are both empty": "El nombre de usuario y el correo electrónico del proveedor OAuth 2.0 están vacíos",
"user name from oauth2 provider is empty": "El nombre de usuario del proveedor OAuth 2.0 está vacío",
"email from oauth2 provider is empty": "El correo electrónico del proveedor OAuth 2.0 está vacío",
"user name from oauth2 provider is empty, cannot register new user": "El nombre de usuario del proveedor OAuth 2.0 está vacío, no se puede registrar un nuevo usuario",
"email from oauth2 provider is empty, cannot register new user": "El correo electrónico del proveedor OAuth 2.0 está vacío, no se puede registrar un nuevo usuario",
"explorer id is invalid": "El ID del explorador no es válido",
"explorer not found": "No se encuentra el explorador",
"explorer data is invalid": "Los datos del explorador no son válidos",
"transaction tag group id is invalid": "El ID del grupo de etiquetas de transacción no es válido",
"transaction tag group not found": "No se encuentra el grupo de etiquetas de transacción",
"transaction tag group is in use and cannot be deleted": "El grupo de etiquetas de transacción está en uso y no se puede eliminar",
"query items cannot be blank": "No hay elementos de consulta",
"query items too much": "Hay demasiados elementos de consulta",
"query items have invalid item": "Hay un elemento no válido en los elementos de consulta",
"parameter invalid": "Parameter is invalid",
"parameter invalid": "El parámetro no es válido",
"format invalid": "El formato no es válido",
"number invalid": "El número no es válido",
"no files uploaded": "No se subieron archivos",
"uploaded file is empty": "El archivo subido está vacío",
"uploaded file size exceeds the maximum allowed size": "El tamaño del archivo cargado excede el tamaño máximo permitido",
"failure count exceeded maximum limit": "Failure count exceeded maximum limit, please try again after some time",
"failure count exceeded maximum limit": "Se ha superado el límite máximo de intentos fallidos, vuelva a intentarlo más tarde",
"repeated request": "Petición repetida",
"ip address is forbidden to access this resource": "IP address is forbidden to access this resource"
"ip address is forbidden to access this resource": "La dirección IP tiene prohibido acceder a este recurso"
},
"parameter": {
"id": "IDENTIFICACIÓN",
@@ -1314,8 +1316,8 @@
"creditCardStatementDate": "Fecha del extracto de la tarjeta de crédito",
"parentId": "ID del nodo principal",
"categoryId": "ID de categoría",
"time": "Tiempo",
"balanceTime": "Tiempo de equilibrio",
"time": "Fecha",
"balanceTime": "Fecha del saldo",
"startTime": "Hora de inicio",
"endTime": "Hora de finalización",
"tagFilter": "Filtro de Etiqueta",
@@ -1446,16 +1448,16 @@
"Apply": "Aplicar",
"Save": "Guardar",
"Save Changes": "Guardar Cambios",
"Reset to Default": "Reset to Default",
"Reset to Default": "Restablecer valores predeterminados",
"Reset": "Reiniciar",
"Update": "Actualizar",
"Refresh": "Refrescar",
"Clear": "Borrar",
"Clear All": "Clear All",
"Clear All": "Borrar todo",
"Generate": "Generar",
"Recognize": "Recognize",
"Recognizing": "Recognizing",
"Cancel Recognition": "Cancel Recognition",
"Recognize": "Reconocer",
"Recognizing": "Reconociendo",
"Cancel Recognition": "Cancelar reconocimiento",
"None": "Ninguno",
"Unspecified": "No especificado",
"Not set": "No establecido",
@@ -1463,11 +1465,11 @@
"No results": "Sin resultados",
"Unknown": "Desconocido",
"Auto detect": "Auto detectar",
"Detecting...": "Detecting...",
"Detecting...": "Detectando...",
"Miscellaneous": "Misceláneas",
"Default": "Por defecto",
"Included": "Included",
"Excluded": "Excluded",
"Included": "Incluido",
"Excluded": "Excluido",
"Done": "Hecho",
"Continue": "Continuar",
"Previous": "Anterior",
@@ -1479,7 +1481,7 @@
"Disable": "Desactivar",
"Disabled": "Desactivado",
"Configuration": "Configuración",
"Example": "Example",
"Example": "Ejemplo",
"Token": "Token",
"Copy": "Copiar",
"Paste": "Paste",
@@ -1489,8 +1491,8 @@
"Version": "Versión",
"Edit": "Editar",
"View": "Ver",
"Move": "Move",
"Move to...": "Move to...",
"Move": "Mover",
"Move to...": "Mover a...",
"Remove": "Eliminar",
"Delete": "Borrar",
"Duplicate": "Duplicar",
@@ -1506,7 +1508,6 @@
"Semicolon": "Punto y coma",
"Tab": "Tabulación",
"Vertical Bar": "Barra Vertical",
"Slash": "Slash",
"All Types": "Todos los Tipos",
"More": "Más",
"All": "Todo",
@@ -1551,7 +1552,7 @@
"Not equal to": "No igual a",
"Between": "Entre",
"Not between": "No entre",
"In": "In",
"In": "En",
"Has any": "Has any",
"Has all": "Has all",
"Not has any": "Not has any",
@@ -1572,13 +1573,13 @@
"Bubble Chart": "Gráfico de Burbujas",
"Candlestick Chart": "Gráfico de Velas",
"Sankey Chart": "Diagrama de Sankey",
"Column Chart (Stacked)": "Column Chart (Stacked)",
"Column Chart (100% Stacked)": "Column Chart (100% Stacked)",
"Column Chart (Grouped)": "Column Chart (Grouped)",
"Line Chart (Grouped)": "Line Chart (Grouped)",
"Area Chart (Stacked)": "Area Chart (Stacked)",
"Area Chart (100% Stacked)": "Area Chart (100% Stacked)",
"Bubble Chart (Grouped)": "Bubble Chart (Grouped)",
"Column Chart (Stacked)": "Gráfico de columnas (apilado)",
"Column Chart (100% Stacked)": "Gráfico de columnas (100 % apilado)",
"Column Chart (Grouped)": "Gráfico de columnas (agrupado)",
"Line Chart (Grouped)": "Gráfico de líneas (agrupado)",
"Area Chart (Stacked)": "Gráfico de área (apilado)",
"Area Chart (100% Stacked)": "Gráfico de área (100 % apilado)",
"Bubble Chart (Grouped)": "Gráfico de burbujas (agrupado)",
"Sort by": "Ordenar por",
"Map": "Mapa",
"Provider": "Proveedor",
@@ -1595,14 +1596,14 @@
"Select All": "Seleccionar Todo",
"Select None": "Seleccionar Nada",
"Invert Selection": "Invertir Selección",
"Select All in This Page": "Seleccionar Todo en Esta Página",
"Select None in This Page": "No Seleccionar Ninguno en Esta Página",
"Invert Selection in This Page": "Invertir Selección en Esta Página",
"Select All on This Page": "Seleccionar Todo en Esta Página",
"Select None on This Page": "No Seleccionar Ninguno en Esta Página",
"Invert Selection on This Page": "Invertir Selección en Esta Página",
"Select All Valid Items": "Seleccionar Todos los Artículos Válidos",
"Select All Invalid Items": "Seleccionar Todos los Artículos Inválidos",
"Set All to Included": "Set All to Included",
"Set All to Default": "Set All to Default",
"Set All to Excluded": "Set All to Excluded",
"Set All to Included": "Establecer Todos como Incluidos",
"Set All to Default": "Establecer Todos por defecto",
"Set All to Excluded": "Establecer Todos como Excluidos",
"Back": "Atrás",
"Load More": "Cargar Más",
"Export Results": "Exportar Resultados",
@@ -1616,7 +1617,7 @@
"Save Display Order": "Guardar Orden de Visualización",
"Change Language": "Cambiar Idioma",
"Date is too early": "La Fecha Es Demasiado Temprana",
"User Canceled": "User Canceled",
"User Canceled": "Usuario cancelado",
"Welcome to ezBookkeeping": "Bienvenido a ezBookkeeping",
"Please log in with your ezBookkeeping account": "Inicia sesión con tu cuenta de ezBookkeeping",
"Unlock Application": "Desbloquear Aplicación",
@@ -1658,10 +1659,10 @@
"This month or later": "Este mes o más tarde",
"This year or later": "Este año o más tarde",
"Log In": "Acceso",
"Log in with OAuth 2.0": "Log in with OAuth 2.0",
"Log in with Connect ID": "Log in with Connect ID",
"Log in with OAuth 2.0": "Iniciar sesión con OAuth 2.0",
"Log in with Connect ID": "Inicie sesión con Connect ID",
"Click here to log in": "Haz clic aquí para iniciar sesión",
"Logging in...": "Logging in...",
"Logging in...": "Iniciando sesión...",
"Back to login page": "Volver a la página de inicio de sesión",
"Back to home page": "Volver a la página de inicio",
"Don't have an account?": "¿No tienes una cuenta?",
@@ -1677,11 +1678,11 @@
"Nickname cannot be blank": "El apodo no puede estar en blanco",
"Default currency cannot be blank": "La moneda predeterminada no puede estar en blanco",
"Unable to log in": "No se puede iniciar sesión",
"Username/password login is disabled": "Username/password login is disabled",
"External login is disabled": "External login is disabled",
"Two-factor authentication is disabled": "Two-factor authentication is disabled",
"Email verification is disabled": "Email verification is disabled",
"Forget password is disabled": "Forget password is disabled",
"Username/password login is disabled": "El inicio de sesión con nombre de usuario/contraseña está desactivado",
"External login is disabled": "El inicio de sesión externo está desactivado",
"Two-factor authentication is disabled": "La autenticación de dos factores está desactivada",
"Email verification is disabled": "La verificación del correo electrónico está desactivada",
"Forget password is disabled": "La opción 'Olvidé mi contraseña' está desactivada.",
"Two-Factor Authentication": "Autenticación de Dos Factores",
"Two-factor authentication is not enabled yet.": "La autenticación de dos factores aún no está activada.",
"Two-factor authentication is already enabled.": "La autenticación de dos factores ya está activada.",
@@ -1764,23 +1765,23 @@
"All Queries": "All Queries",
"Axis / Category": "Axis / Category",
"Series": "Series",
"Transaction Date": "Transaction Date",
"Transaction Year-Month": "Transaction Year-Month",
"Transaction Year-Quarter": "Transaction Year-Quarter",
"Transaction Year": "Transaction Year",
"Transaction Fiscal Year": "Transaction Fiscal Year",
"Transaction Day of Week": "Transaction Day of Week",
"Transaction Day of Month": "Transaction Day of Month",
"Transaction Month of Year": "Transaction Month of Year",
"Transaction Quarter of Year": "Transaction Quarter of Year",
"Source Account Category": "Source Account Category",
"Source Account Currency": "Source Account Currency",
"Destination Account Category": "Destination Account Category",
"Destination Account Currency": "Destination Account Currency",
"Value Metric": "Value Metric",
"Transaction Count": "Transaction Count",
"Average Amount": "Average Amount",
"Median Amount": "Median Amount",
"Transaction Date": "Fecha de la transacción",
"Transaction Year-Month": "Año-mes de la transacción",
"Transaction Year-Quarter": "Año-Trimestre de la transacción",
"Transaction Year": "Año de la transacción",
"Transaction Fiscal Year": "Año fiscal de la transacción",
"Transaction Day of Week": "Día de la semana de la transacción",
"Transaction Day of Month": "Día del mes de la transacción",
"Transaction Month of Year": "Mes del año de la transacción",
"Transaction Quarter of Year": "Trimestre de la transacción",
"Source Account Category": "Categoría de la cuenta de origen",
"Source Account Currency": "Moneda de la cuenta de origen",
"Destination Account Category": "Categoría de la cuenta de destino",
"Destination Account Currency": "Moneda de la cuenta de destino",
"Value Metric": "Métrica de valor",
"Transaction Count": "Recuento de transacciones",
"Average Amount": "Importe Medio",
"Median Amount": "Importe Mediano",
"Account List": "Lista de Cuentas",
"This Week": "Esta Semana",
"This Month": "Este Mes",
@@ -1797,10 +1798,10 @@
"Expense": "Gastos",
"Income": "Ingresos",
"Transfer": "Transferencias",
"Transfer In": "Transfer In",
"Transfer Out": "Transfer Out",
"Transfer In": "Transferencia entrante",
"Transfer Out": "Transferencia saliente",
"Cash": "Efectivo",
"Checking Account": "Cuentas Correientes",
"Checking Account": "Cuentas Corrientes",
"Credit Card": "Tarjetas de Crédito",
"Virtual Account": "Cuentas Virtuales",
"Debt Account": "Cuentas de Deuda",
@@ -1808,8 +1809,8 @@
"Investment Account": "Cuentas de Inversión",
"Savings Account": "Cuentas de Ahorros",
"Certificate of Deposit": "Depósitos a Plazo Fijo",
"Balance": "Balance",
"Outstanding Balance": "Outstanding Balance",
"Balance": "Saldo",
"Outstanding Balance": "Saldo pendiente",
"Unable to retrieve account list": "No se puede recuperar la lista de cuentas",
"Account list is up to date": "La lista de cuentas está actualizada.",
"Account list has been updated": "La lista de cuentas ha sido actualizada.",
@@ -1833,12 +1834,12 @@
"Account Color": "Color de la Cuenta",
"Sub-account Color": "Color de la Subcuenta",
"Currency": "Divisa",
"Account Balance": "Balance de la Cuenta",
"Account Outstanding Balance": "Account Outstanding Balance",
"Sub-account Balance": "Balance de la Subcuenta",
"Sub-account Outstanding Balance": "Sub-account Outstanding Balance",
"Balance Time": "Fecha del Balance",
"Sub-account Balance Time": "Fecha del Balance de la Subcuenta",
"Account Balance": "Saldo de la Cuenta",
"Account Outstanding Balance": "Saldo pendiente de la cuenta",
"Sub-account Balance": "Saldo de la Subcuenta",
"Sub-account Outstanding Balance": "Saldo pendiente de la Subcuenta",
"Balance Time": "Fecha del Saldo",
"Sub-account Balance Time": "Fecha del Saldo de la Subcuenta",
"Statement Date": "Fecha del Extracto",
"Description": "Descripción",
"Your account description (optional)": "Descripción de tu cuenta (opcional)",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Mover todas las transacciones",
"Are you sure you want to move all transactions?": "¿Seguro que quieres mover todas las transacciones?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "Se han movido todas las transacciones de esta cuenta.",
"All transactions in this account have been moved.": "Se han movido todas las transacciones de esta cuenta.",
"Reconciliation Statement": "Estado de Conciliación",
"Account Balance Trends": "Tendencias del Saldo de la Cuenta",
"Update Closing Balance": "Actualizar Saldo de Cierre",
"Please enter the new closing balance for the account": "Introduce el nuevo saldo de cierre para la cuenta",
"Please enter the new closing balance for this account": "Introduce el nuevo saldo de cierre para la cuenta",
"Transaction": "Transacción",
"Transactions": "Transacciones",
"Transaction Pictures": "Imágenes de Transacciones",
@@ -1890,44 +1891,44 @@
"Transfer In Amount": "Importe Recibido",
"Transfer In Account Name": "Nombre de la Cuenta Receptora",
"Transfer In Currency": "Divisa de la Cuenta Receptora ",
"Paste Amount": "Paste Amount",
"Paste Destination Amount": "Paste Destination Amount",
"Cannot parse amount from clipboard": "Cannot parse amount from clipboard",
"Unable to read clipboard text": "Unable to read clipboard text",
"Paste Amount": "Pegar Importe",
"Paste Destination Amount": "Pegar Importe de destino",
"Cannot parse amount from clipboard": "No se puede analizar el importe del portapapeles",
"Unable to read clipboard text": "No se puede leer el texto del portapapeles",
"Show Amount": "Mostrar Importe",
"Hide Amount": "Ocultar Importe",
"Swap Account": "Intercambiar Cuenta",
"Swap Amount": "Intercambiar Importe",
"Swap Account and Amount": "Intercambiar Cuenta e Importe",
"Duplicate (With Time)": "Duplicar (Con Tiempo)",
"Duplicate (With Geographic Location)": "Duplicate (With Geographic Location)",
"Duplicate (With Time and Geographic Location)": "Duplicate (With Time and Geographic Location)",
"AI Image Recognition": "AI Image Recognition",
"Unable to load image": "Unable to load image",
"Unable to recognize image": "Unable to recognize image",
"AI image recognition is disabled": "AI image recognition is disabled",
"You can drag and drop, paste or click to select a receipt or transaction image": "You can drag and drop, paste or click to select a receipt or transaction image",
"Release to load image": "Release to load image",
"Loading image...": "Loading image...",
"Click here to select a receipt or transaction image": "Click here to select a receipt or transaction image",
"Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.": "Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.",
"AI can make mistakes. Check important info.": "AI can make mistakes. Check important info.",
"Duplicate (With Geographic Location)": "Duplicar (con Ubicación Geográfica)",
"Duplicate (With Time and Geographic Location)": "Duplicado (con Hora y Ubicación Geográfica)",
"AI Image Recognition": "Reconocimiento de imágenes mediante IA",
"Unable to load image": "No se puede cargar la imagen",
"Unable to recognize image": "No se puede reconocer la imagen",
"AI image recognition is disabled": "El reconocimiento de imágenes por IA está deshabilitado",
"You can drag and drop, paste or click to select a receipt or transaction image": "Puede arrastrar y soltar, pegar o hacer clic para seleccionar una imagen de recibo o transacción",
"Release to load image": "Suelta para cargar imagen",
"Loading image...": "Cargando imagen...",
"Click here to select a receipt or transaction image": "Haga clic aquí para seleccionar una imagen de recibo o transacción",
"Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.": "Las imágenes y los datos personales cargados se enviarán al LLM. Tenga en cuenta los posibles riesgos para la privacidad.",
"AI can make mistakes. Check important info.": "La IA puede cometer errores. Comprueba la información importante.",
"Category": "Categoría",
"Secondary Category": "Categoría Secundaria",
"Expense Category": "Expense Category",
"Income Category": "Income Category",
"Transfer Category": "Transfer Category",
"Expense Category": "Categoría de gastos",
"Income Category": "Categoría de ingresos",
"Transfer Category": "Categoría de transferencia",
"Multiple Categories": "Múltiples categorías",
"Account": "Cuenta",
"Multiple Accounts": "Varias cuentas",
"Source Account": "Cuenta de Origen",
"Destination Account": "Cuenta de Destino",
"Transaction Tag": "Transaction Tag",
"Transaction Tag": "Etiqueta de transacción",
"Without Tags": "Sin Etiquetas",
"Include Any Selected Tags": "Include Any Selected Tags",
"Include All Selected Tags": "Include All Selected Tags",
"Exclude Any Selected Tags": "Exclude Any Selected Tags",
"Exclude All Selected Tags": "Exclude All Selected Tags",
"Include Any Selected Tags": "Incluir Cualquier Etiqueta Seleccionada",
"Include All Selected Tags": "Incluir Todas las Etiquetas Seleccionadas",
"Exclude Any Selected Tags": "Excluir Cualquier Etiqueta Seleccionada",
"Exclude All Selected Tags": "Excluir Todas las Etiquetas Seleccionadas",
"Multiple Tags": "Múltiples Etiquetas",
"Transaction Time": "Tiempo de la Transacción",
"Scheduled Transaction Frequency": "Frecuencia de la Transacción",
@@ -1943,14 +1944,15 @@
"Location on Map": "Ubicación en el Mapa",
"Update Geographic Location": "Actualizar Ubicación Geográfica",
"Clear Geographic Location": "Borrar Ubicación Geográfica",
"Click on Map to Set Geographic Location": "Click on Map to Set Geographic Location",
"Enable Click to Set Location": "Enable Click to Set Location",
"Disable Click to Set Location": "Disable Click to Set Location",
"Click on Map to Set Geographic Location": "Haga clic en el Mapa para Establecer la Ubicación Geográfica",
"Enable Click to Set Location": "Habilitar Clic para Establecer la Ubicación",
"Disable Click to Set Location": "Deshabilitar Clic para Establecer la Ubicación",
"Unable to retrieve current position": "No se puede recuperar la posición actual",
"Cannot Initialize Map": "No se puede inicializar el mapa",
"Unsupported Map Provider": "Proveedor de mapas no compatible",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Actualice la página e inténtelo de nuevo. Si el error persiste, asegúrese de que la configuración del mapa del servidor esté configurada correctamente.",
"Import Transactions": "Importar Transacciones",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Cargar Archivo",
"Upload Transaction Data File": "Cargar Archivo de Datos",
"Define Column": "Definir Columna",
@@ -1960,7 +1962,7 @@
"Data Import Completed": "Importación de Datos Completada",
"File Type": "Tipo de Archivo",
"Find file type": "Buscar tipo de archivo",
"No available file type": "No available file type",
"No available file type": "No hay ningún tipo de archivo disponible",
"Filter Description": "Descripción del Filtro",
"How to import this file?": "¿Cómo importar este archivo?",
"How to export this file?": "¿Cómo exportar este archivo?",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Formato mes-día-año",
"Day-month-year format": "Formato día-mes-año",
"Intuit Interchange Format (IIF) File": "Archivo IIF (Intuit Interchange Format)",
"Camt.052 Bank to Customer Statement File": "Extracto Camt.052 (Extracto de cuenta del cliente)",
"Camt.053 Bank to Customer Statement File": "Extracto Camt.053 (Extracto de cuenta del cliente)",
"MT940 Consumer Statement Message File": "Extracto MT940 (Extracto de cuenta del cliente)",
"Delimiter-separated Values (DSV) File": "Archivo DSV (valores separados por delimirtadores)",
@@ -1997,7 +2000,7 @@
"Column Mapping": "Asignación de Columnas",
"Custom Script": "Script Personalizado",
"Execute Custom Script": "Ejecutar Script Personalizado",
"Execute Custom Script to Parse Data": "Execute Custom Script to Parse Data",
"Execute Custom Script to Parse Data": "Ejecutar Script Personalizado para Analizar Datos",
"Additional Options": "Opciones Adicionales",
"Parse Payee as Tag": "Parsear Beneficiario como Etiqueta",
"Parse Payee as Description": "Parsear Beneficiario como Descripción",
@@ -2006,8 +2009,8 @@
"Parse Merchant as Tag": "Parsear Vendedor como Etiqueta",
"Data File": "Archivo de Datos",
"Data to import": "Datos a importar",
"Please select a file to import": "Please select a file to import",
"Unable to detect the file encoding automatically. Please select the actual encoding.": "Unable to detect the file encoding automatically. Please select the actual encoding.",
"Please select a file to import": "Seleccione un archivo para importar",
"Unable to detect the file encoding automatically. Please select the actual encoding.": "No se puede detectar automáticamente la codificación del archivo. Seleccione la codificación actual.",
"Include Header Line": "Incluir Línea de Encabezado",
"Time Format": "Formato del Tiempo",
"Transaction Type Mapping": "Asignación de Tipos de Transacciones",
@@ -2018,17 +2021,17 @@
"Transaction Tags Separator": "Separador de Etiquetas de Transacciones",
"Lines Per Page": "Líneas Por Página",
"No data to import": "No hay datos para importar",
"Missing transaction time, transaction type, or amount column mapping": "Missing transaction time, transaction type, or amount column mapping",
"Transaction type mapping is not set": "Transaction type mapping is not set",
"Transaction time format is not set": "Transaction time format is not set",
"Transaction amount format is not set": "Transaction amount format is not set",
"Missing transaction time, transaction type, or amount column mapping": "Falta la asignación de las columnas de hora de la transacción, tipo de transacción o importe",
"Transaction type mapping is not set": "No se ha establecido la asignación de tipos de transacción",
"Transaction time format is not set": "El formato de la hora de la transacción no está configurado",
"Transaction amount format is not set": "El formato del importe de la transacción no está configurado",
"Cannot import invalid transactions": "No se pueden importar transacciones no válidas",
"Unable to parse import file": "No se puede analizar el archivo de importación",
"Unable to import transactions": "Unable to import transactions",
"Transaction importing is disabled": "Transaction importing is disabled",
"Unable to import transactions": "No se pueden importar transacciones",
"Transaction importing is disabled": "La importación de transacciones está desactivada",
"Load Data Mapping File": "Cargar Archivo de Mapeo de Datos",
"Save Data Mapping File": "Guardar Archivo de Mapeo de Datos",
"Data mapping file is invalid": "Data mapping file is invalid",
"Data mapping file is invalid": "El archivo de mapeo de datos no es válido",
"Load Script File": "Load Script File",
"Save Script File": "Save Script File",
"Cannot load script file": "Cannot load script file",
@@ -2137,10 +2140,10 @@
"Total Transactions": "Transacciones Totales",
"Opening Balance": "Saldo de Apertura",
"Closing Balance": "Saldo de Cierre",
"Minimum Balance": "Minimum Balance",
"Maximum Balance": "Maximum Balance",
"Median Balance": "Median Balance",
"Average Balance": "Average Balance",
"Minimum Balance": "Saldo Mínimo",
"Maximum Balance": "Saldo Máximo",
"Median Balance": "Saldo Mediano",
"Average Balance": "Saldo Medio",
"Outflows By Account": "Salidas por Cuenta",
"Expense By Account": "Gastos por Cuenta",
"Expense By Primary Category": "Gastos por Categoría Principal",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Página de Lista de Transacciones",
"Transactions Per Page": "Transacciones por Página",
"Show Monthly Total Amount": "Mostrar Importe Total Mensual",
"Show Transaction Tag": "Mostrar Etiqueta de Transacción",
"Show Transaction Tags": "Mostrar Etiqueta de Transacción",
"Transaction Edit Page": "Página de Edición de Transacciones",
"Automatically Save Draft": "Guardar Borrador Automáticamente",
"Show Confirmation Every Time": "Mostrar Confirmación Cada Vez",
"Always Show Confirmation": "Mostrar Confirmación Cada Vez",
"Automatically Add Geolocation": "Agregar Geolocalización Automáticamente",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "Formato de Archivo",
"CSV (Comma-separated values) File": "Archivo CSV (valores separados por comas)",
"TSV (Tab-separated values) File": "Archivo TSV (valores separados por tabulaciones)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Exportar a archivo CSV (Valores Separados por Comas)",
"Export to TSV (Tab-separated values) File": "Exportar a archivo TSV (Valores Separados por Tabulaciones)",
"Markdown File": "Archivo Markdown",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "NO PUEDES deshacer esta acción. Esto borrará tus transacciones. Introuduce tu contraseña para confirmar.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "NO PUEDES deshacer esta acción. Esto borrará tus cuentas, categorías, etiquetas y transacciones. Introduce tu contraseña para confirmar.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "NO PUEDES deshacer esta acción. \"Eliminar Todas las Transacciones\" eliminará todos los datos de tus transacciones, y \"Eliminar Todos los Datos\" eliminará todos los datos de tus cuentas, categorías, etiquetas y transacciones. Introduce tu contraseña para confirmar.",
"All transactions in this account has been cleared": "Se han eliminado todas las transacciones de esta cuenta",
"All transactions has been cleared": "Se han eliminado todas las transacciones",
"All transactions in this account have been cleared": "Se han eliminado todas las transacciones de esta cuenta",
"All transactions have been cleared": "Se han eliminado todas las transacciones",
"All user data has been cleared": "Se han eliminado todos los datos del usuario",
"Unable to clear user data": "No se pueden borrar los datos del usuario",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Dispositivo y Sesiones",
"Device Info": "Información del Dispositivo",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Transacciones Programadas",
"Template Name": "Nombre de la Plantilla",
"No available template": "No hay plantilla disponible",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Una vez que agregue plantillas, puede presionar prolongadamente el botón Agregar en la página de inicio para agregar rápidamente una nueva transacción.",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Una vez que agregue plantillas, puede presionar prolongadamente el botón Agregar en la página de inicio para agregar rápidamente una nueva transacción.",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "No hay plantillas disponibles. Una vez añadidas, puedes agregar una nueva transacción usando el menú desplegable del botón Añadir en la página de lista de transacciones.",
"No available scheduled transactions": "No hay transacciones programadas disponibles",
"Unable to retrieve template list": "No se puede recuperar la lista de plantillas",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Portugais (Brésil)",
"Russian": "Russe",
"Slovenian": "Slovène",
"Tamil": "Tamoul",
"Thai": "Thaï",
"Turkish": "Turc",
"Ukrainian": "Ukrainien",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Space",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD/MM/YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD/MM/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD/MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD/MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Grégorien",
@@ -1506,7 +1508,6 @@
"Semicolon": "Point-virgule",
"Tab": "Tabulation",
"Vertical Bar": "Barre verticale",
"Slash": "Slash",
"All Types": "Tous les types",
"More": "Plus",
"All": "Tous",
@@ -1595,9 +1596,9 @@
"Select All": "Tout sélectionner",
"Select None": "Ne rien sélectionner",
"Invert Selection": "Inverser la sélection",
"Select All in This Page": "Tout sélectionner dans cette page",
"Select None in This Page": "Ne rien sélectionner dans cette page",
"Invert Selection in This Page": "Inverser la sélection dans cette page",
"Select All on This Page": "Tout sélectionner dans cette page",
"Select None on This Page": "Ne rien sélectionner dans cette page",
"Invert Selection on This Page": "Inverser la sélection dans cette page",
"Select All Valid Items": "Sélectionner tous les éléments valides",
"Select All Invalid Items": "Sélectionner tous les éléments invalides",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Relevé de rapprochement",
"Account Balance Trends": "Tendances du solde du compte",
"Update Closing Balance": "Mettre à jour le solde de clôture",
"Please enter the new closing balance for the account": "Veuillez entrer le nouveau solde de clôture pour le compte",
"Please enter the new closing balance for this account": "Veuillez entrer le nouveau solde de clôture pour le compte",
"Transaction": "Transaction",
"Transactions": "Transactions",
"Transaction Pictures": "Images de transaction",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Fournisseur de cartes non pris en charge",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Veuillez actualiser la page et réessayer. Si l'erreur persiste, assurez-vous que les paramètres de carte du serveur sont correctement configurés.",
"Import Transactions": "Importer des transactions",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Télécharger un fichier",
"Upload Transaction Data File": "Télécharger un fichier de données de transaction",
"Define Column": "Définir les colonnes",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Format mois-jour-année",
"Day-month-year format": "Format jour-mois-année",
"Intuit Interchange Format (IIF) File": "Fichier Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "Fichier de relevé bancaire Camt.052",
"Camt.053 Bank to Customer Statement File": "Fichier de relevé bancaire Camt.053",
"MT940 Consumer Statement Message File": "Fichier de message de relevé consommateur MT940",
"Delimiter-separated Values (DSV) File": "Fichier de valeurs séparées par délimiteur (DSV)",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Page de liste des transactions",
"Transactions Per Page": "Transactions par page",
"Show Monthly Total Amount": "Afficher le montant total mensuel",
"Show Transaction Tag": "Afficher l'étiquette de transaction",
"Show Transaction Tags": "Afficher l'étiquette de transaction",
"Transaction Edit Page": "Page de modification de transaction",
"Automatically Save Draft": "Enregistrer automatiquement le brouillon",
"Show Confirmation Every Time": "Afficher la confirmation à chaque fois",
"Always Show Confirmation": "Afficher la confirmation à chaque fois",
"Automatically Add Geolocation": "Ajouter automatiquement la géolocalisation",
"Always Show Transaction Pictures": "Toujours afficher les images de transaction",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "Format de fichier",
"CSV (Comma-separated values) File": "Fichier CSV (valeurs séparées par virgules)",
"TSV (Tab-separated values) File": "Fichier TSV (valeurs séparées par tabulations)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Exporter vers un fichier CSV (valeurs séparées par virgules)",
"Export to TSV (Tab-separated values) File": "Exporter vers un fichier TSV (valeurs séparées par tabulations)",
"Markdown File": "Fichier Markdown",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "Vous NE POUVEZ PAS annuler cette action. Ceci effacera vos données de transactions. Veuillez entrer votre mot de passe actuel pour confirmer.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Vous NE POUVEZ PAS annuler cette action. Ceci effacera vos comptes, catégories, étiquettes et données de transactions. Veuillez entrer votre mot de passe actuel pour confirmer.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Vous NE POUVEZ PAS annuler cette action. \"Effacer toutes les transactions\" effacera toutes vos données de transactions, et \"Effacer toutes les données\" effacera vos comptes, catégories, étiquettes et données de transactions. Veuillez entrer votre mot de passe actuel pour confirmer.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "Toutes les transactions ont été effacées",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "Toutes les transactions ont été effacées",
"All user data has been cleared": "Toutes les données utilisateur ont été effacées",
"Unable to clear user data": "Impossible d'effacer les données utilisateur",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Appareils et sessions",
"Device Info": "Informations sur l'appareil",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Transactions programmées",
"Template Name": "Nom du modèle",
"No available template": "Aucun modèle disponible",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Une fois que vous ajoutez des modèles, vous pouvez maintenir appuyé le bouton Ajouter sur la page d'accueil pour ajouter rapidement une nouvelle transaction",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Une fois que vous ajoutez des modèles, vous pouvez maintenir appuyé le bouton Ajouter sur la page d'accueil pour ajouter rapidement une nouvelle transaction",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Aucun modèle disponible. Une fois que vous ajoutez des modèles, vous pouvez ajouter rapidement une nouvelle transaction en utilisant le menu déroulant du bouton Ajouter sur la page de liste des transactions",
"No available scheduled transactions": "Aucune transaction programmée disponible",
"Unable to retrieve template list": "Impossible de récupérer la liste des modèles",
+17 -4
View File
@@ -61,6 +61,7 @@ import {
ShortDateFormat,
LongTimeFormat,
ShortTimeFormat,
DateFormatOrder,
DateRange,
DateRangeScene,
LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE
@@ -661,7 +662,7 @@ export function useI18n() {
function getLocalizedDateTimeFormat<T extends DateFormat | TimeFormat>(type: string, allFormatMap: Record<string, T>, allFormatArray: T[], formatTypeValue: number, languageDefaultTypeNameKey: string, systemDefaultFormatType: T): string {
const formatType = getLocalizedDateTimeType(allFormatMap, allFormatArray, formatTypeValue, languageDefaultTypeNameKey, systemDefaultFormatType);
return t(`format.${type}.${formatType.key}`);
return t(`format.${type}.${formatType.typeName}`);
}
function getLocalizedLongDateFormat(): string {
@@ -1078,7 +1079,7 @@ export function useI18n() {
});
for (const formatType of allFormatArray) {
const format = t(`format.${type}.${formatType.key}`);
const format = t(`format.${type}.${formatType.typeName}`);
ret.push({
type: formatType.type,
@@ -1760,12 +1761,22 @@ export function useI18n() {
return t(`currency.name.${currencyCode}`);
}
function getLongDateFormatOrder(): DateFormatOrder {
return getLocalizedDateTimeType(LongDateFormat.all(), LongDateFormat.values(), userStore.currentUserLongDateFormat, 'longDateFormat', LongDateFormat.Default).order;
}
function getShortDateFormatOrder(): DateFormatOrder {
return getLocalizedDateTimeType(ShortDateFormat.all(), ShortDateFormat.values(), userStore.currentUserShortDateFormat, 'shortDateFormat', ShortDateFormat.Default).order;
}
function isLongDateMonthAfterYear(): boolean {
return getLocalizedDateTimeType(LongDateFormat.all(), LongDateFormat.values(), userStore.currentUserLongDateFormat, 'longDateFormat', LongDateFormat.Default).isMonthAfterYear;
const order: DateFormatOrder = getLongDateFormatOrder();
return order === DateFormatOrder.YMD;
}
function isShortDateMonthAfterYear(): boolean {
return getLocalizedDateTimeType(ShortDateFormat.all(), ShortDateFormat.values(), userStore.currentUserShortDateFormat, 'shortDateFormat', ShortDateFormat.Default).isMonthAfterYear;
const order: DateFormatOrder = getShortDateFormatOrder();
return order === DateFormatOrder.YMD;
}
function isLongTime24HourFormat(): boolean {
@@ -2422,6 +2433,8 @@ export function useI18n() {
getCurrentDigitGroupingType,
getCurrentFiscalYearFormatType,
getCurrencyName,
getLongDateFormatOrder,
getShortDateFormatOrder,
isLongDateMonthAfterYear,
isShortDateMonthAfterYear,
isLongTime24HourFormat,
+8
View File
@@ -9,6 +9,7 @@ import ko from './ko.json';
import nl from './nl.json';
import ru from './ru.json';
import sl from './sl.json';
import ta from './ta.json';
import th from './th.json';
import tr from './tr.json';
import uk from './uk.json';
@@ -120,6 +121,13 @@ export const ALL_LANGUAGES: Record<string, LanguageInfo> = {
textDirection: 'ltr',
content: sl
},
'ta': {
name: 'Tamil',
displayName: 'தமிழ்',
alternativeLanguageTag: 'ta-IN',
textDirection: 'ltr',
content: ta
},
'th': {
name: 'Thai',
displayName: 'ภาษาไทย',
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Portoghese (Brasile)",
"Russian": "Russo",
"Slovenian": "Sloveno",
"Tamil": "Tamil",
"Thai": "Thailandese",
"Turkish": "Turco",
"Ukrainian": "Ucraino",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D YYYY",
"dd_mm_yyyy": "D MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D YYYY",
"DayMonthYear": "D MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD/MM/YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD/MM/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD/MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD/MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Punto e virgola",
"Tab": "Tabulazione",
"Vertical Bar": "Barra verticale",
"Slash": "Barra",
"All Types": "Tutti i tipi",
"More": "Altro",
"All": "Tutti",
@@ -1595,9 +1596,9 @@
"Select All": "Seleziona tutto",
"Select None": "Deseleziona tutto",
"Invert Selection": "Inverti selezione",
"Select All in This Page": "Seleziona tutto in questa pagina",
"Select None in This Page": "Deseleziona tutto in questa pagina",
"Invert Selection in This Page": "Inverti selezione in questa pagina",
"Select All on This Page": "Seleziona tutto in questa pagina",
"Select None on This Page": "Deseleziona tutto in questa pagina",
"Invert Selection on This Page": "Inverti selezione in questa pagina",
"Select All Valid Items": "Seleziona tutti gli elementi validi",
"Select All Invalid Items": "Seleziona tutti gli elementi non validi",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Transazione",
"Transactions": "Transazioni",
"Transaction Pictures": "Immagini transazione",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Fornitore mappa non supportato",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Aggiorna la pagina e riprova. Se l'errore persiste, assicurati che le impostazioni della mappa del server siano configurate correttamente.",
"Import Transactions": "Importa transazioni",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Carica file",
"Upload Transaction Data File": "Carica file dati transazione",
"Define Column": "Definisci colonna",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Formato mese-giorno-anno",
"Day-month-year format": "Formato giorno-mese-anno",
"Intuit Interchange Format (IIF) File": "File Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "File valori separati da delimitatore (DSV)",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Pagina elenco transazioni",
"Transactions Per Page": "Transazioni per pagina",
"Show Monthly Total Amount": "Mostra importo totale mensile",
"Show Transaction Tag": "Mostra tag transazione",
"Show Transaction Tags": "Mostra tag transazione",
"Transaction Edit Page": "Pagina modifica transazione",
"Automatically Save Draft": "Salva automaticamente bozza",
"Show Confirmation Every Time": "Mostra conferma ogni volta",
"Always Show Confirmation": "Mostra conferma ogni volta",
"Automatically Add Geolocation": "Aggiungi automaticamente geolocalizzazione",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "File CSV (valori separati da virgola)",
"TSV (Tab-separated values) File": "File TSV (valori separati da tabulazione)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "NON PUOI annullare questa azione. Questo cancellerà i tuoi account, categorie, tag e dati delle transazioni. Inserisci la tua password attuale per confermare.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Tutti i dati utente sono stati cancellati",
"Unable to clear user data": "Impossibile cancellare i dati utente",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Dispositivo e sessioni",
"Device Info": "Info dispositivo",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Transazioni pianificate",
"Template Name": "Nome modello",
"No available template": "Nessun modello disponibile",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Una volta aggiunti i modelli, puoi premere a lungo il pulsante Aggiungi nella home page per aggiungere rapidamente una nuova transazione",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Una volta aggiunti i modelli, puoi premere a lungo il pulsante Aggiungi nella home page per aggiungere rapidamente una nuova transazione",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Nessun modello disponibile. Una volta aggiunti i modelli, puoi aggiungere rapidamente una nuova transazione utilizzando il menu a discesa del pulsante Aggiungi nella pagina dell'elenco delle transazioni",
"No available scheduled transactions": "Nessuna transazione pianificata disponibile",
"Unable to retrieve template list": "Impossibile recuperare l'elenco dei modelli",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "ポルトガル語 (ブラジル)",
"Russian": "ロシア語",
"Slovenian": "スロベニア語",
"Tamil": "タミル語",
"Thai": "タイ語",
"Turkish": "トルコ語",
"Ukrainian": "ウクライナ語",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "YYYYMMDD",
"shortDateFormat": "YYYYMMDD",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "YearMonthDay",
"shortDateFormat": "YearMonthDay",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY年M月D日",
"mm_dd_yyyy": "M月D日YYYY年",
"dd_mm_yyyy": "D日M月YYYY年"
"YearMonthDay": "YYYY年M月D日",
"MonthDayYear": "M月D日YYYY年",
"DayMonthYear": "D日M月YYYY年"
},
"shortDate": {
"yyyy_mm_dd": "YYYY/M/D",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY/M/D",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY年",
"mm_dd_yyyy": "YYYY年",
"dd_mm_yyyy": "YYYY年"
"YearMonthDay": "YYYY年",
"MonthDayYear": "YYYY年",
"DayMonthYear": "YYYY年"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY年M月",
"mm_dd_yyyy": "M月YYYY年",
"dd_mm_yyyy": "M月YYYY年"
"YearMonthDay": "YYYY年M月",
"MonthDayYear": "M月YYYY年",
"DayMonthYear": "M月YYYY年"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY/M",
"mm_dd_yyyy": "M/YYYY",
"dd_mm_yyyy": "M/YYYY"
"YearMonthDay": "YYYY/M",
"MonthDayYear": "M/YYYY",
"DayMonthYear": "M/YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "M月D日",
"mm_dd_yyyy": "M月D日",
"dd_mm_yyyy": "D日M月"
"YearMonthDay": "M月D日",
"MonthDayYear": "M月D日",
"DayMonthYear": "D日M月"
},
"shortMonthDay": {
"yyyy_mm_dd": "M/D",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M/D",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{year}年{quarter}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "セミコロン",
"Tab": "タブ",
"Vertical Bar": "バーティカルバー",
"Slash": "スラッシュ",
"All Types": "全種類",
"More": "さらに",
"All": "すべて",
@@ -1595,9 +1596,9 @@
"Select All": "すべて選択",
"Select None": "選択解除",
"Invert Selection": "選択を反転",
"Select All in This Page": "このページをすべて選択",
"Select None in This Page": "このページの選択を解除",
"Invert Selection in This Page": "このページの選択を反転",
"Select All on This Page": "このページをすべて選択",
"Select None on This Page": "このページの選択を解除",
"Invert Selection on This Page": "このページの選択を反転",
"Select All Valid Items": "すべての有効なアイテムを選択",
"Select All Invalid Items": "すべての無効なアイテムを選択します",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "取引",
"Transactions": "取引",
"Transaction Pictures": "取引の写真",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "サポートされていないマッププロバイダーです",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "ページを更新してもう一度やり直してください。エラーが続く場合はサーバーのマップ設定が正しく構成されていることを確認してください。",
"Import Transactions": "取引をインポート",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "ファイルをアップロード",
"Upload Transaction Data File": "取引データファイルをアップロードします",
"Define Column": "列の定義",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "月-日-年 形式",
"Day-month-year format": "日-月-年 形式",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) ファイル",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) ファイル",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "取引リストページ",
"Transactions Per Page": "ページごとの取引",
"Show Monthly Total Amount": "毎月の合計金額を表示",
"Show Transaction Tag": "取引タグを表示",
"Show Transaction Tags": "取引タグを表示",
"Transaction Edit Page": "取引編集ページ",
"Automatically Save Draft": "下書きの自動保存",
"Show Confirmation Every Time": "確認を毎回表示",
"Always Show Confirmation": "確認を毎回表示",
"Automatically Add Geolocation": "座標を自動的に追加",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "CSV(コンマ区切り)ファイル",
"TSV (Tab-separated values) File": "TSV(タブ区切り)ファイル",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "このアクションを元に戻すことはできません。これにより、口座、カテゴリ、タグ、および取引データがクリアされます。確認のため現在のパスワードを入力してください。",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "ユーザーデータがすべてクリアされました",
"Unable to clear user data": "ユーザーデータをクリアできません",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "デバイスとセッション",
"Device Info": "デバイス情報",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "スケジュールされた取引",
"Template Name": "テンプレート名",
"No available template": "利用可能なテンプレートはありません",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "テンプレートを追加したらホームページの[追加]ボタンを長押しして新しい取引をすばやく追加できます。",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "テンプレートを追加したらホームページの[追加]ボタンを長押しして新しい取引をすばやく追加できます。",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "利用可能なテンプレートはありません。テンプレートを追加したら取引リストページの[追加]ボタンのドロップダウンメニューを使用して新しい取引をすばやく追加できます。",
"No available scheduled transactions": "利用可能なスケジュールされた取引はありません",
"Unable to retrieve template list": "テンプレートリストを取得できません",
+58 -54
View File
@@ -11,12 +11,13 @@
"French": "ಫ್ರೆಂಚ್",
"Italian": "ಇಟಾಲಿಯನ್",
"Japanese": "ಜಪಾನೀಸ್",
"Dutch": "ಡಚ್",
"Kannada": "ಕನ್ನಡ",
"Korean": "ಕೊರಿಯನ್",
"Dutch": "ಡಚ್",
"Portuguese (Brazil)": "ಪೋರ್ಚುಗೀಸ್ (ಬ್ರೆಜಿಲ್)",
"Russian": "ರಶಿಯನ್",
"Slovenian": "ಸ್ಲೋವೇನಿಯನ್",
"Tamil": "ತಮಿಳು",
"Thai": "ಥಾಯ್",
"Turkish": "ಟರ್ಕಿಶ್",
"Ukrainian": "ಉಕ್ರೇನಿಯನ್",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM DD YYYY",
"dd_mm_yyyy": "DD MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM DD YYYY",
"DayMonthYear": "DD MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM-DD-YYYY",
"dd_mm_yyyy": "DD-MM-YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM-DD-YYYY",
"DayMonthYear": "DD-MM-YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM DD",
"dd_mm_yyyy": "DD MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM DD",
"DayMonthYear": "DD MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM-DD",
"dd_mm_yyyy": "DD-MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM-DD",
"DayMonthYear": "DD-MM"
},
"shortDay": {
"yyyy_mm_dd": "DD",
"mm_dd_yyyy": "DD",
"dd_mm_yyyy": "DD"
"YearMonthDay": "DD",
"MonthDayYear": "DD",
"DayMonthYear": "DD"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "ಗ್ರೆಗೋರಿಯನ್",
@@ -1506,7 +1508,6 @@
"Semicolon": "ಅರ್ಧ ವಿರಾಮ",
"Tab": "ಟ್ಯಾಬ್",
"Vertical Bar": "ಲಂಬ ದಂಡೆ",
"Slash": "ಸ್ಲ್ಯಾಶ್",
"All Types": "ಎಲ್ಲಾ ಪ್ರಕಾರಗಳು",
"More": "ಇನ್ನಷ್ಟು",
"All": "ಎಲ್ಲಾ",
@@ -1595,9 +1596,9 @@
"Select All": "ಎಲ್ಲಾ ಆಯ್ಕೆಮಾಡಿ",
"Select None": "ಯಾವುದೂ ಆಯ್ಕೆ ಮಾಡಬೇಡಿ",
"Invert Selection": "ಆಯ್ಕೆಯನ್ನು ತಿರುಗಿಸಿ",
"Select All in This Page": "ಈ ಪುಟದ ಎಲ್ಲವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ",
"Select None in This Page": "ಈ ಪುಟದಲ್ಲಿ ಯಾವುದನ್ನೂ ಆಯ್ಕೆ ಮಾಡಬೇಡಿ",
"Invert Selection in This Page": "ಈ ಪುಟದಲ್ಲಿ ಆಯ್ಕೆಯನ್ನು ತಿರುಗಿಸಿ",
"Select All on This Page": "ಈ ಪುಟದ ಎಲ್ಲವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ",
"Select None on This Page": "ಈ ಪುಟದಲ್ಲಿ ಯಾವುದನ್ನೂ ಆಯ್ಕೆ ಮಾಡಬೇಡಿ",
"Invert Selection on This Page": "ಈ ಪುಟದಲ್ಲಿ ಆಯ್ಕೆಯನ್ನು ತಿರುಗಿಸಿ",
"Select All Valid Items": "ಎಲ್ಲಾ ಮಾನ್ಯ ಅಂಶಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ",
"Select All Invalid Items": "ಎಲ್ಲಾ ಅಮಾನ್ಯ ಅಂಶಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ",
"Set All to Included": "ಎಲ್ಲವನ್ನು ಸೇರಿಸಲಾಗಿದೆ ಎನ್ನಿ",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಸರಿಸಿ",
"Are you sure you want to move all transactions?": "ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಸರಿಸಲು ನೀವು ಖಚಿತವೇ?",
"Unable to move transactions": "ವಹಿವಾಟುಗಳನ್ನು ಸರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
"All transactions in this account has been moved.": "ಈ ಖಾತೆಯಲ್ಲಿರುವ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಸರಿಸಲಾಗಿದೆ.",
"All transactions in this account have been moved.": "ಈ ಖಾತೆಯಲ್ಲಿರುವ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಸರಿಸಲಾಗಿದೆ.",
"Reconciliation Statement": "ಪುನಃಸಮಾಧಾನ ಹೇಳಿಕೆ",
"Account Balance Trends": "ಖಾತೆ ಶೇಷ ಪ್ರವೃತ್ತಿಗಳು",
"Update Closing Balance": "ಕೊನೆಯ ಶೇಷವನ್ನು ನವೀಕರಿಸಿ",
"Please enter the new closing balance for the account": "ಈ ಖಾತೆಗೆ ಹೊಸ ಕೊನೆಗಿನ ಶೇಷವನ್ನು ನಮೂದಿಸಿ",
"Please enter the new closing balance for this account": "ಈ ಖಾತೆಗೆ ಹೊಸ ಕೊನೆಗಿನ ಶೇಷವನ್ನು ನಮೂದಿಸಿ",
"Transaction": "ವಹಿವಾಟು",
"Transactions": "ವಹಿವಾಟುಗಳು",
"Transaction Pictures": "ವಹಿವಾಟಿನ ಚಿತ್ರಗಳು",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "ಬೆಂಬಲಿಸದ ನಕ್ಷೆ ಪೂರೈಕೆದಾರ",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "ದಯವಿಟ್ಟು ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ. ದೋಷ ಮುಂದುವರೆದರೆ, ಸರ್ವರ್‌ನ ನಕ್ಷೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸರಿಯಾಗಿ ಸಂರಚಿಸಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.",
"Import Transactions": "ವಹಿವಾಟುಗಳನ್ನು ಆಮದು ಮಾಡಿ",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "ಫೈಲ್ ಅಪ್ಲೋಡ್ ಮಾಡಿ",
"Upload Transaction Data File": "ವಹಿವಾಟು ಡೇಟಾ ಫೈಲ್ ಅಪ್ಲೋಡ್ ಮಾಡಿ",
"Define Column": "ಕಾಲಮ್ ವ್ಯಾಖ್ಯಾನಿಸಿ",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "ತಿಂಗಳು-ದಿನ-ವರ್ಷ ರೂಪ",
"Day-month-year format": "ದಿನ-ತಿಂಗಳು-ವರ್ಷ ರೂಪ",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) ಫೈಲ್",
"Camt.052 Bank to Customer Statement File": "Camt.052 ಬ್ಯಾಂಕ್ ಸ್ಟೇಟ್ಮೆಂಟ್ ಫೈಲ್",
"Camt.053 Bank to Customer Statement File": "Camt.053 ಬ್ಯಾಂಕ್ ಸ್ಟೇಟ್ಮೆಂಟ್ ಫೈಲ್",
"MT940 Consumer Statement Message File": "MT940 ಗ್ರಾಹಕ ಸ್ಟೇಟ್ಮೆಂಟ್ ಫೈಲ್",
"Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) ಫೈಲ್",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "ವಹಿವಾಟು ಪಟ್ಟಿ ಪುಟ",
"Transactions Per Page": "ಪ್ರತಿ ಪುಟಕ್ಕೆ ವಹಿವಾಟುಗಳು",
"Show Monthly Total Amount": "ಮಾಸಿಕ ಒಟ್ಟು ಮೊತ್ತ ತೋರಿಸಿ",
"Show Transaction Tag": "ವಹಿವಾಟು ಟ್ಯಾಗ್ ತೋರಿಸಿ",
"Show Transaction Tags": "ವಹಿವಾಟು ಟ್ಯಾಗ್ ತೋರಿಸಿ",
"Transaction Edit Page": "ವಹಿವಾಟು ಸಂಪಾದನೆ ಪುಟ",
"Automatically Save Draft": "ಕರಡು ಸ್ವಯಂ ಉಳಿಸಿ",
"Show Confirmation Every Time": "ಪ್ರತಿ ಬಾರಿ ದೃಢೀಕರಣ ತೋರಿಸಿ",
"Always Show Confirmation": "ಪ್ರತಿ ಬಾರಿ ದೃಢೀಕರಣ ತೋರಿಸಿ",
"Automatically Add Geolocation": "ಭೌಗೋಳಿಕ ಸ್ಥಾನವನ್ನು ಸ್ವಯಂ ಸೇರಿಸಿ",
"Always Show Transaction Pictures": "ವಹಿವಾಟು ಚಿತ್ರಗಳನ್ನು ಯಾವಾಗಲೂ ತೋರಿಸಿ",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "ಫೈಲ್ ಫಾರ್ಮ್ಯಾಟ್",
"CSV (Comma-separated values) File": "CSV (ಕಾಮಾ-ಪ್ರತ್ಯೇಕಿತ ಮೌಲ್ಯಗಳು) ಫೈಲ್",
"TSV (Tab-separated values) File": "TSV (ಟ್ಯಾಬ್-ಪ್ರತ್ಯೇಕಿತ ಮೌಲ್ಯಗಳು) ಫೈಲ್",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "CSV (ಕಾಮಾ-ಪ್ರತ್ಯೇಕಿತ ಮೌಲ್ಯಗಳು) ಫೈಲ್‌ಗೆ ರಫ್ತು ಮಾಡಿ",
"Export to TSV (Tab-separated values) File": "TSV (ಟ್ಯಾಬ್-ಪ್ರತ್ಯೇಕಿತ ಮೌಲ್ಯಗಳು) ಫೈಲ್‌ಗೆ ರಫ್ತು ಮಾಡಿ",
"Markdown File": "Markdown ಫೈಲ್",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದು ನಿಮ್ಮ ವಹಿವಾಟು ಡೇಟಾವನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಅಳಿಸುತ್ತದೆ. ದೃಢೀಕರಿಸಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದು ನಿಮ್ಮ ಖಾತೆಗಳು, ವರ್ಗಗಳು, ಟ್ಯಾಗ್‌ಗಳು ಮತ್ತು ವಹಿವಾಟು ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ. ದೃಢೀಕರಿಸಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. \"ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ\" ನಿಮ್ಮ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ಅಳಿಸುತ್ತದೆ, ಮತ್ತು \"ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ\" ನಿಮ್ಮ ಖಾತೆಗಳು, ವರ್ಗಗಳು, ಟ್ಯಾಗ್‌ಗಳು ಮತ್ತು ವಹಿವಾಟು ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ. ದೃಢೀಕರಿಸಲು ದಯವಿಟ್ಟು ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ.",
"All transactions in this account has been cleared": "ಈ ಖಾತೆಯಲ್ಲಿನ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ",
"All transactions has been cleared": "ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ",
"All transactions in this account have been cleared": "ಈ ಖಾತೆಯಲ್ಲಿನ ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ",
"All transactions have been cleared": "ಎಲ್ಲಾ ವಹಿವಾಟುಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ",
"All user data has been cleared": "ಎಲ್ಲಾ ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ",
"Unable to clear user data": "ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
"Third-Party Logins": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್‌ಗಳು",
"Third-Party Login": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್‌ಗಳು",
"Linked Time": "ಲಿಂಕ್ ಮಾಡಿದ ಸಮಯ",
"Link": "ಲಿಂಕ್",
"Unlink": "ಅನ್‌ಲಿಂಕ್",
"Are you sure you want to unlink this login method?": "ಈ ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಅನ್‌ಲಿಂಕ್ ಮಾಡಲು ನೀವು ಖಚಿತವೇ?",
"Unable to retrieve third-party logins list": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಪಟ್ಟಿ ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
"Third-party logins list is up to date": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಪಟ್ಟಿ ನವೀಕೃತವಾಗಿದೆ",
"Third-party logins list has been updated": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಪಟ್ಟಿ ನವೀಕರಿಸಲಾಗಿದೆ",
"Unable to retrieve third-party login list": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಪಟ್ಟಿ ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
"Third-party login list is up to date": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಪಟ್ಟಿ ನವೀಕೃತವಾಗಿದೆ",
"Third-party login list has been updated": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಪಟ್ಟಿ ನವೀಕರಿಸಲಾಗಿದೆ",
"Unable to unlink third-party login": "ಮೂರನೇ-ಪಕ್ಷ ಲಾಗಿನ್ ಅನ್ನು ಅನ್‌ಲಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
"Device & Sessions": "ಸಾಧನಗಳು ಮತ್ತು ಸೆಷನ್‌ಗಳು",
"Device Info": "ಸಾಧನ ಮಾಹಿತಿ",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "ಷೆಡ್ಯೂಲ್ ಮಾಡಿದ ವಹಿವಾಟುಗಳು",
"Template Name": "ಟೆಂಪ್ಲೇಟ್ ಹೆಸರು",
"No available template": "ಯಾವುದೇ ಟೆಂಪ್ಲೇಟ್ ಲಭ್ಯವಿಲ್ಲ",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "ನೀವು ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ಹೋಮ್ ಪುಟದಲ್ಲಿನ Add ಬಟನ್ ಅನ್ನು ದೀರ್ಘವಾಗಿ ಒತ್ತುವುದರಿಂದ ಹೊಸ ವಹಿವಾಟನ್ನು ಶೀಘ್ರವಾಗಿ ಸೇರಿಸಬಹುದು",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "ನೀವು ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ಹೋಮ್ ಪುಟದಲ್ಲಿನ Add ಬಟನ್ ಅನ್ನು ದೀರ್ಘವಾಗಿ ಒತ್ತುವುದರಿಂದ ಹೊಸ ವಹಿವಾಟನ್ನು ಶೀಘ್ರವಾಗಿ ಸೇರಿಸಬಹುದು",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "ಯಾವುದೇ ಟೆಂಪ್ಲೇಟ್ ಲಭ್ಯವಿಲ್ಲ. ನೀವು ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ವಹಿವಾಟು ಪಟ್ಟಿಯ Add ಬಟನ್‌ನ ಡ್ರಾಪ್‌ಡೌನ್ ಬಳಸಿ ಶೀಘ್ರವಾಗಿ ಹೊಸ ವಹಿವಾಟನ್ನು ಸೇರಿಸಬಹುದು",
"No available scheduled transactions": "ಯಾವುದೇ ವೇಳಾಪಡಿಸಿದ ವಹಿವಾಟುಗಳು ಲಭ್ಯವಿಲ್ಲ",
"Unable to retrieve template list": "ಟೆಂಪ್ಲೇಟ್ ಪಟ್ಟಿಯನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
+278 -274
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "포르투갈어 (브라질)",
"Russian": "러시아어",
"Slovenian": "슬로베니아어",
"Tamil": "타밀어",
"Thai": "태국어",
"Turkish": "터키어",
"Ukrainian": "우크라이나어",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "YYYYMMDD",
"shortDateFormat": "YYYYMMDD",
"longTimeFormat": "AHHMMSS",
"shortTimeFormat": "AHHMM",
"longDateFormat": "YearMonthDay",
"shortDateFormat": "YearMonthDay",
"longTimeFormat": "MeridiemIndicatorHourMinuteSecond",
"shortTimeFormat": "MeridiemIndicatorHourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY년 M월 D일",
"mm_dd_yyyy": "M월 D일 YYYY년",
"dd_mm_yyyy": "D일 M월 YYYY년"
"YearMonthDay": "YYYY년 M월 D일",
"MonthDayYear": "M월 D일 YYYY년",
"DayMonthYear": "D일 M월 YYYY년"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD/MM/YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD/MM/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY년",
"mm_dd_yyyy": "YYYY년",
"dd_mm_yyyy": "YYYY년"
"YearMonthDay": "YYYY년",
"MonthDayYear": "YYYY년",
"DayMonthYear": "YYYY년"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY년 M월",
"mm_dd_yyyy": "M월 YYYY년",
"dd_mm_yyyy": "M월 YYYY년"
"YearMonthDay": "YYYY년 M월",
"MonthDayYear": "M월 YYYY년",
"DayMonthYear": "M월 YYYY년"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MM/YYYY",
"dd_mm_yyyy": "MM/YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MM/YYYY",
"DayMonthYear": "MM/YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "M월 D일",
"mm_dd_yyyy": "M월 D일",
"dd_mm_yyyy": "D일 M월"
"YearMonthDay": "M월 D일",
"MonthDayYear": "M월 D일",
"DayMonthYear": "D일 M월"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD/MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD/MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{year}년 {quarter}"
@@ -132,11 +133,11 @@
"confirmImportTransactions": "{count}개의 거래를 가져오시겠습니까?",
"importingTransactions": "가져오는 중 ({process}%)",
"importTransactionResult": "성공적으로 {count}개의 거래를 가져왔습니다.",
"moveTransactionsInAccountTip": "You CANNOT undo this action. This will move all transactions from {fromAccount} to {toAccount}.",
"moveTransactionsInAccountTip": "이 작업은 되돌릴 수 없습니다. {fromAccount}에서 {toAccount}로 모든 거래를 이동합니다.",
"clearTransactionsInAccountTip": "이 작업은 되돌릴 수 없습니다. {account}의 거래 데이터를 지웁니다. 계속하시려면 현재 비밀번호를 입력하세요.",
"accountActivationAndResendValidationEmailTip": "계정 활성화 링크가 귀하의 이메일 주소({email})로 전송되었습니다. 메일을 받지 못하신 경우, 비밀번호를 다시 입력하고 아래 버튼을 클릭하여 확인 메일을 재전송하십시오.",
"resendValidationEmailTip": "메일을 받지 못하신 경우, 비밀번호를 다시 입력하고 아래 버튼을 클릭하여 확인 메일을 {email}로 재전송하십시오.",
"oauth2bindTip": "You're signing in to the {userName} user using {providerName}. Please enter your ezBookkeeping password to verify."
"oauth2bindTip": "{providerName}를 사용하여 {userName} 사용자로 로그인하고 있습니다. 확인을 위해 ezBookkeeping 비밀번호를 입력하세요."
}
},
"dataExport": {
@@ -148,14 +149,15 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
"Buddhist": "Buddhist",
"Persian": "Persian",
"Gregorian with Chinese Calendar": "Gregorian with Chinese Calendar",
"Gregorian with Persian Calendar": "Gregorian with Persian Calendar"
"Gregorian": "그레고리력",
"Buddhist": "불기",
"Persian": "페르시아력",
"Gregorian with Chinese Calendar": "그레고리력 (중국력)",
"Gregorian with Persian Calendar": "그레고리력 (페르시아력)"
},
"datetime": {
"AM": {
@@ -288,18 +290,18 @@
}
},
"granularity": {
"FiscalYearly": "Fiscal Yearly",
"Yearly": "Yearly",
"Quarterly": "Quarterly",
"Monthly": "Monthly",
"Daily": "Daily"
"FiscalYearly": "회계 연도별",
"Yearly": "연간",
"Quarterly": "분기별",
"Monthly": "월간",
"Daily": "일간"
},
"numeral": {
"Western Arabic Numerals": "Western Arabic Numerals",
"Eastern Arabic Numerals": "Eastern Arabic Numerals",
"Persian Digits": "Persian Digits",
"Burmese Numerals": "Burmese Numerals",
"Devanagari Numerals": "Devanagari Numerals",
"Western Arabic Numerals": "서양 아라비아 숫자",
"Eastern Arabic Numerals": "동양 아라비아 숫자",
"Persian Digits": "페르시아 숫자",
"Burmese Numerals": "버마 숫자",
"Devanagari Numerals": "데바나가리 숫자",
"Dot": "닷",
"Comma": "콤마",
"Space": "스페이스",
@@ -1051,10 +1053,10 @@
"googlemap": "Google Map",
"baidumap": "Baidu Map",
"amap": "Amap",
"custom": "User Custom"
"custom": "사용자 정의"
},
"error": {
"system error": " 시스템 오류",
"system error": "시스템 오류",
"api not found": "API를 요청하지 못했습니다",
"not implemented": "구현되지 않음",
"system is busy": "시스템이 바쁩니다",
@@ -1099,9 +1101,9 @@
"user avatar file extension invalid": "사용자 아바타 파일 확장자가 유효하지 않습니다",
"exceed the maximum size of user avatar file": "업로드된 사용자 아바타가 허용된 최대 파일 크기를 초과합니다",
"not permitted to perform this action": "이 작업을 수행할 수 있는 권한이 없습니다",
"cannot login by password": "You cannot login by password",
"user name is invalid": "User name is invalid",
"nick name is invalid": "User nickname is invalid",
"cannot login by password": "비밀번호로 로그인할 수 없습니다",
"user name is invalid": "사용자 이름이 유효하지 않습니다",
"nick name is invalid": "사용자 닉네임이 유효하지 않습니다",
"unauthorized access": "권한이 없는 접근입니다",
"current token is invalid": "현재 토큰이 유효하지 않습니다",
"current token is expired": "현재 토큰이 만료되었습니다",
@@ -1116,13 +1118,13 @@
"token is empty": "토큰이 비어 있습니다",
"email verify token is invalid or expired": "이메일 확인 토큰이 유효하지 않거나 만료되었습니다",
"password reset token is invalid or expired": "비밀번호 재설정 토큰이 유효하지 않거나 만료되었습니다",
"api token is not enabled": "API token is not enabled",
"api token is not enabled": "API 토큰이 활성화되지 않았습니다",
"passcode is invalid": "일회용 비밀번호가 유효하지 않습니다",
"two-factor backup code is invalid": "2단계 백업 코드가 유효하지 않습니다",
"two-factor is not enabled": "2단계 인증이 활성화되지 않았습니다",
"two-factor has already been enabled": "2단계 인증이 이미 활성화되었습니다",
"two-factor backup code does not exist": "2단계 백업 코드가 존재하지 않습니다",
"passcode is empty": "Passcode is empty",
"passcode is empty": "일회용 비밀번호가 비어 있습니다",
"account id is invalid": "계좌 ID가 유효하지 않습니다",
"account not found": "계좌를 찾을 수 없습니다",
"account type is invalid": "계좌 유형이 유효하지 않습니다",
@@ -1182,10 +1184,10 @@
"transaction type mapping invalid": "거래 유형 매핑이 유효하지 않습니다.",
"transaction time format invalid": "거래 시간 형식이 유효하지 않습니다.",
"transaction time zone format invalid": "거래 시간대 형식이 유효하지 않습니다.",
"cannot move transaction to same account": "Cannot move transaction to the same account",
"cannot move transaction from or to hidden account": "Cannot move transaction from or to hidden account",
"cannot move transaction from or to parent account": "Cannot move transaction from or to parent account",
"cannot move transaction between accounts with different currencies": "Cannot move transaction between accounts with different currencies",
"cannot move transaction to same account": "거래를 동일한 계좌로 이동할 수 없습니다.",
"cannot move transaction from or to hidden account": "숨겨진 계좌에서 또는 숨겨진 계좌로 거래를 이동할 수 없습니다.",
"cannot move transaction from or to parent account": "상위 계좌에서 또는 상위 계좌로 거래를 이동할 수 없습니다.",
"cannot move transaction between accounts with different currencies": "다른 통화를 사용하는 계좌 간에 거래를 이동할 수 없습니다.",
"transaction category id is invalid": "거래 카테고리 ID가 유효하지 않습니다.",
"transaction category not found": "거래 카테고리를 찾을 수 없습니다.",
"transaction category type is invalid": "거래 카테고리 유형이 유효하지 않습니다.",
@@ -1256,31 +1258,31 @@
"image for AI recognition is empty": "AI 인식을 위한 이미지 파일이 비어 있습니다.",
"exceed the maximum size of image file for AI recognition": "AI 인식을 위한 업로드된 이미지가 허용된 최대 파일 크기를 초과합니다.",
"no transaction information detected": "거래 정보가 감지되지 않았습니다.",
"user external auth is not found": "User external authentication data not found",
"user external auth already exists": "User external authentication data already exists, please unlink it first",
"user external auth type invalid": "User external authentication type is invalid",
"oauth2 not enabled": "OAuth 2.0 is not enabled",
"oauth2 auto registration not enabled": "OAuth 2.0 auto registration is not enabled",
"invalid oauth2 login request": "Invalid OAuth 2.0 login request",
"invalid oauth2 callback": "Invalid OAuth 2.0 callback",
"missing state in oauth2 callback": "Missing state parameter in OAuth 2.0 callback",
"missing code in oauth2 callback": "Missing code parameter in OAuth 2.0 callback",
"invalid state in oauth2 callback": "Invalid state parameter in OAuth 2.0 callback",
"cannot retrieve oauth2 token": "Cannot retrieve OAuth 2.0 token",
"invalid oauth2 token": "Invalid OAuth 2.0 token",
"cannot retrieve user info from oauth2 provider": "Cannot retrieve user info from OAuth 2.0 provider",
"oauth2 user already bound to another user": "OAuth 2.0 user is already bound to another user",
"user name and email from oauth2 provider are both empty": "User name and email from OAuth 2.0 provider are both empty",
"user name from oauth2 provider is empty": "User name from OAuth 2.0 provider is empty",
"email from oauth2 provider is empty": "Email from OAuth 2.0 provider is empty",
"user name from oauth2 provider is empty, cannot register new user": "User name from OAuth 2.0 provider is empty, cannot register new user",
"email from oauth2 provider is empty, cannot register new user": "Email from OAuth 2.0 provider is empty, cannot register new user",
"explorer id is invalid": "Explorer ID is invalid",
"explorer not found": "Explorer is not found",
"explorer data is invalid": "Explorer data is invalid",
"transaction tag group id is invalid": "Transaction tag group ID is invalid",
"transaction tag group not found": "Transaction tag group is not found",
"transaction tag group is in use and cannot be deleted": "Transaction tag group is in use and it cannot be deleted",
"user external auth is not found": "사용자 외부 인증 데이터가 없습니다.",
"user external auth already exists": "사용자 외부 인증 데이터가 이미 존재합니다. 먼저 연결을 해제하십시오.",
"user external auth type invalid": "사용자 외부 인증 유형이 유효하지 않습니다.",
"oauth2 not enabled": "OAuth 2.0이 활성화되어 있지 않습니다.",
"oauth2 auto registration not enabled": "OAuth 2.0 자동 등록이 활성화되어 있지 않습니다.",
"invalid oauth2 login request": "유효하지 않은 OAuth 2.0 로그인 요청입니다.",
"invalid oauth2 callback": "유효하지 않은 OAuth 2.0 콜백입니다.",
"missing state in oauth2 callback": "OAuth 2.0 콜백에 상태 매개변수가 없습니다.",
"missing code in oauth2 callback": "OAuth 2.0 콜백에 코드 매개변수가 없습니다.",
"invalid state in oauth2 callback": "OAuth 2.0 콜백에 상태 매개변수가 유효하지 않습니다.",
"cannot retrieve oauth2 token": "OAuth 2.0 토큰을 가져올 수 없습니다.",
"invalid oauth2 token": "유효하지 않은 OAuth 2.0 토큰입니다.",
"cannot retrieve user info from oauth2 provider": "OAuth 2.0 공급자에서 사용자 정보를 가져올 수 없습니다.",
"oauth2 user already bound to another user": "OAuth 2.0 사용자가 이미 다른 사용자에 바인딩되어 있습니다.",
"user name and email from oauth2 provider are both empty": "OAuth 2.0 공급자에서 사용자 이름과 이메일이 모두 비어 있습니다.",
"user name from oauth2 provider is empty": "OAuth 2.0 공급자에서 사용자 이름이 비어 있습니다.",
"email from oauth2 provider is empty": "OAuth 2.0 공급자에서 이메일이 비어 있습니다.",
"user name from oauth2 provider is empty, cannot register new user": "OAuth 2.0 공급자에서 사용자 이름이 비어 있어 새 사용자를 등록할 수 없습니다.",
"email from oauth2 provider is empty, cannot register new user": "OAuth 2.0 공급자에서 이메일이 비어 있어 새 사용자를 등록할 수 없습니다.",
"explorer id is invalid": "Explorer ID가 유효하지 않습니다.",
"explorer not found": "Explorer를 찾을 수 없습니다.",
"explorer data is invalid": "Explorer 데이터가 유효하지 않습니다.",
"transaction tag group id is invalid": "Transaction tag group ID가 유효하지 않습니다.",
"transaction tag group not found": "Transaction tag group을 찾을 수 없습니다.",
"transaction tag group is in use and cannot be deleted": "Transaction tag group이 사용 중이므로 삭제할 수 없습니다.",
"query items cannot be blank": "쿼리 항목이 비어 있을 수 없습니다.",
"query items too much": "쿼리 항목이 너무 많습니다.",
"query items have invalid item": "쿼리 항목에 유효하지 않은 항목이 있습니다.",
@@ -1420,8 +1422,8 @@
"functionParamRowDescription": "문자열 배열, 각 요소는 열 값입니다.",
"functionParamIndexDescription": "행 인덱스 (0 기반)",
"functionReturnDescription": "거래를 나타내는 객체 (아래 정의된 필드 포함) 또는 이 행을 건너뛰기 위한 null",
"fieldTimeDescription": "[required] Transaction time, format: YYYY-MM-DD HH:mm:ss. You can also use the parseDateTime(value, format) function to convert a custom formatted time string to the standard format, where 'format' argument is the format of the custom time string, e.g. parseDateTime('12/31/2023 23:59', 'MM/DD/YYYY HH:mm') means converting '12/31/2023 23:59' to the standard format '2023-12-31 23:59:00'",
"fieldUtcOffsetDescription": "[required] Transaction timezone offset in minutes, e.g. '480' for UTC+8, '-300' for UTC-5. You can also use the parseUtcOffset(timezoneName) function to get the timezone offset in minutes automatically according to the transaction time, where 'timezoneName' argument is the IANA time zone name, e.g. parseUtcOffset('Asia/Shanghai') means getting the timezone offset in minutes for Beijing Time",
"fieldTimeDescription": "[필수] 거래 시간, 형식: YYYY-MM-DD HH:mm:ss. 또한 parseDateTime(value, format) 함수를 사용하여 사용자 지정 형식의 시간 문자열을 표준 형식으로 변환할 수 있습니다. 여기서 'format' 인수는 사용자 지정 시간 문자열의 형식입니다. 예: parseDateTime('12/31/2023 23:59', 'MM/DD/YYYY HH:mm') '12/31/2023 23:59'를 표준 형식 '2023-12-31 23:59:00'으로 변환함을 의미합니다.",
"fieldUtcOffsetDescription": "[필수] 거래 시간대 오프셋(분 단위), 예: UTC+8은 '480', UTC-5는 '-300'. 또한 parseUtcOffset(timezoneName) 함수를 사용하여 거래 시간에 따라 자동으로 시간대 오프셋(분 단위)을 얻을 수 있습니다. 여기서 'timezoneName' 인수는 IANA 시간대 이름입니다. 예: parseUtcOffset('Asia/Shanghai')는 베이징 시간에 대한 시간대 오프셋(분 단위)을 얻는 것을 의미합니다.",
"fieldTypeDescription": "[필수] 거래 유형, 'TransactionType.Income', 'TransactionType.Expense' 또는 'TransactionType.Transfer' 중 하나여야 합니다.",
"fieldCategoryNameDescription": "[선택] 카테고리 이름",
"fieldSourceAccountNameDescription": "[선택] 출처 계좌 이름",
@@ -1438,7 +1440,7 @@
"Operation": "작업",
"Open": "열기",
"Close": "닫기",
"or": "or",
"or": "또는",
"Submit": "제출",
"Add": "추가",
"Import": "가져오기",
@@ -1446,15 +1448,15 @@
"Apply": "적용",
"Save": "저장",
"Save Changes": "변경사항 저장",
"Reset to Default": "Reset to Default",
"Reset to Default": "기본값으로 재설정",
"Reset": "재설정",
"Update": "업데이트",
"Refresh": "새로고침",
"Clear": "지우기",
"Clear All": "Clear All",
"Clear All": "모두 지우기",
"Generate": "생성",
"Recognize": "인식",
"Recognizing": "Recognizing",
"Recognizing": "인식 중",
"Cancel Recognition": "인식 취소",
"None": "없음",
"Unspecified": "지정되지 않음",
@@ -1463,11 +1465,11 @@
"No results": "결과 없음",
"Unknown": "알 수 없음",
"Auto detect": "자동 감지",
"Detecting...": "Detecting...",
"Detecting...": "감지 중...",
"Miscellaneous": "기타",
"Default": "기본값",
"Included": "Included",
"Excluded": "Excluded",
"Included": "포함됨",
"Excluded": "제외됨",
"Done": "완료",
"Continue": "계속",
"Previous": "이전",
@@ -1479,18 +1481,18 @@
"Disable": "비활성화",
"Disabled": "비활성화됨",
"Configuration": "설정",
"Example": "Example",
"Example": "예제",
"Token": "토큰",
"Copy": "복사",
"Paste": "Paste",
"Paste": "붙여넣기",
"Visible": "표시",
"Show": "보기",
"Hide": "숨기기",
"Version": "버전",
"Edit": "편집",
"View": "보기",
"Move": "Move",
"Move to...": "Move to...",
"Move": "이동",
"Move to...": "다음으로 이동...",
"Remove": "제거",
"Delete": "삭제",
"Duplicate": "복제",
@@ -1506,7 +1508,6 @@
"Semicolon": "세미콜론",
"Tab": "탭",
"Vertical Bar": "수직선",
"Slash": "슬래시",
"All Types": "모든 유형",
"More": "더 보기",
"All": "전체",
@@ -1566,19 +1567,19 @@
"Not ends with": "Not ends with",
"Pie Chart": "원형 차트",
"Bar Chart": "막대 차트",
"Radar Chart": "Radar Chart",
"Radar Chart": "레이더 차트",
"Area Chart": "영역 차트",
"Column Chart": "세로 막대 차트",
"Bubble Chart": "Bubble Chart",
"Bubble Chart": "버블 차트",
"Candlestick Chart": "캠들스틱 차트",
"Sankey Chart": "Sankey Chart",
"Column Chart (Stacked)": "Column Chart (Stacked)",
"Column Chart (100% Stacked)": "Column Chart (100% Stacked)",
"Column Chart (Grouped)": "Column Chart (Grouped)",
"Line Chart (Grouped)": "Line Chart (Grouped)",
"Area Chart (Stacked)": "Area Chart (Stacked)",
"Area Chart (100% Stacked)": "Area Chart (100% Stacked)",
"Bubble Chart (Grouped)": "Bubble Chart (Grouped)",
"Sankey Chart": "샌키 차트",
"Column Chart (Stacked)": "누적 세로 막대 차트",
"Column Chart (100% Stacked)": "100% 누적 세로 막대 차트",
"Column Chart (Grouped)": "그룹화된 세로 막대 차트",
"Line Chart (Grouped)": "그룹화된 선 차트",
"Area Chart (Stacked)": "누적 영역 차트",
"Area Chart (100% Stacked)": "100% 누적 영역 차트",
"Bubble Chart (Grouped)": "그룹화된 버블 차트",
"Sort by": "정렬 기준",
"Map": "지도",
"Provider": "제공자",
@@ -1595,14 +1596,14 @@
"Select All": "전체 선택",
"Select None": "선택 해제",
"Invert Selection": "선택 반전",
"Select All in This Page": "현재 페이지 전체 선택",
"Select None in This Page": "현재 페이지 선택 해제",
"Invert Selection in This Page": "현재 페이지 선택 반전",
"Select All on This Page": "현재 페이지 전체 선택",
"Select None on This Page": "현재 페이지 선택 해제",
"Invert Selection on This Page": "현재 페이지 선택 반전",
"Select All Valid Items": "유효한 항목 전체 선택",
"Select All Invalid Items": "유효하지 않은 항목 전체 선택",
"Set All to Included": "Set All to Included",
"Set All to Default": "Set All to Default",
"Set All to Excluded": "Set All to Excluded",
"Set All to Included": "모두 포함으로 설정",
"Set All to Default": "모두 기본값으로 설정",
"Set All to Excluded": "모두 제외로 설정",
"Back": "뒤로",
"Load More": "더 불러오기",
"Export Results": "결과 내보내기",
@@ -1658,10 +1659,10 @@
"This month or later": "이번 달 이후",
"This year or later": "올해 이후",
"Log In": "로그인",
"Log in with OAuth 2.0": "Log in with OAuth 2.0",
"Log in with Connect ID": "Log in with Connect ID",
"Log in with OAuth 2.0": "OAuth 2.0으로 로그인",
"Log in with Connect ID": "Connect ID로 로그인",
"Click here to log in": "여기를 클릭하여 로그인",
"Logging in...": "Logging in...",
"Logging in...": "로그인 중...",
"Back to login page": "로그인 페이지로 돌아가기",
"Back to home page": "홈 페이지로 돌아가기",
"Don't have an account?": "계정이 없으신가요?",
@@ -1677,11 +1678,11 @@
"Nickname cannot be blank": "닉네임은 비워둘 수 없습니다.",
"Default currency cannot be blank": "기본 통화는 비워둘 수 없습니다.",
"Unable to log in": "로그인할 수 없습니다.",
"Username/password login is disabled": "Username/password login is disabled",
"External login is disabled": "External login is disabled",
"Two-factor authentication is disabled": "Two-factor authentication is disabled",
"Email verification is disabled": "Email verification is disabled",
"Forget password is disabled": "Forget password is disabled",
"Username/password login is disabled": "사용자 이름/비밀번호 로그인이 비활성화되었습니다.",
"External login is disabled": "외부 로그인이 비활성화되었습니다.",
"Two-factor authentication is disabled": "이중 인증이 비활성화되었습니다.",
"Email verification is disabled": "이메일 확인이 비활성화되었습니다.",
"Forget password is disabled": "비밀번호 찾기가 비활성화되었습니다.",
"Two-Factor Authentication": "이중 인증",
"Two-factor authentication is not enabled yet.": "이중 인증이 아직 활성화되지 않았습니다.",
"Two-factor authentication is already enabled.": "이중 인증이 이미 활성화되어 있습니다.",
@@ -1719,68 +1720,68 @@
"Transaction Calendar": "거래 달력",
"Transaction Details": "거래 세부사항",
"Statistics & Analysis": "통계 및 분석",
"Insights Explorer": "Insights Explorer",
"Insights Explorers": "Insights Explorers",
"Query": "Query",
"Data Table": "Data Table",
"Chart": "Chart",
"No available explorer": "No available explorer",
"New Explorer": "New Explorer",
"Untitled Explorer": "Untitled Explorer",
"Save Explorer": "Save Explorer",
"Save As New Explorer": "Save As New Explorer",
"Restore to Last Saved": "Restore to Last Saved",
"Are you sure you want to restore to last saved state? All unsaved changes will be lost.": "Are you sure you want to restore to last saved state? All unsaved changes will be lost.",
"Set Explorer Name": "Set Explorer Name",
"Rename Explorer": "Rename Explorer",
"Hide Explorer": "Hide Explorer",
"Unhide Explorer": "Unhide Explorer",
"Delete Explorer": "Delete Explorer",
"Change Explorer Display Order": "Change Explorer Display Order",
"Explorer Name": "Explorer Name",
"Add Query": "Add Query",
"Remove Query": "Remove Query",
"Modify Query Name": "Modify Query Name",
"Add Condition": "Add Condition",
"Remove Condition": "Remove Condition",
"No conditions defined. All transactions will match.": "No conditions defined. All transactions will match.",
"Unable to retrieve explorer list": "Unable to retrieve explorer list",
"Explorer list is up to date": "Explorer list is up to date",
"Explorer list has been updated": "Explorer list has been updated",
"Unable to retrieve explorer": "Unable to retrieve explorer",
"Unable to add explorer": "Unable to add explorer",
"Unable to save explorer": "Unable to save explorer",
"Unable to move explorer": "Unable to move explorer",
"Unable to hide this explorer": "Unable to hide this explorer",
"Unable to unhide this explorer": "Unable to unhide this explorer",
"Are you sure you want to delete this explorer?": "Are you sure you want to delete this explorer?",
"Unable to delete this explorer": "Unable to delete this explorer",
"Show Hidden Explorers": "Show Hidden Explorers",
"Hide Hidden Explorers": "Hide Hidden Explorers",
"Editor": "Editor",
"Expression": "Expression",
"Failed to generate expression": "Failed to generate expression",
"Data Source": "Data Source",
"All Queries": "All Queries",
"Axis / Category": "Axis / Category",
"Series": "Series",
"Transaction Date": "Transaction Date",
"Transaction Year-Month": "Transaction Year-Month",
"Transaction Year-Quarter": "Transaction Year-Quarter",
"Transaction Year": "Transaction Year",
"Transaction Fiscal Year": "Transaction Fiscal Year",
"Transaction Day of Week": "Transaction Day of Week",
"Transaction Day of Month": "Transaction Day of Month",
"Transaction Month of Year": "Transaction Month of Year",
"Transaction Quarter of Year": "Transaction Quarter of Year",
"Source Account Category": "Source Account Category",
"Source Account Currency": "Source Account Currency",
"Destination Account Category": "Destination Account Category",
"Destination Account Currency": "Destination Account Currency",
"Value Metric": "Value Metric",
"Transaction Count": "Transaction Count",
"Average Amount": "Average Amount",
"Median Amount": "Median Amount",
"Insights Explorer": "인사이트 탐색기",
"Insights Explorers": "인사이트 탐색기들",
"Query": "쿼리",
"Data Table": "데이터 테이블",
"Chart": "차트",
"No available explorer": "사용 가능한 탐색기가 없습니다.",
"New Explorer": "새 탐색기",
"Untitled Explorer": "제목 없는 탐색기",
"Save Explorer": "탐색기 저장",
"Save As New Explorer": "새 탐색기로 저장",
"Restore to Last Saved": "마지막 저장 상태로 복원",
"Are you sure you want to restore to last saved state? All unsaved changes will be lost.": "마지막 저장 상태로 복원하시겠습니까? 저장되지 않은 모든 변경 사항이 손실됩니다.",
"Set Explorer Name": "탐색기 이름 설정",
"Rename Explorer": "탐색기 이름 바꾸기",
"Hide Explorer": "탐색기 숨기기",
"Unhide Explorer": "탐색기 표시",
"Delete Explorer": "탐색기 삭제",
"Change Explorer Display Order": "탐색기 표시 순서 변경",
"Explorer Name": "탐색기 이름",
"Add Query": "쿼리 추가",
"Remove Query": "쿼리 제거",
"Modify Query Name": "쿼리 이름 수정",
"Add Condition": "조건 추가",
"Remove Condition": "조건 제거",
"No conditions defined. All transactions will match.": "조건이 정의되지 않았습니다. 모든 거래가 일치합니다.",
"Unable to retrieve explorer list": "탐색기 목록을 가져올 수 없습니다",
"Explorer list is up to date": "탐색기 목록이 최신입니다",
"Explorer list has been updated": "탐색기 목록이 업데이트되었습니다",
"Unable to retrieve explorer": "탐색기를 가져올 수 없습니다",
"Unable to add explorer": "탐색기를 추가할 수 없습니다",
"Unable to save explorer": "탐색기를 저장할 수 없습니다",
"Unable to move explorer": "탐색기를 이동할 수 없습니다",
"Unable to hide this explorer": "이 탐색기를 숨길 수 없습니다",
"Unable to unhide this explorer": "이 탐색기를 표시할 수 없습니다",
"Are you sure you want to delete this explorer?": "이 탐색기를 삭제하시겠습니까?",
"Unable to delete this explorer": "이 탐색기를 삭제할 수 없습니다",
"Show Hidden Explorers": "숨겨진 탐색기 표시",
"Hide Hidden Explorers": "숨겨진 탐색기 숨기기",
"Editor": "편집기",
"Expression": "",
"Failed to generate expression": "식 생성 실패",
"Data Source": "데이터 소스",
"All Queries": "모든 쿼리",
"Axis / Category": "축 / 범주",
"Series": "시리즈",
"Transaction Date": "거래 날짜",
"Transaction Year-Month": "거래 연-월",
"Transaction Year-Quarter": "거래 연-분기",
"Transaction Year": "거래 연도",
"Transaction Fiscal Year": "거래 회계 연도",
"Transaction Day of Week": "거래 요일",
"Transaction Day of Month": "거래 일자",
"Transaction Month of Year": "거래 월",
"Transaction Quarter of Year": "거래 분기",
"Source Account Category": "출처 계좌 분류",
"Source Account Currency": "출처 계좌 통화",
"Destination Account Category": "목적지 계좌 분류",
"Destination Account Currency": "목적지 계좌 통화",
"Value Metric": "값 메트릭",
"Transaction Count": "거래 수",
"Average Amount": "평균 금액",
"Median Amount": "중간 금액",
"Account List": "계좌 목록",
"This Week": "이번 주",
"This Month": "이번 달",
@@ -1865,14 +1866,14 @@
"Are you sure you want to delete this sub-account?": "이 하위계좌를 삭제하시겠습니까?",
"Unable to delete this account": "이 계좌를 삭제할 수 없습니다.",
"Unable to delete this sub-account": "이 하위계좌를 삭제할 수 없습니다.",
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"Move All Transactions": "모든 거래 이동",
"Are you sure you want to move all transactions?": "모든 거래를 이동하시겠습니까?",
"Unable to move transactions": "거래를 이동할 수 없습니다.",
"All transactions in this account have been moved.": "이 계좌의 모든 거래가 이동되었습니다.",
"Reconciliation Statement": "조정 명세서",
"Account Balance Trends": "계좌 잔액 추세",
"Update Closing Balance": "마감 잔액 업데이트",
"Please enter the new closing balance for the account": "계좌의 새로운 마감 잔액을 입력하세요",
"Please enter the new closing balance for this account": "계좌의 새로운 마감 잔액을 입력하세요",
"Transaction": "거래",
"Transactions": "거래",
"Transaction Pictures": "거래 사진",
@@ -1890,10 +1891,10 @@
"Transfer In Amount": "이체 입금 금액",
"Transfer In Account Name": "이체 입금 계좌명",
"Transfer In Currency": "이체 입금 통화",
"Paste Amount": "Paste Amount",
"Paste Destination Amount": "Paste Destination Amount",
"Cannot parse amount from clipboard": "Cannot parse amount from clipboard",
"Unable to read clipboard text": "Unable to read clipboard text",
"Paste Amount": "금액 붙여넣기",
"Paste Destination Amount": "목적지 금액 붙여넣기",
"Cannot parse amount from clipboard": "클립보드에서 금액을 분석할 수 없습니다.",
"Unable to read clipboard text": "클립보드 텍스트를 읽을 수 없습니다.",
"Show Amount": "금액 표시",
"Hide Amount": "금액 숨기기",
"Swap Account": "계좌 교체",
@@ -1905,13 +1906,13 @@
"AI Image Recognition": "AI 이미지 인식",
"Unable to load image": "이미지를 로드할 수 없습니다.",
"Unable to recognize image": "이미지를 인식할 수 없습니다.",
"AI image recognition is disabled": "AI image recognition is disabled",
"AI image recognition is disabled": "AI 이미지 인식이 비활성화되었습니다.",
"You can drag and drop, paste or click to select a receipt or transaction image": "영수증 또는 거래 이미지를 선택하려면 드래그 앤 드롭하거나 붙여넣기 또는 클릭하세요.",
"Release to load image": "이미지를 로드하려면 놓으세요.",
"Loading image...": "이미지를 로드하는 중...",
"Click here to select a receipt or transaction image": "영수증 또는 거래 이미지를 선택하려면 여기를 클릭하세요.",
"Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.": "Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.",
"AI can make mistakes. Check important info.": "AI can make mistakes. Check important info.",
"Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.": "업로드된 이미지와 개인 데이터가 대형 언어 모델로 전송됩니다. 잠재적인 개인정보 위험에 유의하세요.",
"AI can make mistakes. Check important info.": "AI는 실수를 할 수 있습니다. 중요한 정보를 확인하세요.",
"Category": "카테고리",
"Secondary Category": "보조 카테고리",
"Expense Category": "지출 카테고리",
@@ -1924,10 +1925,10 @@
"Destination Account": "입금 계좌",
"Transaction Tag": "거래 태그",
"Without Tags": "태그 없음",
"Include Any Selected Tags": "Include Any Selected Tags",
"Include All Selected Tags": "Include All Selected Tags",
"Exclude Any Selected Tags": "Exclude Any Selected Tags",
"Exclude All Selected Tags": "Exclude All Selected Tags",
"Include Any Selected Tags": "선택한 태그 중 하나 포함",
"Include All Selected Tags": "선택한 모든 태그 포함",
"Exclude Any Selected Tags": "선택한 태그 중 하나 제외",
"Exclude All Selected Tags": "선택한 모든 태그 제외",
"Multiple Tags": "다중 태그",
"Transaction Time": "거래 시간",
"Scheduled Transaction Frequency": "예약 거래 빈도",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "지원되지 않는 지도 제공업체",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "페이지를 새로 고치고 다시 시도하십시오. 오류가 지속되면 서버의 지도 설정이 올바르게 구성되었는지 확인하십시오.",
"Import Transactions": "거래 가져오기",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "파일 업로드",
"Upload Transaction Data File": "거래 데이터 파일 업로드",
"Define Column": "열 정의",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "월-일-연 형식",
"Day-month-year format": "일-월-연 형식",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) 파일",
"Camt.052 Bank to Customer Statement File": "Camt.052 은행 고객 명세서 파일",
"Camt.053 Bank to Customer Statement File": "Camt.053 은행 고객 명세서 파일",
"MT940 Consumer Statement Message File": "MT940 소비자 명세서 메시지 파일",
"Delimiter-separated Values (DSV) File": "구분 기호로 구분된 값 (DSV) 파일",
@@ -1998,21 +2001,21 @@
"Custom Script": "사용자 정의 스크립트",
"Execute Custom Script": "사용자 정의 스크립트 실행",
"Execute Custom Script to Parse Data": "데이터 구문 분석을 위한 사용자 정의 스크립트 실행",
"Additional Options": "Additional Options",
"Parse Payee as Tag": "Parse Payee as Tag",
"Parse Payee as Description": "Parse Payee as Description",
"Parse Member as Tag": "Parse Member as Tag",
"Parse Project as Tag": "Parse Project as Tag",
"Parse Merchant as Tag": "Parse Merchant as Tag",
"Additional Options": "추가 옵션",
"Parse Payee as Tag": "수취인을 태그로 구문 분석",
"Parse Payee as Description": "수취인을 설명으로 구문 분석",
"Parse Member as Tag": "구성원을 태그로 구문 분석",
"Parse Project as Tag": "프로젝트를 태그로 구문 분석",
"Parse Merchant as Tag": "상인을 태그로 구문 분석",
"Data File": "데이터 파일",
"Data to import": "가져올 데이터",
"Please select a file to import": "가져올 파일을 선택하십시오",
"Unable to detect the file encoding automatically. Please select the actual encoding.": "Unable to detect the file encoding automatically. Please select the actual encoding.",
"Unable to detect the file encoding automatically. Please select the actual encoding.": "파일 인코딩을 자동으로 감지할 수 없습니다. 실제 인코딩을 선택하십시오.",
"Include Header Line": "헤더 행 포함",
"Time Format": "시간 형식",
"Transaction Type Mapping": "거래 유형 매핑",
"Timezone Format": "시간대 형식",
"IANA Time Zone Name": "IANA Time Zone Name",
"IANA Time Zone Name": "IANA 시간대 이름",
"Amount Format": "금액 형식",
"Geographic Location Separator": "지리적 위치 구분 기호",
"Transaction Tags Separator": "거래 태그 구분 기호",
@@ -2025,7 +2028,7 @@
"Cannot import invalid transactions": "유효하지 않은 거래를 가져올 수 없습니다",
"Unable to parse import file": "가져오기 파일을 구문 분석할 수 없습니다",
"Unable to import transactions": "거래를 가져올 수 없습니다",
"Transaction importing is disabled": "Transaction importing is disabled",
"Transaction importing is disabled": "거래 가져오기가 비활성화되었습니다",
"Load Data Mapping File": "데이터 매핑 파일 로드",
"Save Data Mapping File": "데이터 매핑 파일 저장",
"Data mapping file is invalid": "데이터 매핑 파일이 유효하지 않습니다",
@@ -2036,7 +2039,7 @@
"Please execute the custom script first": "먼저 사용자 정의 스크립트를 실행하십시오",
"Executing Script...": "스크립트 실행 중...",
"No parse function defined": "구문 분석 함수가 정의되지 않았습니다",
"Failed to parse time": "Failed to parse time",
"Failed to parse time": "시간 구문 분석에 실패했습니다",
"Failed to execute custom script": "사용자 정의 스크립트 실행에 실패했습니다",
"Batch Replace Selected Expense Categories": "선택한 비용 카테고리 일괄 교체",
"Batch Replace Selected Income Categories": "선택한 수입 카테고리 일괄 교체",
@@ -2061,9 +2064,9 @@
"Batch Convert Income Transaction to Transfer Transaction": "수입 거래를 이체 거래로 일괄 변환",
"Batch Convert Transfer Transaction to Expense Transaction": "이체 거래를 비용 거래로 일괄 변환",
"Batch Convert Transfer Transaction to Income Transaction": "이체 거래를 수입 거래로 일괄 변환",
"Batch Convert Selected Amounts to Positive Values": "Batch Convert Selected Amounts to Positive Values",
"Batch Convert Selected Amounts to Negative Values": "Batch Convert Selected Amounts to Negative Values",
"Clear All Filters": "Clear All Filters",
"Batch Convert Selected Amounts to Positive Values": "선택한 금액을 양수로 일괄 변환",
"Batch Convert Selected Amounts to Negative Values": "선택한 금액을 음수로 일괄 변환",
"Clear All Filters": "모든 필터 지우기",
"Invalid Category": "유효하지 않은 카테고리",
"Target Category": "대상 카테고리",
"Default Expense Category": "기본 비용 카테고리",
@@ -2071,8 +2074,8 @@
"Default Transfer Category": "기본 이체 카테고리",
"Invalid Account": "유효하지 않은 계좌",
"Target Account": "대상 계좌",
"Confirm Target Account Name": "Confirm Target Account Name",
"Please re-enter the target account name to confirm": "Please re-enter the target account name to confirm",
"Confirm Target Account Name": "대상 계좌 이름 확인",
"Please re-enter the target account name to confirm": "대상 계좌 이름을 다시 입력하여 확인하십시오",
"Invalid Tag": "유효하지 않은 태그",
"Target Tag": "대상 태그",
"Remove Tag": "태그 제거",
@@ -2102,11 +2105,11 @@
"Are you sure you want to remove this transaction picture?": "이 거래 사진을 제거하시겠습니까?",
"Unable to upload transaction picture": "거래 사진을 업로드할 수 없습니다",
"Unable to remove transaction picture": "거래 사진을 제거할 수 없습니다",
"Transaction picture is disabled": "Transaction picture is disabled",
"Transaction picture is disabled": "거래 사진이 비활성화되었습니다",
"Failed to load image, please check whether the config \"domain\" and \"root_url\" are set correctly.": "이미지를 로드하지 못했습니다. \"domain\" 및 \"root_url\" 구성이 올바르게 설정되었는지 확인하십시오.",
"Search transaction description": "거래 설명 검색",
"Unable to retrieve transaction list": "거래 목록을 검색할 수 없습니다",
"Unable to retrieve all transactions": "Unable to retrieve all transactions",
"Unable to retrieve all transactions": "거래를 모두 검색할 수 없습니다",
"Unable to retrieve reconciliation statements": "조정 명세서를 검색할 수 없습니다",
"Custom Date Range": "사용자 지정 날짜 범위",
"Select Month": "월 선택",
@@ -2123,7 +2126,7 @@
"Unable to retrieve transaction statistics": "거래 통계를 검색할 수 없습니다",
"Categorical Analysis": "범주 분석",
"Trend Analysis": "추세 분석",
"Asset Trends": "Asset Trends",
"Asset Trends": "자산 추세",
"Total Amount": "총 금액",
"Total Assets": "총 자산",
"Total Liabilities": "총 부채",
@@ -2225,21 +2228,21 @@
"Transaction List Page": "거래 목록 페이지",
"Transactions Per Page": "페이지당 거래 수",
"Show Monthly Total Amount": "월별 총 금액 표시",
"Show Transaction Tag": "거래 태그 표시",
"Show Transaction Tags": "거래 태그 표시",
"Transaction Edit Page": "거래 편집 페이지",
"Automatically Save Draft": "초안 자동 저장",
"Show Confirmation Every Time": "매번 확인 표시",
"Always Show Confirmation": "매번 확인 표시",
"Automatically Add Geolocation": "지리적 위치 자동 추가",
"Always Show Transaction Pictures": "거래 사진 항상 표시",
"Import Transaction Dialog": "Import Transaction Dialog",
"Remember Last Selected File Type": "Remember Last Selected File Type",
"Insights Explorer Page": "Insights Explorer Page",
"Import Transaction Dialog": "거래 가져오기 대화 상자",
"Remember Last Selected File Type": "마지막으로 선택한 파일 유형 기억",
"Insights Explorer Page": "인사이트 탐색기 페이지",
"Account List Page": "계좌 목록 페이지",
"Accounts Included in Total": "총계에 포함된 계좌",
"Account Category Order": "Account Category Order",
"Account category order saved": "Account category order saved",
"Unable to move account category": "Unable to move account category",
"Hide Categories Without Accounts": "Hide Categories Without Accounts",
"Account Category Order": "계좌 범주 순서",
"Account category order saved": "계좌 범주 순서가 저장되었습니다",
"Unable to move account category": "계좌 범주를 이동할 수 없습니다",
"Hide Categories Without Accounts": "계좌가 없는 범주 숨기기",
"Exchange Rates Data Page": "환율 데이터 페이지",
"Exchange Rate": "환율",
"Enable Swipe Back": "스와이프 뒤로 가기 활성화",
@@ -2292,6 +2295,7 @@
"File Format": "파일 형식",
"CSV (Comma-separated values) File": "CSV (쉼표로 구분된 값) 파일",
"TSV (Tab-separated values) File": "TSV (탭으로 구분된 값) 파일",
"SSV (Semicolon-separated values) File": "SSV (세미콜론으로 구분된 값) 파일",
"Export to CSV (Comma-separated values) File": "CSV (쉼표로 구분된 값) 파일로 내보내기",
"Export to TSV (Tab-separated values) File": "TSV (탭으로 구분된 값) 파일로 내보내기",
"Markdown File": "Markdown 파일",
@@ -2308,19 +2312,19 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "이 작업은 취소할 수 없습니다. 이 작업은 거래 데이터를 지웁니다. 확인하려면 현재 비밀번호를 입력하십시오.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "이 작업은 취소할 수 없습니다. 이 작업은 계정, 카테고리, 태그 및 거래 데이터를 지웁니다. 확인하려면 현재 비밀번호를 입력하십시오.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "이 작업은 취소할 수 없습니다. \"모든 거래 지우기\"는 모든 거래 데이터를 지우고, \"모든 데이터 지우기\"는 계정, 카테고리, 태그 및 거래 데이터를 지웁니다. 확인하려면 현재 비밀번호를 입력하십시오.",
"All transactions in this account has been cleared": "이 계정의 모든 거래가 지워졌습니다.",
"All transactions has been cleared": "모든 거래가 지워졌습니다.",
"All transactions in this account have been cleared": "이 계정의 모든 거래가 지워졌습니다.",
"All transactions have been cleared": "모든 거래가 지워졌습니다.",
"All user data has been cleared": "모든 사용자 데이터가 지워졌습니다.",
"Unable to clear user data": "사용자 데이터를 지울 수 없습니다.",
"Third-Party Logins": "Third-Party Logins",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Third-Party Login": "서드파티 로그인",
"Linked Time": "연결 시간",
"Link": "연결",
"Unlink": "연결 해제",
"Are you sure you want to unlink this login method?": "이 로그인 방법의 연결을 해제하시겠습니까?",
"Unable to retrieve third-party login list": "서드파티 로그인 목록을 가져올 수 없습니다.",
"Third-party login list is up to date": "서드파티 로그인 목록이 최신 상태입니다.",
"Third-party login list has been updated": "서드파티 로그인 목록이 업데이트되었습니다.",
"Unable to unlink third-party login": "서드파티 로그인 연결을 해제할 수 없습니다.",
"Device & Sessions": "장치 및 세션",
"Device Info": "장치 정보",
"Last Activity Time": "마지막 활동 시간",
@@ -2381,29 +2385,29 @@
"Show Hidden Transaction Categories": "숨겨진 거래 카테고리 표시",
"Hide Hidden Transaction Categories": "숨겨진 거래 카테고리 숨기기",
"Transaction Tags": "거래 태그",
"Total tags": "Total tags",
"Default Group": "Default Group",
"Total tags": "총 태그 수",
"Default Group": "기본 그룹",
"Tag Title": "태그 제목",
"No available tag": "사용 가능한 태그가 없습니다.",
"Find tag": "태그 찾기",
"Unable to retrieve tag list": "태그 목록을 가져올 수 없습니다.",
"Tag list is up to date": "태그 목록이 최신 상태입니다.",
"Tag list has been updated": "태그 목록이 업데이트되었습니다.",
"Add Tag Group": "Add Tag Group",
"Rename Tag Group": "Rename Tag Group",
"Delete Tag Group": "Delete Tag Group",
"Change Group Display Order": "Change Group Display Order",
"Tag Group Name": "Tag Group Name",
"New Tag Group Name": "New Tag Group Name",
"No available tag group": "No available tag group",
"Unable to retrieve tag group list": "Unable to retrieve tag group list",
"Tag group list has been updated": "Tag group list has been updated",
"Unable to add tag group": "Unable to add tag group",
"Unable to save tag group": "Unable to save tag group",
"Unable to move tag group": "Unable to move tag group",
"Unable to rename this tag group": "Unable to rename this tag group",
"Are you sure you want to delete this tag group?": "Are you sure you want to delete this tag group?",
"Unable to delete this tag group": "Unable to delete this tag group",
"Add Tag Group": "태그 그룹 추가",
"Rename Tag Group": "태그 그룹 이름 바꾸기",
"Delete Tag Group": "태그 그룹 삭제",
"Change Group Display Order": "그룹 표시 순서 변경",
"Tag Group Name": "태그 그룹 이름",
"New Tag Group Name": "새 태그 그룹 이름",
"No available tag group": "사용 가능한 태그 그룹이 없습니다.",
"Unable to retrieve tag group list": "태그 그룹 목록을 가져올 수 없습니다.",
"Tag group list has been updated": "태그 그룹 목록이 업데이트되었습니다.",
"Unable to add tag group": "태그 그룹을 추가할 수 없습니다.",
"Unable to save tag group": "태그 그룹을 저장할 수 없습니다.",
"Unable to move tag group": "태그 그룹을 이동할 수 없습니다.",
"Unable to rename this tag group": "이 태그 그룹의 이름을 바꿀 수 없습니다.",
"Are you sure you want to delete this tag group?": "이 태그 그룹을 삭제하시겠습니까?",
"Unable to delete this tag group": "이 태그 그룹을 삭제할 수 없습니다.",
"Add new tag": "새 태그 추가",
"Unable to add tag": "태그를 추가할 수 없습니다.",
"Unable to save tag": "태그를 저장할 수 없습니다.",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "예정된 거래",
"Template Name": "템플릿 이름",
"No available template": "사용 가능한 템플릿이 없습니다.",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "템플릿을 추가하면 홈 페이지에서 추가 버튼을 길게 눌러 새 거래를 빠르게 추가할 수 있습니다.",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "템플릿을 추가하면 홈 페이지에서 추가 버튼을 길게 눌러 새 거래를 빠르게 추가할 수 있습니다.",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "사용 가능한 템플릿이 없습니다. 템플릿을 추가하면 거래 목록 페이지의 추가 버튼 드롭다운 메뉴를 사용하여 새 거래를 빠르게 추가할 수 있습니다.",
"No available scheduled transactions": "사용 가능한 예정된 거래가 없습니다.",
"Unable to retrieve template list": "템플릿 목록을 가져올 수 없습니다.",
@@ -2437,15 +2441,15 @@
"Show Hidden Transaction Templates": "숨겨진 거래 템플릿 표시",
"Hide Hidden Transaction Templates": "숨겨진 거래 템플릿 숨기기",
"Template name cannot be blank": "템플릿 이름은 비워둘 수 없습니다.",
"Generate Token": "Generate Token",
"Token Type": "Token Type",
"Expiration Time": "Expiration Time",
"Custom Expiration Time (Seconds)": "Custom Expiration Time (Seconds)",
"No Expiration": "No Expiration",
"API Token": "API Token",
"MCP Token": "MCP Token",
"Your token does not expire, please keep it secure.": "Your token does not expire, please keep it secure.",
"When connecting to third-party apps, be aware that they and any large language models they use can access your private data.": "When connecting to third-party apps, be aware that they and any large language models they use can access your private data.",
"Generate Token": "토큰 생성",
"Token Type": "토큰 유형",
"Expiration Time": "만료 시간",
"Custom Expiration Time (Seconds)": "사용자 지정 만료 시간(초)",
"No Expiration": "만료 없음",
"API Token": "API 토큰",
"MCP Token": "MCP 토큰",
"Your token does not expire, please keep it secure.": "토큰은 만료되지 않으므로 안전하게 보관하십시오.",
"When connecting to third-party apps, be aware that they and any large language models they use can access your private data.": "타사 앱에 연결할 때 해당 앱과 그들이 사용하는 모든 대형 언어 모델이 귀하의 개인 데이터에 접근할 수 있음을 인지하십시오.",
"Unable to generate token": "토큰을 생성할 수 없습니다.",
"Are you sure you want to logout from this session?": "이 세션에서 로그아웃하시겠습니까?",
"Unable to logout from this session": "이 세션에서 로그아웃할 수 없습니다.",
@@ -2529,9 +2533,9 @@
"Official Website": "공식 웹사이트",
"Report Issue": "문제 보고",
"Getting help": "도움 받기",
"Documentation": "Documentation",
"Documentation": "문서",
"License": "라이선스",
"Are you sure you want to open this link?": "Are you sure you want to open this link?",
"Are you sure you want to open this link?": "이 링크를 열겠습니까?",
"An error occurred": "오류가 발생했습니다.",
"Parameter Invalid": "잘못된 매개변수",
"Numeric Overflow": "숫자 오버플로우",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Portugees (Brazilië)",
"Russian": "Russisch",
"Slovenian": "Sloveens",
"Tamil": "Tamil",
"Thai": "Thais",
"Turkish": "Turks",
"Ukrainian": "Oekraïens",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D YYYY",
"dd_mm_yyyy": "D MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D YYYY",
"DayMonthYear": "D MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-M-D",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D-M-YYYY"
"YearMonthDay": "YYYY-M-D",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D-M-YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM, YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM, YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-M",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM, YYYY"
"YearMonthDay": "YYYY-M",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM, YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "M-D",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M-D",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Puntkomma",
"Tab": "Tab",
"Vertical Bar": "Verticale streep",
"Slash": "Schuine streep",
"All Types": "Alle types",
"More": "Meer",
"All": "Alles",
@@ -1595,9 +1596,9 @@
"Select All": "Alles selecteren",
"Select None": "Niets selecteren",
"Invert Selection": "Selectie omkeren",
"Select All in This Page": "Alles op deze pagina selecteren",
"Select None in This Page": "Niets op deze pagina selecteren",
"Invert Selection in This Page": "Selectie op deze pagina omkeren",
"Select All on This Page": "Alles op deze pagina selecteren",
"Select None on This Page": "Niets op deze pagina selecteren",
"Invert Selection on This Page": "Selectie op deze pagina omkeren",
"Select All Valid Items": "Alle geldige items selecteren",
"Select All Invalid Items": "Alle ongeldige items selecteren",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Afstemmingsrapport",
"Account Balance Trends": "Rekening-saldotrends",
"Update Closing Balance": "Eindsaldo bijwerken",
"Please enter the new closing balance for the account": "Voer het nieuwe eindsaldo voor de rekening in",
"Please enter the new closing balance for this account": "Voer het nieuwe eindsaldo voor de rekening in",
"Transaction": "Transactie",
"Transactions": "Transacties",
"Transaction Pictures": "Transactie-afbeeldingen",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Niet-ondersteunde kaartprovider",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Vernieuw de pagina en probeer het opnieuw. Blijft de fout optreden, controleer dan of de kaartinstellingen op de server correct zijn geconfigureerd.",
"Import Transactions": "Transacties importeren",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Bestand uploaden",
"Upload Transaction Data File": "Bestand met transactiegegevens uploaden",
"Define Column": "Kolommen definiëren",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Maand-dag-jaar-formaat",
"Day-month-year format": "Dag-maand-jaar-formaat",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF)-bestand",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank-naar-klant afschriftbestand",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank-naar-klant afschriftbestand",
"MT940 Consumer Statement Message File": "MT940 Rekeningafschriftbestand",
"Delimiter-separated Values (DSV) File": "Delimiter-gescheiden waarden (DSV)-bestand",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Transactielijstpagina",
"Transactions Per Page": "Transacties per pagina",
"Show Monthly Total Amount": "Maandelijks totaalbedrag tonen",
"Show Transaction Tag": "Transactietag tonen",
"Show Transaction Tags": "Transactietag tonen",
"Transaction Edit Page": "Transactiebewerkingspagina",
"Automatically Save Draft": "Concept automatisch opslaan",
"Show Confirmation Every Time": "Elke keer bevestiging tonen",
"Always Show Confirmation": "Elke keer bevestiging tonen",
"Automatically Add Geolocation": "Geolocatie automatisch toevoegen",
"Always Show Transaction Pictures": "Transactie-afbeeldingen altijd tonen",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "Bestandsformaat",
"CSV (Comma-separated values) File": "CSV-bestand (komma-gescheiden waarden)",
"TSV (Tab-separated values) File": "TSV-bestand (tab-gescheiden waarden)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Exporteren naar CSV-bestand (komma-gescheiden waarden)",
"Export to TSV (Tab-separated values) File": "Exporteren naar TSV-bestand (tab-gescheiden waarden)",
"Markdown File": "Markdown-bestand",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Dit kan NIET ongedaan worden gemaakt. Je rekeningen, categorieën, tags en transacties worden gewist. Voer je huidige wachtwoord in ter bevestiging.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Alle gebruikersgegevens zijn gewist",
"Unable to clear user data": "Kan gebruikersgegevens niet wissen",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Apparaten & Sessies",
"Device Info": "Apparaatgegevens",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Geplande transacties",
"Template Name": "Sjabloonnaam",
"No available template": "Geen sjablonen beschikbaar",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Zodra je sjablonen hebt, kun je op de startpagina de knop Toevoegen lang indrukken om snel een nieuwe transactie toe te voegen",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Zodra je sjablonen hebt, kun je op de startpagina de knop Toevoegen lang indrukken om snel een nieuwe transactie toe te voegen",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Geen sjablonen beschikbaar. Nadat je sjablonen hebt toegevoegd, kun je via het uitklapmenu van de knop Toevoegen op de transactielijstpagina snel een nieuwe transactie toevoegen",
"No available scheduled transactions": "Geen geplande transacties beschikbaar",
"Unable to retrieve template list": "Kan sjablonenlijst niet ophalen",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Português (Brasil)",
"Russian": "Russo",
"Slovenian": "Esloveno",
"Tamil": "Tâmil",
"Thai": "Tailandês",
"Turkish": "Turco",
"Ukrainian": "Ucraniano",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Space",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D de MMMM de YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D de MMMM de YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY/MM/DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD/MM/YYYY"
"YearMonthDay": "YYYY/MM/DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD/MM/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM de YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM de YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY/MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM, YYYY"
"YearMonthDay": "YYYY/MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM, YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D de MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D de MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM/DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD/MM"
"YearMonthDay": "MM/DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD/MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Ponto e vírgula",
"Tab": "Tabulação",
"Vertical Bar": "Barra Vertical",
"Slash": "Barra",
"All Types": "Todos os Tipos",
"More": "Mais",
"All": "Todos",
@@ -1595,9 +1596,9 @@
"Select All": "Selecionar Todos",
"Select None": "Selecionar Nenhum",
"Invert Selection": "Inverter Seleção",
"Select All in This Page": "Selecionar Todos nesta Página",
"Select None in This Page": "Selecionar Nenhum nesta Página",
"Invert Selection in This Page": "Inverter Seleção nesta Página",
"Select All on This Page": "Selecionar Todos nesta Página",
"Select None on This Page": "Selecionar Nenhum nesta Página",
"Invert Selection on This Page": "Inverter Seleção nesta Página",
"Select All Valid Items": "Selecionar Todos os Itens Válidos",
"Select All Invalid Items": "Selecionar Todos os Itens Inválidos",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Transação",
"Transactions": "Transações",
"Transaction Pictures": "Imagens das Transações",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Provedor de Mapa Não Suportado",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Por favor, atualize a página e tente novamente. Se o erro persistir, verifique se as configurações de mapa do servidor estão corretamente configuradas.",
"Import Transactions": "Importar Transações",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Enviar Arquivo",
"Upload Transaction Data File": "Enviar Arquivo de Dados de Transação",
"Define Column": "Definir Coluna",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Formato mês-dia-ano",
"Day-month-year format": "Formato dia-mês-ano",
"Intuit Interchange Format (IIF) File": "Arquivo Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "Arquivo, de Extrato Bancário Camt.052",
"Camt.053 Bank to Customer Statement File": "Arquivo, de Extrato Bancário Camt.053",
"MT940 Consumer Statement Message File": "Arquivo de Mensagem de Extrato Consumidor MT940",
"Delimiter-separated Values (DSV) File": "Arquivo de Valores Separados por Delimitador (DSV)",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Página de Lista de Transações",
"Transactions Per Page": "Transações Por Página",
"Show Monthly Total Amount": "Mostrar Valor Total Mensal",
"Show Transaction Tag": "Mostrar Tag da Transação",
"Show Transaction Tags": "Mostrar Tag da Transação",
"Transaction Edit Page": "Página de Edição de Transação",
"Automatically Save Draft": "Salvar Rascunho Automaticamente",
"Show Confirmation Every Time": "Mostrar Confirmação Toda Vez",
"Always Show Confirmation": "Mostrar Confirmação Toda Vez",
"Automatically Add Geolocation": "Adicionar Geolocalização Automaticamente",
"Always Show Transaction Pictures": "Sempre Mostrar Imagens de Transações",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "Formato de Arquivo",
"CSV (Comma-separated values) File": "Arquivo CSV (Valores separados por vírgulas)",
"TSV (Tab-separated values) File": "Arquivo TSV (Valores separados por tabulações)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Arquivo Markdown",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Você NÃO PODE desfazer esta ação. Isto apagará seus dados de contas, categorias, tags e transações. Por favor, insira sua senha atual para confirmar.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Todos os dados de usuário foram apagados",
"Unable to clear user data": "Não foi possível limpar os dados de usuário",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Dispositivo e Sessões",
"Device Info": "Informações do Dispositivo",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Transações Agendadas",
"Template Name": "Nome do Modelo",
"No available template": "No available template",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Depois de adicionar modelos, você pode pressionar longamente o botão Adicionar na página inicial para adicionar rapidamente uma nova transação",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Depois de adicionar modelos, você pode pressionar longamente o botão Adicionar na página inicial para adicionar rapidamente uma nova transação",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Nenhum modelo disponível. Depois de adicionar modelos, você pode adicionar rapidamente uma nova transação usando o menu suspenso do botão Adicionar na página da lista de transações",
"No available scheduled transactions": "Nenhuma transação agendada disponível",
"Unable to retrieve template list": "Não foi possível recuperar a lista de modelos",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Португальский (Бразилия)",
"Russian": "Русский",
"Slovenian": "Словенский",
"Tamil": "Тамильский",
"Thai": "Тайский",
"Turkish": "Турецкий",
"Ukrainian": "Украинский",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Space",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D MMMM YYYY г."
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D MMMM YYYY г."
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD.MM.YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD.MM.YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY г.",
"mm_dd_yyyy": "YYYY г.",
"dd_mm_yyyy": "YYYY г."
"YearMonthDay": "YYYY г.",
"MonthDayYear": "YYYY г.",
"DayMonthYear": "YYYY г."
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM, YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM, YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM, YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM, YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD.MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD.MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "H:mm:ss",
"a_hh_mm_ss": "A h:mm:ss",
"hh_mm_ss_a": "h:mm:ss A"
"HourMinuteSecond": "H:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A h:mm:ss",
"HourMinuteSecondMeridiemIndicator": "h:mm:ss A"
},
"shortTime": {
"hh_mm": "H:mm",
"a_hh_mm": "A h:mm",
"hh_mm_a": "h:mm A"
"HourMinute": "H:mm",
"MeridiemIndicatorHourMinute": "A h:mm",
"HourMinuteMeridiemIndicator": "h:mm A"
},
"yearQuarter": {
"content": "{quarter} {year} г."
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Semicolon",
"Tab": "Tab",
"Vertical Bar": "Vertical Bar",
"Slash": "Slash",
"All Types": "Все типы",
"More": "Еще",
"All": "Все",
@@ -1595,9 +1596,9 @@
"Select All": "Выбрать все",
"Select None": "Отменить выбор",
"Invert Selection": "Инвертировать выбор",
"Select All in This Page": "Выбрать все на этой странице",
"Select None in This Page": "Отменить выбор на этой странице",
"Invert Selection in This Page": "Инвертировать выбор на этой странице",
"Select All on This Page": "Выбрать все на этой странице",
"Select None on This Page": "Отменить выбор на этой странице",
"Invert Selection on This Page": "Инвертировать выбор на этой странице",
"Select All Valid Items": "Выбрать все действительные элементы",
"Select All Invalid Items": "Выбрать все недействительные элементы",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Транзакция",
"Transactions": "Транзакции",
"Transaction Pictures": "Изображения транзакций",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Неподдерживаемый поставщик карт",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Пожалуйста, обновите страницу и попробуйте снова. Если ошибка сохраняется, убедитесь, что настройки карты на сервере настроены правильно.",
"Import Transactions": "Импорт транзакций",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Загрузить файл",
"Upload Transaction Data File": "Загрузить файл данных транзакций",
"Define Column": "Define Column",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Формат месяц-день-год",
"Day-month-year format": "Формат день-месяц-год",
"Intuit Interchange Format (IIF) File": "Файл Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Страница списка транзакций",
"Transactions Per Page": "Транзакций на странице",
"Show Monthly Total Amount": "Показать общую сумму за месяц",
"Show Transaction Tag": "Показать тег транзакции",
"Show Transaction Tags": "Показать тег транзакции",
"Transaction Edit Page": "Страница редактирования транзакции",
"Automatically Save Draft": "Автоматически сохранять черновик",
"Show Confirmation Every Time": "Показывать подтверждение каждый раз",
"Always Show Confirmation": "Показывать подтверждение каждый раз",
"Automatically Add Geolocation": "Автоматически добавлять геолокацию",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "Файл CSV (значения, разделенные запятыми)",
"TSV (Tab-separated values) File": "Файл TSV (значения, разделенные табуляцией)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Вы НЕ сможете отменить это действие. Это очистит данные ваших счетов, категорий, тегов и транзакций. Пожалуйста, введите текущий пароль для подтверждения.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Все данные пользователя были очищены",
"Unable to clear user data": "Не удалось очистить данные пользователя",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Устройства и сессии",
"Device Info": "Информация об устройстве",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Запланированные транзакции",
"Template Name": "Название шаблона",
"No available template": "Нет доступных шаблонов",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "После добавления шаблонов вы можете долго нажимать кнопку «Добавить» на главной странице, чтобы быстро добавить новую транзакцию",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "После добавления шаблонов вы можете долго нажимать кнопку «Добавить» на главной странице, чтобы быстро добавить новую транзакцию",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Нет доступных шаблонов. После добавления шаблонов вы можете быстро добавить новую транзакцию, используя выпадающее меню кнопки «Добавить» на странице списка транзакций",
"No available scheduled transactions": "Нет доступных запланированных транзакций",
"Unable to retrieve template list": "Не удалось получить список шаблонов",
+59 -55
View File
@@ -11,12 +11,13 @@
"French": "Francoščina",
"Italian": "Italijanščina",
"Japanese": "Japonščina",
"Dutch": "Nizozemščina",
"Kannada": "Kanada",
"Korean": "Korejščina",
"Dutch": "Nizozemščina",
"Portuguese (Brazil)": "Portugalščina (Brazilija)",
"Russian": "Ruščina",
"Slovenian": "Slovenščina",
"Tamil": "Tamilščina",
"Thai": "Tajščina",
"Turkish": "Turščina",
"Ukrainian": "Ukrajinščina",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D. MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D. MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD.MM.YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD.MM.YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D. MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D. MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD.MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD.MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorijanski",
@@ -1506,7 +1508,6 @@
"Semicolon": "Podpičje",
"Tab": "Tabulator",
"Vertical Bar": "Navpična črta",
"Slash": "Poševnica",
"All Types": "Vse vrste",
"More": "Več",
"All": "Vse",
@@ -1595,9 +1596,9 @@
"Select All": "Izberi vse",
"Select None": "Počisti izbor",
"Invert Selection": "Obrni izbor",
"Select All in This Page": "Izberi vse na tej strani",
"Select None in This Page": "Počisti izbor na tej strani",
"Invert Selection in This Page": "Obrni izbor na tej strani",
"Select All on This Page": "Izberi vse na tej strani",
"Select None on This Page": "Počisti izbor na tej strani",
"Invert Selection on This Page": "Obrni izbor na tej strani",
"Select All Valid Items": "Izberi vse veljavne elemente",
"Select All Invalid Items": "Izberi vse neveljavne elemente",
"Set All to Included": "Nastavi vse na vključeno",
@@ -1738,7 +1739,7 @@
"Delete Explorer": "Izbriši raziskovanje",
"Change Explorer Display Order": "Change Explorer Display Order",
"Explorer Name": "Ime raziskovanja",
"Add Query": "Dodaj poizvedbo",
"Add Query": "Dodaj poizvedbo",
"Remove Query": "Odstrani poizvedbo",
"Modify Query Name": "Spremeni ime poizvedbe",
"Add Condition": "Dodaj pogoj",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Premakni vse transakcije",
"Are you sure you want to move all transactions?": "Ali ste prepričani, da želite premakniti vse transakcije?",
"Unable to move transactions": "Transakcij ni mogoče premakniti",
"All transactions in this account has been moved.": "Vse transakcije na tem računu so bile premaknjene.",
"All transactions in this account have been moved.": "Vse transakcije na tem računu so bile premaknjene.",
"Reconciliation Statement": "Izpis stanja in prometa",
"Account Balance Trends": "Trendi stanja na računu",
"Update Closing Balance": "Posodobi končno stanje",
"Please enter the new closing balance for the account": "Vnesite novo končno stanje za ta račun",
"Please enter the new closing balance for this account": "Vnesite novo končno stanje za ta račun",
"Transaction": "Transakcija",
"Transactions": "Transakcije",
"Transaction Pictures": "Slike transakcij",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Nepodprt ponudnik zemljevidov",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Osvežite stran in poskusite znova. Če se napaka ponavlja, preverite, ali so nastavitve zemljevida na strežniku pravilno konfigurirane.",
"Import Transactions": "Uvozi transakcije",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Naloži datoteko",
"Upload Transaction Data File": "Naloži datoteko s podatki o transakcijah",
"Define Column": "Določi stolpec",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Format mesec-dan-leto",
"Day-month-year format": "Format dan-mesec-leto",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) datoteka",
"Camt.052 Bank to Customer Statement File": "Camt.052 bančni izpisek",
"Camt.053 Bank to Customer Statement File": "Camt.053 bančni izpisek",
"MT940 Consumer Statement Message File": "MT940 bančni izpisek",
"Delimiter-separated Values (DSV) File": "Datoteka z vrednostmi ločenimi z ločilom (DSV)",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Stran s seznamom transakcij",
"Transactions Per Page": "Transakcij na stran",
"Show Monthly Total Amount": "Prikaži mesečni skupni znesek",
"Show Transaction Tag": "Prikaži oznako transakcije",
"Show Transaction Tags": "Prikaži oznako transakcije",
"Transaction Edit Page": "Stran za urejanje transakcij",
"Automatically Save Draft": "Samodejno shrani osnutek",
"Show Confirmation Every Time": "Vsakič prikaži potrditev",
"Always Show Confirmation": "Vsakič prikaži potrditev",
"Automatically Add Geolocation": "Samodejno dodaj geolokacijo",
"Always Show Transaction Pictures": "Vedno prikaži slike transakcij",
"Import Transaction Dialog": "Pogovorno okno za uvoz transakcij",
@@ -2292,6 +2295,7 @@
"File Format": "Format datoteke",
"CSV (Comma-separated values) File": "CSV datoteka",
"TSV (Tab-separated values) File": "TSV datoteka",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Izvozi v CSV datoteko",
"Export to TSV (Tab-separated values) File": "Izvozi v TSV datoteko",
"Markdown File": "Markdown datoteka",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "Tega dejanja NI mogoče preklicati. To bo izbrisalo vaše podatke o transakcijah. Za potrditev vnesite svoje trenutno geslo.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Tega dejanja NI mogoče preklicati. To bo izbrisalo vaše račune, kategorije, oznake in transakcije. Za potrditev vnesite svoje trenutno geslo.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Tega dejanja NI mogoče preklicati. 'Počisti vse transakcije' bo izbrisalo vaše transakcije, 'Počisti vse podatke' pa bo izbrisalo račune, kategorije, oznake in transakcije. Za potrditev vnesite trenutno geslo.",
"All transactions in this account has been cleared": "Vse transakcije na tem računu so bile očiščene",
"All transactions has been cleared": "Vse transakcije so bile očiščene",
"All transactions in this account have been cleared": "Vse transakcije na tem računu so bile očiščene",
"All transactions have been cleared": "Vse transakcije so bile očiščene",
"All user data has been cleared": "Vsi uporabniški podatki so bili očiščeni",
"Unable to clear user data": "Uporabniških podatkov ni mogoče počistiti",
"Third-Party Logins": "Prijave prek tretjih oseb",
"Third-Party Login": "Prijave prek tretjih oseb",
"Linked Time": "Čas povezave",
"Link": "Poveži",
"Unlink": "Prekini povezavo",
"Are you sure you want to unlink this login method?": "Ali ste prepričani, da želite prekiniti povezavo s tem načinom prijave?",
"Unable to retrieve third-party logins list": "Seznama prijav prek tretjih oseb ni mogoče pridobiti",
"Third-party logins list is up to date": "Seznam prijav prek tretjih oseb je posodobljen",
"Third-party logins list has been updated": "Seznam prijav prek tretjih oseb je bil posodobljen",
"Unable to retrieve third-party login list": "Seznama prijav prek tretjih oseb ni mogoče pridobiti",
"Third-party login list is up to date": "Seznam prijav prek tretjih oseb je posodobljen",
"Third-party login list has been updated": "Seznam prijav prek tretjih oseb je bil posodobljen",
"Unable to unlink third-party login": "Povezave s prijavo tretje osebe ni mogoče prekiniti",
"Device & Sessions": "Naprave in seje",
"Device Info": "Podatki o napravi",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Načrtovane transakcije",
"Template Name": "Ime predloge",
"No available template": "Ni razpoložljivih predlog",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Ko dodate predloge, lahko na začetni strani z dolgim pritiskom na gumb 'Dodaj' hitro dodate novo transakcijo",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Ko dodate predloge, lahko na začetni strani z dolgim pritiskom na gumb 'Dodaj' hitro dodate novo transakcijo",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Ni razpoložljivih predlog. Ko jih dodate, lahko hitro dodate transakcijo prek spustnega menija gumba 'Dodaj' na strani s seznamom transakcij",
"No available scheduled transactions": "Ni razpoložljivih načrtovanih transakcij",
"Unable to retrieve template list": "Seznama predlog ni mogoče pridobiti",
+2543
View File
File diff suppressed because it is too large Load Diff
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "ภาษาโปรตุเกส (บราซิล)",
"Russian": "ภาษารัสเซีย",
"Slovenian": "ภาษาสโลวีเนีย",
"Tamil": "ภาษาทมิฬ",
"Thai": "ภาษาไทย",
"Turkish": "ภาษาตุรกี",
"Ukrainian": "ภาษายูเครน",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Buddhist",
"dateDisplayType": "Buddhist",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-M-D",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY-M-D",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-M",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-M",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "M-D",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M-D",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "H:mm:ss",
"a_hh_mm_ss": "A h:mm:ss",
"hh_mm_ss_a": "h:mm:ss A"
"HourMinuteSecond": "H:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A h:mm:ss",
"HourMinuteSecondMeridiemIndicator": "h:mm:ss A"
},
"shortTime": {
"hh_mm": "H:mm",
"a_hh_mm": "A h:mm",
"hh_mm_a": "h:mm A"
"HourMinute": "H:mm",
"MeridiemIndicatorHourMinute": "A h:mm",
"HourMinuteMeridiemIndicator": "h:mm A"
},
"yearQuarter": {
"content": "{quarter} {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "เกรกอเรียน",
@@ -1506,7 +1508,6 @@
"Semicolon": "เครื่องหมายอัฒภาค",
"Tab": "แท็บ",
"Vertical Bar": "เส้นตั้ง",
"Slash": "เครื่องหมายทับ",
"All Types": "ทุกประเภท",
"More": "เพิ่มเติม",
"All": "ทั้งหมด",
@@ -1595,9 +1596,9 @@
"Select All": "เลือกทั้งหมด",
"Select None": "ยกเลิกการเลือกทั้งหมด",
"Invert Selection": "สลับการเลือก",
"Select All in This Page": "เลือกทั้งหมดในหน้านี้",
"Select None in This Page": "ยกเลิกการเลือกทั้งหมดในหน้านี้",
"Invert Selection in This Page": "สลับการเลือกในหน้านี้",
"Select All on This Page": "เลือกทั้งหมดในหน้านี้",
"Select None on This Page": "ยกเลิกการเลือกทั้งหมดในหน้านี้",
"Invert Selection on This Page": "สลับการเลือกในหน้านี้",
"Select All Valid Items": "เลือกทุกไอเทมที่ถูกต้อง",
"Select All Invalid Items": "เลือกทุกไอเทมที่ไม่ถูกต้อง",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "งบกระทบยอด",
"Account Balance Trends": "แนวโน้มยอดบัญชี",
"Update Closing Balance": "อัปเดตยอดปิดบัญชี",
"Please enter the new closing balance for the account": "กรุณาใส่ยอดปิดบัญชีใหม่",
"Please enter the new closing balance for this account": "กรุณาใส่ยอดปิดบัญชีใหม่",
"Transaction": "รายการ",
"Transactions": "รายการ",
"Transaction Pictures": "รูปภาพรายการ",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "ผู้ให้บริการแผนที่ไม่รองรับ",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "กรุณารีเฟรชหน้าและลองอีกครั้ง หากเกิดข้อผิดพลาดซ้ำ ตรวจสอบการตั้งค่าแผนที่บนเซิร์ฟเวอร์ให้ถูกต้อง",
"Import Transactions": "นำเข้าธุรกรรม",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "อัปโหลดไฟล์",
"Upload Transaction Data File": "อัปโหลดไฟล์ข้อมูลธุรกรรม",
"Define Column": "กำหนดคอลัมน์",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "รูปแบบ เดือน-วัน-ปี",
"Day-month-year format": "รูปแบบ วัน-เดือน-ปี",
"Intuit Interchange Format (IIF) File": "ไฟล์ Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "ไฟล์ Camt.052 รายงานธนาคารถึงลูกค้า",
"Camt.053 Bank to Customer Statement File": "ไฟล์ Camt.053 รายงานธนาคารถึงลูกค้า",
"MT940 Consumer Statement Message File": "ไฟล์ MT940 ข้อความรายการลูกค้า",
"Delimiter-separated Values (DSV) File": "ไฟล์ DSV (ค่าแยกด้วยตัวคั่น)",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "หน้ารายการ",
"Transactions Per Page": "จำนวนรายการต่อหน้า",
"Show Monthly Total Amount": "แสดงจำนวนเงินรวมรายเดือน",
"Show Transaction Tag": "แสดงแท็กรายการ",
"Show Transaction Tags": "แสดงแท็กรายการ",
"Transaction Edit Page": "หน้าการแก้ไขรายการ",
"Automatically Save Draft": "บันทึกร่างอัตโนมัติ",
"Show Confirmation Every Time": "แสดงการยืนยันทุกครั้ง",
"Always Show Confirmation": "แสดงการยืนยันทุกครั้ง",
"Automatically Add Geolocation": "เพิ่มตำแหน่งทางภูมิศาสตร์อัตโนมัติ",
"Always Show Transaction Pictures": "แสดงรูปภาพรายการเสมอ",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "รูปแบบไฟล์",
"CSV (Comma-separated values) File": "ไฟล์ CSV (คั่นด้วยเครื่องหมายจุลภาค)",
"TSV (Tab-separated values) File": "ไฟล์ TSV (คั่นด้วยแท็บ)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "ส่งออกเป็นไฟล์ CSV (คั่นด้วยเครื่องหมายจุลภาค)",
"Export to TSV (Tab-separated values) File": "ส่งออกเป็นไฟล์ TSV (คั่นด้วยแท็บ)",
"Markdown File": "ไฟล์ Markdown",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "คุณไม่สามารถย้อนกลับการกระทำนี้ได้ การดำเนินการนี้จะลบข้อมูลรายการของคุณ กรุณาใส่รหัสผ่านปัจจุบันเพื่อยืนยัน",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "คุณไม่สามารถย้อนกลับการกระทำนี้ได้ การดำเนินการนี้จะลบบัญชี หมวดหมู่ แท็ก และรายการของคุณ กรุณาใส่รหัสผ่านปัจจุบันเพื่อยืนยัน",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "คุณไม่สามารถย้อนกลับการกระทำนี้ได้ \"ลบรายการทั้งหมด\" จะลบข้อมูลรายการทั้งหมดของคุณ และ \"ลบข้อมูลทั้งหมด\" จะลบบัญชี หมวดหมู่ แท็ก และรายการของคุณ กรุณาใส่รหัสผ่านปัจจุบันเพื่อยืนยัน",
"All transactions in this account has been cleared": "รายการทั้งหมดในบัญชีนี้ถูกลบเรียบร้อยแล้ว",
"All transactions has been cleared": "รายการทั้งหมดถูกลบเรียบร้อยแล้ว",
"All transactions in this account have been cleared": "รายการทั้งหมดในบัญชีนี้ถูกลบเรียบร้อยแล้ว",
"All transactions have been cleared": "รายการทั้งหมดถูกลบเรียบร้อยแล้ว",
"All user data has been cleared": "ข้อมูลผู้ใช้ทั้งหมดถูกลบเรียบร้อยแล้ว",
"Unable to clear user data": "ไม่สามารถลบข้อมูลผู้ใช้ได้",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "อุปกรณ์ & เซสชัน",
"Device Info": "ข้อมูลอุปกรณ์",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "รายการตามกำหนด",
"Template Name": "ชื่อแม่แบบ",
"No available template": "ไม่มีแม่แบบที่ใช้ได้",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "เมื่อคุณเพิ่มแม่แบบแล้ว คุณสามารถกดปุ่มเพิ่มค้างไว้บนหน้าหลักเพื่อเพิ่มรายการใหม่อย่างรวดเร็ว",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "เมื่อคุณเพิ่มแม่แบบแล้ว คุณสามารถกดปุ่มเพิ่มค้างไว้บนหน้าหลักเพื่อเพิ่มรายการใหม่อย่างรวดเร็ว",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "ไม่มีแม่แบบที่ใช้ได้ เมื่อคุณเพิ่มแม่แบบแล้ว คุณสามารถเพิ่มรายการใหม่อย่างรวดเร็วโดยใช้เมนูดรอปดาวน์ของปุ่มเพิ่มบนหน้ารายการรายการ",
"No available scheduled transactions": "ไม่มีรายการตามกำหนดที่ใช้ได้",
"Unable to retrieve template list": "ไม่สามารถดึงรายการแม่แบบได้",
+63 -59
View File
@@ -11,12 +11,13 @@
"French": "Fransızca",
"Italian": "İtalyanca",
"Japanese": "Japonca",
"Dutch": "Flemenkçe",
"Kannada": "Kannada Dili",
"Korean": "Korece",
"Dutch": "Flemenkçe",
"Portuguese (Brazil)": "Portekizce (Brezilya)",
"Russian": "Rusça",
"Slovenian": "Slovence",
"Tamil": "Tamilce",
"Thai": "Tayca",
"Turkish": "Türkçe",
"Ukrainian": "Ukraynaca",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D YYYY",
"dd_mm_yyyy": "D MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D YYYY",
"DayMonthYear": "D MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD.MM.YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD.MM.YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "D MMMM",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "D MMMM",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD.MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD.MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{year} {quarter}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_mutabakat_ekstreleri",
"defaultImportDataMappingFileName": "ezBookkeeping_ice_aktarim_eslemesi",
"defaultImportHandlingScript": "ezBookkeeping_isleme_betigi",
"defaultImportReplaceRuleFileName": "ezBookkeeping_ice_aktarim_degistirme_kurali"
"defaultImportReplaceRuleFileName": "ezBookkeeping_ice_aktarim_degistirme_kurali",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Miladi",
@@ -1270,11 +1272,11 @@
"invalid oauth2 token": "Geçersiz OAuth 2.0 jetonu",
"cannot retrieve user info from oauth2 provider": "OAuth 2.0 sağlayıcısından kullanıcı bilgisi alınamıyor",
"oauth2 user already bound to another user": "OAuth 2.0 kullanıcısı zaten başka bir kullanıcıya bağlı",
"user name and email from oauth2 provider are both empty": "User name and email from OAuth 2.0 provider are both empty",
"user name from oauth2 provider is empty": "User name from OAuth 2.0 provider is empty",
"email from oauth2 provider is empty": "Email from OAuth 2.0 provider is empty",
"user name from oauth2 provider is empty, cannot register new user": "User name from OAuth 2.0 provider is empty, cannot register new user",
"email from oauth2 provider is empty, cannot register new user": "Email from OAuth 2.0 provider is empty, cannot register new user",
"user name and email from oauth2 provider are both empty": "User name and email from OAuth 2.0 provider are both empty",
"user name from oauth2 provider is empty": "User name from OAuth 2.0 provider is empty",
"email from oauth2 provider is empty": "Email from OAuth 2.0 provider is empty",
"user name from oauth2 provider is empty, cannot register new user": "User name from OAuth 2.0 provider is empty, cannot register new user",
"email from oauth2 provider is empty, cannot register new user": "Email from OAuth 2.0 provider is empty, cannot register new user",
"explorer id is invalid": "Explorer ID is invalid",
"explorer not found": "Explorer is not found",
"explorer data is invalid": "Explorer data is invalid",
@@ -1506,7 +1508,6 @@
"Semicolon": "Noktalı Virgül",
"Tab": "Sekme (Tab)",
"Vertical Bar": "Dikey Çizgi",
"Slash": "Eğik Çizgi",
"All Types": "Tüm Türler",
"More": "Daha Fazla",
"All": "Tümü",
@@ -1595,9 +1596,9 @@
"Select All": "Tümünü Seç",
"Select None": "Hiçbirini Seçme",
"Invert Selection": "Seçimi Tersine Çevir",
"Select All in This Page": "Bu Sayfadakilerin Tümünü Seç",
"Select None in This Page": "Bu Sayfadakilerin Hiçbirini Seçme",
"Invert Selection in This Page": "Bu Sayfadaki Seçimi Tersine Çevir",
"Select All on This Page": "Bu Sayfadakilerin Tümünü Seç",
"Select None on This Page": "Bu Sayfadakilerin Hiçbirini Seçme",
"Invert Selection on This Page": "Bu Sayfadaki Seçimi Tersine Çevir",
"Select All Valid Items": "Tüm Geçerli Öğeleri Seç",
"Select All Invalid Items": "Tüm Geçersiz Öğeleri Seç",
"Set All to Included": "Tümünü Dahil Et",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Tüm İşlemleri Taşı",
"Are you sure you want to move all transactions?": "Tüm işlemleri taşımak istediğinize emin misiniz?",
"Unable to move transactions": "İşlemler taşınamadı",
"All transactions in this account has been moved.": "Bu hesaptaki tüm işlemler taşındı.",
"All transactions in this account have been moved.": "Bu hesaptaki tüm işlemler taşındı.",
"Reconciliation Statement": "Mutabakat Ekstresi",
"Account Balance Trends": "Hesap Bakiye Trendleri",
"Update Closing Balance": "Kapanış Bakiyesini Güncelle",
"Please enter the new closing balance for the account": "Lütfen hesap için yeni kapanış bakiyesini girin",
"Please enter the new closing balance for this account": "Lütfen hesap için yeni kapanış bakiyesini girin",
"Transaction": "İşlem",
"Transactions": "İşlemler",
"Transaction Pictures": "İşlem Resimleri",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Desteklenmeyen Harita Sağlayıcısı",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Lütfen sayfayı yenileyin ve tekrar deneyin. Hata devam ederse, sunucunun harita ayarlarının doğru yapılandırıldığından emin olun.",
"Import Transactions": "İşlemleri İçe Aktar",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Dosya Yükle",
"Upload Transaction Data File": "İşlem Veri Dosyası Yükle",
"Define Column": "Sütun Tanımla",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Ay-gün-yıl formatı",
"Day-month-year format": "Gün-ay-yıl formatı",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) Dosyası",
"Camt.052 Bank to Customer Statement File": "Camt.052 Banka Müşteri Ekstresi Dosyası",
"Camt.053 Bank to Customer Statement File": "Camt.053 Banka Müşteri Ekstresi Dosyası",
"MT940 Consumer Statement Message File": "MT940 Müşteri Ekstre Mesajı Dosyası",
"Delimiter-separated Values (DSV) File": "Ayırıcı ile Ayrılmış Değerler (DSV) Dosyası",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "İşlem Listesi Sayfası",
"Transactions Per Page": "Sayfa Başına İşlem",
"Show Monthly Total Amount": "Aylık Toplam Tutarı Göster",
"Show Transaction Tag": "İşlem Etiketini Göster",
"Show Transaction Tags": "İşlem Etiketini Göster",
"Transaction Edit Page": "İşlem Düzenleme Sayfası",
"Automatically Save Draft": "Taslağı Otomatik Kaydet",
"Show Confirmation Every Time": "Her Seferinde Onay Göster",
"Always Show Confirmation": "Her Seferinde Onay Göster",
"Automatically Add Geolocation": "Otomatik Olarak Konum Ekle",
"Always Show Transaction Pictures": "İşlem Resimlerini Her Zaman Göster",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "Dosya Formatı",
"CSV (Comma-separated values) File": "CSV (Virgülle ayrılmış değerler) Dosyası",
"TSV (Tab-separated values) File": "TSV (Sekmeyle ayrılmış değerler) Dosyası",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "CSV (Virgülle ayrılmış değerler) Dosyasına Dışa Aktar",
"Export to TSV (Tab-separated values) File": "TSV (Sekmeyle ayrılmış değerler) Dosyasına Dışa Aktar",
"Markdown File": "Markdown Dosyası",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "Bu işlemi GERİ ALAMAZSINIZ. Bu, işlem verilerinizi silecektir. Onaylamak için lütfen mevcut şifrenizi girin.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Bu işlemi GERİ ALAMAZSINIZ. Bu, hesaplarınızı, kategorilerinizi, etiketlerinizi ve işlem verilerinizi silecektir. Onaylamak için lütfen mevcut şifrenizi girin.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Bu işlemi GERİ ALAMAZSINIZ. \"Tüm İşlemleri Temizle\" tüm işlem verilerinizi silecek, \"Tüm Verileri Temizle\" ise hesaplarınızı, kategorilerinizi, etiketlerinizi ve işlem verilerinizi silecektir. Onaylamak için lütfen mevcut şifrenizi girin.",
"All transactions in this account has been cleared": "Bu hesaptaki tüm işlemler temizlendi",
"All transactions has been cleared": "Tüm işlemler temizlendi",
"All transactions in this account have been cleared": "Bu hesaptaki tüm işlemler temizlendi",
"All transactions have been cleared": "Tüm işlemler temizlendi",
"All user data has been cleared": "Tüm kullanıcı verileri temizlendi",
"Unable to clear user data": "Kullanıcı verileri temizlenemedi",
"Third-Party Logins": "Üçüncü Taraf Girişleri",
"Third-Party Login": "Üçüncü Taraf Girişleri",
"Linked Time": "Bağlantı Zamanı",
"Link": "Bağla",
"Unlink": "Bağlantıyı Kes",
"Are you sure you want to unlink this login method?": "Bu giriş yönteminin bağlantısını kesmek istediğinize emin misiniz?",
"Unable to retrieve third-party logins list": "Üçüncü taraf giriş listesi alınamadı",
"Third-party logins list is up to date": "Üçüncü taraf giriş listesi güncel",
"Third-party logins list has been updated": "Üçüncü taraf giriş listesi güncellendi",
"Unable to retrieve third-party login list": "Üçüncü taraf giriş listesi alınamadı",
"Third-party login list is up to date": "Üçüncü taraf giriş listesi güncel",
"Third-party login list has been updated": "Üçüncü taraf giriş listesi güncellendi",
"Unable to unlink third-party login": "Üçüncü taraf giriş bağlantısı kesilemedi",
"Device & Sessions": "Cihaz & Oturumlar",
"Device Info": "Cihaz Bilgisi",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Planlanmış İşlemler",
"Template Name": "Şablon Adı",
"No available template": "Mevcut şablon yok",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Şablon ekledikten sonra, hızlıca yeni bir işlem eklemek için ana sayfadaki Ekle butonuna uzun basabilirsiniz",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Şablon ekledikten sonra, hızlıca yeni bir işlem eklemek için ana sayfadaki Ekle butonuna uzun basabilirsiniz",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Mevcut şablon yok. Şablon ekledikten sonra, işlem listesi sayfasındaki Ekle butonunun açılır menüsünü kullanarak hızlıca yeni bir işlem ekleyebilirsiniz",
"No available scheduled transactions": "Mevcut planlanmış işlem yok",
"Unable to retrieve template list": "Şablon listesi alınamadı",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Португальська (Бразилія)",
"Russian": "Російська",
"Slovenian": "Словенська",
"Tamil": "Тамільська",
"Thai": "Тайська",
"Turkish": "Турецька",
"Ukrainian": "Українська",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Space",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM D, YYYY",
"dd_mm_yyyy": "D MMMM YYYY р."
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM D, YYYY",
"DayMonthYear": "D MMMM YYYY р."
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD.MM.YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD.MM.YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY р.",
"mm_dd_yyyy": "YYYY р.",
"dd_mm_yyyy": "YYYY р."
"YearMonthDay": "YYYY р.",
"MonthDayYear": "YYYY р.",
"DayMonthYear": "YYYY р."
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM, YYYY",
"dd_mm_yyyy": "MMMM, YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM, YYYY",
"DayMonthYear": "MMMM, YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM, YYYY",
"dd_mm_yyyy": "MMM, YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM, YYYY",
"DayMonthYear": "MMM, YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM D",
"dd_mm_yyyy": "D MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM D",
"DayMonthYear": "D MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD.MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD.MM"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} {year} р."
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Крапка з комою",
"Tab": "Табуляція",
"Vertical Bar": "Вертикальна риска",
"Slash": "Коса риска",
"All Types": "Усі типи",
"More": "Більше",
"All": "Усе",
@@ -1595,9 +1596,9 @@
"Select All": "Вибрати все",
"Select None": "Скасувати вибір",
"Invert Selection": "Інвертувати вибір",
"Select All in This Page": "Вибрати все на цій сторінці",
"Select None in This Page": "Скасувати вибір на цій сторінці",
"Invert Selection in This Page": "Інвертувати вибір на цій сторінці",
"Select All on This Page": "Вибрати все на цій сторінці",
"Select None on This Page": "Скасувати вибір на цій сторінці",
"Invert Selection on This Page": "Інвертувати вибір на цій сторінці",
"Select All Valid Items": "Вибрати всі дійсні елементи",
"Select All Invalid Items": "Вибрати всі недійсні елементи",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Транзакція",
"Transactions": "Транзакції",
"Transaction Pictures": "Зображення транзакцій",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Непідтримуваний провайдер карт",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Оновіть сторінку та спробуйте ще раз. Якщо помилка не зникає, перевірте налаштування мап на сервері.",
"Import Transactions": "Імпортувати транзакції",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Завантажити файл",
"Upload Transaction Data File": "Завантажити файл з даними транзакцій",
"Define Column": "Визначити стовпець",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Формат місяць-день-рік",
"Day-month-year format": "Формат день-місяць-рік",
"Intuit Interchange Format (IIF) File": "Файл Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "Файл із розділювачами значень (DSV)",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Сторінка списку транзакцій",
"Transactions Per Page": "Транзакцій на сторінку",
"Show Monthly Total Amount": "Показати місячну загальну суму",
"Show Transaction Tag": "Показати тег транзакції",
"Show Transaction Tags": "Показати тег транзакції",
"Transaction Edit Page": "Сторінка редагування транзакції",
"Automatically Save Draft": "Автоматично зберігати чернетку",
"Show Confirmation Every Time": "Показувати підтвердження щоразу",
"Always Show Confirmation": "Показувати підтвердження щоразу",
"Automatically Add Geolocation": "Автоматично додавати геолокацію",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "Файл CSV (значення, розділені комами)",
"TSV (Tab-separated values) File": "Файл TSV (значення, розділені табуляцією)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Цю дію не можна скасувати. Будуть видалені рахунки, категорії, теги та транзакції. Введіть поточний пароль для підтвердження.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Усі дані користувача очищено",
"Unable to clear user data": "Не вдалося очистити дані",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Пристрої та сесії",
"Device Info": "Інформація про пристрій",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Заплановані транзакції",
"Template Name": "Назва шаблону",
"No available template": "Немає доступних шаблонів",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Після додавання шаблонів ви можете довго натискати кнопку «Додати» на головній сторінці, щоб швидко додати транзакцію",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Після додавання шаблонів ви можете довго натискати кнопку «Додати» на головній сторінці, щоб швидко додати транзакцію",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Немає доступних шаблонів. Після додавання шаблонів ви зможете швидко додавати транзакції через меню кнопки «Додати» на сторінці транзакцій",
"No available scheduled transactions": "Немає доступних запланованих транзакцій",
"Unable to retrieve template list": "Не вдалося отримати список шаблонів",
+57 -53
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "Tiếng Bồ Đào Nha (Brazil)",
"Russian": "Tiếng Nga",
"Slovenian": "Tiếng Slovenia",
"Tamil": "Tiếng Tamil",
"Thai": "Tiếng Thái",
"Turkish": "Tiếng Thổ Nhĩ Kỳ",
"Ukrainian": "Tiếng Ukraina",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "Gregorian",
"dateDisplayType": "Gregorian",
"longDateFormat": "DDMMYYYY",
"shortDateFormat": "DDMMYYYY",
"longTimeFormat": "HHMMSSA",
"shortTimeFormat": "HHMMA",
"longDateFormat": "DayMonthYear",
"shortDateFormat": "DayMonthYear",
"longTimeFormat": "HourMinuteSecondMeridiemIndicator",
"shortTimeFormat": "HourMinuteMeridiemIndicator",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Comma",
"digitGroupingSymbol": "Dot",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY MMMM DD",
"mm_dd_yyyy": "MMMM DD YYYY",
"dd_mm_yyyy": "DD MMMM YYYY"
"YearMonthDay": "YYYY MMMM DD",
"MonthDayYear": "MMMM DD YYYY",
"DayMonthYear": "DD MMMM YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-MM-DD",
"mm_dd_yyyy": "MM/DD/YYYY",
"dd_mm_yyyy": "DD/MM/YYYY"
"YearMonthDay": "YYYY-MM-DD",
"MonthDayYear": "MM/DD/YYYY",
"DayMonthYear": "DD/MM/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY MMMM",
"mm_dd_yyyy": "MMMM YYYY",
"dd_mm_yyyy": "MMMM YYYY"
"YearMonthDay": "YYYY MMMM",
"MonthDayYear": "MMMM YYYY",
"DayMonthYear": "MMMM YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-MM",
"mm_dd_yyyy": "MMM YYYY",
"dd_mm_yyyy": "MMM YYYY"
"YearMonthDay": "YYYY-MM",
"MonthDayYear": "MMM YYYY",
"DayMonthYear": "MMM YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "MMMM DD",
"mm_dd_yyyy": "MMMM DD",
"dd_mm_yyyy": "DD MMMM"
"YearMonthDay": "MMMM DD",
"MonthDayYear": "MMMM DD",
"DayMonthYear": "DD MMMM"
},
"shortMonthDay": {
"yyyy_mm_dd": "MM-DD",
"mm_dd_yyyy": "MM/DD",
"dd_mm_yyyy": "DD/MM"
"YearMonthDay": "MM-DD",
"MonthDayYear": "MM/DD",
"DayMonthYear": "DD/MM"
},
"shortDay": {
"yyyy_mm_dd": "DD",
"mm_dd_yyyy": "DD",
"dd_mm_yyyy": "DD"
"YearMonthDay": "DD",
"MonthDayYear": "DD",
"DayMonthYear": "DD"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{quarter} năm {year}"
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_reconciliation_statements",
"defaultImportDataMappingFileName": "ezBookkeeping_import_data_mapping",
"defaultImportHandlingScript": "ezBookkeeping_handling_script",
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule"
"defaultImportReplaceRuleFileName": "ezBookkeeping_import_replace_rule",
"defaultImportCheckResultFileName": "ezBookkeeping_import_check_result"
},
"calendar": {
"Gregorian": "Gregorian",
@@ -1506,7 +1508,6 @@
"Semicolon": "Semicolon",
"Tab": "Tab",
"Vertical Bar": "Vertical Bar",
"Slash": "Slash",
"All Types": "Tất cả các loại",
"More": "Thêm",
"All": "Tất cả",
@@ -1595,9 +1596,9 @@
"Select All": "Chọn tất cả",
"Select None": "Bỏ chọn tất cả",
"Invert Selection": "Đảo ngược lựa chọn",
"Select All in This Page": "Chọn tất cả trong trang này",
"Select None in This Page": "Bỏ chọn tất cả trong trang này",
"Invert Selection in This Page": "Đảo ngược lựa chọn trong trang này",
"Select All on This Page": "Chọn tất cả trong trang này",
"Select None on This Page": "Bỏ chọn tất cả trong trang này",
"Invert Selection on This Page": "Đảo ngược lựa chọn trong trang này",
"Select All Valid Items": "Chọn tất cả các mục hợp lệ",
"Select All Invalid Items": "Chọn tất cả các mục không hợp lệ",
"Set All to Included": "Set All to Included",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "Move All Transactions",
"Are you sure you want to move all transactions?": "Are you sure you want to move all transactions?",
"Unable to move transactions": "Unable to move transactions",
"All transactions in this account has been moved.": "All transactions in this account has been moved.",
"All transactions in this account have been moved.": "All transactions in this account have been moved.",
"Reconciliation Statement": "Reconciliation Statement",
"Account Balance Trends": "Account Balance Trends",
"Update Closing Balance": "Update Closing Balance",
"Please enter the new closing balance for the account": "Please enter the new closing balance for the account",
"Please enter the new closing balance for this account": "Please enter the new closing balance for this account",
"Transaction": "Giao dịch",
"Transactions": "Giao dịch",
"Transaction Pictures": "Ảnh giao dịch",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "Nhà cung cấp bản đồ không được hỗ trợ",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "Vui lòng làm mới trang và thử lại. Nếu lỗi vẫn tiếp diễn, hãy đảm bảo rằng cài đặt bản đồ của máy chủ được định cấu hình chính xác.",
"Import Transactions": "Nhập giao dịch",
"Refresh Accounts, Categories and Tags": "Refresh Accounts, Categories and Tags",
"Upload File": "Tải lên tệp",
"Upload Transaction Data File": "Tải lên tệp dữ liệu giao dịch",
"Define Column": "Define Column",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "Định dạng tháng-ngày-năm",
"Day-month-year format": "Định dạng ngày-tháng-năm",
"Intuit Interchange Format (IIF) File": "Tệp Intuit Interchange Format (IIF)",
"Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File",
"Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File",
"MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File",
"Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "Trang danh sách giao dịch",
"Transactions Per Page": "Giao dịch mỗi trang",
"Show Monthly Total Amount": "Hiển thị tổng số tiền hàng tháng",
"Show Transaction Tag": "Hiển thị thẻ giao dịch",
"Show Transaction Tags": "Hiển thị thẻ giao dịch",
"Transaction Edit Page": "Trang chỉnh sửa giao dịch",
"Automatically Save Draft": "Tự động lưu bản nháp",
"Show Confirmation Every Time": "Hiển thị xác nhận mỗi lần",
"Always Show Confirmation": "Hiển thị xác nhận mỗi lần",
"Automatically Add Geolocation": "Tự động thêm vị trí địa lý",
"Always Show Transaction Pictures": "Always Show Transaction Pictures",
"Import Transaction Dialog": "Import Transaction Dialog",
@@ -2292,6 +2295,7 @@
"File Format": "File Format",
"CSV (Comma-separated values) File": "Tệp CSV (Giá trị phân cách bằng dấu phẩy)",
"TSV (Tab-separated values) File": "Tệp TSV (Giá trị phân cách bằng tab)",
"SSV (Semicolon-separated values) File": "SSV (Semicolon-separated values) File",
"Export to CSV (Comma-separated values) File": "Export to CSV (Comma-separated values) File",
"Export to TSV (Tab-separated values) File": "Export to TSV (Tab-separated values) File",
"Markdown File": "Markdown File",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "Bạn KHÔNG THỂ hoàn tác hành động này. Thao tác này sẽ xóa dữ liệu tài khoản, danh mục, thẻ và giao dịch của bạn. Vui lòng nhập mật khẩu hiện tại của bạn để xác nhận.",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.",
"All transactions in this account has been cleared": "All transactions in this account has been cleared",
"All transactions has been cleared": "All transactions has been cleared",
"All transactions in this account have been cleared": "All transactions in this account have been cleared",
"All transactions have been cleared": "All transactions have been cleared",
"All user data has been cleared": "Tất cả dữ liệu người dùng đã bị xóa",
"Unable to clear user data": "Không thể xóa dữ liệu người dùng",
"Third-Party Logins": "Third-Party Logins",
"Third-Party Login": "Third-Party Login",
"Linked Time": "Linked Time",
"Link": "Link",
"Unlink": "Unlink",
"Are you sure you want to unlink this login method?": "Are you sure you want to unlink this login method?",
"Unable to retrieve third-party logins list": "Unable to retrieve third-party logins list",
"Third-party logins list is up to date": "Third-party logins list is up to date",
"Third-party logins list has been updated": "Third-party logins list has been updated",
"Unable to retrieve third-party login list": "Unable to retrieve third-party login list",
"Third-party login list is up to date": "Third-party login list is up to date",
"Third-party login list has been updated": "Third-party login list has been updated",
"Unable to unlink third-party login": "Unable to unlink third-party login",
"Device & Sessions": "Thiết bị & Phiên",
"Device Info": "Thông tin thiết bị",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "Giao dịch theo lịch trình",
"Template Name": "Tên mẫu",
"No available template": "Không có mẫu nào khả dụng",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "Sau khi bạn thêm mẫu, bạn có thể nhấn giữ nút Thêm trên trang chủ để nhanh chóng thêm giao dịch mới",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "Sau khi bạn thêm mẫu, bạn có thể nhấn giữ nút Thêm trên trang chủ để nhanh chóng thêm giao dịch mới",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "Không có mẫu nào khả dụng. Sau khi bạn thêm mẫu, bạn có thể nhanh chóng thêm giao dịch mới bằng cách sử dụng menu thả xuống của nút Thêm trên trang danh sách giao dịch",
"No available scheduled transactions": "Không có giao dịch theo lịch trình nào khả dụng",
"Unable to retrieve template list": "Không thể truy xuất danh sách mẫu",
+59 -55
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "葡萄牙语 (巴西)",
"Russian": "俄语",
"Slovenian": "斯洛文尼亚语",
"Tamil": "泰米尔语",
"Thai": "泰语",
"Turkish": "土耳其语",
"Ukrainian": "乌克兰语",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "GregorianWithChinese",
"dateDisplayType": "Gregorian",
"longDateFormat": "YYYYMMDD",
"shortDateFormat": "YYYYMMDD",
"longTimeFormat": "HHMMSS",
"shortTimeFormat": "HHMM",
"longDateFormat": "YearMonthDay",
"shortDateFormat": "YearMonthDay",
"longTimeFormat": "HourMinuteSecond",
"shortTimeFormat": "HourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY年M月D日",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY年M月D日",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-M-D",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY-M-D",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY年",
"mm_dd_yyyy": "YYYY年",
"dd_mm_yyyy": "YYYY年"
"YearMonthDay": "YYYY年",
"MonthDayYear": "YYYY年",
"DayMonthYear": "YYYY年"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY年M月",
"mm_dd_yyyy": "M/YYYY",
"dd_mm_yyyy": "M/YYYY"
"YearMonthDay": "YYYY年M月",
"MonthDayYear": "M/YYYY",
"DayMonthYear": "M/YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-M",
"mm_dd_yyyy": "M/YYYY",
"dd_mm_yyyy": "M/YYYY"
"YearMonthDay": "YYYY-M",
"MonthDayYear": "M/YYYY",
"DayMonthYear": "M/YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "M月D日",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M月D日",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortMonthDay": {
"yyyy_mm_dd": "M-D",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M-D",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{year}{quarter}"
@@ -116,7 +117,7 @@
"hoursBehindDefaultTimezone": "比默认时区晚{hours}小时",
"hoursAheadOfDefaultTimezone": "比默认时区早{hours}小时",
"hoursMinutesBehindDefaultTimezone": "比默认时区晚{hours}小时{minutes}分",
"hoursMinutesAheadOfDefaultTimezone": "比默认时区早{time}小时{minutes}分",
"hoursMinutesAheadOfDefaultTimezone": "比默认时区早{hours}小时{minutes}分",
"monthDay": "{ordinal}日",
"eachMonthDayInMonthDays": "{ordinal}日",
"monthDays": "{multiMonthDays}",
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_对账单",
"defaultImportDataMappingFileName": "ezBookkeeping_导入数据映射文件",
"defaultImportHandlingScript": "ezBookkeeping_导入处理脚本",
"defaultImportReplaceRuleFileName": "ezBookkeeping_导入替换规则文件"
"defaultImportReplaceRuleFileName": "ezBookkeeping_导入替换规则文件",
"defaultImportCheckResultFileName": "ezBookkeeping_导入检查结果"
},
"calendar": {
"Gregorian": "公历",
@@ -1506,7 +1508,6 @@
"Semicolon": "分号",
"Tab": "制表符 Tab",
"Vertical Bar": "竖线",
"Slash": "Slash",
"All Types": "全部类型",
"More": "更多",
"All": "全部",
@@ -1595,9 +1596,9 @@
"Select All": "全部选择",
"Select None": "全部不选",
"Invert Selection": "反向选择",
"Select All in This Page": "本页全选",
"Select None in This Page": "本页不选",
"Invert Selection in This Page": "本页反选",
"Select All on This Page": "本页全选",
"Select None on This Page": "本页不选",
"Invert Selection on This Page": "本页反选",
"Select All Valid Items": "选择全部有效项目",
"Select All Invalid Items": "选择全部无效项目",
"Set All to Included": "全部设置为包含",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "移动所有交易",
"Are you sure you want to move all transactions?": "您确定要移动所有交易?",
"Unable to move transactions": "无法移动交易",
"All transactions in this account has been moved.": "该账户中的所有交易已被移动。",
"All transactions in this account have been moved.": "该账户中的所有交易已被移动。",
"Reconciliation Statement": "对账单",
"Account Balance Trends": "账户余额趋势",
"Update Closing Balance": "更新期末余额",
"Please enter the new closing balance for the account": "请输入账户的新期末余额",
"Please enter the new closing balance for this account": "请输入账户的新期末余额",
"Transaction": "交易",
"Transactions": "交易",
"Transaction Pictures": "交易图片",
@@ -1951,6 +1952,7 @@
"Unsupported Map Provider": "不支持的地图提供方",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "请刷新页面并重试。如果仍然显示错误,请确保正确设置了服务器地图设置。",
"Import Transactions": "导入交易",
"Refresh Accounts, Categories and Tags": "刷新账户、分类和标签",
"Upload File": "上传文件",
"Upload Transaction Data File": "上传交易数据文件",
"Define Column": "定义列",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "月-日-年 格式",
"Day-month-year format": "日-月-年 格式",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) 文件",
"Camt.052 Bank to Customer Statement File": "Camt.052 银行对账单文件",
"Camt.053 Bank to Customer Statement File": "Camt.053 银行对账单文件",
"MT940 Consumer Statement Message File": "MT940 客户对账消息文件",
"Delimiter-separated Values (DSV) File": "分隔符分隔值 (DSV) 文件",
@@ -2183,7 +2186,7 @@
"Aggregate by Year": "按年聚合",
"Aggregate by Fiscal Year": "按财年聚合",
"Filter Accounts": "过滤账户",
"Filter Transaction Categories": "过滤交易类",
"Filter Transaction Categories": "过滤交易类",
"Filter Transaction Tags": "过滤交易标签",
"Filter transaction description": "过滤交易描述",
"User Settings": "用户设置",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "交易列表页面",
"Transactions Per Page": "每页交易数",
"Show Monthly Total Amount": "显示月度总金额",
"Show Transaction Tag": "显示交易标签",
"Show Transaction Tags": "显示交易标签",
"Transaction Edit Page": "交易编辑页面",
"Automatically Save Draft": "自动保存草稿",
"Show Confirmation Every Time": "每次提示确认",
"Always Show Confirmation": "每次提示确认",
"Automatically Add Geolocation": "自动添加地理位置",
"Always Show Transaction Pictures": "总是显示交易图片",
"Import Transaction Dialog": "导入交易对话框",
@@ -2292,6 +2295,7 @@
"File Format": "文件格式",
"CSV (Comma-separated values) File": "CSV (逗号分隔的值) 文件",
"TSV (Tab-separated values) File": "TSV (制表符分隔的值) 文件",
"SSV (Semicolon-separated values) File": "SSV (分号分隔的值) 文件",
"Export to CSV (Comma-separated values) File": "导出到 CSV (逗号分隔的值) 文件",
"Export to TSV (Tab-separated values) File": "导出到 TSV (制表符分隔的值) 文件",
"Markdown File": "Markdown 文件",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "您不能撤销该操作。该操作将会清除您的交易数据。请输入您当前的密码以确认。",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "您不能撤销该操作。该操作将会清除您的账户、分类、标签以及交易数据。请输入您当前的密码以确认。",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "您不能撤销该操作。\"清除所有交易\" 将会清除您的所有交易数据,以及 \"清除所有数据\" 将会清除您的账户、分类、标签以及交易数据。请输入您当前的密码以确认。",
"All transactions in this account has been cleared": "该账户中的所有交易已经清空",
"All transactions has been cleared": "所有交易已经清空",
"All transactions in this account have been cleared": "该账户中的所有交易已经清空",
"All transactions have been cleared": "所有交易已经清空",
"All user data has been cleared": "用户所有数据已经清空",
"Unable to clear user data": "无法清除用户数据",
"Third-Party Logins": "第三方登录",
"Third-Party Login": "第三方登录",
"Linked Time": "关联时间",
"Link": "关联",
"Unlink": "取消关联",
"Are you sure you want to unlink this login method?": "您确定要取消关联该登录方式?",
"Unable to retrieve third-party logins list": "无法获取第三方登录列表",
"Third-party logins list is up to date": "第三方登录列表已是最新",
"Third-party logins list has been updated": "关联账户列表已更新",
"Unable to retrieve third-party login list": "无法获取第三方登录列表",
"Third-party login list is up to date": "第三方登录列表已是最新",
"Third-party login list has been updated": "关联账户列表已更新",
"Unable to unlink third-party login": "无法取消关联第三方登录",
"Device & Sessions": "设备和会话",
"Device Info": "设备信息",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "定时交易",
"Template Name": "模板名称",
"No available template": "没有可用的模板",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "当添加模板后,您可以在主界面长按添加按钮快速添加新的交易",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "当添加模板后,您可以在主界面长按添加按钮快速添加新的交易",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "没有可用的模板。当添加模板后,您可以通过交易列表添加按钮的下拉菜单快速添加新的交易",
"No available scheduled transactions": "没有可用的定时交易",
"Unable to retrieve template list": "无法获取模板列表",
+60 -56
View File
@@ -17,6 +17,7 @@
"Portuguese (Brazil)": "葡萄牙語 (巴西)",
"Russian": "俄語",
"Slovenian": "斯洛維尼亞語",
"Tamil": "泰米爾語",
"Thai": "泰語",
"Turkish": "土耳其語",
"Ukrainian": "烏克蘭語",
@@ -30,10 +31,10 @@
"fiscalYearFormat": "EndYYYY",
"calendarDisplayType": "GregorianWithChinese",
"dateDisplayType": "Gregorian",
"longDateFormat": "YYYYMMDD",
"shortDateFormat": "YYYYMMDD",
"longTimeFormat": "AHHMMSS",
"shortTimeFormat": "AHHMM",
"longDateFormat": "YearMonthDay",
"shortDateFormat": "YearMonthDay",
"longTimeFormat": "MeridiemIndicatorHourMinuteSecond",
"shortTimeFormat": "MeridiemIndicatorHourMinute",
"numeralSystem": "WesternArabicNumerals",
"decimalSeparator": "Dot",
"digitGroupingSymbol": "Comma",
@@ -42,59 +43,59 @@
},
"format": {
"longDate": {
"yyyy_mm_dd": "YYYY年M月D日",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY年M月D日",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"shortDate": {
"yyyy_mm_dd": "YYYY-M-D",
"mm_dd_yyyy": "M/D/YYYY",
"dd_mm_yyyy": "D/M/YYYY"
"YearMonthDay": "YYYY-M-D",
"MonthDayYear": "M/D/YYYY",
"DayMonthYear": "D/M/YYYY"
},
"longYear": {
"yyyy_mm_dd": "YYYY年",
"mm_dd_yyyy": "YYYY年",
"dd_mm_yyyy": "YYYY年"
"YearMonthDay": "YYYY年",
"MonthDayYear": "YYYY年",
"DayMonthYear": "YYYY年"
},
"shortYear": {
"yyyy_mm_dd": "YYYY",
"mm_dd_yyyy": "YYYY",
"dd_mm_yyyy": "YYYY"
"YearMonthDay": "YYYY",
"MonthDayYear": "YYYY",
"DayMonthYear": "YYYY"
},
"longYearMonth": {
"yyyy_mm_dd": "YYYY年M月",
"mm_dd_yyyy": "M/YYYY",
"dd_mm_yyyy": "M/YYYY"
"YearMonthDay": "YYYY年M月",
"MonthDayYear": "M/YYYY",
"DayMonthYear": "M/YYYY"
},
"shortYearMonth": {
"yyyy_mm_dd": "YYYY-M",
"mm_dd_yyyy": "M/YYYY",
"dd_mm_yyyy": "M/YYYY"
"YearMonthDay": "YYYY-M",
"MonthDayYear": "M/YYYY",
"DayMonthYear": "M/YYYY"
},
"longMonthDay": {
"yyyy_mm_dd": "M月D日",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M月D日",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortMonthDay": {
"yyyy_mm_dd": "M-D",
"mm_dd_yyyy": "M/D",
"dd_mm_yyyy": "D/M"
"YearMonthDay": "M-D",
"MonthDayYear": "M/D",
"DayMonthYear": "D/M"
},
"shortDay": {
"yyyy_mm_dd": "D",
"mm_dd_yyyy": "D",
"dd_mm_yyyy": "D"
"YearMonthDay": "D",
"MonthDayYear": "D",
"DayMonthYear": "D"
},
"longTime": {
"hh_mm_ss": "HH:mm:ss",
"a_hh_mm_ss": "A hh:mm:ss",
"hh_mm_ss_a": "hh:mm:ss A"
"HourMinuteSecond": "HH:mm:ss",
"MeridiemIndicatorHourMinuteSecond": "A hh:mm:ss",
"HourMinuteSecondMeridiemIndicator": "hh:mm:ss A"
},
"shortTime": {
"hh_mm": "HH:mm",
"a_hh_mm": "A hh:mm",
"hh_mm_a": "hh:mm A"
"HourMinute": "HH:mm",
"MeridiemIndicatorHourMinute": "A hh:mm",
"HourMinuteMeridiemIndicator": "hh:mm A"
},
"yearQuarter": {
"content": "{year}{quarter}"
@@ -116,7 +117,7 @@
"hoursBehindDefaultTimezone": "比預設時區晚{hours}小時",
"hoursAheadOfDefaultTimezone": "比預設時區早{hours}小時",
"hoursMinutesBehindDefaultTimezone": "比預設時區晚{hours}小時{minutes}分",
"hoursMinutesAheadOfDefaultTimezone": "比預設時區早{time}小時{minutes}分",
"hoursMinutesAheadOfDefaultTimezone": "比預設時區早{hours}小時{minutes}分",
"monthDay": "{ordinal}日",
"eachMonthDayInMonthDays": "{ordinal}日",
"monthDays": "{multiMonthDays}",
@@ -148,7 +149,8 @@
"exportReconciliationStatementsFileName": "ezBookkeeping_{nickname}_對帳單",
"defaultImportDataMappingFileName": "ezBookkeeping_匯入資料對應檔案",
"defaultImportHandlingScript": "ezBookkeeping_匯入處理腳本",
"defaultImportReplaceRuleFileName": "ezBookkeeping_匯入替換規則檔案"
"defaultImportReplaceRuleFileName": "ezBookkeeping_匯入替換規則檔案",
"defaultImportCheckResultFileName": "ezBookkeeping_匯入檢查結果"
},
"calendar": {
"Gregorian": "公曆",
@@ -1506,7 +1508,6 @@
"Semicolon": "分號",
"Tab": "定位字元 Tab",
"Vertical Bar": "垂直線",
"Slash": "斜線",
"All Types": "全部類型",
"More": "更多",
"All": "全部",
@@ -1595,9 +1596,9 @@
"Select All": "全選",
"Select None": "取消全選",
"Invert Selection": "反向選擇",
"Select All in This Page": "本頁全選",
"Select None in This Page": "取消本頁全選",
"Invert Selection in This Page": "本頁反向選擇",
"Select All on This Page": "本頁全選",
"Select None on This Page": "取消本頁全選",
"Invert Selection on This Page": "本頁反向選擇",
"Select All Valid Items": "選擇全部有效項目",
"Select All Invalid Items": "選擇全部無效項目",
"Set All to Included": "全部設為包含",
@@ -1868,11 +1869,11 @@
"Move All Transactions": "移動所有交易",
"Are you sure you want to move all transactions?": "您確定要移動所有交易?",
"Unable to move transactions": "無法移動交易",
"All transactions in this account has been moved.": "此帳戶中的所有交易已被移動。",
"All transactions in this account have been moved.": "此帳戶中的所有交易已被移動。",
"Reconciliation Statement": "對帳單",
"Account Balance Trends": "帳戶餘額趨勢",
"Update Closing Balance": "更新期末餘額",
"Please enter the new closing balance for the account": "請輸入帳戶的新期末餘額",
"Please enter the new closing balance for this account": "請輸入帳戶的新期末餘額",
"Transaction": "交易",
"Transactions": "交易",
"Transaction Pictures": "交易圖片",
@@ -1949,8 +1950,9 @@
"Unable to retrieve current position": "無法取得目前位置",
"Cannot Initialize Map": "無法初始化地圖",
"Unsupported Map Provider": "不支援的地圖提供者",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "請重新整理頁面並重試。如果仍然顯示錯誤,請確保正確設定了伺服器地圖設定。",
"Please refresh the page and try again. If the error persists, ensure that the server's map settings are correctly configured.": "請重新載入頁面並重試。如果仍然顯示錯誤,請確保正確設定了伺服器地圖設定。",
"Import Transactions": "匯入交易",
"Refresh Accounts, Categories and Tags": "重新載入帳戶、分類和標籤",
"Upload File": "上傳檔案",
"Upload Transaction Data File": "上傳交易資料檔案",
"Define Column": "定義欄位",
@@ -1979,6 +1981,7 @@
"Month-day-year format": "月-日-年 格式",
"Day-month-year format": "日-月-年 格式",
"Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) 檔案",
"Camt.052 Bank to Customer Statement File": "Camt.052 銀行對帳單檔案",
"Camt.053 Bank to Customer Statement File": "Camt.053 銀行對帳單檔案",
"MT940 Consumer Statement Message File": "MT940 客戶對帳訊息檔案",
"Delimiter-separated Values (DSV) File": "分隔符分隔值 (DSV) 檔案",
@@ -2183,7 +2186,7 @@
"Aggregate by Year": "依年份彙整",
"Aggregate by Fiscal Year": "依財年彙整",
"Filter Accounts": "篩選帳戶",
"Filter Transaction Categories": "篩選交易類",
"Filter Transaction Categories": "篩選交易類",
"Filter Transaction Tags": "篩選交易標籤",
"Filter transaction description": "篩選交易描述",
"User Settings": "使用者設定",
@@ -2225,10 +2228,10 @@
"Transaction List Page": "交易清單頁面",
"Transactions Per Page": "每頁交易數",
"Show Monthly Total Amount": "顯示月度總金額",
"Show Transaction Tag": "顯示交易標籤",
"Show Transaction Tags": "顯示交易標籤",
"Transaction Edit Page": "交易編輯頁面",
"Automatically Save Draft": "自動儲存草稿",
"Show Confirmation Every Time": "每次提示確認",
"Always Show Confirmation": "每次提示確認",
"Automatically Add Geolocation": "自動新增地理位置",
"Always Show Transaction Pictures": "總是顯示交易圖片",
"Import Transaction Dialog": "匯入交易對話框",
@@ -2292,6 +2295,7 @@
"File Format": "檔案格式",
"CSV (Comma-separated values) File": "CSV (逗號分隔的值) 檔案",
"TSV (Tab-separated values) File": "TSV (定位點分隔的值) 檔案",
"SSV (Semicolon-separated values) File": "SSV (分號分隔的值) 檔案",
"Export to CSV (Comma-separated values) File": "匯出為 CSV (逗號分隔的值) 檔案",
"Export to TSV (Tab-separated values) File": "匯出為 TSV (定位點分隔的值) 檔案",
"Markdown File": "Markdown 檔案",
@@ -2308,18 +2312,18 @@
"You CANNOT undo this action. This will clear your transactions data. Please enter your current password to confirm.": "您不能還原此操作。此操作將會清除您的交易資料。請輸入您目前的密碼以確認。",
"You CANNOT undo this action. This will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "您不能還原此操作。此操作將會清除您的帳戶、分類、標籤以及交易資料。請輸入您目前的密碼以確認。",
"You CANNOT undo this action. \"Clear All Transactions\" will clear all your transactions data, and \"Clear All Data\" will clear your accounts, categories, tags and transactions data. Please enter your current password to confirm.": "您不能還原此操作。\"清除所有交易\" 將會清除您的所有交易資料,以及 \"清除所有資料\" 將會清除您的帳戶、分類、標籤以及交易資料。請輸入您目前的密碼以確認。",
"All transactions in this account has been cleared": "此帳戶中的所有交易已經清空",
"All transactions has been cleared": "所有交易已經清空",
"All transactions in this account have been cleared": "此帳戶中的所有交易已經清空",
"All transactions have been cleared": "所有交易已經清空",
"All user data has been cleared": "使用者所有資料已經清空",
"Unable to clear user data": "無法清除使用者資料",
"Third-Party Logins": "第三方登入",
"Third-Party Login": "第三方登入",
"Linked Time": "連結時間",
"Link": "連結",
"Unlink": "取消連結",
"Are you sure you want to unlink this login method?": "您確定要取消連結這個登入方式?",
"Unable to retrieve third-party logins list": "無法取得第三方登入清單",
"Third-party logins list is up to date": "第三方登入清單已是最新",
"Third-party logins list has been updated": "連結的帳戶清單已更新",
"Unable to retrieve third-party login list": "無法取得第三方登入清單",
"Third-party login list is up to date": "第三方登入清單已是最新",
"Third-party login list has been updated": "連結的帳戶清單已更新",
"Unable to unlink third-party login": "無法取消連結第三方登入",
"Device & Sessions": "裝置和會話",
"Device Info": "裝置資訊",
@@ -2418,7 +2422,7 @@
"Scheduled Transactions": "定期交易",
"Template Name": "範本名稱",
"No available template": "沒有可用的範本",
"Once you add templates, you can long press the Add button on the home page to quickly add a new transaction": "當新增範本後,您可以在首頁長按新增按鈕快速新增交易",
"Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction": "當新增範本後,您可以在首頁長按新增按鈕快速新增交易",
"No available template. Once you add templates, you can quickly add a new transaction using the dropdown menu of the Add button on the transaction list page": "沒有可用的範本。當新增範本後,您可以透過交易清單新增按鈕的下拉選單快速新增交易",
"No available scheduled transactions": "沒有可用的定期交易",
"Unable to retrieve template list": "無法取得範本清單",
+2 -10
View File
@@ -606,16 +606,9 @@ export const useTransactionTagsStore = defineStore('transactionTags', () => {
function changeTagDisplayOrder({ tagId, from, to }: { tagId: string, from: number, to: number }): Promise<void> {
return new Promise((resolve, reject) => {
let currentTag: TransactionTag | null = null;
const currentTag = allTransactionTagsMap.value[tagId];
for (const transactionTag of allTransactionTags.value) {
if (transactionTag.id === tagId) {
currentTag = transactionTag;
break;
}
}
if (!currentTag || !allTransactionTags.value[to]) {
if (!currentTag || !allTransactionTagsByGroupMap.value[currentTag.groupId] || !allTransactionTagsByGroupMap.value[currentTag.groupId]![to]) {
reject({ message: 'Unable to move tag' });
return;
}
@@ -757,7 +750,6 @@ export const useTransactionTagsStore = defineStore('transactionTags', () => {
// states
allTransactionTagGroups,
allTransactionTagGroupsMap,
allTransactionTags,
allTransactionTagsMap,
allTransactionTagsByGroupMap,
transactionTagGroupListStateInvalid,
+3 -3
View File
@@ -12,18 +12,18 @@ export const useUserExternalAuthStore = defineStore('userExternalAUth', () => {
const data = response.data;
if (!data || !data.success || !data.result) {
reject({ message: 'Unable to retrieve third-party logins list' });
reject({ message: 'Unable to retrieve third-party login list' });
return;
}
resolve(data.result);
}).catch(error => {
logger.error('failed to load third-party logins list', error);
logger.error('failed to load third-party login list', error);
if (error.response && error.response.data && error.response.data.errorMessage) {
reject({ error: error.response.data });
} else if (!error.processed) {
reject({ message: 'Unable to retrieve third-party logins list' });
reject({ message: 'Unable to retrieve third-party login list' });
} else {
reject(error);
}
@@ -274,13 +274,7 @@ export function useReconciliationStatementPageBase() {
displayAccountBalance = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.accountClosingBalance);
}
let description = transaction.comment || '';
if (fileType === KnownFileType.CSV) {
description = replaceAll(description, ',', ' ');
} else if (fileType === KnownFileType.TSV) {
description = replaceAll(description, '\t', ' ');
}
const description = replaceAll(transaction.comment || '', separator, ' ');
return [
formatDateTimeToGregorianDefaultDateTime(transactionTime),
@@ -40,7 +40,7 @@ export const ALL_APPLICATION_CLOUD_SETTINGS: CategorizedApplicationCloudSettingI
items: [
{ settingKey: 'itemsCountInTransactionListPage', settingName: 'Transactions Per Page', mobile: false, desktop: true },
{ settingKey: 'showTotalAmountInTransactionListPage', settingName: 'Show Monthly Total Amount', mobile: true, desktop: true },
{ settingKey: 'showTagInTransactionListPage', settingName: 'Show Transaction Tag', mobile: true, desktop: true }
{ settingKey: 'showTagInTransactionListPage', settingName: 'Show Transaction Tags', mobile: true, desktop: true }
]
},
{
@@ -61,7 +61,7 @@ export const ALL_APPLICATION_CLOUD_SETTINGS: CategorizedApplicationCloudSettingI
categoryName: 'Insights Explorer Page',
items: [
{ settingKey: 'insightsExplorerDefaultDateRangeType', settingName: 'Default Date Range', mobile: false, desktop: true },
{ settingKey: 'showTagInInsightsExplorerPage', settingName: 'Show Transaction Tag', mobile: false, desktop: true }
{ settingKey: 'showTagInInsightsExplorerPage', settingName: 'Show Transaction Tags', mobile: false, desktop: true }
]
},
{
@@ -46,7 +46,7 @@ export function useAppSettingPageBase() {
return [
{ name: tt('Disabled'), value: 'disabled' },
{ name: tt('Enabled'), value: 'enabled' },
{ name: tt('Show Confirmation Every Time'), value: 'confirmation' }
{ name: tt('Always Show Confirmation'), value: 'confirmation' }
];
});
+7 -7
View File
@@ -107,23 +107,23 @@
{{ tt('Log In') }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="loggingInByPassword"></v-progress-circular>
</v-btn>
<v-btn block :disabled="twoFAInputIsEmpty || loggingInByPassword || loggingInByOAuth2 || verifying"
@click="verify" v-else-if="isInternalAuthEnabled() && show2faInput">
{{ tt('Continue') }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="verifying"></v-progress-circular>
</v-btn>
<v-col cols="12" class="d-flex align-center px-0" v-if="isInternalAuthEnabled() && isOAuth2Enabled()">
<v-col cols="12" class="d-flex align-center px-0 text-no-wrap" v-if="isInternalAuthEnabled() && isOAuth2Enabled()">
<v-divider class="me-3" />
{{ tt('or') }}
<v-divider class="ms-3" />
</v-col>
<v-btn block :disabled="loggingInByPassword || loggingInByOAuth2 || verifying" :href="oauth2LoginUrl"
<v-btn block :disabled="show2faInput || loggingInByPassword || loggingInByOAuth2 || verifying" :href="oauth2LoginUrl"
@click="loggingInByOAuth2 = true" v-if="isOAuth2Enabled()">
{{ oauth2LoginDisplayName }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="loggingInByOAuth2"></v-progress-circular>
</v-btn>
<v-btn block :disabled="twoFAInputIsEmpty || loggingInByPassword || loggingInByOAuth2 || verifying"
@click="verify" v-else-if="show2faInput">
{{ tt('Continue') }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="verifying"></v-progress-circular>
</v-btn>
</v-col>
<v-col cols="12" class="text-center text-base" v-if="isInternalAuthEnabled()">
+11 -1
View File
@@ -108,9 +108,10 @@
</template>
<script setup lang="ts">
import { VTextField } from 'vuetify/components/VTextField';
import SnackBar from '@/components/desktop/SnackBar.vue';
import { ref, computed, useTemplateRef } from 'vue';
import { ref, computed, useTemplateRef, nextTick } from 'vue';
import { useRouter } from 'vue-router';
import { useTheme } from 'vuetify';
@@ -164,6 +165,7 @@ const {
doAfterLogin
} = useLoginPageBase('desktop');
const passcodeInput = useTemplateRef<VTextField>('passcodeInput');
const snackbar = useTemplateRef<SnackBarType>('snackbar');
const passcode = ref<string>('');
@@ -225,6 +227,14 @@ function verifyAndLogin(): void {
return;
} else if (error.error && error.error.errorCode === KnownErrorCode.TwoFactorAuthorizationPasscodeEmpty) {
show2faInput.value = true;
nextTick(() => {
if (passcodeInput.value) {
passcodeInput.value.focus();
passcodeInput.value.select();
}
});
return;
}
+2 -2
View File
@@ -550,7 +550,7 @@ function showReconciliationStatementCustomDateRangeDialog(account: Account, date
function moveAllTransactions(account: Account): void {
moveAllTransactionsDialog.value?.open(account).then(() => {
snackbar.value?.showMessage('All transactions in this account has been moved.');
snackbar.value?.showMessage('All transactions in this account have been moved.');
if (accountsStore.accountListStateInvalid && !loading.value) {
reload(false);
@@ -560,7 +560,7 @@ function moveAllTransactions(account: Account): void {
function clearAllTransactions(account: Account): void {
clearAllTransactionsDialog.value?.open(account).then(() => {
snackbar.value?.showMessage('All transactions in this account has been cleared');
snackbar.value?.showMessage('All transactions in this account have been cleared');
if (accountsStore.accountListStateInvalid && !loading.value) {
reload(false);
@@ -565,7 +565,7 @@ function updateClosingBalance(): void {
}
amountInputDialog.value?.open({
text: 'Please enter the new closing balance for the account',
text: 'Please enter the new closing balance for this account',
inputLabel: 'Closing Balance',
inputPlaceholder: 'Closing Balance',
currency: currentAccountCurrency.value,
@@ -178,8 +178,8 @@
item-title="displayName"
item-value="value"
persistent-placeholder
:label="tt('Show Transaction Tag')"
:placeholder="tt('Show Transaction Tag')"
:label="tt('Show Transaction Tags')"
:placeholder="tt('Show Transaction Tags')"
:items="enableDisableOptions"
v-model="showTagInTransactionListPage"
/>
@@ -267,8 +267,8 @@
item-title="displayName"
item-value="value"
persistent-placeholder
:label="tt('Show Transaction Tag')"
:placeholder="tt('Show Transaction Tag')"
:label="tt('Show Transaction Tags')"
:placeholder="tt('Show Transaction Tags')"
:items="enableDisableOptions"
v-model="showTagInInsightsExplorerPage"
/>
+4 -3
View File
@@ -20,7 +20,7 @@
direction="vertical"
:prev-icon="mdiMenuUp" :next-icon="mdiMenuDown"
:disabled="loading || updating" v-model="activeTagGroupId">
<v-tab class="tab-text-truncate" :disabled="loading || updating || hasEditingTag"
<v-tab class="tab-text-truncate" :disabled="loading || updating || displayOrderModified || hasEditingTag"
:key="tagGroup.id" :value="tagGroup.id"
v-for="tagGroup in allTagGroupsWithDefault"
@click="switchTagGroup(tagGroup.id)">
@@ -77,10 +77,11 @@
v-if="activeTagGroupId && activeTagGroupId !== DEFAULT_TAG_GROUP_ID">
<v-list-item-title>{{ tt('Delete Tag Group') }}</v-list-item-title>
</v-list-item>
<v-divider class="my-2"/>
<v-divider class="my-2" v-if="allTagGroupsWithDefault.length >= 2"/>
<v-list-item :prepend-icon="mdiSort"
:disabled="!allTagGroupsWithDefault || allTagGroupsWithDefault.length < 2"
:title="tt('Change Group Display Order')"
v-if="allTagGroupsWithDefault.length >= 2"
@click="showChangeGroupDisplayOrderDialog"></v-list-item>
<v-divider class="my-2"/>
<v-list-item :prepend-icon="mdiEyeOutline"
@@ -182,7 +183,7 @@
:class="{ 'd-none': loading, 'hover-display': !loading }"
:prepend-icon="mdiFolderMoveOutline"
:loading="tagMoving[element.id]"
:disabled="loading || updating"
:disabled="loading || updating || allTagGroupsWithDefault.length < 2"
v-if="editingTag.id !== element.id">
<template #loader>
<v-progress-circular indeterminate size="20" width="2"/>
+1 -1
View File
@@ -63,7 +63,7 @@
<v-btn class="ms-3" color="default" variant="outlined"
:disabled="loading || !canAddTransaction" @click="add()">
{{ tt('Add') }}
<v-menu activator="parent" :open-on-hover="true" v-if="isTransactionFromAIImageRecognitionEnabled() || (allTransactionTemplates && allTransactionTemplates.length)">
<v-menu activator="parent" max-height="500" :open-on-hover="true" v-if="isTransactionFromAIImageRecognitionEnabled() || (allTransactionTemplates && allTransactionTemplates.length)">
<v-list>
<v-list-item key="AIImageRecognition"
:title="tt('AI Image Recognition')"
@@ -5,7 +5,18 @@
<div class="d-flex align-center justify-center">
<div class="d-flex w-100 align-center">
<h4 class="text-h4">{{ tt('Import Transactions') }}</h4>
<v-progress-circular indeterminate size="22" class="ms-2" v-if="loading"></v-progress-circular>
<v-progress-circular indeterminate size="22" class="ms-2" v-if="currentStep !== 'checkData' && loading"></v-progress-circular>
<v-btn density="compact" color="default" variant="text" size="24"
class="ms-2" :icon="true" :disabled="loading"
:loading="loading"
v-if="currentStep === 'checkData'"
@click="reloadBasisData">
<template #loader>
<v-progress-circular indeterminate size="20"/>
</template>
<v-icon :icon="mdiRefresh" size="24" />
<v-tooltip activator="parent">{{ tt('Refresh Accounts, Categories and Tags') }}</v-tooltip>
</v-btn>
</div>
<v-btn density="comfortable" color="default" variant="text" class="ms-2"
:icon="true" :disabled="loading || submitting"
@@ -307,6 +318,7 @@ import { generateRandomUUID } from '@/lib/misc.ts';
import logger from '@/lib/logger.ts';
import {
mdiRefresh,
mdiFilterOutline,
mdiCheck,
mdiDotsVertical,
@@ -674,6 +686,46 @@ function setImportFile(event: Event): void {
}
}
function reloadBasisData(): void {
loading.value = true;
Promise.allSettled([
accountsStore.loadAllAccounts({ force: true }),
transactionCategoriesStore.loadAllCategories({ force: true }),
transactionTagsStore.loadAllTags({ force: true })
]).then(results => {
loading.value = false;
const isAllUpToDate = results.length === 3
&& results[0].status === 'rejected' && results[0].reason?.isUpToDate
&& results[1].status === 'rejected' && results[1].reason?.isUpToDate
&& results[2].status === 'rejected' && results[2].reason?.isUpToDate;
// show info if all up to date
if (isAllUpToDate) {
snackbar.value?.showMessage('Data is up to date');
return;
}
// show error if any
for (const result of results) {
if (result.status === 'rejected' && !result.reason?.isUpToDate) {
snackbar.value?.showError(result.reason);
return;
}
}
// show info if one of them updated
for (const result of results) {
if (result.status === 'fulfilled') {
snackbar.value?.showMessage('Data has been updated');
importTransactionCheckDataTab.value?.updateAllTransactionsIsValid();
return;
}
}
});
}
function parseData(): void {
let uploadFile: File;
let type: string = fileType.value;
@@ -715,6 +767,8 @@ function parseData(): void {
uploadFile = KnownFileType.CSV.createFile(importData.value, 'import');
} else if (type === 'custom_tsv') {
uploadFile = KnownFileType.TSV.createFile(importData.value, 'import');
} else if (type === 'custom_ssv') {
uploadFile = KnownFileType.TXT.createFile(importData.value, 'import');
} else {
snackbar.value?.showError('Parameter Invalid');
return;
@@ -958,10 +1012,16 @@ function close(completed: boolean): void {
}
watch(fileType, (newValue) => {
if (allFileSubTypes.value && allFileSubTypes.value.length) {
fileSubType.value = allFileSubTypes.value[0]!.type;
const subFileTypes = allSupportedImportFileTypesMap.value[newValue]?.subTypes;
if (subFileTypes && subFileTypes.length) {
if (fileSubType.value !== subFileTypes[0]!.type) {
fileSubType.value = subFileTypes[0]!.type;
} else if (settingsStore.appSettings.rememberLastSelectedFileTypeInImportTransactionDialog && !loading.value) {
settingsStore.setLastSelectedFileTypeInImportTransactionDialog(`${newValue}|${fileSubType.value}`);
}
} else {
if (settingsStore.appSettings.rememberLastSelectedFileTypeInImportTransactionDialog) {
if (settingsStore.appSettings.rememberLastSelectedFileTypeInImportTransactionDialog && !loading.value) {
settingsStore.setLastSelectedFileTypeInImportTransactionDialog(`${newValue}|`);
}
}
@@ -973,7 +1033,7 @@ watch(fileType, (newValue) => {
});
watch(fileSubType, (newValue) => {
if (settingsStore.appSettings.rememberLastSelectedFileTypeInImportTransactionDialog) {
if (settingsStore.appSettings.rememberLastSelectedFileTypeInImportTransactionDialog && !loading.value) {
settingsStore.setLastSelectedFileTypeInImportTransactionDialog(`${fileType.value}|${newValue}`);
}
@@ -164,7 +164,7 @@
<v-autocomplete density="compact" variant="underlined"
item-title="name" item-value="id"
persistent-placeholder chips
:disabled="loading" :items="allTags"
:disabled="loading" :items="allTagsWithGroupHeader"
:no-data-text="tt('No available tag')"
v-model="newRule.targetId"
v-if="newRule.dataType == 'tag'">
@@ -172,8 +172,12 @@
<v-chip :prepend-icon="mdiPound" :text="item.title" v-bind="props" v-if="newRule.targetId"/>
</template>
<template #subheader="{ props }">
<v-list-subheader>{{ props['title'] }}</v-list-subheader>
</template>
<template #item="{ props, item }">
<v-list-item :value="item.value" v-bind="props" v-if="!item.raw.hidden">
<v-list-item :value="item.value" v-bind="props" v-if="item.raw instanceof TransactionTag && !item.raw.hidden">
<template #title>
<v-list-item-title>
<div class="d-flex align-center">
@@ -215,6 +219,7 @@ import SnackBar from '@/components/desktop/SnackBar.vue';
import { ref, computed, useTemplateRef } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { useTransactionTagSelectionBase } from '@/components/base/TransactionTagSelectionBase.ts';
import { useSettingsStore } from '@/stores/setting.ts';
import { useAccountsStore } from '@/stores/account.ts';
@@ -228,7 +233,7 @@ import { KnownFileType } from '@/core/file.ts';
import { Account, type CategorizedAccountWithDisplayBalance } from '@/models/account.ts';
import type { TransactionCategory } from '@/models/transaction_category.ts';
import type { TransactionTag } from '@/models/transaction_tag.ts';
import { TransactionTag } from '@/models/transaction_tag.ts';
import {
getTransactionPrimaryCategoryName,
@@ -257,6 +262,8 @@ interface BatchReplaceAllTypesDialogResponse {
const { tt, getCategorizedAccountsWithDisplayBalance } = useI18n();
const { allTagsWithGroupHeader } = useTransactionTagSelectionBase({ modelValue: [] }, false);
const settingsStore = useSettingsStore();
const accountsStore = useAccountsStore();
const transactionCategoriesStore = useTransactionCategoriesStore();
@@ -284,7 +291,7 @@ const allAccounts = computed<Account[]>(() => accountsStore.allPlainAccounts);
const allVisibleAccounts = computed<Account[]>(() => accountsStore.allVisiblePlainAccounts);
const allVisibleCategorizedAccounts = computed<CategorizedAccountWithDisplayBalance[]>(() => getCategorizedAccountsWithDisplayBalance(allVisibleAccounts.value, showAccountBalance.value, customAccountCategoryOrder.value));
const allCategories = computed<Record<number, TransactionCategory[]>>(() => transactionCategoriesStore.allTransactionCategories);
const allTags = computed<TransactionTag[]>(() => transactionTagsStore.allTransactionTags);
const allTagsMap = computed<Record<string, TransactionTag>>(() => transactionTagsStore.allTransactionTagsMap);
const hasVisibleExpenseCategories = computed<boolean>(() => transactionCategoriesStore.hasVisibleExpenseCategories);
const hasVisibleIncomeCategories = computed<boolean>(() => transactionCategoriesStore.hasVisibleIncomeCategories);
@@ -352,13 +359,7 @@ function getRuleTargetValueDisplayName(rule: ImportTransactionReplaceRule): stri
case 'account':
return getAccountDisplayName(rule.targetId);
case 'tag':
for (const tag of allTags.value) {
if (tag.id === rule.targetId) {
return tag.name;
}
}
return '';
return allTagsMap.value[rule.targetId]?.name ?? '';
default:
return '';
}
@@ -391,17 +392,38 @@ function open(options: { expenseCategoryNames: NameValue[], incomeCategoryNames:
function reload(): void {
loading.value = true;
Promise.all([
Promise.allSettled([
accountsStore.loadAllAccounts({ force: true }),
transactionCategoriesStore.loadAllCategories({ force: true }),
transactionTagsStore.loadAllTags({ force: true })
]).then(() => {
loading.value = false;
}).catch(error => {
]).then(results => {
loading.value = false;
if (!error.processed) {
snackbar.value?.showError(error);
const isAllUpToDate = results.length === 3
&& results[0].status === 'rejected' && results[0].reason?.isUpToDate
&& results[1].status === 'rejected' && results[1].reason?.isUpToDate
&& results[2].status === 'rejected' && results[2].reason?.isUpToDate;
// show info if all up to date
if (isAllUpToDate) {
snackbar.value?.showMessage('Data is up to date');
return;
}
// show error if any
for (const result of results) {
if (result.status === 'rejected' && !result.reason?.isUpToDate) {
snackbar.value?.showError(result.reason);
return;
}
}
// show info if one of them updated
for (const result of results) {
if (result.status === 'fulfilled') {
snackbar.value?.showMessage('Data has been updated');
return;
}
}
});
}
@@ -168,7 +168,7 @@
:disabled="loading || removeTag"
:label="tt('Target Tag')"
:placeholder="tt('Target Tag')"
:items="allTags"
:items="allTagsWithGroupHeader"
:no-data-text="tt('No available tag')"
v-model="targetItem"
>
@@ -176,8 +176,12 @@
<v-chip :prepend-icon="mdiPound" :text="item.title" v-bind="props"/>
</template>
<template #subheader="{ props }">
<v-list-subheader>{{ props['title'] }}</v-list-subheader>
</template>
<template #item="{ props, item }">
<v-list-item :value="item.value" v-bind="props" v-if="!item.raw.hidden">
<v-list-item :value="item.value" v-bind="props" v-if="item.raw instanceof TransactionTag && !item.raw.hidden">
<template #title>
<v-list-item-title>
<div class="d-flex align-center">
@@ -214,6 +218,7 @@ import SnackBar from '@/components/desktop/SnackBar.vue';
import { ref, computed, useTemplateRef, watch } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { useTransactionTagSelectionBase } from '@/components/base/TransactionTagSelectionBase.ts';
import { useSettingsStore } from '@/stores/setting.ts';
import { useAccountsStore } from '@/stores/account.ts';
@@ -224,7 +229,7 @@ import type { NameValue } from '@/core/base.ts';
import { CategoryType } from '@/core/category.ts';
import { Account, type CategorizedAccountWithDisplayBalance } from '@/models/account.ts';
import type { TransactionCategory } from '@/models/transaction_category.ts';
import type { TransactionTag } from '@/models/transaction_tag.ts';
import { TransactionTag } from '@/models/transaction_tag.ts';
import {
getTransactionPrimaryCategoryName,
@@ -248,6 +253,8 @@ interface BatchReplaceDialogResponse {
const { tt, getCategorizedAccountsWithDisplayBalance } = useI18n();
const { allTagsWithGroupHeader } = useTransactionTagSelectionBase({ modelValue: [] }, false);
const settingsStore = useSettingsStore();
const accountsStore = useAccountsStore();
const transactionCategoriesStore = useTransactionCategoriesStore();
@@ -274,7 +281,6 @@ const allAccounts = computed<Account[]>(() => accountsStore.allPlainAccounts);
const allVisibleAccounts = computed<Account[]>(() => accountsStore.allVisiblePlainAccounts);
const allVisibleCategorizedAccounts = computed<CategorizedAccountWithDisplayBalance[]>(() => getCategorizedAccountsWithDisplayBalance(allVisibleAccounts.value, showAccountBalance.value, customAccountCategoryOrder.value));
const allCategories = computed<Record<number, TransactionCategory[]>>(() => transactionCategoriesStore.allTransactionCategories);
const allTags = computed<TransactionTag[]>(() => transactionTagsStore.allTransactionTags);
const hasVisibleExpenseCategories = computed<boolean>(() => transactionCategoriesStore.hasVisibleExpenseCategories);
const hasVisibleIncomeCategories = computed<boolean>(() => transactionCategoriesStore.hasVisibleIncomeCategories);
@@ -49,15 +49,15 @@
@click="selectInvert"></v-list-item>
<v-divider class="my-2"/>
<v-list-item :prepend-icon="mdiSelectAll"
:title="tt('Select All in This Page')"
:title="tt('Select All on This Page')"
:disabled="!!disabled"
@click="selectAllInThisPage"></v-list-item>
<v-list-item :prepend-icon="mdiSelect"
:title="tt('Select None in This Page')"
:title="tt('Select None on This Page')"
:disabled="!!disabled"
@click="selectNoneInThisPage"></v-list-item>
<v-list-item :prepend-icon="mdiSelectInverse"
:title="tt('Invert Selection in This Page')"
:title="tt('Invert Selection on This Page')"
:disabled="!!disabled"
@click="selectInvertInThisPage"></v-list-item>
</v-list>
@@ -265,7 +265,7 @@
density="compact" variant="plain"
:disabled="!!disabled"
:placeholder="tt('None')"
:items="allTags"
:items="allTagsWithGroupHeader"
:no-data-text="tt('No available tag')"
v-model="editingTags"
>
@@ -277,8 +277,12 @@
v-bind="props"/>
</template>
<template #subheader="{ props }">
<v-list-subheader>{{ props['title'] }}</v-list-subheader>
</template>
<template #item="{ props, item }">
<v-list-item :value="item.value" v-bind="props" v-if="!item.raw.hidden">
<v-list-item :value="item.value" v-bind="props" v-if="item.raw instanceof TransactionTag && !item.raw.hidden">
<template #title>
<v-list-item-title>
<div class="d-flex align-center">
@@ -403,6 +407,7 @@ import BatchCreateDialog, { type BatchCreateDialogDataType } from '../dialogs/Ba
import { ref, computed, useTemplateRef } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { useTransactionTagSelectionBase } from '@/components/base/TransactionTagSelectionBase.ts';
import { useSettingsStore } from '@/stores/setting.ts';
import { useUserStore } from '@/stores/user.ts';
@@ -414,15 +419,18 @@ import { type NameValue, type NameNumeralValue, itemAndIndex, reversed, keys } f
import { type NumeralSystem, AmountFilterType } from '@/core/numeral.ts';
import { CategoryType } from '@/core/category.ts';
import { TransactionType } from '@/core/transaction.ts';
import { KnownFileType } from '@/core/file.ts';
import { ImportTransactionColumnType } from '@/core/import_transaction.ts';
import { Account, type CategorizedAccountWithDisplayBalance } from '@/models/account.ts';
import type { TransactionCategory } from '@/models/transaction_category.ts';
import type { TransactionTag } from '@/models/transaction_tag.ts';
import { TransactionTag } from '@/models/transaction_tag.ts';
import { ImportTransaction } from '@/models/imported_transaction.ts';
import {
isString,
isNumber,
replaceAll,
objectFieldToArrayItem
} from '@/lib/common.ts';
import {
@@ -432,15 +440,14 @@ import {
parseDateTimeFromUnixTimeWithTimezoneOffset
} from '@/lib/datetime.ts';
import { formatCoordinate } from '@/lib/coordinate.ts';
import {
getAccountMapByName
} from '@/lib/account.ts';
import { getAccountMapByName } from '@/lib/account.ts';
import {
transactionTypeToCategoryType,
getSecondaryTransactionMapByName,
getTransactionPrimaryCategoryName,
getTransactionSecondaryCategoryName
} from '@/lib/category.ts';
import { startDownloadFile } from '@/lib/ui/common.ts';
import {
mdiCheck,
@@ -456,7 +463,9 @@ import {
mdiShapePlusOutline,
mdiPencilBoxMultipleOutline,
mdiNumericPositive1,
mdiNumericNegative1
mdiNumericNegative1,
mdiComma,
mdiKeyboardTab
} from '@mdi/js';
type SnackBarType = InstanceType<typeof SnackBar>;
@@ -499,10 +508,14 @@ const {
tt,
getCurrentNumeralSystemType,
formatDateTimeToLongDateTime,
formatDateTimeToGregorianDefaultDateTime,
formatAmountToWesternArabicNumeralsWithoutDigitGrouping,
formatAmountToLocalizedNumeralsWithCurrency,
getCategorizedAccountsWithDisplayBalance
} = useI18n();
const { allTagsWithGroupHeader } = useTransactionTagSelectionBase({ modelValue: [] }, false);
const settingsStore = useSettingsStore();
const userStore = useUserStore();
const accountsStore = useAccountsStore();
@@ -551,7 +564,6 @@ const allAccountsMap = computed<Record<string, Account>>(() => accountsStore.all
const allAccountsMapByName = computed<Record<string, Account>>(() => getAccountMapByName(accountsStore.allAccounts));
const allCategories = computed<Record<number, TransactionCategory[]>>(() => transactionCategoriesStore.allTransactionCategories);
const allCategoriesMap = computed<Record<string, TransactionCategory>>(() => transactionCategoriesStore.allTransactionCategoriesMap);
const allTags = computed<TransactionTag[]>(() => transactionTagsStore.allTransactionTags);
const allTagsMap = computed<Record<string, TransactionTag>>(() => transactionTagsStore.allTransactionTagsMap);
const hasVisibleExpenseCategories = computed<boolean>(() => transactionCategoriesStore.hasVisibleExpenseCategories);
@@ -931,6 +943,19 @@ const toolMenus = computed<ImportTransactionCheckDataMenu[]>(() => [
title: tt('Batch Convert Selected Amounts to Negative Values'),
disabled: isEditing.value || selectedImportTransactionCount.value < 1,
onClick: () => convertTransactionAmountSign(-1)
},
{
prependIcon: mdiComma,
title: tt('Export to CSV (Comma-separated values) File'),
disabled: isEditing.value || selectedImportTransactionCount.value < 1,
divider: true,
onClick: () => exportData(KnownFileType.CSV)
},
{
prependIcon: mdiKeyboardTab,
title: tt('Export to TSV (Tab-separated values) File'),
disabled: isEditing.value || selectedImportTransactionCount.value < 1,
onClick: () => exportData(KnownFileType.TSV)
}
]);
@@ -1314,6 +1339,20 @@ function getDisplayTimezone(transaction: ImportTransaction): string {
return `UTC${getUtcOffsetByUtcOffsetMinutes(transaction.utcOffset)}`;
}
function getDisplayTransactionType(transaction: ImportTransaction): string {
if (transaction.type === TransactionType.ModifyBalance) {
return tt('Modify Balance');
} else if (transaction.type === TransactionType.Income) {
return tt('Income');
} else if (transaction.type === TransactionType.Expense) {
return tt('Expense');
} else if (transaction.type === TransactionType.Transfer) {
return tt('Transfer');
} else {
return tt('Unknown');
}
}
function getDisplayCurrency(value: number, currencyCode: string): string {
return formatAmountToLocalizedNumeralsWithCurrency(value, currencyCode);
}
@@ -1595,14 +1634,43 @@ function updateTransactionData(transaction: ImportTransaction): void {
if (transaction.categoryId && allCategoriesMap.value[transaction.categoryId]) {
transaction.actualCategoryName = allCategoriesMap.value[transaction.categoryId]!.name;
} else {
if (transaction.type !== TransactionType.ModifyBalance) {
transaction.valid = false;
}
}
if (transaction.sourceAccountId && allAccountsMap.value[transaction.sourceAccountId]) {
transaction.actualSourceAccountName = allAccountsMap.value[transaction.sourceAccountId]!.name;
} else {
transaction.valid = false;
}
if (transaction.destinationAccountId && allAccountsMap.value[transaction.destinationAccountId]) {
transaction.actualDestinationAccountName = allAccountsMap.value[transaction.destinationAccountId]!.name;
} else {
if (transaction.type === TransactionType.Transfer) {
transaction.valid = false;
}
}
if (transaction.tagIds && transaction.tagIds.length) {
for (const tagId of transaction.tagIds) {
if (!tagId || !allTagsMap.value[tagId]) {
transaction.valid = false;
break;
}
}
}
}
function updateAllTransactionsIsValid(): void {
if (!props.importTransactions || props.importTransactions.length < 1) {
return;
}
for (const importTransaction of props.importTransactions) {
updateTransactionData(importTransaction);
}
}
@@ -2073,6 +2141,94 @@ function changeCustomDateFilter(minTime: number, maxTime: number): void {
showCustomDateRangeDialog.value = false;
}
function exportData(fileType: KnownFileType): void {
if (!props.importTransactions || props.importTransactions.length < 1 || selectedImportTransactionCount.value < 1) {
return;
}
let separator = ',';
if (fileType === KnownFileType.TSV) {
separator = '\t';
}
const header = [
tt(ImportTransactionColumnType.TransactionTime.name),
tt(ImportTransactionColumnType.TransactionTimezone.name),
tt(ImportTransactionColumnType.TransactionType.name),
tt(ImportTransactionColumnType.Category.name),
tt(ImportTransactionColumnType.AccountName.name),
tt(ImportTransactionColumnType.AccountCurrency.name),
tt(ImportTransactionColumnType.Amount.name),
tt(ImportTransactionColumnType.RelatedAccountName.name),
tt(ImportTransactionColumnType.RelatedAccountCurrency.name),
tt(ImportTransactionColumnType.RelatedAmount.name),
tt(ImportTransactionColumnType.GeographicLocation.name),
tt(ImportTransactionColumnType.Tags.name),
tt(ImportTransactionColumnType.Description.name)
].join(separator) + '\n';
const transactions = props.importTransactions ?? [];
const rows = transactions.filter(transaction => transaction.selected).map(transaction => {
const transactionTime = parseDateTimeFromUnixTimeWithTimezoneOffset(transaction.time, transaction.utcOffset);
const type = getDisplayTransactionType(transaction);
const accountName = transaction.sourceAccountId && transaction.sourceAccountId !== '0' && allAccountsMap.value[transaction.sourceAccountId] ? (allAccountsMap.value[transaction.sourceAccountId]?.name ?? transaction.originalSourceAccountName) : transaction.originalSourceAccountName;
const amountCurrency = transaction.sourceAccountId && transaction.sourceAccountId !== '0' && allAccountsMap.value[transaction.sourceAccountId] ? (allAccountsMap.value[transaction.sourceAccountId]?.currency ?? transaction.originalSourceAccountCurrency) : transaction.originalSourceAccountCurrency;
const amount = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.sourceAmount);
const geographicLocation = transaction.geoLocation ? `${transaction.geoLocation.longitude} ${transaction.geoLocation.latitude}` : '';
let categoryName = transaction.categoryId && transaction.categoryId !== '0' && allCategoriesMap.value[transaction.categoryId] ? (allCategoriesMap.value[transaction.categoryId]?.name ?? transaction.originalCategoryName) : transaction.originalCategoryName;
let relatedAccountName: string | undefined = undefined;
let relatedAccountCurrency: string | undefined = undefined;
let relatedAmount: string | undefined = undefined;
if (transaction.type === TransactionType.ModifyBalance) {
categoryName = '';
} else if (transaction.type === TransactionType.Transfer) {
relatedAccountName = transaction.destinationAccountId && transaction.destinationAccountId !== '0' && allAccountsMap.value[transaction.destinationAccountId] ? (allAccountsMap.value[transaction.destinationAccountId]?.name ?? transaction.originalDestinationAccountName) : transaction.originalDestinationAccountName;
relatedAccountCurrency = transaction.destinationAccountId && transaction.destinationAccountId !== '0' && allAccountsMap.value[transaction.destinationAccountId] ? (allAccountsMap.value[transaction.destinationAccountId]?.currency ?? transaction.originalDestinationAccountCurrency) : transaction.originalDestinationAccountCurrency;
relatedAmount = formatAmountToWesternArabicNumeralsWithoutDigitGrouping(transaction.destinationAmount);
}
const tagNames: string[] = [];
if (transaction.tagIds && transaction.tagIds.length > 0) {
for (const [tagId, index] of itemAndIndex(transaction.tagIds)) {
let tagName = '';
if (tagId && tagId !== '0' && allTagsMap.value[tagId]) {
tagName = allTagsMap.value[tagId]!.name;
} else if (transaction.originalTagNames && transaction.originalTagNames[index]) {
tagName = transaction.originalTagNames[index] as string;
}
if (tagName) {
tagName = replaceAll(tagName, separator, ' ');
tagName = replaceAll(tagName, ';', ' ');
tagNames.push(tagName);
}
}
}
return [
formatDateTimeToGregorianDefaultDateTime(transactionTime),
getUtcOffsetByUtcOffsetMinutes(transaction.utcOffset),
type,
replaceAll(categoryName, separator, ' '),
replaceAll(accountName, separator, ' '),
amountCurrency,
amount,
replaceAll(relatedAccountName ?? '', separator, ' '),
relatedAccountCurrency ?? '',
relatedAmount ?? '',
geographicLocation,
tagNames.join(';'),
replaceAll(transaction.comment || '', separator, ' ')
].join(separator);
});
startDownloadFile(fileType.formatFileName(tt('dataExport.defaultImportCheckResultFileName')), fileType.createBlob(header + rows.join('\n')));
}
function onShowDateRangeError(message: string): void {
snackbar.value?.showError(message);
}
@@ -2100,6 +2256,7 @@ defineExpose({
toolMenus,
isEditing,
canImport,
updateAllTransactionsIsValid,
reset,
setCountPerPage
});
@@ -230,7 +230,7 @@ import { useI18n } from '@/locales/helpers.ts';
import { type NameValue, type NameNumeralValue, type TypeAndDisplayName, itemAndIndex, entries } from '@/core/base.ts';
import { type NumeralSystem, KnownAmountFormat } from '@/core/numeral.ts';
import { KnownDateTimeFormat } from '@/core/datetime.ts';
import { type DateFormatOrder, KnownDateTimeFormat } from '@/core/datetime.ts';
import { KnownDateTimezoneFormat } from '@/core/timezone.ts';
import { TransactionType } from '@/core/transaction.ts';
import { ImportTransactionColumnType, ImportTransactionDataMapping } from '@/core/import_transaction.ts';
@@ -286,6 +286,8 @@ const {
tt,
ti,
getCurrentNumeralSystemType,
getLongDateFormatOrder,
getShortDateFormatOrder,
getAllImportTransactionColumnTypes
} = useI18n();
@@ -296,6 +298,8 @@ const countPerPage = ref<number>(10);
const parsedFileDataColumnMapping = ref<ImportTransactionDataMapping>(ImportTransactionDataMapping.createEmpty());
const numeralSystem = computed<NumeralSystem>(() => getCurrentNumeralSystemType());
const longDateFormatOrder = computed<DateFormatOrder>(() => getLongDateFormatOrder());
const shortDateFormatOrder = computed<DateFormatOrder>(() => getShortDateFormatOrder());
const allImportTransactionColumnTypes = computed<TypeAndDisplayName[]>(() => getAllImportTransactionColumnTypes());
const menus = computed<ImportTransactionDefineColumnMenu[]>(() => [
@@ -402,7 +406,7 @@ const parsedFileLinesTablePageOptions = computed<NameNumeralValue[]>(() => getTa
const parsedFileAllTransactionTypes = computed<string[]>(() => parsedFileDataColumnMapping.value.parseFileAllTransactionTypes(props.parsedFileData));
const parsedFileValidMappedTransactionTypes = computed<Record<string, TransactionType>>(() => parsedFileDataColumnMapping.value.parseFileValidMappedTransactionTypes(props.parsedFileData));
const parsedFileAutoDetectedTimeFormat = computed<string | undefined>(() => parsedFileDataColumnMapping.value.parseFileAutoDetectedTimeFormat(props.parsedFileData));
const parsedFileAutoDetectedTimeFormat = computed<string | undefined>(() => parsedFileDataColumnMapping.value.parseFileAutoDetectedTimeFormat(props.parsedFileData, longDateFormatOrder.value, shortDateFormatOrder.value));
const parsedFileAutoDetectedTimezoneFormat = computed<string | undefined>(() => parsedFileDataColumnMapping.value.parseFileAutoDetectedTimezoneFormat(props.parsedFileData));
const parsedFileAutoDetectedAmountFormat = computed<string | undefined>(() => parsedFileDataColumnMapping.value.parseFileAutoDetectedAmountFormat(props.parsedFileData));
@@ -12,14 +12,14 @@
@dragleave.prevent="onDragLeave"
@drop.prevent="onDrop">
<div class="d-flex w-100 h-100 justify-center align-center justify-content-center text-center px-4"
:class="{ 'dropzone': true, 'dropzone-dragover': isDragOver }">
:class="{ 'dropzone': true, 'dropzone-dark': isDarkMode, 'dropzone-blurry-bg': loading || isDragOver || recognizing, 'dropzone-dragover': isDragOver }">
<div class="d-inline-flex flex-column" v-if="!loading && !imageFile && !isDragOver">
<h3 :class="{ 'pa-2': true, 'bg-grey-200': !isDarkMode, 'bg-grey-100': isDarkMode }">{{ tt('You can drag and drop, paste or click to select a receipt or transaction image') }}</h3>
<span :class="{ 'pa-2': true, 'bg-grey-200': !isDarkMode, 'bg-grey-100': isDarkMode }">{{ tt('Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.') }}</span>
<h3 class="pa-2">{{ tt('You can drag and drop, paste or click to select a receipt or transaction image') }}</h3>
<span class="pa-2">{{ tt('Uploaded image and personal data will be sent to the large language model, please be aware of potential privacy risks.') }}</span>
</div>
<h3 :class="{ 'pa-2': true, 'bg-grey-200': !isDarkMode, 'bg-grey-100': isDarkMode }" v-else-if="!loading && isDragOver">{{ tt('Release to load image') }}</h3>
<h3 class="pa-2" v-else-if="!loading && isDragOver">{{ tt('Release to load image') }}</h3>
<h3 class="pa-2" v-else-if="loading">{{ tt('Loading image...') }}</h3>
<h3 :class="{ 'pa-2': true, 'bg-grey-200': !isDarkMode, 'bg-grey-100': isDarkMode }" v-else-if="recognizing">{{ tt('AI can make mistakes. Check important info.') }}</h3>
<h3 class="pa-2" v-else-if="recognizing">{{ tt('AI can make mistakes. Check important info.') }}</h3>
</div>
<v-img :class="{ 'cursor-pointer': !loading && !recognizing && !isDragOver, 'h-100': true }"
:src="imageSrc" @click="showOpenImageDialog">
@@ -262,6 +262,24 @@ defineExpose({
pointer-events: none;
border-radius: 8px;
z-index: 10;
h3, span {
color: rgb(var(--v-theme-on-grey-200)) !important;
text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff;
}
&.dropzone-dark {
h3, span {
color: rgb(var(--v-theme-on-grey-100)) !important;
text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;
}
}
}
.dropzone-blurry-bg {
/* stylelint-disable property-no-vendor-prefix */
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
}
.dropzone-dragover {
@@ -63,11 +63,11 @@
</v-card>
</v-col>
<v-col cols="12" v-if="isOAuth2Enabled() && (loadingExternalAuth || (thirdPartyLogins && thirdPartyLogins.length))">
<v-col cols="12" v-if="isOAuth2Enabled() && (loadingExternalAuth || (thirdPartyLoginList && thirdPartyLoginList.length))">
<v-card :class="{ 'disabled': loadingExternalAuth }">
<template #title>
<div class="d-flex align-center">
<span>{{ tt('Third-Party Logins') }}</span>
<span>{{ tt('Third-Party Login') }}</span>
<v-btn density="compact" color="default" variant="text" size="24"
class="ms-2" :icon="true" :loading="loadingExternalAuth" @click="reloadExternalAuth(false)">
<template #loader>
@@ -97,7 +97,7 @@
</tr>
<tr :key="thirdPartyLogin.externalAuthType"
v-for="thirdPartyLogin in thirdPartyLogins">
v-for="thirdPartyLogin in thirdPartyLoginList">
<td class="text-sm">
<v-icon start :icon="thirdPartyLogin.icon"/>
{{ thirdPartyLogin.displayName }}
@@ -337,18 +337,18 @@ const oauth2ClientSessionId = ref<string>(generateRandomUUID());
const oauth2LinkUrl = computed<string>(() => rootStore.generateOAuth2LinkUrl('desktop', oauth2ClientSessionId.value));
const thirdPartyLogins = computed<DesktopPageLinkedThirdPartyLogin[]>(() => {
const logins: DesktopPageLinkedThirdPartyLogin[] = [];
const thirdPartyLoginList = computed<DesktopPageLinkedThirdPartyLogin[]>(() => {
const ret: DesktopPageLinkedThirdPartyLogin[] = [];
if (!externalAuths.value) {
return logins;
return ret;
}
for (const externalAuth of externalAuths.value) {
logins.push(new DesktopPageLinkedThirdPartyLogin(externalAuth));
ret.push(new DesktopPageLinkedThirdPartyLogin(externalAuth));
}
return logins;
return ret;
});
const sessions = computed<DesktopPageSessionInfo[]>(() => {
@@ -432,9 +432,9 @@ function reloadExternalAuth(silent?: boolean): void {
userExternalAuthStore.getExternalAuths().then(response => {
if (!silent) {
if (isEquals(externalAuths.value, response)) {
snackbar.value?.showMessage('Third-party logins list is up to date');
snackbar.value?.showMessage('Third-party login list is up to date');
} else {
snackbar.value?.showMessage('Third-party logins list has been updated');
snackbar.value?.showMessage('Third-party login list has been updated');
}
}
+4 -9
View File
@@ -93,31 +93,27 @@
:opened="show2faSheet" @sheet:closed="show2faSheet = false"
>
<f7-page-content>
<div class="display-flex padding justify-content-space-between align-items-center">
<div class="display-flex padding-horizontal padding-top justify-content-space-between align-items-center">
<div class="ebk-sheet-title"><b>{{ tt('Two-Factor Authentication') }}</b></div>
</div>
<div class="padding-horizontal padding-bottom">
<f7-list strong class="no-margin">
<f7-list class="no-margin">
<f7-list-input
type="number"
autocomplete="one-time-code"
outline
floating-label
clear-button
class="no-margin no-padding-bottom"
v-if="twoFAVerifyType === 'passcode'"
:label="tt('Passcode')"
:placeholder="tt('Passcode')"
v-model:value="passcode"
@keyup.enter="verify"
></f7-list-input>
<f7-list-input
outline
floating-label
clear-button
class="no-margin no-padding-bottom"
v-if="twoFAVerifyType === 'backupcode'"
:label="tt('Backup Code')"
:placeholder="tt('Backup Code')"
v-model:value="backupCode"
@keyup.enter="verify"
@@ -144,15 +140,13 @@
<p class="no-margin">
<span>{{ tt('Please enter your email address used for registration and we\'ll send you an email with a reset password link') }}</span>
</p>
<f7-list strong class="no-margin">
<f7-list class="no-margin">
<f7-list-input
type="email"
autocomplete="email"
outline
floating-label
clear-button
class="no-margin no-padding-bottom"
:label="tt('E-mail')"
:placeholder="tt('Your email address')"
v-model:value="forgetPasswordEmail"
@keyup.enter="requestResetPassword"
@@ -432,6 +426,7 @@ oauth2ClientSessionId.value = generateRandomUUID();
.login-divider > .item-content {
width: 100%;
min-height: 0;
white-space: nowrap;
> .item-inner {
padding-top: 0;
+1 -1
View File
@@ -411,7 +411,7 @@ function clearAllTransactions(password: string): void {
hideLoading();
showInputPasswordSheetForClearAllTransactions.value = false;
showToast('All transactions in this account has been cleared');
showToast('All transactions in this account have been cleared');
}).catch(error => {
clearingData.value = false;
hideLoading();
@@ -147,7 +147,7 @@ function confirm(): void {
moving.value = false;
hideLoading();
showToast('All transactions in this account has been moved.');
showToast('All transactions in this account have been moved.');
router.back();
}).catch(error => {
moving.value = false;
@@ -323,7 +323,7 @@
<number-pad-sheet :min-value="TRANSACTION_MIN_AMOUNT"
:max-value="TRANSACTION_MAX_AMOUNT"
:currency="currentAccountCurrency"
:hint="tt('Please enter the new closing balance for the account')"
:hint="tt('Please enter the new closing balance for this account')"
v-model:show="showNewClosingBalanceSheet"
v-model="newClosingBalance"
@update:model-value="updateClosingBalance"
@@ -82,7 +82,7 @@
</f7-list-item>
<f7-list-item>
<template #after-title>
{{ tt('Show Transaction Tag') }}
{{ tt('Show Transaction Tags') }}
</template>
<template #after>
<f7-toggle :checked="showTagInTransactionListPage" @toggle:change="showTagInTransactionListPage = $event"></f7-toggle>
+9 -4
View File
@@ -6,7 +6,7 @@
<f7-link icon-f7="xmark" :class="{ 'disabled': displayOrderSaving }" @click="cancelSort"></f7-link>
</f7-nav-left>
<f7-nav-title>
<f7-link popover-open=".tag-group-popover-menu" :class="{ 'disabled': loading || sortable || hasEditingTag }">
<f7-link popover-open=".tag-group-popover-menu" :class="{ 'disabled': loading || sortable || displayOrderModified || hasEditingTag }">
<span style="color: var(--f7-text-color)">{{ displayTagGroupName }}</span>
<f7-icon class="page-title-bar-icon" color="gray" style="opacity: 0.5" f7="chevron_down_circle_fill"></f7-icon>
</f7-link>
@@ -110,7 +110,7 @@
<f7-swipeout-actions :left="textDirection === TextDirection.RTL"
:right="textDirection === TextDirection.LTR"
v-if="!sortable && editingTag.id !== tag.id">
<f7-swipeout-button color="primary" close :text="tt('Move')" @click="moveTagToGroup(tag)"></f7-swipeout-button>
<f7-swipeout-button color="primary" close :class="{ 'disabled': allTagGroupsWithDefault.length < 2 }" :text="tt('Move')" @click="moveTagToGroup(tag)"></f7-swipeout-button>
<f7-swipeout-button color="orange" close :text="tt('Edit')" @click="edit(tag)"></f7-swipeout-button>
<f7-swipeout-button color="red" class="padding-horizontal" @click="remove(tag, false)">
<f7-icon f7="trash"></f7-icon>
@@ -163,7 +163,12 @@
@click="moveTagToGroup(tagToMove, moveToTagGroupId)"></f7-link>
</f7-nav-right>
</f7-navbar>
<f7-list strong inset dividers class="margin-vertical">
<f7-list strong inset dividers class="margin-top" v-if="!loading && allTagGroupsWithDefault.length < 2">
<f7-list-item :title="tt('No available tag group')"></f7-list-item>
</f7-list>
<f7-list strong inset dividers class="margin-vertical" v-if="allTagGroupsWithDefault.length >= 2">
<template :key="tagGroup.id" v-for="tagGroup in allTagGroupsWithDefault">
<f7-list-item checkbox
:title="tagGroup.name"
@@ -186,7 +191,7 @@
@click="removeTagGroup"
v-if="activeTagGroupId && activeTagGroupId !== DEFAULT_TAG_GROUP_ID">{{ tt('Delete Tag Group') }}</f7-actions-button>
</f7-actions-group>
<f7-actions-group>
<f7-actions-group v-if="allTagGroupsWithDefault.length >= 2">
<f7-actions-button @click="changeTagGroupDisplayOrder">{{ tt('Change Group Display Order') }}</f7-actions-button>
</f7-actions-group>
<f7-actions-group>
+1 -1
View File
@@ -24,7 +24,7 @@
<f7-list strong inset dividers class="margin-top" v-if="!loading && noAvailableTemplate">
<f7-list-item :title="tt('No available template')"
:footer="tt('Once you add templates, you can long press the Add button on the home page to quickly add a new transaction')"
:footer="tt('Once you add templates, you can long-press the Add button on the home page to quickly add a new transaction')"
v-if="templateType === TemplateType.Normal.type"></f7-list-item>
<f7-list-item :title="tt('No available scheduled transactions')" v-else-if="templateType === TemplateType.Schedule.type"></f7-list-item>
<f7-list-item :title="tt('No available template')" v-else></f7-list-item>