feat: add free charge price mode for product buy page (#3015)

* feat: add free charge price mode for product buy page

* fix: improve code format
This commit is contained in:
DacongDA
2024-06-22 14:05:53 +08:00
committed by GitHub
parent 4cc2120fed
commit 793a7d6cda
36 changed files with 332 additions and 34 deletions

View File

@ -17,6 +17,7 @@ package controllers
import (
"encoding/json"
"fmt"
"strconv"
"github.com/beego/beego/utils/pagination"
"github.com/casdoor/casdoor/object"
@ -164,6 +165,16 @@ func (c *ApiController) BuyProduct() {
host := c.Ctx.Request.Host
providerName := c.Input().Get("providerName")
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`
pricingName := c.Input().Get("pricingName")
@ -189,7 +200,7 @@ func (c *ApiController) BuyProduct() {
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 {
c.ResponseError(err.Error())
return

View File

@ -39,6 +39,8 @@ type Payment struct {
Currency string `xorm:"varchar(100)" json:"currency"`
Price float64 `json:"price"`
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
IsRecharge bool `xorm:"bool" json:"isRecharge"`
// Payer Info
User string `xorm:"varchar(100)" json:"user"`
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
}
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)
return payment, nil, err
}
if payment.IsRecharge {
err = updateUserBalance(payment.Owner, payment.User, payment.Price)
return payment, notifyResult, err
}
return payment, notifyResult, nil
}

View File

@ -39,6 +39,7 @@ type Product struct {
Price float64 `json:"price"`
Quantity int `json:"quantity"`
Sold int `json:"sold"`
IsRecharge bool `json:"isRecharge"`
Providers []string `xorm:"varchar(255)" json:"providers"`
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
@ -160,7 +161,7 @@ func (product *Product) getProvider(providerName string) (*Provider, error) {
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)
if err != nil {
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)
}
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)
if err != nil {
return nil, nil, err
@ -246,6 +255,7 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
Currency: product.Currency,
Price: product.Price,
ReturnUrl: product.ReturnUrl,
IsRecharge: product.IsRecharge,
User: user.Name,
PayUrl: payResp.PayUrl,
@ -256,6 +266,10 @@ func BuyProduct(id string, user *User, providerName, pricingName, planName, host
if provider.Type == "Dummy" {
payment.State = pp.PaymentStatePaid
err = updateUserBalance(user.Owner, user.Name, payment.Price)
if err != nil {
return nil, nil, err
}
}
affected, err := AddPayment(payment)
@ -304,8 +318,9 @@ func CreateProductForPlan(plan *Plan) *Product {
Price: plan.Price,
Currency: plan.Currency,
Quantity: 999,
Sold: 0,
Quantity: 999,
Sold: 0,
IsRecharge: false,
Providers: plan.PaymentProviders,
State: "Published",

View File

@ -687,7 +687,7 @@ func UpdateUser(id string, user *User, columns []string, isAdmin bool) (bool, er
}
}
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")
@ -1157,3 +1157,13 @@ func GenerateIdForNewUser(application *Application) (string, error) {
res := strconv.Itoa(lastUserId + 1)
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
}

View File

@ -416,6 +416,11 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
itemsChanged = append(itemsChanged, item)
}
if oldUser.Balance != newUser.Balance {
item := GetAccountItemByName("Balance", organization)
itemsChanged = append(itemsChanged, item)
}
if oldUser.Score != newUser.Score {
item := GetAccountItemByName("Score", organization)
itemsChanged = append(itemsChanged, item)

View File

@ -17,6 +17,7 @@ import {Button, Result, Spin} from "antd";
import * as PaymentBackend from "./backend/PaymentBackend";
import * as PricingBackend from "./backend/PricingBackend";
import * as SubscriptionBackend from "./backend/SubscriptionBackend";
import * as UserBackend from "./backend/UserBackend";
import * as Setting from "./Setting";
import i18next from "i18next";
@ -34,6 +35,7 @@ class PaymentResultPage extends React.Component {
pricing: props.pricing ?? null,
subscription: props.subscription ?? null,
timeout: null,
user: null,
};
}
@ -41,6 +43,25 @@ class PaymentResultPage extends React.Component {
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() {
if (this.state.timeout !== null) {
clearTimeout(this.state.timeout);
@ -114,6 +135,12 @@ class PaymentResultPage extends React.Component {
});
}
}
if (payment.state === "Paid") {
if (this.props.account) {
this.getUser();
}
}
} catch (err) {
Setting.showMessage("error", err.message);
return;
@ -136,6 +163,27 @@ class PaymentResultPage extends React.Component {
}
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 (
<div className="login-content">
{

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {Button, Descriptions, Spin} from "antd";
import {Button, Descriptions, InputNumber, Space, Spin} from "antd";
import i18next from "i18next";
import * as ProductBackend from "./backend/ProductBackend";
import * as PlanBackend from "./backend/PlanBackend";
@ -36,6 +36,7 @@ class ProductBuyPage extends React.Component {
pricing: props?.pricing ?? null,
plan: null,
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) {
return `${this.getCurrencySymbol(product)}${product?.price} (${this.getCurrencyText(product)})`;
return `${this.getCurrencySymbol(product)}${product?.price} (${Setting.getCurrencyText(product)})`;
}
// Call Weechat Pay via jsapi
@ -192,7 +183,7 @@ class ProductBuyPage extends React.Component {
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) => {
if (res.status === "ok") {
const payment = res.data;
@ -295,15 +286,27 @@ class ProductBuyPage extends React.Component {
<Descriptions.Item label={i18next.t("product:Image")} span={3}>
<img src={product?.image} alt={product?.name} height={90} style={{marginBottom: "20px"}} />
</Descriptions.Item>
<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>
{
product.isRecharge ? (
<Descriptions.Item span={3} label={i18next.t("product:Price")}>
<Space>
<InputNumber min={0} value={this.state.customPrice} onChange={(e) => {this.setState({customPrice: e});}} /> {Setting.getCurrencyText(product)}
</Space>
</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}>
{
this.renderPay(product)

View File

@ -13,7 +13,7 @@
// limitations under the License.
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 Setting from "./Setting";
import i18next from "i18next";
@ -216,14 +216,27 @@ class ProductEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<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 span={22} >
<InputNumber value={this.state.product.price} disabled={isCreatedByPlan} onChange={value => {
this.updateProductField("price", value);
<Switch checked={this.state.product.isRecharge} onChange={value => {
this.updateProductField("isRecharge", value);
}} />
</Col>
</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"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("product:Quantity"), i18next.t("product:Quantity - Tooltip"))} :

View File

@ -38,6 +38,7 @@ class ProductListPage extends BaseListPage {
price: 300,
quantity: 99,
sold: 10,
isRecharge: false,
providers: [],
state: "Published",
};

View File

@ -1516,3 +1516,13 @@ export function getDefaultHtmlEmailContent() {
</body>
</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)";
}
}

View File

@ -707,6 +707,19 @@ class UserEditPage extends React.Component {
</Col>
</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") {
return (
<Row style={{marginTop: "20px"}} >

View File

@ -70,8 +70,8 @@ export function deleteProduct(product) {
}).then(res => res.json());
}
export function buyProduct(owner, name, providerName, pricingName = "", planName = "", userName = "", paymentEnv = "") {
return fetch(`${Setting.ServerUrl}/api/buy-product?id=${owner}/${encodeURIComponent(name)}&providerName=${providerName}&pricingName=${pricingName}&planName=${planName}&userName=${userName}&paymentEnv=${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}&customPrice=${customPrice}`, {
method: "POST",
credentials: "include",
headers: {

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "In Bearbeitung...",
"Product": "Produkt",
"Product - Tooltip": "Produktname",
"Recharged successfully": "Recharged successfully",
"Result": "Ergebnis",
"Return to Website": "Zurück zur Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "Die Zahlung wird immer noch bearbeitet",
"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 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...",
"the current state is": "der aktuelle Zustand ist"
},
@ -689,6 +692,8 @@
"Edit Product": "Produkt bearbeiten",
"Image": "Bild",
"Image - Tooltip": "Bild des Produkts",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Neues Produkt",
"Pay": "Zahlen",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Zugehörigkeit",
"Affiliation - Tooltip": "Arbeitgeber, wie Firmenname oder Organisationsname",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Selbstvorstellung des Nutzers",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Procesando...",
"Product": "Producto",
"Product - Tooltip": "Nombre del producto",
"Recharged successfully": "Recharged successfully",
"Result": "Resultado",
"Return to Website": "Regresar al sitio web",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "El pago aún está en proceso",
"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 recharged": "You have successfully recharged",
"Your current balance is": "Your current balance is",
"please wait for a few seconds...": "Por favor espera unos segundos...",
"the current state is": "el estado actual es"
},
@ -689,6 +692,8 @@
"Edit Product": "Editar Producto",
"Image": "Imagen",
"Image - Tooltip": "Imagen del producto",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Nuevo producto",
"Pay": "Pagar",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Afiliació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 - Tooltip": "Introducción personal del usuario",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Traitement...",
"Product": "Produit",
"Product - Tooltip": "Nom du produit",
"Recharged successfully": "Recharged successfully",
"Result": "Résultat",
"Return to Website": "Retourner sur le site web",
"The payment has been canceled": "Le paiement a été annulé",
@ -627,6 +628,8 @@
"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",
"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...",
"the current state is": "l'état actuel est"
},
@ -689,6 +692,8 @@
"Edit Product": "Modifier le produit",
"Image": "Image",
"Image - Tooltip": "Image du produit",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Nouveau produit",
"Pay": "Payer",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employeur, tel que le nom de l'entreprise ou de l'organisation",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Biographie du compte",
"Birthday": "Date de naissance",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Pemrosesan...",
"Product": "Produk",
"Product - Tooltip": "Nama Produk",
"Recharged successfully": "Recharged successfully",
"Result": "Hasil",
"Return to Website": "Kembali ke Situs Web",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "Pembayaran masih dalam proses",
"Type - Tooltip": "Metode pembayaran yang digunakan saat membeli produk",
"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...",
"the current state is": "keadaan saat ini adalah"
},
@ -689,6 +692,8 @@
"Edit Product": "Edit Produk",
"Image": "Gambar",
"Image - Tooltip": "Gambar produk",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Produk Baru",
"Pay": "Bayar",
"PayPal": "Paypal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Afiliasi",
"Affiliation - Tooltip": "Pemberi Kerja, seperti nama perusahaan atau nama organisasi",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio: Biografi",
"Bio - Tooltip": "Pengenalan diri dari pengguna",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "処理中... ",
"Product": "製品",
"Product - Tooltip": "製品名",
"Recharged successfully": "Recharged successfully",
"Result": "結果",
"Return to Website": "ウェブサイトに戻る",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "支払いはまだ処理中です",
"Type - Tooltip": "製品を購入する際に使用される支払方法",
"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...": "数秒お待ちください...",
"the current state is": "現在の状態は"
},
@ -689,6 +692,8 @@
"Edit Product": "製品を編集",
"Image": "画像",
"Image - Tooltip": "製品のイメージ",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "新製品",
"Pay": "支払う",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "所属",
"Affiliation - Tooltip": "企業名や団体名などの雇用主",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "バイオ技術",
"Bio - Tooltip": "ユーザーの自己紹介\n\n私は○○です。私は○○国、都市、職業など出身で、現在は○○国、都市、職業などに住んでいます。私は○○趣味、特技、興味などが好きで、空き時間にはよくそれをしています。よろしくお願いします",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "처리 중...",
"Product": "제품",
"Product - Tooltip": "제품 이름",
"Recharged successfully": "Recharged successfully",
"Result": "결과",
"Return to Website": "웹 사이트로 돌아가기",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "지불은 아직 처리 중입니다",
"Type - Tooltip": "제품을 구매할 때 사용되는 결제 방법",
"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...": "잠시만 기다려주세요...",
"the current state is": "현재 상태입니다"
},
@ -689,6 +692,8 @@
"Edit Product": "제품 편집",
"Image": "이미지",
"Image - Tooltip": "제품 이미지",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "새로운 제품",
"Pay": "결제하다",
"PayPal": "페이팔",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "소속",
"Affiliation - Tooltip": "고용주, 회사명 또는 조직명",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "바이오",
"Bio - Tooltip": "사용자의 자기소개\n\n안녕하세요, 저는 [이름]입니다. 한국을 포함한 여러 나라에서 살아본 적이 있습니다. 저는 [직업/전공]을 공부하고 있으며 [취미/관심사]에 대해 깊게 알고 있습니다. 이 채팅 서비스를 사용하여 새로운 사람들과 함께 대화를 나누기를 원합니다. 감사합니다",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processando...",
"Product": "Produto",
"Product - Tooltip": "Nome do Produto",
"Recharged successfully": "Recharged successfully",
"Result": "Resultado",
"Return to Website": "Retornar ao Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "O pagamento ainda está sendo processado",
"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 recharged": "You have successfully recharged",
"Your current balance is": "Your current balance is",
"please wait for a few seconds...": "por favor, aguarde alguns segundos...",
"the current state is": "o estado atual é"
},
@ -689,6 +692,8 @@
"Edit Product": "Editar Produto",
"Image": "Imagem",
"Image - Tooltip": "Imagem do produto",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Novo Produto",
"Pay": "Pagar",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Afiliação",
"Affiliation - Tooltip": "Empregador, como nome da empresa ou organização",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Biografia",
"Bio - Tooltip": "Autoapresentação do usuário",
"Birthday": "Aniversário",

View File

@ -619,6 +619,7 @@
"Processing...": "Обработка...",
"Product": "Продукт",
"Product - Tooltip": "Название продукта",
"Recharged successfully": "Recharged successfully",
"Result": "Результат",
"Return to Website": "Вернуться на веб-сайт",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "Оплата все еще обрабатывается",
"Type - Tooltip": "Способ оплаты, используемый при покупке товара",
"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...": "Пожалуйста, подождите несколько секунд...",
"the current state is": "текущее состояние"
},
@ -689,6 +692,8 @@
"Edit Product": "Редактировать продукт",
"Image": "Изображение",
"Image - Tooltip": "Изображение продукта",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Новый продукт",
"Pay": "Заплатить",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Принадлежность",
"Affiliation - Tooltip": "Работодатель, такой как название компании или организации",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Био",
"Bio - Tooltip": "Само представление пользователя",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Processing...",
"Product": "Product",
"Product - Tooltip": "Product Name",
"Recharged successfully": "Recharged successfully",
"Result": "Result",
"Return to Website": "Return to Website",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"The payment is still under processing": "The payment is still under processing",
"Type - Tooltip": "Payment method used when purchasing the product",
"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 +692,8 @@
"Edit Product": "Edit Product",
"Image": "Image",
"Image - Tooltip": "Image of product",
"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 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Affiliation",
"Affiliation - Tooltip": "Employer, such as company name or organization name",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "Bio",
"Bio - Tooltip": "Self introduction of the user",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "Обробка...",
"Product": "Продукт",
"Product - Tooltip": "Назва продукту",
"Recharged successfully": "Recharged successfully",
"Result": "Результат",
"Return to Website": "Повернутися на сайт",
"The payment has been canceled": "Платіж скасовано",
@ -627,6 +628,8 @@
"The payment is still under processing": "Платіж ще обробляється",
"Type - Tooltip": "Спосіб оплати, який використовується при покупці товару",
"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...": "зачекайте кілька секунд...",
"the current state is": "поточний стан є"
},
@ -689,6 +692,8 @@
"Edit Product": "Редагувати товар",
"Image": "Зображення",
"Image - Tooltip": "Зображення товару",
"Is recharge": "Is recharge",
"Is recharge - Tooltip": "Whether the current product is to recharge balance",
"New Product": "Новий продукт",
"Pay": "платити",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"Affiliation": "Приналежність",
"Affiliation - Tooltip": "Роботодавець, наприклад назва компанії чи організації",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "біографія",
"Bio - Tooltip": "Самостійне представлення користувача",
"Birthday": "день народження",

View File

@ -619,6 +619,7 @@
"Processing...": "Đang xử lý...",
"Product": "Sản phẩm",
"Product - Tooltip": "Tên sản phẩm",
"Recharged successfully": "Recharged successfully",
"Result": "Kết quả",
"Return to Website": "Trở lại trang web",
"The payment has been canceled": "The payment has been canceled",
@ -627,6 +628,8 @@
"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",
"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...",
"the current state is": "tình trạng hiện tại là"
},
@ -689,6 +692,8 @@
"Edit Product": "Sửa sản phẩm",
"Image": "Ảnh",
"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",
"Pay": "Trả tiền",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "Address line",
"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",
"Balance": "Balance",
"Balance - Tooltip": "User's balance",
"Bio": "bản vẻ đời sống",
"Bio - Tooltip": "Tự giới thiệu của người dùng",
"Birthday": "Birthday",

View File

@ -619,6 +619,7 @@
"Processing...": "正在处理...",
"Product": "商品",
"Product - Tooltip": "商品名称",
"Recharged successfully": "充值成功",
"Result": "结果",
"Return to Website": "返回原网站",
"The payment has been canceled": "付款已取消",
@ -627,6 +628,8 @@
"The payment is still under processing": "支付正在处理",
"Type - Tooltip": "商品购买时的支付方式",
"You have successfully completed the payment": "支付成功",
"You have successfully recharged": "您已成功充值",
"Your current balance is": "您现在的余额为",
"please wait for a few seconds...": "请稍后...",
"the current state is": "当前状态为"
},
@ -689,6 +692,8 @@
"Edit Product": "编辑商品",
"Image": "图片",
"Image - Tooltip": "商品图片",
"Is recharge": "充值",
"Is recharge - Tooltip": "当前商品是否为充值商品",
"New Product": "添加商品",
"Pay": "支付方式",
"PayPal": "PayPal",
@ -1080,6 +1085,8 @@
"Address line": "地址",
"Affiliation": "工作单位",
"Affiliation - Tooltip": "工作单位,如公司、组织名称",
"Balance": "余额",
"Balance - Tooltip": "用户的余额",
"Bio": "自我介绍",
"Bio - Tooltip": "用户的自我介绍",
"Birthday": "生日",

View File

@ -88,6 +88,7 @@ class AccountTable extends React.Component {
{name: "Gender", label: i18next.t("user:Gender")},
{name: "Birthday", label: i18next.t("user:Birthday")},
{name: "Education", label: i18next.t("user:Education")},
{name: "Balance", label: i18next.t("user:Balance")},
{name: "Score", label: i18next.t("user:Score")},
{name: "Karma", label: i18next.t("user:Karma")},
{name: "Ranking", label: i18next.t("user:Ranking")},