mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-15 17:13:49 +08:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
22fca78be9 | |||
effd257040 | |||
a38747d90e | |||
da70682cd1 | |||
4a3bd84f84 | |||
7f2869cecb | |||
cef2ab213b | |||
cc979c310e | |||
13d73732ce | |||
5686fe5d22 | |||
d8cb82f67a | |||
cad2e1bcc3 | |||
52cc2e4fa7 | |||
8077a2ccba | |||
4cb8e4a514 | |||
2f48d45773 | |||
cff0c7a273 | |||
793a7d6cda |
6
.github/workflows/build.yml
vendored
6
.github/workflows/build.yml
vendored
@ -35,7 +35,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 20
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
cache-dependency-path: ./web/yarn.lock
|
cache-dependency-path: ./web/yarn.lock
|
||||||
- run: yarn install && CI=false yarn run build
|
- run: yarn install && CI=false yarn run build
|
||||||
@ -101,7 +101,7 @@ jobs:
|
|||||||
working-directory: ./
|
working-directory: ./
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 20
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
cache-dependency-path: ./web/yarn.lock
|
cache-dependency-path: ./web/yarn.lock
|
||||||
- run: yarn install
|
- run: yarn install
|
||||||
@ -138,7 +138,7 @@ jobs:
|
|||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 20
|
||||||
|
|
||||||
- name: Fetch Previous version
|
- name: Fetch Previous version
|
||||||
id: get-previous-tag
|
id: get-previous-tag
|
||||||
|
@ -169,7 +169,11 @@ func (c *ApiController) Signup() {
|
|||||||
|
|
||||||
username := authForm.Username
|
username := authForm.Username
|
||||||
if !application.IsSignupItemVisible("Username") {
|
if !application.IsSignupItemVisible("Username") {
|
||||||
username = id
|
if organization.UseEmailAsUsername && application.IsSignupItemVisible("Email") {
|
||||||
|
username = authForm.Email
|
||||||
|
} else {
|
||||||
|
username = id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
initScore, err := organization.GetInitScore()
|
initScore, err := organization.GetInitScore()
|
||||||
|
@ -16,6 +16,7 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/beego/beego/utils/pagination"
|
"github.com/beego/beego/utils/pagination"
|
||||||
"github.com/casdoor/casdoor/object"
|
"github.com/casdoor/casdoor/object"
|
||||||
@ -163,11 +164,17 @@ func (c *ApiController) GetPolicies() {
|
|||||||
c.ResponseError(err.Error())
|
c.ResponseError(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if adapter == nil {
|
||||||
|
c.ResponseError(fmt.Sprintf(c.T("the adapter: %s is not found"), adapterId))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
err = adapter.InitAdapter()
|
err = adapter.InitAdapter()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.ResponseError(err.Error())
|
c.ResponseError(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.ResponseOk()
|
c.ResponseOk()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ package controllers
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/beego/beego/utils/pagination"
|
"github.com/beego/beego/utils/pagination"
|
||||||
"github.com/casdoor/casdoor/object"
|
"github.com/casdoor/casdoor/object"
|
||||||
@ -164,6 +165,16 @@ func (c *ApiController) BuyProduct() {
|
|||||||
host := c.Ctx.Request.Host
|
host := c.Ctx.Request.Host
|
||||||
providerName := c.Input().Get("providerName")
|
providerName := c.Input().Get("providerName")
|
||||||
paymentEnv := c.Input().Get("paymentEnv")
|
paymentEnv := c.Input().Get("paymentEnv")
|
||||||
|
customPriceStr := c.Input().Get("customPrice")
|
||||||
|
if customPriceStr == "" {
|
||||||
|
customPriceStr = "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
customPrice, err := strconv.ParseFloat(customPriceStr, 64)
|
||||||
|
if err != nil {
|
||||||
|
c.ResponseError(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// buy `pricingName/planName` for `paidUserName`
|
// buy `pricingName/planName` for `paidUserName`
|
||||||
pricingName := c.Input().Get("pricingName")
|
pricingName := c.Input().Get("pricingName")
|
||||||
@ -189,7 +200,7 @@ func (c *ApiController) BuyProduct() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
payment, attachInfo, err := object.BuyProduct(id, user, providerName, pricingName, planName, host, paymentEnv)
|
payment, attachInfo, err := object.BuyProduct(id, user, providerName, pricingName, planName, host, paymentEnv, customPrice)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.ResponseError(err.Error())
|
c.ResponseError(err.Error())
|
||||||
return
|
return
|
||||||
|
@ -46,10 +46,10 @@ func (c *ApiController) GetSystemInfo() {
|
|||||||
// @Success 200 {object} util.VersionInfo The Response object
|
// @Success 200 {object} util.VersionInfo The Response object
|
||||||
// @router /get-version-info [get]
|
// @router /get-version-info [get]
|
||||||
func (c *ApiController) GetVersionInfo() {
|
func (c *ApiController) GetVersionInfo() {
|
||||||
|
errInfo := ""
|
||||||
versionInfo, err := util.GetVersionInfo()
|
versionInfo, err := util.GetVersionInfo()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.ResponseError(err.Error())
|
errInfo = "Git error: " + err.Error()
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if versionInfo.Version != "" {
|
if versionInfo.Version != "" {
|
||||||
@ -59,9 +59,11 @@ func (c *ApiController) GetVersionInfo() {
|
|||||||
|
|
||||||
versionInfo, err = util.GetVersionInfoFromFile()
|
versionInfo, err = util.GetVersionInfoFromFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.ResponseError(err.Error())
|
errInfo = errInfo + ", File error: " + err.Error()
|
||||||
|
c.ResponseError(errInfo)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.ResponseOk(versionInfo)
|
c.ResponseOk(versionInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,6 +333,35 @@ func (c *ApiController) IntrospectToken() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if application.TokenFormat == "JWT-Standard" {
|
||||||
|
jwtToken, err := object.ParseStandardJwtTokenByApplication(tokenValue, application)
|
||||||
|
if err != nil || jwtToken.Valid() != nil {
|
||||||
|
// and token revoked case. but we not implement
|
||||||
|
// TODO: 2022-03-03 add token revoked check, when we implemented the Token Revocation(rfc7009) Specs.
|
||||||
|
// refs: https://tools.ietf.org/html/rfc7009
|
||||||
|
c.Data["json"] = &object.IntrospectionResponse{Active: false}
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data["json"] = &object.IntrospectionResponse{
|
||||||
|
Active: true,
|
||||||
|
Scope: jwtToken.Scope,
|
||||||
|
ClientId: clientId,
|
||||||
|
Username: token.User,
|
||||||
|
TokenType: token.TokenType,
|
||||||
|
Exp: jwtToken.ExpiresAt.Unix(),
|
||||||
|
Iat: jwtToken.IssuedAt.Unix(),
|
||||||
|
Nbf: jwtToken.NotBefore.Unix(),
|
||||||
|
Sub: jwtToken.Subject,
|
||||||
|
Aud: jwtToken.Audience,
|
||||||
|
Iss: jwtToken.Issuer,
|
||||||
|
Jti: jwtToken.ID,
|
||||||
|
}
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
jwtToken, err := object.ParseJwtTokenByApplication(tokenValue, application)
|
jwtToken, err := object.ParseJwtTokenByApplication(tokenValue, application)
|
||||||
if err != nil || jwtToken.Valid() != nil {
|
if err != nil || jwtToken.Valid() != nil {
|
||||||
// and token revoked case. but we not implement
|
// and token revoked case. but we not implement
|
||||||
|
14
idp/lark.go
14
idp/lark.go
@ -22,6 +22,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/nyaruka/phonenumbers"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -199,12 +200,25 @@ func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var phoneNumber string
|
||||||
|
var countryCode string
|
||||||
|
if len(larkUserInfo.Data.Mobile) != 0 {
|
||||||
|
phoneNumberParsed, err := phonenumbers.Parse(larkUserInfo.Data.Mobile, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
countryCode = phonenumbers.GetRegionCodeForNumber(phoneNumberParsed)
|
||||||
|
phoneNumber = fmt.Sprintf("%d", phoneNumberParsed.GetNationalNumber())
|
||||||
|
}
|
||||||
|
|
||||||
userInfo := UserInfo{
|
userInfo := UserInfo{
|
||||||
Id: larkUserInfo.Data.OpenId,
|
Id: larkUserInfo.Data.OpenId,
|
||||||
DisplayName: larkUserInfo.Data.EnName,
|
DisplayName: larkUserInfo.Data.EnName,
|
||||||
Username: larkUserInfo.Data.Name,
|
Username: larkUserInfo.Data.Name,
|
||||||
Email: larkUserInfo.Data.Email,
|
Email: larkUserInfo.Data.Email,
|
||||||
AvatarUrl: larkUserInfo.Data.AvatarUrl,
|
AvatarUrl: larkUserInfo.Data.AvatarUrl,
|
||||||
|
Phone: phoneNumber,
|
||||||
|
CountryCode: countryCode,
|
||||||
}
|
}
|
||||||
return &userInfo, nil
|
return &userInfo, nil
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,15 @@ func handleBind(w ldap.ResponseWriter, m *ldap.Message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bindPassword := string(r.AuthenticationSimple())
|
bindPassword := string(r.AuthenticationSimple())
|
||||||
bindUser, err := object.CheckUserPassword(bindOrg, bindUsername, bindPassword, "en")
|
|
||||||
|
enableCaptcha := false
|
||||||
|
isSigninViaLdap := false
|
||||||
|
isPasswordWithLdapEnabled := false
|
||||||
|
if bindPassword != "" {
|
||||||
|
isPasswordWithLdapEnabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
bindUser, err := object.CheckUserPassword(bindOrg, bindUsername, bindPassword, "en", enableCaptcha, isSigninViaLdap, isPasswordWithLdapEnabled)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Bind failed User=%s, Pass=%#v, ErrMsg=%s", string(r.Name()), r.Authentication(), err)
|
log.Printf("Bind failed User=%s, Pass=%#v, ErrMsg=%s", string(r.Name()), r.Authentication(), err)
|
||||||
res.SetResultCode(ldap.LDAPResultInvalidCredentials)
|
res.SetResultCode(ldap.LDAPResultInvalidCredentials)
|
||||||
|
@ -108,6 +108,8 @@ func initBuiltInOrganization() bool {
|
|||||||
AccountItems: getBuiltInAccountItems(),
|
AccountItems: getBuiltInAccountItems(),
|
||||||
EnableSoftDeletion: false,
|
EnableSoftDeletion: false,
|
||||||
IsProfilePublic: false,
|
IsProfilePublic: false,
|
||||||
|
UseEmailAsUsername: false,
|
||||||
|
EnableTour: true,
|
||||||
}
|
}
|
||||||
_, err = AddOrganization(organization)
|
_, err = AddOrganization(organization)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -72,6 +72,8 @@ type Organization struct {
|
|||||||
InitScore int `json:"initScore"`
|
InitScore int `json:"initScore"`
|
||||||
EnableSoftDeletion bool `json:"enableSoftDeletion"`
|
EnableSoftDeletion bool `json:"enableSoftDeletion"`
|
||||||
IsProfilePublic bool `json:"isProfilePublic"`
|
IsProfilePublic bool `json:"isProfilePublic"`
|
||||||
|
UseEmailAsUsername bool `json:"useEmailAsUsername"`
|
||||||
|
EnableTour bool `json:"enableTour"`
|
||||||
|
|
||||||
MfaItems []*MfaItem `xorm:"varchar(300)" json:"mfaItems"`
|
MfaItems []*MfaItem `xorm:"varchar(300)" json:"mfaItems"`
|
||||||
AccountItems []*AccountItem `xorm:"varchar(5000)" json:"accountItems"`
|
AccountItems []*AccountItem `xorm:"varchar(5000)" json:"accountItems"`
|
||||||
|
@ -39,6 +39,8 @@ type Payment struct {
|
|||||||
Currency string `xorm:"varchar(100)" json:"currency"`
|
Currency string `xorm:"varchar(100)" json:"currency"`
|
||||||
Price float64 `json:"price"`
|
Price float64 `json:"price"`
|
||||||
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
|
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
|
||||||
|
IsRecharge bool `xorm:"bool" json:"isRecharge"`
|
||||||
|
|
||||||
// Payer Info
|
// Payer Info
|
||||||
User string `xorm:"varchar(100)" json:"user"`
|
User string `xorm:"varchar(100)" json:"user"`
|
||||||
PersonName string `xorm:"varchar(100)" json:"personName"`
|
PersonName string `xorm:"varchar(100)" json:"personName"`
|
||||||
@ -193,11 +195,16 @@ func notifyPayment(body []byte, owner string, paymentName string) (*Payment, *pp
|
|||||||
return payment, nil, err
|
return payment, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if notifyResult.Price != product.Price {
|
if notifyResult.Price != product.Price && !product.IsRecharge {
|
||||||
err = fmt.Errorf("the payment's price: %f doesn't equal to the expected price: %f", notifyResult.Price, product.Price)
|
err = fmt.Errorf("the payment's price: %f doesn't equal to the expected price: %f", notifyResult.Price, product.Price)
|
||||||
return payment, nil, err
|
return payment, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if payment.IsRecharge {
|
||||||
|
err = UpdateUserBalance(payment.Owner, payment.User, payment.Price)
|
||||||
|
return payment, notifyResult, err
|
||||||
|
}
|
||||||
|
|
||||||
return payment, notifyResult, nil
|
return payment, notifyResult, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,6 +222,19 @@ func NotifyPayment(body []byte, owner string, paymentName string) (*Payment, err
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transaction, err := GetTransaction(payment.GetId())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if transaction != nil {
|
||||||
|
transaction.State = payment.State
|
||||||
|
_, err = UpdateTransaction(transaction.GetId(), transaction)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return payment, nil
|
return payment, nil
|
||||||
|
@ -181,15 +181,15 @@ func UpdatePermission(id string, permission *Permission) (bool, error) {
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if oldPermission.Adapter != "" && oldPermission.Adapter != permission.Adapter {
|
// if oldPermission.Adapter != "" && oldPermission.Adapter != permission.Adapter {
|
||||||
isEmpty, _ := ormer.Engine.IsTableEmpty(oldPermission.Adapter)
|
// isEmpty, _ := ormer.Engine.IsTableEmpty(oldPermission.Adapter)
|
||||||
if isEmpty {
|
// if isEmpty {
|
||||||
err = ormer.Engine.DropTables(oldPermission.Adapter)
|
// err = ormer.Engine.DropTables(oldPermission.Adapter)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
return false, err
|
// return false, err
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
err = addGroupingPolicies(permission)
|
err = addGroupingPolicies(permission)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -312,15 +312,15 @@ func DeletePermission(permission *Permission) (bool, error) {
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if permission.Adapter != "" && permission.Adapter != "permission_rule" {
|
// if permission.Adapter != "" && permission.Adapter != "permission_rule" {
|
||||||
isEmpty, _ := ormer.Engine.IsTableEmpty(permission.Adapter)
|
// isEmpty, _ := ormer.Engine.IsTableEmpty(permission.Adapter)
|
||||||
if isEmpty {
|
// if isEmpty {
|
||||||
err = ormer.Engine.DropTables(permission.Adapter)
|
// err = ormer.Engine.DropTables(permission.Adapter)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
return false, err
|
// return false, err
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
return affected, nil
|
return affected, nil
|
||||||
|
@ -39,6 +39,7 @@ type Product struct {
|
|||||||
Price float64 `json:"price"`
|
Price float64 `json:"price"`
|
||||||
Quantity int `json:"quantity"`
|
Quantity int `json:"quantity"`
|
||||||
Sold int `json:"sold"`
|
Sold int `json:"sold"`
|
||||||
|
IsRecharge bool `json:"isRecharge"`
|
||||||
Providers []string `xorm:"varchar(255)" json:"providers"`
|
Providers []string `xorm:"varchar(255)" json:"providers"`
|
||||||
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
|
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
|
||||||
|
|
||||||
@ -160,7 +161,7 @@ func (product *Product) getProvider(providerName string) (*Provider, error) {
|
|||||||
return provider, nil
|
return provider, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func BuyProduct(id string, user *User, providerName, pricingName, planName, host, paymentEnv string) (payment *Payment, attachInfo map[string]interface{}, err error) {
|
func BuyProduct(id string, user *User, providerName, pricingName, planName, host, paymentEnv string, customPrice float64) (payment *Payment, attachInfo map[string]interface{}, err error) {
|
||||||
product, err := GetProduct(id)
|
product, err := GetProduct(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@ -169,6 +170,14 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
|
|||||||
return nil, nil, fmt.Errorf("the product: %s does not exist", id)
|
return nil, nil, fmt.Errorf("the product: %s does not exist", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if product.IsRecharge {
|
||||||
|
if customPrice <= 0 {
|
||||||
|
return nil, nil, fmt.Errorf("the custom price should bigger than zero")
|
||||||
|
} else {
|
||||||
|
product.Price = customPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
provider, err := product.getProvider(providerName)
|
provider, err := product.getProvider(providerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@ -218,13 +227,17 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
|
|||||||
NotifyUrl: notifyUrl,
|
NotifyUrl: notifyUrl,
|
||||||
PaymentEnv: paymentEnv,
|
PaymentEnv: paymentEnv,
|
||||||
}
|
}
|
||||||
|
|
||||||
// custom process for WeChat & WeChat Pay
|
// custom process for WeChat & WeChat Pay
|
||||||
if provider.Type == "WeChat Pay" {
|
if provider.Type == "WeChat Pay" {
|
||||||
payReq.PayerId, err = getUserExtraProperty(user, "WeChat", idp.BuildWechatOpenIdKey(provider.ClientId2))
|
payReq.PayerId, err = getUserExtraProperty(user, "WeChat", idp.BuildWechatOpenIdKey(provider.ClientId2))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
} else if provider.Type == "Balance" {
|
||||||
|
payReq.PayerId = user.GetId()
|
||||||
}
|
}
|
||||||
|
|
||||||
payResp, err := pProvider.Pay(payReq)
|
payResp, err := pProvider.Pay(payReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@ -246,6 +259,7 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
|
|||||||
Currency: product.Currency,
|
Currency: product.Currency,
|
||||||
Price: product.Price,
|
Price: product.Price,
|
||||||
ReturnUrl: product.ReturnUrl,
|
ReturnUrl: product.ReturnUrl,
|
||||||
|
IsRecharge: product.IsRecharge,
|
||||||
|
|
||||||
User: user.Name,
|
User: user.Name,
|
||||||
PayUrl: payResp.PayUrl,
|
PayUrl: payResp.PayUrl,
|
||||||
@ -254,8 +268,46 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
|
|||||||
OutOrderId: payResp.OrderId,
|
OutOrderId: payResp.OrderId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transaction := &Transaction{
|
||||||
|
Owner: payment.Owner,
|
||||||
|
Name: payment.Name,
|
||||||
|
DisplayName: payment.DisplayName,
|
||||||
|
Provider: provider.Name,
|
||||||
|
Category: provider.Category,
|
||||||
|
Type: provider.Type,
|
||||||
|
|
||||||
|
ProductName: product.Name,
|
||||||
|
ProductDisplayName: product.DisplayName,
|
||||||
|
Detail: product.Detail,
|
||||||
|
Tag: product.Tag,
|
||||||
|
Currency: product.Currency,
|
||||||
|
Amount: payment.Price,
|
||||||
|
ReturnUrl: payment.ReturnUrl,
|
||||||
|
|
||||||
|
User: payment.User,
|
||||||
|
Application: owner,
|
||||||
|
Payment: payment.GetId(),
|
||||||
|
|
||||||
|
State: pp.PaymentStateCreated,
|
||||||
|
}
|
||||||
|
|
||||||
if provider.Type == "Dummy" {
|
if provider.Type == "Dummy" {
|
||||||
payment.State = pp.PaymentStatePaid
|
payment.State = pp.PaymentStatePaid
|
||||||
|
err = UpdateUserBalance(user.Owner, user.Name, payment.Price)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
} else if provider.Type == "Balance" {
|
||||||
|
if product.Price > user.Balance {
|
||||||
|
return nil, nil, fmt.Errorf("insufficient user balance")
|
||||||
|
}
|
||||||
|
transaction.Amount = -transaction.Amount
|
||||||
|
err = UpdateUserBalance(user.Owner, user.Name, -product.Price)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
payment.State = pp.PaymentStatePaid
|
||||||
|
transaction.State = pp.PaymentStatePaid
|
||||||
}
|
}
|
||||||
|
|
||||||
affected, err := AddPayment(payment)
|
affected, err := AddPayment(payment)
|
||||||
@ -266,6 +318,17 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
|
|||||||
if !affected {
|
if !affected {
|
||||||
return nil, nil, fmt.Errorf("failed to add payment: %s", util.StructToJson(payment))
|
return nil, nil, fmt.Errorf("failed to add payment: %s", util.StructToJson(payment))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if product.IsRecharge || provider.Type == "Balance" {
|
||||||
|
affected, err = AddTransaction(transaction)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
if !affected {
|
||||||
|
return nil, nil, fmt.Errorf("failed to add transaction: %s", util.StructToJson(payment))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return payment, payResp.AttachInfo, nil
|
return payment, payResp.AttachInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,8 +367,9 @@ func CreateProductForPlan(plan *Plan) *Product {
|
|||||||
Price: plan.Price,
|
Price: plan.Price,
|
||||||
Currency: plan.Currency,
|
Currency: plan.Currency,
|
||||||
|
|
||||||
Quantity: 999,
|
Quantity: 999,
|
||||||
Sold: 0,
|
Sold: 0,
|
||||||
|
IsRecharge: false,
|
||||||
|
|
||||||
Providers: plan.PaymentProviders,
|
Providers: plan.PaymentProviders,
|
||||||
State: "Published",
|
State: "Published",
|
||||||
|
@ -309,6 +309,12 @@ func GetPaymentProvider(p *Provider) (pp.PaymentProvider, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return pp, nil
|
return pp, nil
|
||||||
|
} else if typ == "Balance" {
|
||||||
|
pp, err := pp.NewBalancePaymentProvider()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return pp, nil
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("the payment provider type: %s is not supported", p.Type)
|
return nil, fmt.Errorf("the payment provider type: %s is not supported", p.Type)
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,15 @@ type ClaimsShort struct {
|
|||||||
jwt.RegisteredClaims
|
jwt.RegisteredClaims
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OIDCAddress struct {
|
||||||
|
Formatted string `json:"formatted"`
|
||||||
|
StreetAddress string `json:"street_address"`
|
||||||
|
Locality string `json:"locality"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
PostalCode string `json:"postal_code"`
|
||||||
|
Country string `json:"country"`
|
||||||
|
}
|
||||||
|
|
||||||
type ClaimsWithoutThirdIdp struct {
|
type ClaimsWithoutThirdIdp struct {
|
||||||
*UserWithoutThirdIdp
|
*UserWithoutThirdIdp
|
||||||
TokenType string `json:"tokenType,omitempty"`
|
TokenType string `json:"tokenType,omitempty"`
|
||||||
@ -386,6 +395,13 @@ func generateJwtToken(application *Application, user *User, nonce string, scope
|
|||||||
refreshClaims["exp"] = jwt.NewNumericDate(refreshExpireTime)
|
refreshClaims["exp"] = jwt.NewNumericDate(refreshExpireTime)
|
||||||
refreshClaims["TokenType"] = "refresh-token"
|
refreshClaims["TokenType"] = "refresh-token"
|
||||||
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, refreshClaims)
|
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, refreshClaims)
|
||||||
|
} else if application.TokenFormat == "JWT-Standard" {
|
||||||
|
claimsStandard := getStandardClaims(claims)
|
||||||
|
|
||||||
|
token = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsStandard)
|
||||||
|
claimsStandard.ExpiresAt = jwt.NewNumericDate(refreshExpireTime)
|
||||||
|
claimsStandard.TokenType = "refresh-token"
|
||||||
|
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsStandard)
|
||||||
} else {
|
} else {
|
||||||
return "", "", "", fmt.Errorf("unknown application TokenFormat: %s", application.TokenFormat)
|
return "", "", "", fmt.Errorf("unknown application TokenFormat: %s", application.TokenFormat)
|
||||||
}
|
}
|
||||||
|
@ -309,12 +309,22 @@ func RefreshToken(grantType string, refreshToken string, scope string, clientId
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = ParseJwtToken(refreshToken, cert)
|
if application.TokenFormat == "JWT-Standard" {
|
||||||
if err != nil {
|
_, err = ParseStandardJwtToken(refreshToken, cert)
|
||||||
return &TokenError{
|
if err != nil {
|
||||||
Error: InvalidGrant,
|
return &TokenError{
|
||||||
ErrorDescription: fmt.Sprintf("parse refresh token error: %s", err.Error()),
|
Error: InvalidGrant,
|
||||||
}, nil
|
ErrorDescription: fmt.Sprintf("parse refresh token error: %s", err.Error()),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_, err = ParseJwtToken(refreshToken, cert)
|
||||||
|
if err != nil {
|
||||||
|
return &TokenError{
|
||||||
|
Error: InvalidGrant,
|
||||||
|
ErrorDescription: fmt.Sprintf("parse refresh token error: %s", err.Error()),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate a new token
|
// generate a new token
|
||||||
|
106
object/token_standard_jwt.go
Normal file
106
object/token_standard_jwt.go
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
// Copyright 2024 The Casdoor Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package object
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/golang-jwt/jwt/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClaimsStandard struct {
|
||||||
|
*UserShort
|
||||||
|
Gender string `json:"gender,omitempty"`
|
||||||
|
TokenType string `json:"tokenType,omitempty"`
|
||||||
|
Nonce string `json:"nonce,omitempty"`
|
||||||
|
Scope string `json:"scope,omitempty"`
|
||||||
|
Address OIDCAddress `json:"address,omitempty"`
|
||||||
|
|
||||||
|
jwt.RegisteredClaims
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStreetAddress(user *User) string {
|
||||||
|
var addrs string
|
||||||
|
for _, addr := range user.Address {
|
||||||
|
addrs += addr + "\n"
|
||||||
|
}
|
||||||
|
return addrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStandardClaims(claims Claims) ClaimsStandard {
|
||||||
|
res := ClaimsStandard{
|
||||||
|
UserShort: getShortUser(claims.User),
|
||||||
|
TokenType: claims.TokenType,
|
||||||
|
Nonce: claims.Nonce,
|
||||||
|
Scope: claims.Scope,
|
||||||
|
RegisteredClaims: claims.RegisteredClaims,
|
||||||
|
}
|
||||||
|
|
||||||
|
var scopes []string
|
||||||
|
|
||||||
|
if strings.Contains(claims.Scope, ",") {
|
||||||
|
scopes = strings.Split(claims.Scope, ",")
|
||||||
|
} else {
|
||||||
|
scopes = strings.Split(claims.Scope, " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, scope := range scopes {
|
||||||
|
if scope == "address" {
|
||||||
|
res.Address = OIDCAddress{StreetAddress: getStreetAddress(claims.User)}
|
||||||
|
} else if scope == "profile" {
|
||||||
|
res.Gender = claims.User.Gender
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseStandardJwtToken(token string, cert *Cert) (*ClaimsStandard, error) {
|
||||||
|
t, err := jwt.ParseWithClaims(token, &ClaimsStandard{}, func(token *jwt.Token) (interface{}, error) {
|
||||||
|
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
|
||||||
|
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||||
|
}
|
||||||
|
|
||||||
|
if cert.Certificate == "" {
|
||||||
|
return nil, fmt.Errorf("the certificate field should not be empty for the cert: %v", cert)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RSA certificate
|
||||||
|
certificate, err := jwt.ParseRSAPublicKeyFromPEM([]byte(cert.Certificate))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return certificate, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if t != nil {
|
||||||
|
if claims, ok := t.Claims.(*ClaimsStandard); ok && t.Valid {
|
||||||
|
return claims, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseStandardJwtTokenByApplication(token string, application *Application) (*ClaimsStandard, error) {
|
||||||
|
cert, err := getCertByApplication(application)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ParseStandardJwtToken(token, cert)
|
||||||
|
}
|
@ -17,6 +17,7 @@ package object
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/casdoor/casdoor/pp"
|
||||||
"github.com/casdoor/casdoor/util"
|
"github.com/casdoor/casdoor/util"
|
||||||
"github.com/xorm-io/core"
|
"github.com/xorm-io/core"
|
||||||
)
|
)
|
||||||
@ -43,7 +44,7 @@ type Transaction struct {
|
|||||||
Application string `xorm:"varchar(100)" json:"application"`
|
Application string `xorm:"varchar(100)" json:"application"`
|
||||||
Payment string `xorm:"varchar(100)" json:"payment"`
|
Payment string `xorm:"varchar(100)" json:"payment"`
|
||||||
|
|
||||||
State string `xorm:"varchar(100)" json:"state"`
|
State pp.PaymentState `xorm:"varchar(100)" json:"state"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetTransactionCount(owner, field, value string) (int64, error) {
|
func GetTransactionCount(owner, field, value string) (int64, error) {
|
||||||
|
@ -687,7 +687,7 @@ func UpdateUser(id string, user *User, columns []string, isAdmin bool) (bool, er
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if isAdmin {
|
if isAdmin {
|
||||||
columns = append(columns, "name", "id", "email", "phone", "country_code", "type")
|
columns = append(columns, "name", "id", "email", "phone", "country_code", "type", "balance")
|
||||||
}
|
}
|
||||||
|
|
||||||
columns = append(columns, "updated_time")
|
columns = append(columns, "updated_time")
|
||||||
@ -1157,3 +1157,13 @@ func GenerateIdForNewUser(application *Application) (string, error) {
|
|||||||
res := strconv.Itoa(lastUserId + 1)
|
res := strconv.Itoa(lastUserId + 1)
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UpdateUserBalance(owner string, name string, balance float64) error {
|
||||||
|
user, err := getUser(owner, name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
user.Balance += balance
|
||||||
|
_, err = UpdateUser(user.GetId(), user, []string{"balance"}, true)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
@ -416,6 +416,11 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
|
|||||||
itemsChanged = append(itemsChanged, item)
|
itemsChanged = append(itemsChanged, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if oldUser.Balance != newUser.Balance {
|
||||||
|
item := GetAccountItemByName("Balance", organization)
|
||||||
|
itemsChanged = append(itemsChanged, item)
|
||||||
|
}
|
||||||
|
|
||||||
if oldUser.Score != newUser.Score {
|
if oldUser.Score != newUser.Score {
|
||||||
item := GetAccountItemByName("Score", organization)
|
item := GetAccountItemByName("Score", organization)
|
||||||
itemsChanged = append(itemsChanged, item)
|
itemsChanged = append(itemsChanged, item)
|
||||||
|
50
pp/balance.go
Normal file
50
pp/balance.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// Copyright 2024 The Casdoor Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package pp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/casdoor/casdoor/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BalancePaymentProvider struct{}
|
||||||
|
|
||||||
|
func NewBalancePaymentProvider() (*BalancePaymentProvider, error) {
|
||||||
|
pp := &BalancePaymentProvider{}
|
||||||
|
return pp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pp *BalancePaymentProvider) Pay(r *PayReq) (*PayResp, error) {
|
||||||
|
owner, _ := util.GetOwnerAndNameFromId(r.PayerId)
|
||||||
|
return &PayResp{
|
||||||
|
PayUrl: r.ReturnUrl,
|
||||||
|
OrderId: fmt.Sprintf("%s/%s", owner, r.PaymentName),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pp *BalancePaymentProvider) Notify(body []byte, orderId string) (*NotifyResult, error) {
|
||||||
|
return &NotifyResult{
|
||||||
|
PaymentStatus: PaymentStatePaid,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pp *BalancePaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pp *BalancePaymentProvider) GetResponseError(err error) string {
|
||||||
|
return ""
|
||||||
|
}
|
@ -35,20 +35,13 @@ type Object struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getUsername(ctx *context.Context) (username string) {
|
func getUsername(ctx *context.Context) (username string) {
|
||||||
defer func() {
|
username, ok := ctx.Input.Session("username").(string)
|
||||||
if r := recover(); r != nil {
|
if !ok || username == "" {
|
||||||
username, _ = getUsernameByClientIdSecret(ctx)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
username = ctx.Input.Session("username").(string)
|
|
||||||
|
|
||||||
if username == "" {
|
|
||||||
username, _ = getUsernameByClientIdSecret(ctx)
|
username, _ = getUsernameByClientIdSecret(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
if username == "" {
|
if username == "" {
|
||||||
username = getUsernameByKeys(ctx)
|
username, _ = getUsernameByKeys(ctx)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -91,17 +91,22 @@ func getUsernameByClientIdSecret(ctx *context.Context) (string, error) {
|
|||||||
return fmt.Sprintf("app/%s", application.Name), nil
|
return fmt.Sprintf("app/%s", application.Name), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUsernameByKeys(ctx *context.Context) string {
|
func getUsernameByKeys(ctx *context.Context) (string, error) {
|
||||||
accessKey, accessSecret := getKeys(ctx)
|
accessKey, accessSecret := getKeys(ctx)
|
||||||
user, err := object.GetUserByAccessKey(accessKey)
|
user, err := object.GetUserByAccessKey(accessKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if user != nil && accessSecret == user.AccessSecret {
|
if user == nil {
|
||||||
return user.GetId()
|
return "", fmt.Errorf("user not found for access key: %s", accessKey)
|
||||||
}
|
}
|
||||||
return ""
|
|
||||||
|
if accessSecret != user.AccessSecret {
|
||||||
|
return "", fmt.Errorf("incorrect access secret for user: %s", user.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return user.GetId(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSessionUser(ctx *context.Context) string {
|
func getSessionUser(ctx *context.Context) string {
|
||||||
|
@ -252,8 +252,8 @@ class AdapterEditPage extends React.Component {
|
|||||||
{Setting.getLabel(i18next.t("provider:DB test"), i18next.t("provider:DB test - Tooltip"))} :
|
{Setting.getLabel(i18next.t("provider:DB test"), i18next.t("provider:DB test - Tooltip"))} :
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={2} >
|
<Col span={2} >
|
||||||
<Button type={"primary"} onClick={() => {
|
<Button disabled={this.state.organizationName !== this.state.adapter.owner} type={"primary"} onClick={() => {
|
||||||
AdapterBackend.getPolicies("", "", `${this.state.organizationName}/${this.state.adapterName}`)
|
AdapterBackend.getPolicies("", "", `${this.state.adapter.owner}/${this.state.adapter.name}`)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status === "ok") {
|
if (res.status === "ok") {
|
||||||
Setting.showMessage("success", i18next.t("syncer:Connect successfully"));
|
Setting.showMessage("success", i18next.t("syncer:Connect successfully"));
|
||||||
@ -279,13 +279,14 @@ class AdapterEditPage extends React.Component {
|
|||||||
if (res.status === "ok") {
|
if (res.status === "ok") {
|
||||||
Setting.showMessage("success", i18next.t("general:Successfully saved"));
|
Setting.showMessage("success", i18next.t("general:Successfully saved"));
|
||||||
this.setState({
|
this.setState({
|
||||||
|
organizationName: this.state.adapter.owner,
|
||||||
adapterName: this.state.adapter.name,
|
adapterName: this.state.adapter.name,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (exitAfterSave) {
|
if (exitAfterSave) {
|
||||||
this.props.history.push("/adapters");
|
this.props.history.push("/adapters");
|
||||||
} else {
|
} else {
|
||||||
this.props.history.push(`/adapters/${this.state.organizationName}/${this.state.adapter.name}`);
|
this.props.history.push(`/adapters/${this.state.adapter.owner}/${this.state.adapter.name}`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`);
|
Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`);
|
||||||
|
@ -16,6 +16,7 @@ import React, {Component, Suspense, lazy} from "react";
|
|||||||
import "./App.less";
|
import "./App.less";
|
||||||
import {Helmet} from "react-helmet";
|
import {Helmet} from "react-helmet";
|
||||||
import * as Setting from "./Setting";
|
import * as Setting from "./Setting";
|
||||||
|
import {setOrgIsTourVisible, setTourLogo} from "./TourConfig";
|
||||||
import {StyleProvider, legacyLogicalPropertiesTransformer} from "@ant-design/cssinjs";
|
import {StyleProvider, legacyLogicalPropertiesTransformer} from "@ant-design/cssinjs";
|
||||||
import {GithubOutlined, InfoCircleFilled, ShareAltOutlined} from "@ant-design/icons";
|
import {GithubOutlined, InfoCircleFilled, ShareAltOutlined} from "@ant-design/icons";
|
||||||
import {Alert, Button, ConfigProvider, Drawer, FloatButton, Layout, Result, Tooltip} from "antd";
|
import {Alert, Button, ConfigProvider, Drawer, FloatButton, Layout, Result, Tooltip} from "antd";
|
||||||
@ -247,6 +248,8 @@ class App extends Component {
|
|||||||
|
|
||||||
this.setLanguage(account);
|
this.setLanguage(account);
|
||||||
this.setTheme(Setting.getThemeData(account.organization), Conf.InitThemeAlgorithm);
|
this.setTheme(Setting.getThemeData(account.organization), Conf.InitThemeAlgorithm);
|
||||||
|
setTourLogo(account.organization.logo);
|
||||||
|
setOrgIsTourVisible(account.organization.enableTour);
|
||||||
} else {
|
} else {
|
||||||
if (res.data !== "Please login first") {
|
if (res.data !== "Please login first") {
|
||||||
Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`);
|
Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`);
|
||||||
|
@ -384,7 +384,7 @@ class ApplicationEditPage extends React.Component {
|
|||||||
</Col>
|
</Col>
|
||||||
<Col span={22} >
|
<Col span={22} >
|
||||||
<Select virtual={false} style={{width: "100%"}} value={this.state.application.tokenFormat} onChange={(value => {this.updateApplicationField("tokenFormat", value);})}
|
<Select virtual={false} style={{width: "100%"}} value={this.state.application.tokenFormat} onChange={(value => {this.updateApplicationField("tokenFormat", value);})}
|
||||||
options={["JWT", "JWT-Empty", "JWT-Custom"].map((item) => Setting.getOption(item, item))}
|
options={["JWT", "JWT-Empty", "JWT-Custom", "JWT-Standard"].map((item) => Setting.getOption(item, item))}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
@ -436,6 +436,26 @@ class OrganizationEditPage extends React.Component {
|
|||||||
}} />
|
}} />
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("organization:Use Email as username"), i18next.t("organization:Use Email as username - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={1} >
|
||||||
|
<Switch checked={this.state.organization.useEmailAsUsername} onChange={checked => {
|
||||||
|
this.updateOrganizationField("useEmailAsUsername", checked);
|
||||||
|
}} />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("general:Enable tour"), i18next.t("general:Enable tour - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={1} >
|
||||||
|
<Switch checked={this.state.organization.enableTour} onChange={checked => {
|
||||||
|
this.updateOrganizationField("enableTour", checked);
|
||||||
|
}} />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{Setting.getLabel(i18next.t("organization:Account items"), i18next.t("organization:Account items - Tooltip"))} :
|
{Setting.getLabel(i18next.t("organization:Account items"), i18next.t("organization:Account items - Tooltip"))} :
|
||||||
|
@ -44,6 +44,7 @@ class OrganizationListPage extends BaseListPage {
|
|||||||
defaultPassword: "",
|
defaultPassword: "",
|
||||||
enableSoftDeletion: false,
|
enableSoftDeletion: false,
|
||||||
isProfilePublic: true,
|
isProfilePublic: true,
|
||||||
|
enableTour: true,
|
||||||
accountItems: [
|
accountItems: [
|
||||||
{name: "Organization", visible: true, viewRule: "Public", modifyRule: "Admin"},
|
{name: "Organization", visible: true, viewRule: "Public", modifyRule: "Admin"},
|
||||||
{name: "ID", visible: true, viewRule: "Public", modifyRule: "Immutable"},
|
{name: "ID", visible: true, viewRule: "Public", modifyRule: "Immutable"},
|
||||||
|
@ -17,6 +17,7 @@ import {Button, Result, Spin} from "antd";
|
|||||||
import * as PaymentBackend from "./backend/PaymentBackend";
|
import * as PaymentBackend from "./backend/PaymentBackend";
|
||||||
import * as PricingBackend from "./backend/PricingBackend";
|
import * as PricingBackend from "./backend/PricingBackend";
|
||||||
import * as SubscriptionBackend from "./backend/SubscriptionBackend";
|
import * as SubscriptionBackend from "./backend/SubscriptionBackend";
|
||||||
|
import * as UserBackend from "./backend/UserBackend";
|
||||||
import * as Setting from "./Setting";
|
import * as Setting from "./Setting";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
|
|
||||||
@ -34,6 +35,7 @@ class PaymentResultPage extends React.Component {
|
|||||||
pricing: props.pricing ?? null,
|
pricing: props.pricing ?? null,
|
||||||
subscription: props.subscription ?? null,
|
subscription: props.subscription ?? null,
|
||||||
timeout: null,
|
timeout: null,
|
||||||
|
user: null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,6 +43,25 @@ class PaymentResultPage extends React.Component {
|
|||||||
this.getPayment();
|
this.getPayment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getUser() {
|
||||||
|
UserBackend.getUser(this.props.account.owner, this.props.account.name)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.data === null) {
|
||||||
|
this.props.history.push("/404");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.status === "error") {
|
||||||
|
Setting.showMessage("error", res.msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
user: res.data,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
if (this.state.timeout !== null) {
|
if (this.state.timeout !== null) {
|
||||||
clearTimeout(this.state.timeout);
|
clearTimeout(this.state.timeout);
|
||||||
@ -101,7 +122,7 @@ class PaymentResultPage extends React.Component {
|
|||||||
payment: payment,
|
payment: payment,
|
||||||
});
|
});
|
||||||
if (payment.state === "Created") {
|
if (payment.state === "Created") {
|
||||||
if (["PayPal", "Stripe", "Alipay", "WeChat Pay"].includes(payment.type)) {
|
if (["PayPal", "Stripe", "Alipay", "WeChat Pay", "Balance"].includes(payment.type)) {
|
||||||
this.setState({
|
this.setState({
|
||||||
timeout: setTimeout(async() => {
|
timeout: setTimeout(async() => {
|
||||||
await PaymentBackend.notifyPayment(this.state.owner, this.state.paymentName);
|
await PaymentBackend.notifyPayment(this.state.owner, this.state.paymentName);
|
||||||
@ -114,6 +135,12 @@ class PaymentResultPage extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (payment.state === "Paid") {
|
||||||
|
if (this.props.account) {
|
||||||
|
this.getUser();
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
Setting.showMessage("error", err.message);
|
Setting.showMessage("error", err.message);
|
||||||
return;
|
return;
|
||||||
@ -136,6 +163,27 @@ class PaymentResultPage extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (payment.state === "Paid") {
|
if (payment.state === "Paid") {
|
||||||
|
if (payment.isRecharge) {
|
||||||
|
return (
|
||||||
|
<div className="login-content">
|
||||||
|
{
|
||||||
|
Setting.renderHelmet(payment)
|
||||||
|
}
|
||||||
|
<Result
|
||||||
|
status="success"
|
||||||
|
title={`${i18next.t("payment:Recharged successfully")}`}
|
||||||
|
subTitle={`${i18next.t("payment:You have successfully recharged")} ${payment.price} ${Setting.getCurrencyText(payment)}, ${i18next.t("payment:Your current balance is")} ${this.state.user?.balance} ${Setting.getCurrencyText(payment)}`}
|
||||||
|
extra={[
|
||||||
|
<Button type="primary" key="returnUrl" onClick={() => {
|
||||||
|
this.goToPaymentUrl(payment);
|
||||||
|
}}>
|
||||||
|
{i18next.t("payment:Return to Website")}
|
||||||
|
</Button>,
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div className="login-content">
|
<div className="login-content">
|
||||||
{
|
{
|
||||||
|
@ -487,6 +487,7 @@ class PermissionEditPage extends React.Component {
|
|||||||
if (res.status === "ok") {
|
if (res.status === "ok") {
|
||||||
Setting.showMessage("success", i18next.t("general:Successfully saved"));
|
Setting.showMessage("success", i18next.t("general:Successfully saved"));
|
||||||
this.setState({
|
this.setState({
|
||||||
|
organizationName: this.state.permission.owner,
|
||||||
permissionName: this.state.permission.name,
|
permissionName: this.state.permission.name,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import {Button, Descriptions, Spin} from "antd";
|
import {Button, Descriptions, InputNumber, Space, Spin} from "antd";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import * as ProductBackend from "./backend/ProductBackend";
|
import * as ProductBackend from "./backend/ProductBackend";
|
||||||
import * as PlanBackend from "./backend/PlanBackend";
|
import * as PlanBackend from "./backend/PlanBackend";
|
||||||
@ -36,6 +36,7 @@ class ProductBuyPage extends React.Component {
|
|||||||
pricing: props?.pricing ?? null,
|
pricing: props?.pricing ?? null,
|
||||||
plan: null,
|
plan: null,
|
||||||
isPlacingOrder: false,
|
isPlacingOrder: false,
|
||||||
|
customPrice: 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,18 +128,8 @@ class ProductBuyPage extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getCurrencyText(product) {
|
|
||||||
if (product?.currency === "USD") {
|
|
||||||
return i18next.t("product:USD");
|
|
||||||
} else if (product?.currency === "CNY") {
|
|
||||||
return i18next.t("product:CNY");
|
|
||||||
} else {
|
|
||||||
return "(Unknown currency)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getPrice(product) {
|
getPrice(product) {
|
||||||
return `${this.getCurrencySymbol(product)}${product?.price} (${this.getCurrencyText(product)})`;
|
return `${this.getCurrencySymbol(product)}${product?.price} (${Setting.getCurrencyText(product)})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call Weechat Pay via jsapi
|
// Call Weechat Pay via jsapi
|
||||||
@ -192,7 +183,7 @@ class ProductBuyPage extends React.Component {
|
|||||||
isPlacingOrder: true,
|
isPlacingOrder: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
ProductBackend.buyProduct(product.owner, product.name, provider.name, this.state.pricingName ?? "", this.state.planName ?? "", this.state.userName ?? "", this.state.paymentEnv)
|
ProductBackend.buyProduct(product.owner, product.name, provider.name, this.state.pricingName ?? "", this.state.planName ?? "", this.state.userName ?? "", this.state.paymentEnv, this.state.customPrice)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status === "ok") {
|
if (res.status === "ok") {
|
||||||
const payment = res.data;
|
const payment = res.data;
|
||||||
@ -295,15 +286,27 @@ class ProductBuyPage extends React.Component {
|
|||||||
<Descriptions.Item label={i18next.t("product:Image")} span={3}>
|
<Descriptions.Item label={i18next.t("product:Image")} span={3}>
|
||||||
<img src={product?.image} alt={product?.name} height={90} style={{marginBottom: "20px"}} />
|
<img src={product?.image} alt={product?.name} height={90} style={{marginBottom: "20px"}} />
|
||||||
</Descriptions.Item>
|
</Descriptions.Item>
|
||||||
<Descriptions.Item label={i18next.t("product:Price")}>
|
{
|
||||||
<span style={{fontSize: 28, color: "red", fontWeight: "bold"}}>
|
product.isRecharge ? (
|
||||||
{
|
<Descriptions.Item span={3} label={i18next.t("product:Price")}>
|
||||||
this.getPrice(product)
|
<Space>
|
||||||
}
|
<InputNumber min={0} value={this.state.customPrice} onChange={(e) => {this.setState({customPrice: e});}} /> {Setting.getCurrencyText(product)}
|
||||||
</span>
|
</Space>
|
||||||
</Descriptions.Item>
|
</Descriptions.Item>
|
||||||
<Descriptions.Item label={i18next.t("product:Quantity")}><span style={{fontSize: 16}}>{product?.quantity}</span></Descriptions.Item>
|
) : (
|
||||||
<Descriptions.Item label={i18next.t("product:Sold")}><span style={{fontSize: 16}}>{product?.sold}</span></Descriptions.Item>
|
<React.Fragment>
|
||||||
|
<Descriptions.Item label={i18next.t("product:Price")}>
|
||||||
|
<span style={{fontSize: 28, color: "red", fontWeight: "bold"}}>
|
||||||
|
{
|
||||||
|
this.getPrice(product)
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label={i18next.t("product:Quantity")}><span style={{fontSize: 16}}>{product?.quantity}</span></Descriptions.Item>
|
||||||
|
<Descriptions.Item label={i18next.t("product:Sold")}><span style={{fontSize: 16}}>{product?.sold}</span></Descriptions.Item>
|
||||||
|
</React.Fragment>
|
||||||
|
)
|
||||||
|
}
|
||||||
<Descriptions.Item label={i18next.t("product:Pay")} span={3}>
|
<Descriptions.Item label={i18next.t("product:Pay")} span={3}>
|
||||||
{
|
{
|
||||||
this.renderPay(product)
|
this.renderPay(product)
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import {Button, Card, Col, Input, InputNumber, Row, Select} from "antd";
|
import {Button, Card, Col, Input, InputNumber, Row, Select, Switch} from "antd";
|
||||||
import * as ProductBackend from "./backend/ProductBackend";
|
import * as ProductBackend from "./backend/ProductBackend";
|
||||||
import * as Setting from "./Setting";
|
import * as Setting from "./Setting";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
@ -216,14 +216,27 @@ class ProductEditPage extends React.Component {
|
|||||||
</Row>
|
</Row>
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{Setting.getLabel(i18next.t("product:Price"), i18next.t("product:Price - Tooltip"))} :
|
{Setting.getLabel(i18next.t("product:Is recharge"), i18next.t("product:Is recharge - Tooltip"))} :
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={22} >
|
<Col span={22} >
|
||||||
<InputNumber value={this.state.product.price} disabled={isCreatedByPlan} onChange={value => {
|
<Switch checked={this.state.product.isRecharge} onChange={value => {
|
||||||
this.updateProductField("price", value);
|
this.updateProductField("isRecharge", value);
|
||||||
}} />
|
}} />
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
{
|
||||||
|
this.state.product.isRecharge ? null : (
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("product:Price"), i18next.t("product:Price - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={22} >
|
||||||
|
<InputNumber value={this.state.product.price} disabled={isCreatedByPlan} onChange={value => {
|
||||||
|
this.updateProductField("price", value);
|
||||||
|
}} />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
)}
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{Setting.getLabel(i18next.t("product:Quantity"), i18next.t("product:Quantity - Tooltip"))} :
|
{Setting.getLabel(i18next.t("product:Quantity"), i18next.t("product:Quantity - Tooltip"))} :
|
||||||
|
@ -38,6 +38,7 @@ class ProductListPage extends BaseListPage {
|
|||||||
price: 300,
|
price: 300,
|
||||||
quantity: 99,
|
quantity: 99,
|
||||||
sold: 10,
|
sold: 10,
|
||||||
|
isRecharge: false,
|
||||||
providers: [],
|
providers: [],
|
||||||
state: "Published",
|
state: "Published",
|
||||||
};
|
};
|
||||||
|
@ -725,7 +725,7 @@ class ProviderEditPage extends React.Component {
|
|||||||
(this.state.provider.category === "Web3") ||
|
(this.state.provider.category === "Web3") ||
|
||||||
(this.state.provider.category === "Storage" && this.state.provider.type === "Local File System") ||
|
(this.state.provider.category === "Storage" && this.state.provider.type === "Local File System") ||
|
||||||
(this.state.provider.category === "SMS" && this.state.provider.type === "Custom HTTP SMS") ||
|
(this.state.provider.category === "SMS" && this.state.provider.type === "Custom HTTP SMS") ||
|
||||||
(this.state.provider.category === "Notification" && (this.state.provider.type === "Google Chat" || this.state.provider.type === "Custom HTTP")) ? null : (
|
(this.state.provider.category === "Notification" && (this.state.provider.type === "Google Chat" || this.state.provider.type === "Custom HTTP") || this.state.provider.type === "Balance") ? null : (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
{
|
{
|
||||||
(this.state.provider.category === "Storage" && this.state.provider.type === "Google Cloud Storage") ||
|
(this.state.provider.category === "Storage" && this.state.provider.type === "Google Cloud Storage") ||
|
||||||
|
@ -247,6 +247,10 @@ export const OtherProviderInfo = {
|
|||||||
logo: `${StaticBaseUrl}/img/payment_paypal.png`,
|
logo: `${StaticBaseUrl}/img/payment_paypal.png`,
|
||||||
url: "",
|
url: "",
|
||||||
},
|
},
|
||||||
|
"Balance": {
|
||||||
|
logo: `${StaticBaseUrl}/img/payment_balance.svg`,
|
||||||
|
url: "",
|
||||||
|
},
|
||||||
"Alipay": {
|
"Alipay": {
|
||||||
logo: `${StaticBaseUrl}/img/payment_alipay.png`,
|
logo: `${StaticBaseUrl}/img/payment_alipay.png`,
|
||||||
url: "https://www.alipay.com/",
|
url: "https://www.alipay.com/",
|
||||||
@ -1067,6 +1071,7 @@ export function getProviderTypeOptions(category) {
|
|||||||
} else if (category === "Payment") {
|
} else if (category === "Payment") {
|
||||||
return ([
|
return ([
|
||||||
{id: "Dummy", name: "Dummy"},
|
{id: "Dummy", name: "Dummy"},
|
||||||
|
{id: "Balance", name: "Balance"},
|
||||||
{id: "Alipay", name: "Alipay"},
|
{id: "Alipay", name: "Alipay"},
|
||||||
{id: "WeChat Pay", name: "WeChat Pay"},
|
{id: "WeChat Pay", name: "WeChat Pay"},
|
||||||
{id: "PayPal", name: "PayPal"},
|
{id: "PayPal", name: "PayPal"},
|
||||||
@ -1516,3 +1521,13 @@ export function getDefaultHtmlEmailContent() {
|
|||||||
</body>
|
</body>
|
||||||
</html>`;
|
</html>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getCurrencyText(product) {
|
||||||
|
if (product?.currency === "USD") {
|
||||||
|
return i18next.t("product:USD");
|
||||||
|
} else if (product?.currency === "CNY") {
|
||||||
|
return i18next.t("product:CNY");
|
||||||
|
} else {
|
||||||
|
return "(Unknown currency)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -203,13 +203,24 @@ export function getNextUrl(pathName = window.location.pathname) {
|
|||||||
return TourUrlList[TourUrlList.indexOf(pathName.replace("/", "")) + 1] || "";
|
return TourUrlList[TourUrlList.indexOf(pathName.replace("/", "")) + 1] || "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let orgIsTourVisible = true;
|
||||||
|
|
||||||
|
export function setOrgIsTourVisible(visible) {
|
||||||
|
orgIsTourVisible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
export function setIsTourVisible(visible) {
|
export function setIsTourVisible(visible) {
|
||||||
localStorage.setItem("isTourVisible", visible);
|
localStorage.setItem("isTourVisible", visible);
|
||||||
window.dispatchEvent(new Event("storageTourChanged"));
|
}
|
||||||
|
|
||||||
|
export function setTourLogo(tourLogoSrc) {
|
||||||
|
if (tourLogoSrc !== "") {
|
||||||
|
TourObj["home"][0]["cover"] = (<img alt="casdoor.png" src={tourLogoSrc} />);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTourVisible() {
|
export function getTourVisible() {
|
||||||
return localStorage.getItem("isTourVisible") !== "false";
|
return localStorage.getItem("isTourVisible") !== "false" && orgIsTourVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getNextButtonChild(nextPathName) {
|
export function getNextButtonChild(nextPathName) {
|
||||||
|
@ -707,6 +707,19 @@ class UserEditPage extends React.Component {
|
|||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
);
|
);
|
||||||
|
} else if (accountItem.name === "Balance") {
|
||||||
|
return (
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("user:Balance"), i18next.t("user:Balance - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={22} >
|
||||||
|
<InputNumber value={this.state.user.balance} onChange={value => {
|
||||||
|
this.updateUserField("balance", value);
|
||||||
|
}} />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
);
|
||||||
} else if (accountItem.name === "Score") {
|
} else if (accountItem.name === "Score") {
|
||||||
return (
|
return (
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
@ -70,8 +70,8 @@ export function deleteProduct(product) {
|
|||||||
}).then(res => res.json());
|
}).then(res => res.json());
|
||||||
}
|
}
|
||||||
|
|
||||||
export function buyProduct(owner, name, providerName, pricingName = "", planName = "", userName = "", paymentEnv = "") {
|
export function buyProduct(owner, name, providerName, pricingName = "", planName = "", userName = "", paymentEnv = "", customPrice = 0) {
|
||||||
return fetch(`${Setting.ServerUrl}/api/buy-product?id=${owner}/${encodeURIComponent(name)}&providerName=${providerName}&pricingName=${pricingName}&planName=${planName}&userName=${userName}&paymentEnv=${paymentEnv}`, {
|
return fetch(`${Setting.ServerUrl}/api/buy-product?id=${owner}/${encodeURIComponent(name)}&providerName=${providerName}&pricingName=${pricingName}&planName=${planName}&userName=${userName}&paymentEnv=${paymentEnv}&customPrice=${customPrice}`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
credentials: "include",
|
credentials: "include",
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Wenn aktiviert, werden gelöschte Benutzer nicht vollständig aus der Datenbank entfernt. Stattdessen werden sie als gelöscht markiert",
|
"Soft deletion - Tooltip": "Wenn aktiviert, werden gelöschte Benutzer nicht vollständig aus der Datenbank entfernt. Stattdessen werden sie als gelöscht markiert",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Sammlung von Tags, die für Benutzer zur Auswahl zur Verfügung stehen",
|
"Tags - Tooltip": "Sammlung von Tags, die für Benutzer zur Auswahl zur Verfügung stehen",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Ansichtsregel",
|
"View rule": "Ansichtsregel",
|
||||||
"Visible": "Sichtbar",
|
"Visible": "Sichtbar",
|
||||||
"Website URL": "Website-URL",
|
"Website URL": "Website-URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "In Bearbeitung...",
|
"Processing...": "In Bearbeitung...",
|
||||||
"Product": "Produkt",
|
"Product": "Produkt",
|
||||||
"Product - Tooltip": "Produktname",
|
"Product - Tooltip": "Produktname",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Ergebnis",
|
"Result": "Ergebnis",
|
||||||
"Return to Website": "Zurück zur Website",
|
"Return to Website": "Zurück zur Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "Die Zahlung wird immer noch bearbeitet",
|
"The payment is still under processing": "Die Zahlung wird immer noch bearbeitet",
|
||||||
"Type - Tooltip": "Zahlungsmethode, die beim Kauf des Produkts verwendet wurde",
|
"Type - Tooltip": "Zahlungsmethode, die beim Kauf des Produkts verwendet wurde",
|
||||||
"You have successfully completed the payment": "Sie haben die Zahlung erfolgreich abgeschlossen",
|
"You have successfully completed the payment": "Sie haben die Zahlung erfolgreich abgeschlossen",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "Bitte warten Sie ein paar Sekunden...",
|
"please wait for a few seconds...": "Bitte warten Sie ein paar Sekunden...",
|
||||||
"the current state is": "der aktuelle Zustand ist"
|
"the current state is": "der aktuelle Zustand ist"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Produkt bearbeiten",
|
"Edit Product": "Produkt bearbeiten",
|
||||||
"Image": "Bild",
|
"Image": "Bild",
|
||||||
"Image - Tooltip": "Bild des Produkts",
|
"Image - Tooltip": "Bild des Produkts",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Neues Produkt",
|
"New Product": "Neues Produkt",
|
||||||
"Pay": "Zahlen",
|
"Pay": "Zahlen",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Zugehörigkeit",
|
"Affiliation": "Zugehörigkeit",
|
||||||
"Affiliation - Tooltip": "Arbeitgeber, wie Firmenname oder Organisationsname",
|
"Affiliation - Tooltip": "Arbeitgeber, wie Firmenname oder Organisationsname",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Selbstvorstellung des Nutzers",
|
"Bio - Tooltip": "Selbstvorstellung des Nutzers",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Cuando se habilita, la eliminación de usuarios no los eliminará por completo de la base de datos. En su lugar, se marcarán como eliminados",
|
"Soft deletion - Tooltip": "Cuando se habilita, la eliminación de usuarios no los eliminará por completo de la base de datos. En su lugar, se marcarán como eliminados",
|
||||||
"Tags": "Etiquetas",
|
"Tags": "Etiquetas",
|
||||||
"Tags - Tooltip": "Colección de etiquetas disponibles para que los usuarios elijan",
|
"Tags - Tooltip": "Colección de etiquetas disponibles para que los usuarios elijan",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Regla de visualización",
|
"View rule": "Regla de visualización",
|
||||||
"Visible": "Visible - Visible",
|
"Visible": "Visible - Visible",
|
||||||
"Website URL": "URL del sitio web",
|
"Website URL": "URL del sitio web",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Procesando...",
|
"Processing...": "Procesando...",
|
||||||
"Product": "Producto",
|
"Product": "Producto",
|
||||||
"Product - Tooltip": "Nombre del producto",
|
"Product - Tooltip": "Nombre del producto",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Resultado",
|
"Result": "Resultado",
|
||||||
"Return to Website": "Regresar al sitio web",
|
"Return to Website": "Regresar al sitio web",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "El pago aún está en proceso",
|
"The payment is still under processing": "El pago aún está en proceso",
|
||||||
"Type - Tooltip": "Método de pago utilizado al comprar el producto",
|
"Type - Tooltip": "Método de pago utilizado al comprar el producto",
|
||||||
"You have successfully completed the payment": "Has completado el pago exitosamente",
|
"You have successfully completed the payment": "Has completado el pago exitosamente",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "Por favor espera unos segundos...",
|
"please wait for a few seconds...": "Por favor espera unos segundos...",
|
||||||
"the current state is": "el estado actual es"
|
"the current state is": "el estado actual es"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Editar Producto",
|
"Edit Product": "Editar Producto",
|
||||||
"Image": "Imagen",
|
"Image": "Imagen",
|
||||||
"Image - Tooltip": "Imagen del producto",
|
"Image - Tooltip": "Imagen del producto",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Nuevo producto",
|
"New Product": "Nuevo producto",
|
||||||
"Pay": "Pagar",
|
"Pay": "Pagar",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Afiliación",
|
"Affiliation": "Afiliación",
|
||||||
"Affiliation - Tooltip": "Empleador, como el nombre de una empresa u organización",
|
"Affiliation - Tooltip": "Empleador, como el nombre de una empresa u organización",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio - Biografía",
|
"Bio": "Bio - Biografía",
|
||||||
"Bio - Tooltip": "Introducción personal del usuario",
|
"Bio - Tooltip": "Introducción personal del usuario",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Lorsque c'est activée, la suppression de compte ne les retirera pas complètement de la base de données. Au lieu de cela, ils seront marqués comme supprimés",
|
"Soft deletion - Tooltip": "Lorsque c'est activée, la suppression de compte ne les retirera pas complètement de la base de données. Au lieu de cela, ils seront marqués comme supprimés",
|
||||||
"Tags": "Étiquettes",
|
"Tags": "Étiquettes",
|
||||||
"Tags - Tooltip": "Collection d'étiquettes disponibles pour les comptes",
|
"Tags - Tooltip": "Collection d'étiquettes disponibles pour les comptes",
|
||||||
|
"Use Email as username": "Utiliser l'e-mail comme identifiant",
|
||||||
|
"Use Email as username - Tooltip": "Utiliser l'adresse e-mail comme identifiant pour les comptes lorsque l'identifiant ne fait pas partie des champs d'inscription",
|
||||||
"View rule": "Règle de visibilité",
|
"View rule": "Règle de visibilité",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "URL du site web",
|
"Website URL": "URL du site web",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Traitement...",
|
"Processing...": "Traitement...",
|
||||||
"Product": "Produit",
|
"Product": "Produit",
|
||||||
"Product - Tooltip": "Nom du produit",
|
"Product - Tooltip": "Nom du produit",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Résultat",
|
"Result": "Résultat",
|
||||||
"Return to Website": "Retourner sur le site web",
|
"Return to Website": "Retourner sur le site web",
|
||||||
"The payment has been canceled": "Le paiement a été annulé",
|
"The payment has been canceled": "Le paiement a été annulé",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "Le paiement est encore en cours de traitement",
|
"The payment is still under processing": "Le paiement est encore en cours de traitement",
|
||||||
"Type - Tooltip": "Méthode de paiement utilisée lors de l'achat du produit",
|
"Type - Tooltip": "Méthode de paiement utilisée lors de l'achat du produit",
|
||||||
"You have successfully completed the payment": "Vous avez effectué le paiement avec succès",
|
"You have successfully completed the payment": "Vous avez effectué le paiement avec succès",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "Veuillez patienter quelques secondes...",
|
"please wait for a few seconds...": "Veuillez patienter quelques secondes...",
|
||||||
"the current state is": "l'état actuel est"
|
"the current state is": "l'état actuel est"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Modifier le produit",
|
"Edit Product": "Modifier le produit",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image du produit",
|
"Image - Tooltip": "Image du produit",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Nouveau produit",
|
"New Product": "Nouveau produit",
|
||||||
"Pay": "Payer",
|
"Pay": "Payer",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employeur, tel que le nom de l'entreprise ou de l'organisation",
|
"Affiliation - Tooltip": "Employeur, tel que le nom de l'entreprise ou de l'organisation",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Biographie du compte",
|
"Bio - Tooltip": "Biographie du compte",
|
||||||
"Birthday": "Date de naissance",
|
"Birthday": "Date de naissance",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Ketika diaktifkan, menghapus pengguna tidak akan sepenuhnya menghapus mereka dari database. Sebaliknya, mereka akan ditandai sebagai dihapus",
|
"Soft deletion - Tooltip": "Ketika diaktifkan, menghapus pengguna tidak akan sepenuhnya menghapus mereka dari database. Sebaliknya, mereka akan ditandai sebagai dihapus",
|
||||||
"Tags": "Tag-tag",
|
"Tags": "Tag-tag",
|
||||||
"Tags - Tooltip": "Kumpulan tag yang tersedia bagi pengguna untuk dipilih",
|
"Tags - Tooltip": "Kumpulan tag yang tersedia bagi pengguna untuk dipilih",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Aturan tampilan",
|
"View rule": "Aturan tampilan",
|
||||||
"Visible": "Terlihat",
|
"Visible": "Terlihat",
|
||||||
"Website URL": "URL situs web",
|
"Website URL": "URL situs web",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Pemrosesan...",
|
"Processing...": "Pemrosesan...",
|
||||||
"Product": "Produk",
|
"Product": "Produk",
|
||||||
"Product - Tooltip": "Nama Produk",
|
"Product - Tooltip": "Nama Produk",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Hasil",
|
"Result": "Hasil",
|
||||||
"Return to Website": "Kembali ke Situs Web",
|
"Return to Website": "Kembali ke Situs Web",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "Pembayaran masih dalam proses",
|
"The payment is still under processing": "Pembayaran masih dalam proses",
|
||||||
"Type - Tooltip": "Metode pembayaran yang digunakan saat membeli produk",
|
"Type - Tooltip": "Metode pembayaran yang digunakan saat membeli produk",
|
||||||
"You have successfully completed the payment": "Anda telah berhasil menyelesaikan pembayaran",
|
"You have successfully completed the payment": "Anda telah berhasil menyelesaikan pembayaran",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "Mohon tunggu beberapa detik...",
|
"please wait for a few seconds...": "Mohon tunggu beberapa detik...",
|
||||||
"the current state is": "keadaan saat ini adalah"
|
"the current state is": "keadaan saat ini adalah"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Produk",
|
"Edit Product": "Edit Produk",
|
||||||
"Image": "Gambar",
|
"Image": "Gambar",
|
||||||
"Image - Tooltip": "Gambar produk",
|
"Image - Tooltip": "Gambar produk",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Produk Baru",
|
"New Product": "Produk Baru",
|
||||||
"Pay": "Bayar",
|
"Pay": "Bayar",
|
||||||
"PayPal": "Paypal",
|
"PayPal": "Paypal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Afiliasi",
|
"Affiliation": "Afiliasi",
|
||||||
"Affiliation - Tooltip": "Pemberi Kerja, seperti nama perusahaan atau nama organisasi",
|
"Affiliation - Tooltip": "Pemberi Kerja, seperti nama perusahaan atau nama organisasi",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio: Biografi",
|
"Bio": "Bio: Biografi",
|
||||||
"Bio - Tooltip": "Pengenalan diri dari pengguna",
|
"Bio - Tooltip": "Pengenalan diri dari pengguna",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "有効になっている場合、ユーザーを削除しても完全にデータベースから削除されません。代わりに、削除されたとマークされます",
|
"Soft deletion - Tooltip": "有効になっている場合、ユーザーを削除しても完全にデータベースから削除されません。代わりに、削除されたとマークされます",
|
||||||
"Tags": "タグ",
|
"Tags": "タグ",
|
||||||
"Tags - Tooltip": "ユーザーが選択できるタグのコレクション",
|
"Tags - Tooltip": "ユーザーが選択できるタグのコレクション",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "ビュールール",
|
"View rule": "ビュールール",
|
||||||
"Visible": "見える",
|
"Visible": "見える",
|
||||||
"Website URL": "ウェブサイトのURL",
|
"Website URL": "ウェブサイトのURL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "処理中... ",
|
"Processing...": "処理中... ",
|
||||||
"Product": "製品",
|
"Product": "製品",
|
||||||
"Product - Tooltip": "製品名",
|
"Product - Tooltip": "製品名",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "結果",
|
"Result": "結果",
|
||||||
"Return to Website": "ウェブサイトに戻る",
|
"Return to Website": "ウェブサイトに戻る",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "支払いはまだ処理中です",
|
"The payment is still under processing": "支払いはまだ処理中です",
|
||||||
"Type - Tooltip": "製品を購入する際に使用される支払方法",
|
"Type - Tooltip": "製品を購入する際に使用される支払方法",
|
||||||
"You have successfully completed the payment": "あなたは支払いを正常に完了しました",
|
"You have successfully completed the payment": "あなたは支払いを正常に完了しました",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "数秒お待ちください...",
|
"please wait for a few seconds...": "数秒お待ちください...",
|
||||||
"the current state is": "現在の状態は"
|
"the current state is": "現在の状態は"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "製品を編集",
|
"Edit Product": "製品を編集",
|
||||||
"Image": "画像",
|
"Image": "画像",
|
||||||
"Image - Tooltip": "製品のイメージ",
|
"Image - Tooltip": "製品のイメージ",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "新製品",
|
"New Product": "新製品",
|
||||||
"Pay": "支払う",
|
"Pay": "支払う",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "所属",
|
"Affiliation": "所属",
|
||||||
"Affiliation - Tooltip": "企業名や団体名などの雇用主",
|
"Affiliation - Tooltip": "企業名や団体名などの雇用主",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "バイオ技術",
|
"Bio": "バイオ技術",
|
||||||
"Bio - Tooltip": "ユーザーの自己紹介\n\n私は○○です。私は○○(国、都市、職業など)出身で、現在は○○(国、都市、職業など)に住んでいます。私は○○(趣味、特技、興味など)が好きで、空き時間にはよくそれをしています。よろしくお願いします",
|
"Bio - Tooltip": "ユーザーの自己紹介\n\n私は○○です。私は○○(国、都市、職業など)出身で、現在は○○(国、都市、職業など)に住んでいます。私は○○(趣味、特技、興味など)が好きで、空き時間にはよくそれをしています。よろしくお願いします",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "사용 가능한 경우, 사용자 삭제 시 데이터베이스에서 완전히 삭제되지 않습니다. 대신 삭제됨으로 표시됩니다",
|
"Soft deletion - Tooltip": "사용 가능한 경우, 사용자 삭제 시 데이터베이스에서 완전히 삭제되지 않습니다. 대신 삭제됨으로 표시됩니다",
|
||||||
"Tags": "태그",
|
"Tags": "태그",
|
||||||
"Tags - Tooltip": "사용자가 선택할 수 있는 태그 컬렉션",
|
"Tags - Tooltip": "사용자가 선택할 수 있는 태그 컬렉션",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "보기 규칙",
|
"View rule": "보기 규칙",
|
||||||
"Visible": "보이는",
|
"Visible": "보이는",
|
||||||
"Website URL": "웹사이트 URL",
|
"Website URL": "웹사이트 URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "처리 중...",
|
"Processing...": "처리 중...",
|
||||||
"Product": "제품",
|
"Product": "제품",
|
||||||
"Product - Tooltip": "제품 이름",
|
"Product - Tooltip": "제품 이름",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "결과",
|
"Result": "결과",
|
||||||
"Return to Website": "웹 사이트로 돌아가기",
|
"Return to Website": "웹 사이트로 돌아가기",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "지불은 아직 처리 중입니다",
|
"The payment is still under processing": "지불은 아직 처리 중입니다",
|
||||||
"Type - Tooltip": "제품을 구매할 때 사용되는 결제 방법",
|
"Type - Tooltip": "제품을 구매할 때 사용되는 결제 방법",
|
||||||
"You have successfully completed the payment": "당신은 결제를 성공적으로 완료하셨습니다",
|
"You have successfully completed the payment": "당신은 결제를 성공적으로 완료하셨습니다",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "잠시만 기다려주세요...",
|
"please wait for a few seconds...": "잠시만 기다려주세요...",
|
||||||
"the current state is": "현재 상태입니다"
|
"the current state is": "현재 상태입니다"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "제품 편집",
|
"Edit Product": "제품 편집",
|
||||||
"Image": "이미지",
|
"Image": "이미지",
|
||||||
"Image - Tooltip": "제품 이미지",
|
"Image - Tooltip": "제품 이미지",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "새로운 제품",
|
"New Product": "새로운 제품",
|
||||||
"Pay": "결제하다",
|
"Pay": "결제하다",
|
||||||
"PayPal": "페이팔",
|
"PayPal": "페이팔",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "소속",
|
"Affiliation": "소속",
|
||||||
"Affiliation - Tooltip": "고용주, 회사명 또는 조직명",
|
"Affiliation - Tooltip": "고용주, 회사명 또는 조직명",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "바이오",
|
"Bio": "바이오",
|
||||||
"Bio - Tooltip": "사용자의 자기소개\n\n안녕하세요, 저는 [이름]입니다. 한국을 포함한 여러 나라에서 살아본 적이 있습니다. 저는 [직업/전공]을 공부하고 있으며 [취미/관심사]에 대해 깊게 알고 있습니다. 이 채팅 서비스를 사용하여 새로운 사람들과 함께 대화를 나누기를 원합니다. 감사합니다",
|
"Bio - Tooltip": "사용자의 자기소개\n\n안녕하세요, 저는 [이름]입니다. 한국을 포함한 여러 나라에서 살아본 적이 있습니다. 저는 [직업/전공]을 공부하고 있으며 [취미/관심사]에 대해 깊게 알고 있습니다. 이 채팅 서비스를 사용하여 새로운 사람들과 함께 대화를 나누기를 원합니다. 감사합니다",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Quando ativada, a exclusão de usuários não os removerá completamente do banco de dados. Em vez disso, eles serão marcados como excluídos",
|
"Soft deletion - Tooltip": "Quando ativada, a exclusão de usuários não os removerá completamente do banco de dados. Em vez disso, eles serão marcados como excluídos",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Coleção de tags disponíveis para os usuários escolherem",
|
"Tags - Tooltip": "Coleção de tags disponíveis para os usuários escolherem",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Ver regra",
|
"View rule": "Ver regra",
|
||||||
"Visible": "Visível",
|
"Visible": "Visível",
|
||||||
"Website URL": "URL do website",
|
"Website URL": "URL do website",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processando...",
|
"Processing...": "Processando...",
|
||||||
"Product": "Produto",
|
"Product": "Produto",
|
||||||
"Product - Tooltip": "Nome do Produto",
|
"Product - Tooltip": "Nome do Produto",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Resultado",
|
"Result": "Resultado",
|
||||||
"Return to Website": "Retornar ao Website",
|
"Return to Website": "Retornar ao Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "O pagamento ainda está sendo processado",
|
"The payment is still under processing": "O pagamento ainda está sendo processado",
|
||||||
"Type - Tooltip": "Método de pagamento utilizado ao comprar o produto",
|
"Type - Tooltip": "Método de pagamento utilizado ao comprar o produto",
|
||||||
"You have successfully completed the payment": "Você concluiu o pagamento com sucesso",
|
"You have successfully completed the payment": "Você concluiu o pagamento com sucesso",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "por favor, aguarde alguns segundos...",
|
"please wait for a few seconds...": "por favor, aguarde alguns segundos...",
|
||||||
"the current state is": "o estado atual é"
|
"the current state is": "o estado atual é"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Editar Produto",
|
"Edit Product": "Editar Produto",
|
||||||
"Image": "Imagem",
|
"Image": "Imagem",
|
||||||
"Image - Tooltip": "Imagem do produto",
|
"Image - Tooltip": "Imagem do produto",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Novo Produto",
|
"New Product": "Novo Produto",
|
||||||
"Pay": "Pagar",
|
"Pay": "Pagar",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Afiliação",
|
"Affiliation": "Afiliação",
|
||||||
"Affiliation - Tooltip": "Empregador, como nome da empresa ou organização",
|
"Affiliation - Tooltip": "Empregador, como nome da empresa ou organização",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Biografia",
|
"Bio": "Biografia",
|
||||||
"Bio - Tooltip": "Autoapresentação do usuário",
|
"Bio - Tooltip": "Autoapresentação do usuário",
|
||||||
"Birthday": "Aniversário",
|
"Birthday": "Aniversário",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Когда включено, удаление пользователей не полностью удаляет их из базы данных. Вместо этого они будут помечены как удаленные",
|
"Soft deletion - Tooltip": "Когда включено, удаление пользователей не полностью удаляет их из базы данных. Вместо этого они будут помечены как удаленные",
|
||||||
"Tags": "Теги",
|
"Tags": "Теги",
|
||||||
"Tags - Tooltip": "Коллекция тегов, доступных для выбора пользователями",
|
"Tags - Tooltip": "Коллекция тегов, доступных для выбора пользователями",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Правило просмотра",
|
"View rule": "Правило просмотра",
|
||||||
"Visible": "Видимый",
|
"Visible": "Видимый",
|
||||||
"Website URL": "Веб-адрес сайта",
|
"Website URL": "Веб-адрес сайта",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Обработка...",
|
"Processing...": "Обработка...",
|
||||||
"Product": "Продукт",
|
"Product": "Продукт",
|
||||||
"Product - Tooltip": "Название продукта",
|
"Product - Tooltip": "Название продукта",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Результат",
|
"Result": "Результат",
|
||||||
"Return to Website": "Вернуться на веб-сайт",
|
"Return to Website": "Вернуться на веб-сайт",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "Оплата все еще обрабатывается",
|
"The payment is still under processing": "Оплата все еще обрабатывается",
|
||||||
"Type - Tooltip": "Способ оплаты, используемый при покупке товара",
|
"Type - Tooltip": "Способ оплаты, используемый при покупке товара",
|
||||||
"You have successfully completed the payment": "Вы успешно произвели платеж",
|
"You have successfully completed the payment": "Вы успешно произвели платеж",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "Пожалуйста, подождите несколько секунд...",
|
"please wait for a few seconds...": "Пожалуйста, подождите несколько секунд...",
|
||||||
"the current state is": "текущее состояние"
|
"the current state is": "текущее состояние"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Редактировать продукт",
|
"Edit Product": "Редактировать продукт",
|
||||||
"Image": "Изображение",
|
"Image": "Изображение",
|
||||||
"Image - Tooltip": "Изображение продукта",
|
"Image - Tooltip": "Изображение продукта",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Новый продукт",
|
"New Product": "Новый продукт",
|
||||||
"Pay": "Заплатить",
|
"Pay": "Заплатить",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Принадлежность",
|
"Affiliation": "Принадлежность",
|
||||||
"Affiliation - Tooltip": "Работодатель, такой как название компании или организации",
|
"Affiliation - Tooltip": "Работодатель, такой как название компании или организации",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Био",
|
"Bio": "Био",
|
||||||
"Bio - Tooltip": "Само представление пользователя",
|
"Bio - Tooltip": "Само представление пользователя",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Visible",
|
"Visible": "Visible",
|
||||||
"Website URL": "Website URL",
|
"Website URL": "Website URL",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
"Soft deletion - Tooltip": "When enabled, deleting users will not completely remove them from the database. Instead, they will be marked as deleted",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
"Tags - Tooltip": "Collection of tags available for users to choose from",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "View rule",
|
"View rule": "View rule",
|
||||||
"Visible": "Görünür",
|
"Visible": "Görünür",
|
||||||
"Website URL": "Web Sitesi URL'si",
|
"Website URL": "Web Sitesi URL'si",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Processing...",
|
"Processing...": "Processing...",
|
||||||
"Product": "Product",
|
"Product": "Product",
|
||||||
"Product - Tooltip": "Product Name",
|
"Product - Tooltip": "Product Name",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Result",
|
"Result": "Result",
|
||||||
"Return to Website": "Return to Website",
|
"Return to Website": "Return to Website",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "The payment is still under processing",
|
"The payment is still under processing": "The payment is still under processing",
|
||||||
"Type - Tooltip": "Payment method used when purchasing the product",
|
"Type - Tooltip": "Payment method used when purchasing the product",
|
||||||
"You have successfully completed the payment": "You have successfully completed the payment",
|
"You have successfully completed the payment": "You have successfully completed the payment",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "please wait for a few seconds...",
|
"please wait for a few seconds...": "please wait for a few seconds...",
|
||||||
"the current state is": "the current state is"
|
"the current state is": "the current state is"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Edit Product",
|
"Edit Product": "Edit Product",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image - Tooltip": "Image of product",
|
"Image - Tooltip": "Image of product",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "New Product",
|
"New Product": "New Product",
|
||||||
"Pay": "Pay",
|
"Pay": "Pay",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Affiliation",
|
"Affiliation": "Affiliation",
|
||||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "Bio",
|
"Bio": "Bio",
|
||||||
"Bio - Tooltip": "Self introduction of the user",
|
"Bio - Tooltip": "Self introduction of the user",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Якщо ввімкнено, видалення користувачів не призведе до їх повного видалення з бази даних. ",
|
"Soft deletion - Tooltip": "Якщо ввімкнено, видалення користувачів не призведе до їх повного видалення з бази даних. ",
|
||||||
"Tags": "Теги",
|
"Tags": "Теги",
|
||||||
"Tags - Tooltip": "Колекція тегів, доступна для вибору користувачами",
|
"Tags - Tooltip": "Колекція тегів, доступна для вибору користувачами",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Переглянути правило",
|
"View rule": "Переглянути правило",
|
||||||
"Visible": "Видно",
|
"Visible": "Видно",
|
||||||
"Website URL": "адреса вебсайту",
|
"Website URL": "адреса вебсайту",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Обробка...",
|
"Processing...": "Обробка...",
|
||||||
"Product": "Продукт",
|
"Product": "Продукт",
|
||||||
"Product - Tooltip": "Назва продукту",
|
"Product - Tooltip": "Назва продукту",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Результат",
|
"Result": "Результат",
|
||||||
"Return to Website": "Повернутися на сайт",
|
"Return to Website": "Повернутися на сайт",
|
||||||
"The payment has been canceled": "Платіж скасовано",
|
"The payment has been canceled": "Платіж скасовано",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "Платіж ще обробляється",
|
"The payment is still under processing": "Платіж ще обробляється",
|
||||||
"Type - Tooltip": "Спосіб оплати, який використовується при покупці товару",
|
"Type - Tooltip": "Спосіб оплати, який використовується при покупці товару",
|
||||||
"You have successfully completed the payment": "Ви успішно завершили оплату",
|
"You have successfully completed the payment": "Ви успішно завершили оплату",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "зачекайте кілька секунд...",
|
"please wait for a few seconds...": "зачекайте кілька секунд...",
|
||||||
"the current state is": "поточний стан є"
|
"the current state is": "поточний стан є"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Редагувати товар",
|
"Edit Product": "Редагувати товар",
|
||||||
"Image": "Зображення",
|
"Image": "Зображення",
|
||||||
"Image - Tooltip": "Зображення товару",
|
"Image - Tooltip": "Зображення товару",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Новий продукт",
|
"New Product": "Новий продукт",
|
||||||
"Pay": "платити",
|
"Pay": "платити",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Приналежність",
|
"Affiliation": "Приналежність",
|
||||||
"Affiliation - Tooltip": "Роботодавець, наприклад назва компанії чи організації",
|
"Affiliation - Tooltip": "Роботодавець, наприклад назва компанії чи організації",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "біографія",
|
"Bio": "біографія",
|
||||||
"Bio - Tooltip": "Самостійне представлення користувача",
|
"Bio - Tooltip": "Самостійне представлення користувача",
|
||||||
"Birthday": "день народження",
|
"Birthday": "день народження",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "Khi được bật, việc xóa người dùng sẽ không hoàn toàn loại bỏ họ khỏi cơ sở dữ liệu. Thay vào đó, họ sẽ được đánh dấu là đã bị xóa",
|
"Soft deletion - Tooltip": "Khi được bật, việc xóa người dùng sẽ không hoàn toàn loại bỏ họ khỏi cơ sở dữ liệu. Thay vào đó, họ sẽ được đánh dấu là đã bị xóa",
|
||||||
"Tags": "Thẻ",
|
"Tags": "Thẻ",
|
||||||
"Tags - Tooltip": "Bộ sưu tập các thẻ có sẵn cho người dùng lựa chọn",
|
"Tags - Tooltip": "Bộ sưu tập các thẻ có sẵn cho người dùng lựa chọn",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "Xem quy tắc",
|
"View rule": "Xem quy tắc",
|
||||||
"Visible": "Rõ ràng",
|
"Visible": "Rõ ràng",
|
||||||
"Website URL": "Địa chỉ trang web",
|
"Website URL": "Địa chỉ trang web",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "Đang xử lý...",
|
"Processing...": "Đang xử lý...",
|
||||||
"Product": "Sản phẩm",
|
"Product": "Sản phẩm",
|
||||||
"Product - Tooltip": "Tên sản phẩm",
|
"Product - Tooltip": "Tên sản phẩm",
|
||||||
|
"Recharged successfully": "Recharged successfully",
|
||||||
"Result": "Kết quả",
|
"Result": "Kết quả",
|
||||||
"Return to Website": "Trở lại trang web",
|
"Return to Website": "Trở lại trang web",
|
||||||
"The payment has been canceled": "The payment has been canceled",
|
"The payment has been canceled": "The payment has been canceled",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "Thanh toán vẫn đang được xử lý",
|
"The payment is still under processing": "Thanh toán vẫn đang được xử lý",
|
||||||
"Type - Tooltip": "Phương thức thanh toán được sử dụng khi mua sản phẩm",
|
"Type - Tooltip": "Phương thức thanh toán được sử dụng khi mua sản phẩm",
|
||||||
"You have successfully completed the payment": "Bạn đã hoàn thành thanh toán thành công",
|
"You have successfully completed the payment": "Bạn đã hoàn thành thanh toán thành công",
|
||||||
|
"You have successfully recharged": "You have successfully recharged",
|
||||||
|
"Your current balance is": "Your current balance is",
|
||||||
"please wait for a few seconds...": "Vui lòng đợi trong vài giây...",
|
"please wait for a few seconds...": "Vui lòng đợi trong vài giây...",
|
||||||
"the current state is": "tình trạng hiện tại là"
|
"the current state is": "tình trạng hiện tại là"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "Sửa sản phẩm",
|
"Edit Product": "Sửa sản phẩm",
|
||||||
"Image": "Ảnh",
|
"Image": "Ảnh",
|
||||||
"Image - Tooltip": "Hình ảnh sản phẩm",
|
"Image - Tooltip": "Hình ảnh sản phẩm",
|
||||||
|
"Is recharge": "Is recharge",
|
||||||
|
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
|
||||||
"New Product": "Sản phẩm mới",
|
"New Product": "Sản phẩm mới",
|
||||||
"Pay": "Trả tiền",
|
"Pay": "Trả tiền",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "Address line",
|
"Address line": "Address line",
|
||||||
"Affiliation": "Liên kết",
|
"Affiliation": "Liên kết",
|
||||||
"Affiliation - Tooltip": "Nhà tuyển dụng, chẳng hạn như tên công ty hoặc tổ chức",
|
"Affiliation - Tooltip": "Nhà tuyển dụng, chẳng hạn như tên công ty hoặc tổ chức",
|
||||||
|
"Balance": "Balance",
|
||||||
|
"Balance - Tooltip": "User's balance",
|
||||||
"Bio": "bản vẻ đời sống",
|
"Bio": "bản vẻ đời sống",
|
||||||
"Bio - Tooltip": "Tự giới thiệu của người dùng",
|
"Bio - Tooltip": "Tự giới thiệu của người dùng",
|
||||||
"Birthday": "Birthday",
|
"Birthday": "Birthday",
|
||||||
|
@ -576,6 +576,8 @@
|
|||||||
"Soft deletion - Tooltip": "启用后,删除一个用户时不会在数据库彻底清除,只会标记为已删除状态",
|
"Soft deletion - Tooltip": "启用后,删除一个用户时不会在数据库彻底清除,只会标记为已删除状态",
|
||||||
"Tags": "标签集合",
|
"Tags": "标签集合",
|
||||||
"Tags - Tooltip": "可供用户选择的标签集合",
|
"Tags - Tooltip": "可供用户选择的标签集合",
|
||||||
|
"Use Email as username": "Use Email as username",
|
||||||
|
"Use Email as username - Tooltip": "Use Email as username if the username field is not visible at signup",
|
||||||
"View rule": "查看规则",
|
"View rule": "查看规则",
|
||||||
"Visible": "是否可见",
|
"Visible": "是否可见",
|
||||||
"Website URL": "主页地址",
|
"Website URL": "主页地址",
|
||||||
@ -619,6 +621,7 @@
|
|||||||
"Processing...": "正在处理...",
|
"Processing...": "正在处理...",
|
||||||
"Product": "商品",
|
"Product": "商品",
|
||||||
"Product - Tooltip": "商品名称",
|
"Product - Tooltip": "商品名称",
|
||||||
|
"Recharged successfully": "充值成功",
|
||||||
"Result": "结果",
|
"Result": "结果",
|
||||||
"Return to Website": "返回原网站",
|
"Return to Website": "返回原网站",
|
||||||
"The payment has been canceled": "付款已取消",
|
"The payment has been canceled": "付款已取消",
|
||||||
@ -627,6 +630,8 @@
|
|||||||
"The payment is still under processing": "支付正在处理",
|
"The payment is still under processing": "支付正在处理",
|
||||||
"Type - Tooltip": "商品购买时的支付方式",
|
"Type - Tooltip": "商品购买时的支付方式",
|
||||||
"You have successfully completed the payment": "支付成功",
|
"You have successfully completed the payment": "支付成功",
|
||||||
|
"You have successfully recharged": "您已成功充值",
|
||||||
|
"Your current balance is": "您现在的余额为",
|
||||||
"please wait for a few seconds...": "请稍后...",
|
"please wait for a few seconds...": "请稍后...",
|
||||||
"the current state is": "当前状态为"
|
"the current state is": "当前状态为"
|
||||||
},
|
},
|
||||||
@ -689,6 +694,8 @@
|
|||||||
"Edit Product": "编辑商品",
|
"Edit Product": "编辑商品",
|
||||||
"Image": "图片",
|
"Image": "图片",
|
||||||
"Image - Tooltip": "商品图片",
|
"Image - Tooltip": "商品图片",
|
||||||
|
"Is recharge": "充值",
|
||||||
|
"Is recharge - Tooltip": "当前商品是否为充值商品",
|
||||||
"New Product": "添加商品",
|
"New Product": "添加商品",
|
||||||
"Pay": "支付方式",
|
"Pay": "支付方式",
|
||||||
"PayPal": "PayPal",
|
"PayPal": "PayPal",
|
||||||
@ -1080,6 +1087,8 @@
|
|||||||
"Address line": "地址",
|
"Address line": "地址",
|
||||||
"Affiliation": "工作单位",
|
"Affiliation": "工作单位",
|
||||||
"Affiliation - Tooltip": "工作单位,如公司、组织名称",
|
"Affiliation - Tooltip": "工作单位,如公司、组织名称",
|
||||||
|
"Balance": "余额",
|
||||||
|
"Balance - Tooltip": "用户的余额",
|
||||||
"Bio": "自我介绍",
|
"Bio": "自我介绍",
|
||||||
"Bio - Tooltip": "用户的自我介绍",
|
"Bio - Tooltip": "用户的自我介绍",
|
||||||
"Birthday": "生日",
|
"Birthday": "生日",
|
||||||
|
@ -88,6 +88,7 @@ class AccountTable extends React.Component {
|
|||||||
{name: "Gender", label: i18next.t("user:Gender")},
|
{name: "Gender", label: i18next.t("user:Gender")},
|
||||||
{name: "Birthday", label: i18next.t("user:Birthday")},
|
{name: "Birthday", label: i18next.t("user:Birthday")},
|
||||||
{name: "Education", label: i18next.t("user:Education")},
|
{name: "Education", label: i18next.t("user:Education")},
|
||||||
|
{name: "Balance", label: i18next.t("user:Balance")},
|
||||||
{name: "Score", label: i18next.t("user:Score")},
|
{name: "Score", label: i18next.t("user:Score")},
|
||||||
{name: "Karma", label: i18next.t("user:Karma")},
|
{name: "Karma", label: i18next.t("user:Karma")},
|
||||||
{name: "Ranking", label: i18next.t("user:Ranking")},
|
{name: "Ranking", label: i18next.t("user:Ranking")},
|
||||||
|
Reference in New Issue
Block a user