Compare commits

...

11 Commits

44 changed files with 1212 additions and 1330 deletions
-1
View 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
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "ezbookkeeping",
"version": "1.3.1",
"version": "1.3.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ezbookkeeping",
"version": "1.3.1",
"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.1",
"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()
@@ -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",
})
}
+17 -19
View File
@@ -125,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 (
@@ -1180,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 {
+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) {
+5
View File
@@ -229,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,
+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;
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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)",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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)",
+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,
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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)",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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) ファイル",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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) ಫೈಲ್",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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) 파일",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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)",
+38 -37
View File
@@ -31,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",
@@ -43,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} г."
@@ -1981,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",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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)",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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) கோப்பு",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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 (ค่าแยกด้วยตัวคั่น)",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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ı",
+38 -37
View File
@@ -31,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",
@@ -43,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} р."
@@ -1981,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)",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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) 文件",
+38 -37
View File
@@ -31,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",
@@ -43,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}"
@@ -1981,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) 檔案",
+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;
}
@@ -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 {
+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;