From 9bd341fb0e3c4f9e673496882bf392d67181d6ca Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sat, 7 Nov 2020 21:48:58 +0800 Subject: [PATCH] add default currency option in user profile --- cmd/webserver.go | 1 + pkg/api/users.go | 9 ++ pkg/errs/global.go | 4 + pkg/models/user.go | 36 ++--- pkg/services/users.go | 4 + pkg/utils/api.go | 2 + pkg/validators/currency.go | 175 +++++++++++++++++++++++++ src/consts/currency.js | 163 +++++++++++++++++++++++ src/lib/i18n.js | 8 ++ src/lib/services.js | 10 +- src/locales/en.js | 166 +++++++++++++++++++++++ src/locales/zh_Hans.js | 166 +++++++++++++++++++++++ src/mobile-main.js | 20 +++ src/views/mobile/Signup.vue | 22 +++- src/views/mobile/users/UserProfile.vue | 29 +++- 15 files changed, 790 insertions(+), 25 deletions(-) create mode 100644 pkg/validators/currency.go create mode 100644 src/consts/currency.js diff --git a/cmd/webserver.go b/cmd/webserver.go index d52f3c1a..38635e1d 100644 --- a/cmd/webserver.go +++ b/cmd/webserver.go @@ -73,6 +73,7 @@ func startWebServer(c *cli.Context) error { _ = v.RegisterValidation("notBlank", validators.NotBlank) _ = v.RegisterValidation("validUsername", validators.ValidUsername) _ = v.RegisterValidation("validEmail", validators.ValidEmail) + _ = v.RegisterValidation("validCurrency", validators.ValidCurrency) } router.NoRoute(bindApi(api.Default.ApiNotFound)) diff --git a/pkg/api/users.go b/pkg/api/users.go index 0c5ed65b..2bcc765a 100644 --- a/pkg/api/users.go +++ b/pkg/api/users.go @@ -42,6 +42,7 @@ func (a *UsersApi) UserRegisterHandler(c *core.Context) (interface{}, *errs.Erro Email: userRegisterReq.Email, Nickname: userRegisterReq.Nickname, Password: userRegisterReq.Password, + DefaultCurrency: userRegisterReq.DefaultCurrency, } err = a.users.CreateUser(user) @@ -92,6 +93,7 @@ func (a *UsersApi) UserProfileHandler(c *core.Context) (interface{}, *errs.Error Email: user.Email, Nickname: user.Nickname, Type: user.Type, + DefaultCurrency: user.DefaultCurrency, CreatedAt: user.CreatedUnixTime, UpdatedAt: user.UpdatedUnixTime, LastLoginAt: user.LastLoginUnixTime, @@ -151,6 +153,12 @@ func (a *UsersApi) UserUpdateProfileHandler(c *core.Context) (interface{}, *errs userUpdateReq.Nickname = "" } + if userUpdateReq.DefaultCurrency != "" && userUpdateReq.DefaultCurrency != user.DefaultCurrency { + anythingUpdate = true + } else { + userUpdateReq.DefaultCurrency = "" + } + if !anythingUpdate { return nil, errs.ErrNothingWillBeUpdated } @@ -158,6 +166,7 @@ func (a *UsersApi) UserUpdateProfileHandler(c *core.Context) (interface{}, *errs user.Email = userUpdateReq.Email user.Password = userUpdateReq.Password user.Nickname = userUpdateReq.Nickname + user.DefaultCurrency = userUpdateReq.DefaultCurrency keyProfileUpdated, err := a.users.UpdateUser(user) diff --git a/pkg/errs/global.go b/pkg/errs/global.go index 52250f8c..3035735f 100644 --- a/pkg/errs/global.go +++ b/pkg/errs/global.go @@ -44,3 +44,7 @@ func GetParameterInvalidUsernameMessage(field string) string { func GetParameterInvalidEmailMessage(field string) string { return fmt.Sprintf("parameter \"%s\" is invalid email format", field) } + +func GetParameterInvalidCurrencylMessage(field string) string { + return fmt.Sprintf("parameter \"%s\" is invalid currency", field) +} diff --git a/pkg/models/user.go b/pkg/models/user.go index 44954787..2871add9 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -17,6 +17,7 @@ type User struct { Salt string `xorm:"VARCHAR(10) NOT NULL"` Rands string `xorm:"VARCHAR(10) NOT NULL"` Type UserType `xorm:"TINYINT NOT NULL"` + DefaultCurrency string `xorm:"VARCHAR(3) NOT NULL"` IsAdmin bool `xorm:"NOT NULL"` Deleted bool `xorm:"NOT NULL"` EmailVerified bool `xorm:"NOT NULL"` @@ -32,26 +33,29 @@ type UserLoginRequest struct { } type UserRegisterRequest struct { - Username string `json:"username" binding:"required,notBlank,max=32,validUsername"` - Email string `json:"email" binding:"required,notBlank,max=100,validEmail"` - Nickname string `json:"nickname" binding:"required,notBlank,max=64"` - Password string `json:"password" binding:"required,min=6,max=128"` + Username string `json:"username" binding:"required,notBlank,max=32,validUsername"` + Email string `json:"email" binding:"required,notBlank,max=100,validEmail"` + Nickname string `json:"nickname" binding:"required,notBlank,max=64"` + Password string `json:"password" binding:"required,min=6,max=128"` + DefaultCurrency string `json:"defaultCurrency" binding:"required,len=3,validCurrency"` } type UserProfileUpdateRequest struct { - Email string `json:"email" binding:"omitempty,notBlank,max=100,validEmail"` - Nickname string `json:"nickname" binding:"omitempty,notBlank,max=64"` - Password string `json:"password" binding:"omitempty,min=6,max=128"` - OldPassword string `json:"oldPassword" binding:"omitempty,min=6,max=128"` + Email string `json:"email" binding:"omitempty,notBlank,max=100,validEmail"` + Nickname string `json:"nickname" binding:"omitempty,notBlank,max=64"` + Password string `json:"password" binding:"omitempty,min=6,max=128"` + OldPassword string `json:"oldPassword" binding:"omitempty,min=6,max=128"` + DefaultCurrency string `json:"defaultCurrency" binding:"required,len=3,validCurrency"` } type UserProfileResponse struct { - Uid string `json:"uid"` - Username string `json:"username"` - Email string `json:"email"` - Nickname string `json:"nickname"` - Type UserType `json:"type"` - CreatedAt int64 `json:"createdAt"` - UpdatedAt int64 `json:"updatedAt"` - LastLoginAt int64 `json:"lastLoginAt"` + Uid string `json:"uid"` + Username string `json:"username"` + Email string `json:"email"` + Nickname string `json:"nickname"` + Type UserType `json:"type"` + DefaultCurrency string `json:"defaultCurrency"` + CreatedAt int64 `json:"createdAt"` + UpdatedAt int64 `json:"updatedAt"` + LastLoginAt int64 `json:"lastLoginAt"` } diff --git a/pkg/services/users.go b/pkg/services/users.go index bed66f18..9fa3b9ca 100644 --- a/pkg/services/users.go +++ b/pkg/services/users.go @@ -174,6 +174,10 @@ func (s *UserService) UpdateUser(user *models.User) (keyProfileUpdated bool, err updateCols = append(updateCols, "nickname") } + if user.DefaultCurrency != "" { + updateCols = append(updateCols, "default_currency") + } + user.UpdatedUnixTime = now updateCols = append(updateCols, "updated_unix_time") diff --git a/pkg/utils/api.go b/pkg/utils/api.go index 46308bd0..445500b0 100644 --- a/pkg/utils/api.go +++ b/pkg/utils/api.go @@ -59,6 +59,8 @@ func getValidationErrorText(err validator.FieldError) string { return errs.GetParameterInvalidUsernameMessage(fieldName) case "validEmail": return errs.GetParameterInvalidEmailMessage(fieldName) + case "validCurrency": + return errs.GetParameterInvalidCurrencylMessage(fieldName) } return errs.GetParameterInvalidMessage(fieldName) diff --git a/pkg/validators/currency.go b/pkg/validators/currency.go new file mode 100644 index 00000000..7f48b724 --- /dev/null +++ b/pkg/validators/currency.go @@ -0,0 +1,175 @@ +package validators + +import ( + "github.com/go-playground/validator/v10" +) + +// ISO 4217 +var ALL_CURRENCY_NAMES = map[string]bool { + "AED": true, //UAE Dirham + "AFN": true, //Afghani + "ALL": true, //Lek + "AMD": true, //Armenian Dram + "ANG": true, //Netherlands Antillean Guilder + "AOA": true, //Kwanza + "ARS": true, //Argentine Peso + "AUD": true, //Australian Dollar + "AWG": true, //Aruban Florin + "AZN": true, //Azerbaijan Manat + "BAM": true, //Convertible Mark + "BBD": true, //Barbados Dollar + "BDT": true, //Taka + "BGN": true, //Bulgarian Lev + "BHD": true, //Bahraini Dinar + "BIF": true, //Burundi Franc + "BMD": true, //Bermudian Dollar + "BND": true, //Brunei Dollar + "BOB": true, //Boliviano + "BRL": true, //Brazilian Real + "BSD": true, //Bahamian Dollar + "BTN": true, //Ngultrum + "BWP": true, //Pula + "BYN": true, //Belarusian Ruble + "BZD": true, //Belize Dollar + "CAD": true, //Canadian Dollar + "CDF": true, //Congolese Franc + "CHF": true, //Swiss Franc + "CLP": true, //Chilean Peso + "CNY": true, //Yuan Renminbi + "COP": true, //Colombian Peso + "CRC": true, //Costa Rican Colon + "CUC": true, //Peso Convertible + "CUP": true, //Cuban Peso + "CVE": true, //Cabo Verde Escudo + "CZK": true, //Czech Koruna + "DJF": true, //Djibouti Franc + "DKK": true, //Danish Krone + "DOP": true, //Dominican Peso + "DZD": true, //Algerian Dinar + "EGP": true, //Egyptian Pound + "ERN": true, //Nakfa + "ETB": true, //Ethiopian Birr + "EUR": true, //Euro + "FJD": true, //Fiji Dollar + "FKP": true, //Falkland Islands Pound + "GBP": true, //Pound Sterling + "GEL": true, //Lari + "GHS": true, //Ghana Cedi + "GIP": true, //Gibraltar Pound + "GMD": true, //Dalasi + "GNF": true, //Guinean Franc + "GTQ": true, //Quetzal + "GYD": true, //Guyana Dollar + "HKD": true, //Hong Kong Dollar + "HNL": true, //Lempira + "HRK": true, //Kuna + "HTG": true, //Gourde + "HUF": true, //Forint + "IDR": true, //Rupiah + "ILS": true, //New Israeli Sheqel + "INR": true, //Indian Rupee + "IQD": true, //Iraqi Dinar + "IRR": true, //Iranian Rial + "ISK": true, //Iceland Krona + "JMD": true, //Jamaican Dollar + "JOD": true, //Jordanian Dinar + "JPY": true, //Yen + "KES": true, //Kenyan Shilling + "KGS": true, //Som + "KHR": true, //Riel + "KMF": true, //Comorian Franc + "KPW": true, //North Korean Won + "KRW": true, //Won + "KWD": true, //Kuwaiti Dinar + "KYD": true, //Cayman Islands Dollar + "KZT": true, //Tenge + "LAK": true, //Lao Kip + "LBP": true, //Lebanese Pound + "LKR": true, //Sri Lanka Rupee + "LRD": true, //Liberian Dollar + "LSL": true, //Loti + "LYD": true, //Libyan Dinar + "MAD": true, //Moroccan Dirham + "MDL": true, //Moldovan Leu + "MGA": true, //Malagasy Ariary + "MKD": true, //Denar + "MMK": true, //Kyat + "MNT": true, //Tugrik + "MOP": true, //Pataca + "MRU": true, //Ouguiya + "MUR": true, //Mauritius Rupee + "MVR": true, //Rufiyaa + "MWK": true, //Malawi Kwacha + "MXN": true, //Mexican Peso + "MYR": true, //Malaysian Ringgit + "MZN": true, //Mozambique Metical + "NAD": true, //Namibia Dollar + "NGN": true, //Naira + "NIO": true, //Cordoba Oro + "NOK": true, //Norwegian Krone + "NPR": true, //Nepalese Rupee + "NZD": true, //New Zealand Dollar + "OMR": true, //Rial Omani + "PAB": true, //Balboa + "PEN": true, //Sol + "PGK": true, //Kina + "PHP": true, //Philippine Peso + "PKR": true, //Pakistan Rupee + "PLN": true, //Zloty + "PYG": true, //Guarani + "QAR": true, //Qatari Rial + "RON": true, //Romanian Leu + "RSD": true, //Serbian Dinar + "RUB": true, //Russian Ruble + "RWF": true, //Rwanda Franc + "SAR": true, //Saudi Riyal + "SBD": true, //Solomon Islands Dollar + "SCR": true, //Seychelles Rupee + "SDG": true, //Sudanese Pound + "SEK": true, //Swedish Krona + "SGD": true, //Singapore Dollar + "SHP": true, //Saint Helena Pound + "SLL": true, //Leone + "SOS": true, //Somali Shilling + "SRD": true, //Surinam Dollar + "SSP": true, //South Sudanese Pound + "STN": true, //Dobra + "SVC": true, //El Salvador Colon + "SYP": true, //Syrian Pound + "SZL": true, //Lilangeni + "THB": true, //Baht + "TJS": true, //Somoni + "TMT": true, //Turkmenistan New Manat + "TND": true, //Tunisian Dinar + "TOP": true, //Pa’anga + "TRY": true, //Turkish Lira + "TTD": true, //Trinidad and Tobago Dollar + "TWD": true, //New Taiwan Dollar + "TZS": true, //Tanzanian Shilling + "UAH": true, //Hryvnia + "UGX": true, //Uganda Shilling + "USD": true, //US Dollar + "UYU": true, //Peso Uruguayo + "UZS": true, //Uzbekistan Sum + "VES": true, //Bolívar Soberano + "VND": true, //Dong + "VUV": true, //Vatu + "WST": true, //Tala + "XAF": true, //CFA Franc BEAC + "XCD": true, //East Caribbean Dollar + "XOF": true, //CFA Franc BCEAO + "XPF": true, //CFP Franc + "YER": true, //Yemeni Rial + "ZAR": true, //Rand + "ZMW": true, //Zambian Kwacha + "ZWL": true, //Zimbabwe Dollar +} + +func ValidCurrency(fl validator.FieldLevel) bool { + if value, ok := fl.Field().Interface().(string); ok { + _, ok := ALL_CURRENCY_NAMES[value] + return ok + } + + return false +} diff --git a/src/consts/currency.js b/src/consts/currency.js new file mode 100644 index 00000000..1907a053 --- /dev/null +++ b/src/consts/currency.js @@ -0,0 +1,163 @@ +const allCurrencies = [ + 'AED', //UAE Dirham + 'AFN', //Afghani + 'ALL', //Lek + 'AMD', //Armenian Dram + 'ANG', //Netherlands Antillean Guilder + 'AOA', //Kwanza + 'ARS', //Argentine Peso + 'AUD', //Australian Dollar + 'AWG', //Aruban Florin + 'AZN', //Azerbaijan Manat + 'BAM', //Convertible Mark + 'BBD', //Barbados Dollar + 'BDT', //Taka + 'BGN', //Bulgarian Lev + 'BHD', //Bahraini Dinar + 'BIF', //Burundi Franc + 'BMD', //Bermudian Dollar + 'BND', //Brunei Dollar + 'BOB', //Boliviano + 'BRL', //Brazilian Real + 'BSD', //Bahamian Dollar + 'BTN', //Ngultrum + 'BWP', //Pula + 'BYN', //Belarusian Ruble + 'BZD', //Belize Dollar + 'CAD', //Canadian Dollar + 'CDF', //Congolese Franc + 'CHF', //Swiss Franc + 'CLP', //Chilean Peso + 'CNY', //Yuan Renminbi + 'COP', //Colombian Peso + 'CRC', //Costa Rican Colon + 'CUC', //Peso Convertible + 'CUP', //Cuban Peso + 'CVE', //Cabo Verde Escudo + 'CZK', //Czech Koruna + 'DJF', //Djibouti Franc + 'DKK', //Danish Krone + 'DOP', //Dominican Peso + 'DZD', //Algerian Dinar + 'EGP', //Egyptian Pound + 'ERN', //Nakfa + 'ETB', //Ethiopian Birr + 'EUR', //Euro + 'FJD', //Fiji Dollar + 'FKP', //Falkland Islands Pound + 'GBP', //Pound Sterling + 'GEL', //Lari + 'GHS', //Ghana Cedi + 'GIP', //Gibraltar Pound + 'GMD', //Dalasi + 'GNF', //Guinean Franc + 'GTQ', //Quetzal + 'GYD', //Guyana Dollar + 'HKD', //Hong Kong Dollar + 'HNL', //Lempira + 'HRK', //Kuna + 'HTG', //Gourde + 'HUF', //Forint + 'IDR', //Rupiah + 'ILS', //New Israeli Sheqel + 'INR', //Indian Rupee + 'IQD', //Iraqi Dinar + 'IRR', //Iranian Rial + 'ISK', //Iceland Krona + 'JMD', //Jamaican Dollar + 'JOD', //Jordanian Dinar + 'JPY', //Yen + 'KES', //Kenyan Shilling + 'KGS', //Som + 'KHR', //Riel + 'KMF', //Comorian Franc + 'KPW', //North Korean Won + 'KRW', //Won + 'KWD', //Kuwaiti Dinar + 'KYD', //Cayman Islands Dollar + 'KZT', //Tenge + 'LAK', //Lao Kip + 'LBP', //Lebanese Pound + 'LKR', //Sri Lanka Rupee + 'LRD', //Liberian Dollar + 'LSL', //Loti + 'LYD', //Libyan Dinar + 'MAD', //Moroccan Dirham + 'MDL', //Moldovan Leu + 'MGA', //Malagasy Ariary + 'MKD', //Denar + 'MMK', //Kyat + 'MNT', //Tugrik + 'MOP', //Pataca + 'MRU', //Ouguiya + 'MUR', //Mauritius Rupee + 'MVR', //Rufiyaa + 'MWK', //Malawi Kwacha + 'MXN', //Mexican Peso + 'MYR', //Malaysian Ringgit + 'MZN', //Mozambique Metical + 'NAD', //Namibia Dollar + 'NGN', //Naira + 'NIO', //Cordoba Oro + 'NOK', //Norwegian Krone + 'NPR', //Nepalese Rupee + 'NZD', //New Zealand Dollar + 'OMR', //Rial Omani + 'PAB', //Balboa + 'PEN', //Sol + 'PGK', //Kina + 'PHP', //Philippine Peso + 'PKR', //Pakistan Rupee + 'PLN', //Zloty + 'PYG', //Guarani + 'QAR', //Qatari Rial + 'RON', //Romanian Leu + 'RSD', //Serbian Dinar + 'RUB', //Russian Ruble + 'RWF', //Rwanda Franc + 'SAR', //Saudi Riyal + 'SBD', //Solomon Islands Dollar + 'SCR', //Seychelles Rupee + 'SDG', //Sudanese Pound + 'SEK', //Swedish Krona + 'SGD', //Singapore Dollar + 'SHP', //Saint Helena Pound + 'SLL', //Leone + 'SOS', //Somali Shilling + 'SRD', //Surinam Dollar + 'SSP', //South Sudanese Pound + 'STN', //Dobra + 'SVC', //El Salvador Colon + 'SYP', //Syrian Pound + 'SZL', //Lilangeni + 'THB', //Baht + 'TJS', //Somoni + 'TMT', //Turkmenistan New Manat + 'TND', //Tunisian Dinar + 'TOP', //Pa’anga + 'TRY', //Turkish Lira + 'TTD', //Trinidad and Tobago Dollar + 'TWD', //New Taiwan Dollar + 'TZS', //Tanzanian Shilling + 'UAH', //Hryvnia + 'UGX', //Uganda Shilling + 'USD', //US Dollar + 'UYU', //Peso Uruguayo + 'UZS', //Uzbekistan Sum + 'VES', //Bolívar Soberano + 'VND', //Dong + 'VUV', //Vatu + 'WST', //Tala + 'XAF', //CFA Franc BEAC + 'XCD', //East Caribbean Dollar + 'XOF', //CFA Franc BCEAO + 'XPF', //CFP Franc + 'YER', //Yemeni Rial + 'ZAR', //Rand + 'ZMW', //Zambian Kwacha + 'ZWL', //Zimbabwe Dollar +]; + +export default { + all: allCurrencies +}; diff --git a/src/lib/i18n.js b/src/lib/i18n.js index 1f3bd102..6457b6db 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -80,6 +80,14 @@ const parameterizedErrors = [ field: 'parameter', localized: true }] + }, + { + localeKey: 'parameter invalid currency', + regex: /^parameter "(\w+)" is invalid currency$/, + parameters: [{ + field: 'parameter', + localized: true + }] } ]; diff --git a/src/lib/services.js b/src/lib/services.js index bf8a40ba..420b6eb6 100644 --- a/src/lib/services.js +++ b/src/lib/services.js @@ -78,12 +78,13 @@ export default { } }); }, - register: ({ username, email, nickname, password }) => { + register: ({ username, email, nickname, password, defaultCurrency }) => { return axios.post('register.json', { username, email, nickname, - password + password, + defaultCurrency }); }, logout: () => { @@ -127,12 +128,13 @@ export default { getProfile: () => { return axios.get('v1/users/profile/get.json'); }, - updateProfile: ({ email, nickname, password, oldPassword }) => { + updateProfile: ({ email, nickname, password, oldPassword, defaultCurrency }) => { return axios.post('v1/users/profile/update.json', { email, nickname, password, - oldPassword + oldPassword, + defaultCurrency }); }, get2FAStatus: () => { diff --git a/src/locales/en.js b/src/locales/en.js index da2df473..c6f83050 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -4,11 +4,173 @@ export default { 'title': 'lab account book', } }, + 'default': { + 'currency': 'USD', + }, 'format': { 'datetime': { 'long': 'MM/DD/YYYY HH:mm:ss', } }, + 'currency': { + 'AED': 'United Arab Emirates dirham', + 'AFN': 'Afghan afghani', + 'ALL': 'Albanian lek', + 'AMD': 'Armenian dram', + 'ANG': 'Netherlands Antillean guilder', + 'AOA': 'Angolan kwanza', + 'ARS': 'Argentine peso', + 'AUD': 'Australian dollar', + 'AWG': 'Aruban florin', + 'AZN': 'Azerbaijani manat', + 'BAM': 'Bosnia and Herzegovina convertible mark', + 'BBD': 'Barbados dollar', + 'BDT': 'Bangladeshi taka', + 'BGN': 'Bulgarian lev', + 'BHD': 'Bahraini dinar', + 'BIF': 'Burundian franc', + 'BMD': 'Bermudian dollar', + 'BND': 'Brunei dollar', + 'BOB': 'Boliviano', + 'BRL': 'Brazilian real', + 'BSD': 'Bahamian dollar', + 'BTN': 'Bhutanese ngultrum', + 'BWP': 'Botswana pula', + 'BYN': 'Belarusian ruble', + 'BZD': 'Belize dollar', + 'CAD': 'Canadian dollar', + 'CDF': 'Congolese franc', + 'CHF': 'Swiss franc', + 'CLP': 'Chilean peso', + 'CNY': 'Chinese yuan', + 'COP': 'Colombian peso', + 'CRC': 'Costa Rican colon', + 'CUC': 'Cuban convertible peso', + 'CUP': 'Cuban peso', + 'CVE': 'Cape Verdean escudo', + 'CZK': 'Czech koruna', + 'DJF': 'Djiboutian franc', + 'DKK': 'Danish krone', + 'DOP': 'Dominican peso', + 'DZD': 'Algerian dinar', + 'EGP': 'Egyptian pound', + 'ERN': 'Eritrean nakfa', + 'ETB': 'Ethiopian birr', + 'EUR': 'Euro', + 'FJD': 'Fiji dollar', + 'FKP': 'Falkland Islands pound', + 'GBP': 'Pound sterling', + 'GEL': 'Georgian lari', + 'GHS': 'Ghanaian cedi', + 'GIP': 'Gibraltar pound', + 'GMD': 'Gambian dalasi', + 'GNF': 'Guinean franc', + 'GTQ': 'Guatemalan quetzal', + 'GYD': 'Guyanese dollar', + 'HKD': 'Hong Kong dollar', + 'HNL': 'Honduran lempira', + 'HRK': 'Croatian kuna', + 'HTG': 'Haitian gourde', + 'HUF': 'Hungarian forint', + 'IDR': 'Indonesian rupiah', + 'ILS': 'Israeli new shekel', + 'INR': 'Indian rupee', + 'IQD': 'Iraqi dinar', + 'IRR': 'Iranian rial', + 'ISK': 'Icelandic króna', + 'JMD': 'Jamaican dollar', + 'JOD': 'Jordanian dinar', + 'JPY': 'Japanese yen', + 'KES': 'Kenyan shilling', + 'KGS': 'Kyrgyzstani som', + 'KHR': 'Cambodian riel', + 'KMF': 'Comoro franc', + 'KPW': 'North Korean won', + 'KRW': 'South Korean won', + 'KWD': 'Kuwaiti dinar', + 'KYD': 'Cayman Islands dollar', + 'KZT': 'Kazakhstani tenge', + 'LAK': 'Lao kip', + 'LBP': 'Lebanese pound', + 'LKR': 'Sri Lankan rupee', + 'LRD': 'Liberian dollar', + 'LSL': 'Lesotho loti', + 'LYD': 'Libyan dinar', + 'MAD': 'Moroccan dirham', + 'MDL': 'Moldovan leu', + 'MGA': 'Malagasy ariary', + 'MKD': 'Macedonian denar', + 'MMK': 'Myanmar kyat', + 'MNT': 'Mongolian tögrög', + 'MOP': 'Macanese pataca', + 'MRU': 'Mauritanian ouguiya', + 'MUR': 'Mauritian rupee', + 'MVR': 'Maldivian rufiyaa', + 'MWK': 'Malawian kwacha', + 'MXN': 'Mexican peso', + 'MYR': 'Malaysian ringgit', + 'MZN': 'Mozambican metical', + 'NAD': 'Namibian dollar', + 'NGN': 'Nigerian naira', + 'NIO': 'Nicaraguan córdoba', + 'NOK': 'Norwegian krone', + 'NPR': 'Nepalese rupee', + 'NZD': 'New Zealand dollar', + 'OMR': 'Omani rial', + 'PAB': 'Panamanian balboa', + 'PEN': 'Peruvian sol', + 'PGK': 'Papua New Guinean kina', + 'PHP': 'Philippine peso', + 'PKR': 'Pakistani rupee', + 'PLN': 'Polish złoty', + 'PYG': 'Paraguayan guaraní', + 'QAR': 'Qatari riyal', + 'RON': 'Romanian leu', + 'RSD': 'Serbian dinar', + 'RUB': 'Russian ruble', + 'RWF': 'Rwandan franc', + 'SAR': 'Saudi riyal', + 'SBD': 'Solomon Islands dollar', + 'SCR': 'Seychelles rupee', + 'SDG': 'Sudanese pound', + 'SEK': 'Swedish krona/kronor', + 'SGD': 'Singapore dollar', + 'SHP': 'Saint Helena pound', + 'SLL': 'Sierra Leonean leone', + 'SOS': 'Somali shilling', + 'SRD': 'Surinamese dollar', + 'SSP': 'South Sudanese pound', + 'STN': 'São Tomé and Príncipe dobra', + 'SVC': 'Salvadoran colón', + 'SYP': 'Syrian pound', + 'SZL': 'Swazi lilangeni', + 'THB': 'Thai baht', + 'TJS': 'Tajikistani somoni', + 'TMT': 'Turkmenistan manat', + 'TND': 'Tunisian dinar', + 'TOP': 'Tongan paʻanga', + 'TRY': 'Turkish lira', + 'TTD': 'Trinidad and Tobago dollar', + 'TWD': 'New Taiwan dollar', + 'TZS': 'Tanzanian shilling', + 'UAH': 'Ukrainian hryvnia', + 'UGX': 'Ugandan shilling', + 'USD': 'United States dollar', + 'UYU': 'Uruguayan peso', + 'UZS': 'Uzbekistan som', + 'VES': 'Venezuelan bolívar soberano', + 'VND': 'Vietnamese đồng', + 'VUV': 'Vanuatu vatu', + 'WST': 'Samoan tala', + 'XAF': 'CFA franc BEAC', + 'XCD': 'East Caribbean dollar', + 'XOF': 'CFA franc BCEAO', + 'XPF': 'CFP franc', + 'YER': 'Yemeni rial', + 'ZAR': 'South African rand', + 'ZMW': 'Zambian kwacha', + 'ZWL': 'Zimbabwean dollar', + }, 'error': { 'system error': 'System Error', 'api not found': 'Failed to request api', @@ -50,6 +212,7 @@ export default { 'email': 'Email', 'nickname': 'Nickname', 'oldPassword': 'Current Password', + 'defaultCurrency': 'Default Currency', }, 'parameterizedError': { 'parameter invalid': '{parameter} is invalid', @@ -60,6 +223,7 @@ export default { 'parameter cannot be blank': '{parameter} cannot be blank', 'parameter invalid username format': '{parameter} is invalid format', 'parameter invalid email format': '{parameter} is invalid format', + 'parameter invalid currency': '{parameter} is invalid format', }, 'OK': 'OK', 'Cancel': 'Cancel', @@ -92,6 +256,7 @@ export default { 'Your email address': 'Your email address', 'Nickname': 'Nickname', 'Your nickname': 'Your nickname', + 'Default Currency': 'Default Currency', 'Log In': 'Log In', 'Don\'t have an account?': 'Don\'t have an account?', 'Create an account': 'Create an account', @@ -102,6 +267,7 @@ export default { 'Password and confirmation password do not match': 'Password and confirmation password do not match', 'Email address cannot be empty': 'Email address cannot be empty', 'Nickname cannot be empty': 'Nickname cannot be empty', + 'Default currency cannot be empty': 'Default currency cannot be empty', 'Unable to login': 'Unable to login', 'Two-Factor Authentication': 'Two-Factor Authentication', 'Passcode': 'Passcode', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index 8ee0d0fe..a0958b67 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -4,11 +4,173 @@ export default { 'title': 'lab 轻记账', } }, + 'default': { + 'currency': 'CNY', + }, 'format': { 'datetime': { 'long': 'YYYY年MM月DD日 HH:mm:ss', } }, + 'currency': { + 'AED': '阿联酋迪拉姆', + 'AFN': '阿富汗阿富汗尼', + 'ALL': '阿尔巴尼亚列克', + 'AMD': '亚美尼亚德拉姆', + 'ANG': '荷属安的列斯盾', + 'AOA': '安哥拉宽扎', + 'ARS': '阿根廷比索', + 'AUD': '澳大利亚元', + 'AWG': '阿鲁巴弗罗林', + 'AZN': '阿塞拜疆马纳特', + 'BAM': '波斯尼亚和黑塞哥维那可兑换马克', + 'BBD': '巴巴多斯元', + 'BDT': '孟加拉塔卡', + 'BGN': '保加利亚列弗', + 'BHD': '巴林第纳尔', + 'BIF': '布隆迪法郎', + 'BMD': '百慕大元', + 'BND': '文莱元', + 'BOB': '玻利维亚玻利维亚诺', + 'BRL': '巴西雷亚尔', + 'BSD': '巴哈马元', + 'BTN': '不丹努扎姆', + 'BWP': '博茨瓦纳普拉', + 'BYN': '白俄罗斯卢布', + 'BZD': '伯利兹元', + 'CAD': '加拿大元', + 'CDF': '刚果民主共和国刚果法郎', + 'CHF': '瑞士法郎', + 'CLP': '智利比索', + 'CNY': '人民币', + 'COP': '哥伦比亚比索', + 'CRC': '哥斯达黎加科朗', + 'CUC': '古巴可兑换比索', + 'CUP': '古巴比索', + 'CVE': '佛得角埃斯库多', + 'CZK': '捷克克朗', + 'DJF': '吉布提法郎', + 'DKK': '丹麦克朗', + 'DOP': '多米尼加比索', + 'DZD': '阿尔及利亚第纳尔', + 'EGP': '埃及镑', + 'ERN': '厄立特里亚纳克法', + 'ETB': '埃塞俄比亚比尔', + 'EUR': '欧元', + 'FJD': '斐济元', + 'FKP': '福克兰镑', + 'GBP': '英镑', + 'GEL': '格鲁吉亚拉里', + 'GHS': '加纳塞地', + 'GIP': '直布罗陀镑', + 'GMD': '冈比亚达拉西', + 'GNF': '几内亚法郎', + 'GTQ': '危地马拉格查尔', + 'GYD': '圭亚那元', + 'HKD': '港元', + 'HNL': '洪都拉斯伦皮拉', + 'HRK': '克罗地亚库纳', + 'HTG': '海地古德', + 'HUF': '匈牙利福林', + 'IDR': '印度尼西亚盾', + 'ILS': '以色列新谢克尔', + 'INR': '印度卢比', + 'IQD': '伊拉克第纳尔', + 'IRR': '伊朗里亚尔', + 'ISK': '冰岛克朗', + 'JMD': '牙买加元', + 'JOD': '约旦第纳尔', + 'JPY': '日元', + 'KES': '肯尼亚先令', + 'KGS': '吉尔吉斯斯坦索姆', + 'KHR': '柬埔寨瑞尔', + 'KMF': '科摩罗法郎', + 'KPW': '朝鲜圆', + 'KRW': '韩元', + 'KWD': '科威特第纳尔', + 'KYD': '开曼群岛元', + 'KZT': '哈萨克斯坦坚戈', + 'LAK': '老挝基普', + 'LBP': '黎巴嫩镑', + 'LKR': '斯里兰卡卢比', + 'LRD': '利比里亚元', + 'LSL': '莱索托洛蒂', + 'LYD': '利比亚第纳尔', + 'MAD': '摩洛哥迪拉姆', + 'MDL': '摩尔多瓦列伊', + 'MGA': '马达加斯加阿里亚里', + 'MKD': '北马其顿代纳尔', + 'MMK': '缅甸元', + 'MNT': '蒙古图格里克', + 'MOP': '澳门元', + 'MRU': '毛里塔尼亚乌吉亚', + 'MUR': '毛里求斯卢比', + 'MVR': '马尔代夫拉菲亚', + 'MWK': '马拉维克瓦查', + 'MXN': '墨西哥比索', + 'MYR': '马来西亚林吉特', + 'MZN': '莫桑比克梅蒂卡尔', + 'NAD': '纳米比亚元', + 'NGN': '尼日利亚奈拉', + 'NIO': '尼加拉瓜科多巴', + 'NOK': '挪威克朗', + 'NPR': '尼泊尔卢比', + 'NZD': '新西兰元', + 'OMR': '阿曼里亚尔', + 'PAB': '巴拿马巴波亚', + 'PEN': '秘鲁新索尔', + 'PGK': '巴布亚新几内亚基那', + 'PHP': '菲律宾比索', + 'PKR': '巴基斯坦卢比', + 'PLN': '波兰兹罗提', + 'PYG': '巴拉圭瓜拉尼', + 'QAR': '卡塔尔里亚尔', + 'RON': '罗马尼亚列伊', + 'RSD': '塞尔维亚第纳尔', + 'RUB': '俄罗斯卢布', + 'RWF': '卢旺达法郎', + 'SAR': '沙特里亚尔', + 'SBD': '所罗门群岛元', + 'SCR': '塞舌尔卢比', + 'SDG': '苏丹镑', + 'SEK': '瑞典克朗', + 'SGD': '新加坡元', + 'SHP': '圣赫勒拿镑', + 'SLL': '塞拉利昂利昂', + 'SOS': '索马里先令', + 'SRD': '苏里南元', + 'SSP': '南苏丹镑', + 'STN': '圣多美和普林西比多布拉', + 'SVC': '萨尔瓦多科朗', + 'SYP': '叙利亚镑', + 'SZL': '斯威士兰里兰吉尼', + 'THB': '泰铢', + 'TJS': '塔吉克斯坦索莫尼', + 'TMT': '土库曼斯坦马纳特', + 'TND': '突尼斯第纳尔', + 'TOP': '汤加潘加', + 'TRY': '土耳其里拉', + 'TTD': '特立尼达和多巴哥元', + 'TWD': '新台币', + 'TZS': '坦桑尼亚先令', + 'UAH': '乌克兰格里夫尼亚', + 'UGX': '乌干达先令', + 'USD': '美元', + 'UYU': '乌拉圭比索', + 'UZS': '乌兹别克斯坦苏姆', + 'VES': '委内瑞拉玻利瓦尔', + 'VND': '越南盾', + 'VUV': '瓦努阿图瓦图', + 'WST': '萨摩亚塔拉', + 'XAF': '中非金融合作法郎', + 'XCD': '东加勒比元', + 'XOF': '非洲金融共同体法郎', + 'XPF': '太平洋法郎', + 'YER': '也门里亚尔', + 'ZAR': '南非兰特', + 'ZMW': '赞比亚克瓦查', + 'ZWL': '津巴布韦元', + }, 'error': { 'system error': '系统错误', 'api not found': '接口调用失败', @@ -50,6 +212,7 @@ export default { 'email': '电子邮箱', 'nickname': '昵称', 'oldPassword': '当前密码', + 'defaultCurrency': '默认货币', }, 'parameterizedError': { 'parameter invalid': '{parameter}无效', @@ -60,6 +223,7 @@ export default { 'parameter cannot be blank': '{parameter}不能为空', 'parameter invalid username format': '{parameter}格式错误', 'parameter invalid email format': '{parameter}格式错误', + 'parameter invalid currency': '{parameter}格式错误', }, 'OK': '确定', 'Cancel': '取消', @@ -92,6 +256,7 @@ export default { 'Your email address': '你的电子邮箱地址', 'Nickname': '昵称', 'Your nickname': '你的昵称', + 'Default Currency': '默认货币', 'Log In': '登录', 'Don\'t have an account?': '还没有账号?', 'Create an account': '创建新账号', @@ -102,6 +267,7 @@ export default { 'Password and confirmation password do not match': '密码和确认密码不匹配', 'Email address cannot be empty': '电子邮箱地址不能为空', 'Nickname cannot be empty': '昵称不能为空', + 'Default currency cannot be empty': '默认货币不能为空', 'Unable to login': '无法登录', 'Two-Factor Authentication': '两步验证', 'Passcode': '验证码', diff --git a/src/mobile-main.js b/src/mobile-main.js index bfae5bbe..3ada4ffb 100644 --- a/src/mobile-main.js +++ b/src/mobile-main.js @@ -13,6 +13,7 @@ import 'framework7/css/framework7.bundle.css'; import 'framework7-icons'; import { getAllLanguages, getLanguage, getDefaultLanguage, getI18nOptions, getLocalizedError } from './lib/i18n.js'; +import currency from './consts/currency.js'; import version from './lib/version.js'; import settings from './lib/settings.js'; import services from './lib/services.js'; @@ -43,6 +44,25 @@ Vue.prototype.$setLanguage = function (locale) { document.querySelector('html').setAttribute('lang', locale); return locale; }; +Vue.prototype.$getAllCurrencies = function () { + const allCurrencyCodes = currency.all; + const allCurrencies = []; + + for (let i = 0; i < allCurrencyCodes.length; i++) { + const code = allCurrencyCodes[i]; + + allCurrencies.push({ + code: code, + displayName: i18n.t(`currency.${code}`) + }); + } + + allCurrencies.sort(function(c1, c2){ + return c1.displayName.localeCompare(c2.displayName); + }) + + return allCurrencies; +}; Vue.prototype.$isUserRegistrationEnabled = settings.isUserRegistrationEnabled; Vue.prototype.$alert = function (message, confirmCallback) { diff --git a/src/views/mobile/Signup.vue b/src/views/mobile/Signup.vue index d0f9feee..64609b24 100644 --- a/src/views/mobile/Signup.vue +++ b/src/views/mobile/Signup.vue @@ -47,6 +47,17 @@ @input="nickname = $event.target.value" > + + + + @@ -57,13 +68,17 @@