improvement: updated translations en/pt

This commit is contained in:
canove
2020-09-28 15:41:19 -03:00
parent 3c0ecd8fb1
commit c4aa05ea4a
13 changed files with 325 additions and 72 deletions

View File

@@ -103,7 +103,7 @@ const ContactModal = ({ open, onClose, contactId }) => {
} else {
await api.post("/contacts", values);
}
toast.success("Contact saved sucessfully!");
toast.success(i18n.t("contactModal.success"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {

View File

@@ -5,7 +5,7 @@ import { toast } from "react-toastify";
import MenuItem from "@material-ui/core/MenuItem";
import Menu from "@material-ui/core/Menu";
// import { i18n } from "../../translate/i18n";
import { i18n } from "../../translate/i18n";
import api from "../../services/api";
import ConfirmationModal from "../ConfirmationModal";
@@ -31,12 +31,12 @@ const MessageOptionsMenu = ({ messageId, menuOpen, handleClose, anchorEl }) => {
return (
<>
<ConfirmationModal
title={`Delete message?`}
title={i18n.t("messageOptionsMenu.confirmationModal.title")}
open={confirmationOpen}
setOpen={setConfirmationOpen}
onConfirm={handleDeleteMessage}
>
This action cannot be reverted.
{i18n.t("messageOptionsMenu.confirmationModal.message")}
</ConfirmationModal>
<Menu
anchorEl={anchorEl}
@@ -53,9 +53,9 @@ const MessageOptionsMenu = ({ messageId, menuOpen, handleClose, anchorEl }) => {
onClose={handleClose}
>
<MenuItem onClick={handleOpenConfirmationModal}>
Delete Message
{i18n.t("messageOptionsMenu.delete")}
</MenuItem>
<MenuItem disabled>Reply Message</MenuItem>
<MenuItem disabled> {i18n.t("messageOptionsMenu.reply")}</MenuItem>
</Menu>
</>
);

View File

@@ -183,7 +183,7 @@ const NotificationsPopOver = () => {
<List dense className={classes.tabContainer}>
{notifications.length === 0 ? (
<ListItem>
<ListItemText>No tickets with unread messages.</ListItemText>
<ListItemText>{i18n.t("notifications.noTickets")}</ListItemText>
</ListItem>
) : (
notifications.map(ticket => (

View File

@@ -18,7 +18,7 @@ import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
// import { i18n } from "../../translate/i18n";
import { i18n } from "../../translate/i18n";
import api from "../../services/api";
@@ -105,7 +105,7 @@ const UserModal = ({ open, onClose, userId }) => {
} else {
await api.post("/users", values);
}
toast.success("Success!");
toast.success(i18n.t("userModal.success"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {
@@ -119,7 +119,9 @@ const UserModal = ({ open, onClose, userId }) => {
<div className={classes.root}>
<Dialog open={open} onClose={handleClose} maxWidth="lg" scroll="paper">
<DialogTitle id="form-dialog-title">
{userId ? `Edit User` : `New User`}
{userId
? `${i18n.t("userModal.title.edit")}`
: `${i18n.t("userModal.title.add")}`}
</DialogTitle>
<Formik
initialValues={user}
@@ -137,7 +139,7 @@ const UserModal = ({ open, onClose, userId }) => {
<DialogContent dividers>
<Field
as={TextField}
label="Name"
label={i18n.t("userModal.form.name")}
autoFocus
name="name"
error={touched.name && Boolean(errors.name)}
@@ -148,7 +150,7 @@ const UserModal = ({ open, onClose, userId }) => {
/>
<Field
as={TextField}
label="Email"
label={i18n.t("userModal.form.email")}
name="email"
error={touched.email && Boolean(errors.email)}
helperText={touched.email && errors.email}
@@ -158,7 +160,7 @@ const UserModal = ({ open, onClose, userId }) => {
<div>
<Field
as={TextField}
label="New Password"
label={i18n.t("userModal.form.password")}
type="password"
name="password"
error={touched.password && Boolean(errors.password)}
@@ -176,7 +178,7 @@ const UserModal = ({ open, onClose, userId }) => {
</InputLabel>
<Field
as={Select}
label="Profile"
label={i18n.t("userModal.form.profile")}
name="profile"
labelId="profile-selection-label"
id="profile-selection"
@@ -195,7 +197,7 @@ const UserModal = ({ open, onClose, userId }) => {
disabled={isSubmitting}
variant="outlined"
>
Cancel
{i18n.t("userModal.buttons.cancel")}
</Button>
<Button
type="submit"
@@ -204,7 +206,9 @@ const UserModal = ({ open, onClose, userId }) => {
variant="contained"
className={classes.btnWrapper}
>
{"Ok"}
{userId
? `${i18n.t("userModal.buttons.okEdit")}`
: `${i18n.t("userModal.buttons.okAdd")}`}
{isSubmitting && (
<CircularProgress
size={24}

View File

@@ -20,6 +20,7 @@ import {
// import { i18n } from "../../translate/i18n";
import api from "../../services/api";
import { i18n } from "../../translate/i18n";
const useStyles = makeStyles(theme => ({
form: {
@@ -91,7 +92,7 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
} else {
await api.post("/whatsapp", values);
}
toast.success("Success!");
toast.success(i18n.t("whatsappModal.success"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {
@@ -108,7 +109,11 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
return (
<Dialog open={open} onClose={handleClose} maxWidth="lg" scroll="paper">
<DialogTitle>WhatsApp</DialogTitle>
<DialogTitle>
{whatsAppId
? i18n.t("whatsappModal.title.edit")
: i18n.t("whatsappModal.title.add")}
</DialogTitle>
<Formik
initialValues={whatsApp}
enableReinitialize={true}
@@ -116,7 +121,6 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
onSubmit={(values, actions) => {
setTimeout(() => {
handleSaveWhatsApp(values);
// alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 400);
}}
@@ -126,7 +130,7 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
<DialogContent dividers className={classes.form}>
<Field
as={TextField}
label="Name"
label={i18n.t("whatsappModal.form.name")}
autoFocus
name="name"
error={touched.name && Boolean(errors.name)}
@@ -144,7 +148,7 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
checked={values.isDefault}
/>
}
label="Default"
label={i18n.t("whatsappModal.form.default")}
/>
</DialogContent>
<DialogActions>
@@ -154,7 +158,7 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
disabled={isSubmitting}
variant="outlined"
>
Cancel
{i18n.t("whatsappModal.buttons.cancel")}
</Button>
<Button
type="submit"
@@ -163,7 +167,9 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
variant="contained"
className={classes.btnWrapper}
>
Save
{whatsAppId
? i18n.t("whatsappModal.buttons.okEdit")
: i18n.t("whatsappModal.buttons.okAdd")}
{isSubmitting && (
<CircularProgress
size={24}

View File

@@ -44,7 +44,7 @@ const MainListItems = () => {
<ListItemLink to="/" primary="Dashboard" icon={<DashboardIcon />} />
<ListItemLink
to="/connections"
primary="Connections"
primary={i18n.t("mainDrawer.listItems.connections")}
icon={<SyncAltIcon />}
/>
<ListItemLink
@@ -61,7 +61,9 @@ const MainListItems = () => {
{userProfile === "admin" && (
<>
<Divider />
<ListSubheader inset>Administration</ListSubheader>
<ListSubheader inset>
{i18n.t("mainDrawer.listItems.administration")}
</ListSubheader>
<ListItemLink
to="/users"
primary={i18n.t("mainDrawer.listItems.users")}

View File

@@ -20,6 +20,7 @@ import NotificationsPopOver from "../NotificationsPopOver";
import UserModal from "../UserModal";
import { AuthContext } from "../../context/Auth/AuthContext";
import BackdropLoading from "../BackdropLoading";
import { i18n } from "../../translate/i18n";
const drawerWidth = 240;
@@ -197,7 +198,7 @@ const LoggedInLayout = ({ appTitle, children }) => {
noWrap
className={classes.title}
>
WHATICKET
WhaTicket
</Typography>
<NotificationsPopOver />
@@ -226,8 +227,12 @@ const LoggedInLayout = ({ appTitle, children }) => {
open={menuOpen}
onClose={handleCloseMenu}
>
<MenuItem onClick={handleOpenUserModal}>Profile</MenuItem>
<MenuItem onClick={handleLogout}>Logout</MenuItem>
<MenuItem onClick={handleOpenUserModal}>
{i18n.t("mainDrawer.appBar.user.profile")}
</MenuItem>
<MenuItem onClick={handleLogout}>
{i18n.t("mainDrawer.appBar.user.logout")}
</MenuItem>
</Menu>
</div>
</Toolbar>

View File

@@ -27,6 +27,7 @@ import api from "../../services/api";
import WhatsAppModal from "../../components/WhatsAppModal";
import ConfirmationModal from "../../components/ConfirmationModal";
import QrcodeModal from "../../components/QrcodeModal";
import { i18n } from "../../translate/i18n";
const reducer = (state, action) => {
if (action.type === "LOAD_WHATSAPPS") {
@@ -179,7 +180,7 @@ const Connections = () => {
const handleDeleteWhatsApp = async whatsAppId => {
try {
await api.delete(`/whatsapp/${whatsAppId}`);
toast.success("Deleted!");
toast.success(i18n.t("connections.toasts.deleted"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {
@@ -192,12 +193,17 @@ const Connections = () => {
return (
<MainContainer>
<ConfirmationModal
title={deletingWhatsApp && `Delete ${deletingWhatsApp.name}?`}
title={
deletingWhatsApp &&
`${i18n.t("connections.confirmationModal.deleteTitle")} ${
deletingWhatsApp.name
}?`
}
open={confirmModalOpen}
setOpen={setConfirmModalOpen}
onConfirm={() => handleDeleteWhatsApp(deletingWhatsApp.id)}
>
Are you sure? It cannot be reverted.
{i18n.t("connections.confirmationModal.deleteMessage")}
</ConfirmationModal>
<QrcodeModal
open={qrModalOpen}
@@ -212,14 +218,14 @@ const Connections = () => {
whatsAppId={selectedWhatsApp && !qrModalOpen && selectedWhatsApp.id}
/>
<MainHeader>
<Title>Connections</Title>
<Title>{i18n.t("connections.title")}</Title>
<MainHeaderButtonsWrapper>
<Button
variant="contained"
color="primary"
onClick={handleOpenWhatsAppModal}
>
Add Whatsapp
{i18n.t("connections.buttons.add")}
</Button>
</MainHeaderButtonsWrapper>
</MainHeader>
@@ -227,11 +233,21 @@ const Connections = () => {
<Table size="small">
<TableHead>
<TableRow>
<TableCell align="center">Name</TableCell>
<TableCell align="center">Status</TableCell>
<TableCell align="center">Last update</TableCell>
<TableCell align="center">Default</TableCell>
<TableCell align="center">Actions</TableCell>
<TableCell align="center">
{i18n.t("connections.table.name")}
</TableCell>
<TableCell align="center">
{i18n.t("connections.table.status")}
</TableCell>
<TableCell align="center">
{i18n.t("connections.table.lastUpdate")}
</TableCell>
<TableCell align="center">
{i18n.t("connections.table.default")}
</TableCell>
<TableCell align="center">
{i18n.t("connections.table.actions")}
</TableCell>
</TableRow>
</TableHead>
<TableBody>

View File

@@ -164,7 +164,7 @@ const Contacts = () => {
const handleDeleteContact = async contactId => {
try {
await api.delete(`/contacts/${contactId}`);
toast.success("Contact deleted sucessfully!");
toast.success(i18n.t("contacts.toasts.deleted"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {

View File

@@ -9,6 +9,7 @@ import Select from "@material-ui/core/Select";
import { toast } from "react-toastify";
import api from "../../services/api";
import { i18n } from "../../translate/i18n.js";
const useStyles = makeStyles(theme => ({
root: {
@@ -78,7 +79,7 @@ const Settings = () => {
await api.put(`/settings/${settingKey}`, {
value: selectedValue,
});
toast.success("Setting updated");
toast.success(i18n.t("settings.success"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {
@@ -96,10 +97,12 @@ const Settings = () => {
<div className={classes.root}>
<Container className={classes.container} maxWidth="sm">
<Typography variant="body2" gutterBottom>
Settings
{i18n.t("settings.title")}
</Typography>
<Paper className={classes.paper}>
<Typography variant="body1">User creation</Typography>
<Typography variant="body1">
{i18n.t("settings.settings.userCreation.name")}
</Typography>
<Select
margin="dense"
variant="outlined"
@@ -112,8 +115,12 @@ const Settings = () => {
className={classes.settingOption}
onChange={handleChangeSetting}
>
<option value="enabled">Enabled</option>
<option value="disabled">Disabled</option>
<option value="enabled">
{i18n.t("settings.settings.userCreation.options.enabled")}
</option>
<option value="disabled">
{i18n.t("settings.settings.userCreation.options.disabled")}
</option>
</Select>
</Paper>
</Container>

View File

@@ -24,6 +24,7 @@ import MainHeaderButtonsWrapper from "../../components/MainHeaderButtonsWrapper"
import Title from "../../components/Title";
import api from "../../services/api";
import { i18n } from "../../translate/i18n";
import TableRowSkeleton from "../../components/TableRowSkeleton";
import UserModal from "../../components/UserModal";
import ConfirmationModal from "../../components/ConfirmationModal";
@@ -161,7 +162,7 @@ const Users = () => {
const handleDeleteUser = async userId => {
try {
await api.delete(`/users/${userId}`);
toast.success("User deleted!");
toast.success(i18n.t("users.toasts.deleted"));
} catch (err) {
console.log(err);
if (err.response && err.response.data && err.response.data.error) {
@@ -188,12 +189,17 @@ const Users = () => {
return (
<MainContainer>
<ConfirmationModal
title={deletingUser && `Delete ${deletingUser.name}?`}
title={
deletingUser &&
`${i18n.t("users.confirmationModal.deleteTitle")} ${
deletingUser.name
}?`
}
open={confirmModalOpen}
setOpen={setConfirmModalOpen}
onConfirm={e => handleDeleteUser(deletingUser.id)}
onConfirm={() => handleDeleteUser(deletingUser.id)}
>
Are you sure? It canoot be reverted.
{i18n.t("users.confirmationModal.deleteMessage")}
</ConfirmationModal>
<UserModal
open={userModalOpen}
@@ -202,10 +208,10 @@ const Users = () => {
userId={selectedUser && selectedUser.id}
/>
<MainHeader>
<Title>Usuários</Title>
<Title>{i18n.t("users.title")}</Title>
<MainHeaderButtonsWrapper>
<TextField
placeholder="Search..."
placeholder={i18n.t("contacts.searchPlaceholder")}
type="search"
value={searchParam}
onChange={handleSearch}
@@ -222,7 +228,7 @@ const Users = () => {
color="primary"
onClick={handleOpenUserModal}
>
Novo Usuário
{i18n.t("users.buttons.add")}
</Button>
</MainHeaderButtonsWrapper>
</MainHeader>
@@ -234,10 +240,12 @@ const Users = () => {
<Table size="small">
<TableHead>
<TableRow>
<TableCell>Name</TableCell>
<TableCell>Email</TableCell>
<TableCell>Profile</TableCell>
<TableCell align="right">Actions</TableCell>
<TableCell>{i18n.t("users.table.name")}</TableCell>
<TableCell>{i18n.t("users.table.email")}</TableCell>
<TableCell>{i18n.t("users.table.profile")}</TableCell>
<TableCell align="right">
{i18n.t("users.table.actions")}
</TableCell>
</TableRow>
</TableHead>
<TableBody>

View File

@@ -41,20 +41,50 @@ const messages = {
},
},
},
sessionInfo: {
status: "Status:",
battery: "Battery:",
charging: "Loading:",
updatedAt: "Updated at:",
buttons: {
disconnect: "Disconnect",
connections: {
title: "Connections",
toasts: {
deleted: "WhatsApp connection deleted sucessfully!",
},
confirmationModal: {
deleteTitle: "Delete",
deleteMessage: "Are you sure? It cannot be reverted.",
},
buttons: {
add: "Add WhatsApp",
},
table: {
name: "Name",
status: "Status",
lastUpdate: "Last Update",
default: "Default",
actions: "Actions",
},
},
whatsappModal: {
title: {
add: "Add WhatsApp",
edit: "Edit WhatsApp",
},
form: {
name: "Name",
default: "Default",
},
buttons: {
okAdd: "Add",
okEdit: "Save",
cancel: "Cancel",
},
success: "WhatsApp saved successfully.",
},
qrCode: {
message: "Read QrCode to start the session",
},
contacts: {
title: "Contacts",
toasts: {
deleted: "Contact deleted sucessfully!",
},
searchPlaceholder: "Search ...",
confirmationModal: {
deleteTitle: "Delete",
@@ -95,6 +125,25 @@ const messages = {
okEdit: "Save",
cancel: "Cancel",
},
success: "Contact saved successfully.",
},
userModal: {
title: {
add: "Add user",
edit: "Edit user",
},
form: {
name: "Name",
email: "Email",
password: "Password",
profile: "Profile",
},
buttons: {
okAdd: "Add",
okEdit: "Save",
cancel: "Cancel",
},
success: "User saved successfully.",
},
chat: {
noTicketMessage: "Select a ticket to start chatting.",
@@ -138,13 +187,55 @@ const messages = {
mainDrawer: {
listItems: {
dashboard: "Dashboard",
connection: "Connection",
connections: "Connections",
tickets: "Tickets",
contacts: "Contacts",
administration: "Administration",
users: "Users",
settings: "Settings",
},
appBar: {
user: {
profile: "Profile",
logout: "Logout",
},
},
},
notifications: {
noTickets: "No notifications.",
},
users: {
title: "Users",
table: {
name: "Name",
email: "Email",
profile: "Profile",
actions: "Actions",
},
buttons: {
add: "Add user",
},
toasts: {
deleted: "User deleted sucessfully.",
},
confirmationModal: {
deleteTitle: "Delete",
deleteMessage:
"All user data will be lost. Users' open tickets will be moved to queue.",
},
},
settings: {
success: "Settings saved successfully.",
title: "Settings",
settings: {
userCreation: {
name: "User creation",
options: {
enabled: "Enabled",
disabled: "Disabled",
},
},
},
},
messagesList: {
header: {
@@ -185,6 +276,14 @@ const messages = {
cancel: "Cancel",
},
},
messageOptionsMenu: {
delete: "Delete",
reply: "Reply",
confirmationModal: {
title: "Delete message?",
message: "This action cannot be reverted.",
},
},
},
},
};

View File

@@ -41,20 +41,50 @@ const messages = {
},
},
},
sessionInfo: {
status: "Status: ",
battery: "Bateria: ",
charging: "Carregando: ",
updatedAt: "Atualizado em:",
buttons: {
disconnect: "Desconectar",
connections: {
title: "Conexões",
toasts: {
deleted: "Conexão com o WhatsApp excluída com sucesso!",
},
confirmationModal: {
deleteTitle: "Deletar",
deleteMessage: "Você tem certeza? Essa ação não pode ser revertida.",
},
buttons: {
add: "Adicionar WhatsApp",
},
table: {
name: "Nome",
status: "Status",
lastUpdate: "Última atualização",
default: "Padrão",
actions: "Ações",
},
},
whatsappModal: {
title: {
add: "Adicionar WhatsApp",
edit: "Editar WhatsApp",
},
form: {
name: "Nome",
default: "Padrão",
},
buttons: {
okAdd: "Adicionar",
okEdit: "Salvar",
cancel: "Cancelar",
},
success: "WhatsApp salvo com sucesso.",
},
qrCode: {
message: "Leia o QrCode para iniciar a sessão",
},
contacts: {
title: "Contatos",
toasts: {
deleted: "Contato excluído com sucesso!",
},
searchPlaceholder: "Pesquisar...",
confirmationModal: {
deleteTitle: "Deletar ",
@@ -95,6 +125,25 @@ const messages = {
okEdit: "Salvar",
cancel: "Cancelar",
},
success: "Contato salvo com sucesso.",
},
userModal: {
title: {
add: "Adicionar usuário",
edit: "Editar usuário",
},
form: {
name: "Nome",
email: "Email",
password: "Senha",
profile: "Perfil",
},
buttons: {
okAdd: "Adicionar",
okEdit: "Salvar",
cancel: "Cancelar",
},
success: "Usuário salvo com sucesso.",
},
chat: {
noTicketMessage: "Selecione um ticket para começar a conversar.",
@@ -112,7 +161,7 @@ const messages = {
search: { title: "Busca" },
},
search: {
placeholder: "Pesquisar tickets e mensagens.",
placeholder: "Buscar tickets e mensagens",
},
buttons: {
showAll: "Todos",
@@ -139,9 +188,54 @@ const messages = {
mainDrawer: {
listItems: {
dashboard: "Dashboard",
connection: "Conexão",
connections: "Conexões",
tickets: "Tickets",
contacts: "Contatos",
administration: "Administração",
users: "Usuários",
settings: "Configurações",
},
appBar: {
user: {
profile: "Perfil",
logout: "Sair",
},
},
},
notifications: {
noTickets: "Nenhuma notificação.",
},
users: {
title: "Usuários",
table: {
name: "Nome",
email: "Email",
profile: "Perfil",
actions: "Ações",
},
buttons: {
add: "Adicionar usuário",
},
toasts: {
deleted: "Usuário excluído com sucesso.",
},
confirmationModal: {
deleteTitle: "Excluir",
deleteMessage:
"Todos os dados do usuário serão perdidos. Os tickets abertos deste usuário serão movidos para a fila.",
},
},
settings: {
success: "Configurações salvas com sucesso.",
title: "Configurações",
settings: {
userCreation: {
name: "Criação de usuário",
options: {
enabled: "Ativado",
disabled: "Desativado",
},
},
},
},
messagesList: {
@@ -173,6 +267,10 @@ const messages = {
message:
"Atenção! Todas as mensagens relacionadas ao ticket serão perdidas.",
},
buttons: {
delete: "Excluir",
cancel: "Cancelar",
},
},
confirmationModal: {
buttons: {
@@ -180,6 +278,14 @@ const messages = {
cancel: "Cancelar",
},
},
messageOptionsMenu: {
delete: "Deletar",
reply: "Responder",
confirmationModal: {
title: "Apagar mensagem?",
message: "Esta ação não pode ser revertida.",
},
},
},
},
};