diff --git a/.gitignore b/.gitignore index 2a437ad..a7f0228 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ settings-demo.json settings-staging.json settings-production.json settings-development.json +imports/ui/stylesheets/.sass-cache/ diff --git a/imports/startup/client/i18n.js b/imports/startup/client/i18n.js index e5be7ac..8bba059 100644 --- a/imports/startup/client/i18n.js +++ b/imports/startup/client/i18n.js @@ -2,6 +2,9 @@ import i18n from 'i18next'; import backend from 'i18next-xhr-backend'; import LngDetector from 'i18next-browser-languagedetector'; import Cache from 'i18next-localstorage-cache'; +import { T9n } from 'meteor-accounts-t9n'; +import en from 'meteor-accounts-t9n/build/en'; +import es from 'meteor-accounts-t9n/build/es'; // Adapted from: https://github.com/appigram/ryfma-boilerplate/blob/44c1eabfb9928b5623afab36a23997969e5beb02/imports/startup/client/i18n.js @@ -41,6 +44,8 @@ var backOpts = { jsonIndent: 2 }; +T9N_LANGUAGES='es,en'; + i18n.use(backend) .use(LngDetector) .use(Cache) @@ -79,8 +84,11 @@ i18n.use(backend) } }, function(err, t) { // initialized and ready to - // console.log(t('AppName')); document.title = t("AppName"); + // https://github.com/softwarerero/meteor-accounts-t9n + console.log("Language: " + i18n.language); + T9n.setLanguage(i18n.language); + console.log(T9n.get('error.accounts.User not found')); }); export default i18n; diff --git a/imports/ui/components/OAuthLoginButton/OAuthLoginButton.js b/imports/ui/components/OAuthLoginButton/OAuthLoginButton.js index 606e026..294a8cf 100644 --- a/imports/ui/components/OAuthLoginButton/OAuthLoginButton.js +++ b/imports/ui/components/OAuthLoginButton/OAuthLoginButton.js @@ -4,6 +4,7 @@ import { Meteor } from 'meteor/meteor'; import { Bert } from 'meteor/themeteorchef:bert'; import Icon from '../Icon/Icon'; import { translate, Trans } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; import './OAuthLoginButton.scss'; @@ -49,7 +50,8 @@ const OAuthLoginButton = ({ service, callback }) => ( OAuthLoginButton.defaultProps = { callback: (error) => { - if (error) Bert.alert(error.message, 'danger'); + if (error) Bert.alert(T9n.get(`error.accounts.${error.message}`), 'danger'); + // Bert.alert(error.message, 'danger'); }, }; diff --git a/imports/ui/components/ReSendEmail/ReSendEmail.js b/imports/ui/components/ReSendEmail/ReSendEmail.js index 57d339d..551a9d0 100644 --- a/imports/ui/components/ReSendEmail/ReSendEmail.js +++ b/imports/ui/components/ReSendEmail/ReSendEmail.js @@ -2,11 +2,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Grid, Alert, Button } from 'react-bootstrap'; import { t, Trans, translate, Interpolate } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; const handleResendVerificationEmail = (emailAddress, t) => { Meteor.call('users.sendVerificationEmail', (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { Bert.alert(t("checkVerificationEmail", {email: emailAddress}), 'success'); } diff --git a/imports/ui/pages/Login/Login.js b/imports/ui/pages/Login/Login.js index a428a46..f0fb7ad 100644 --- a/imports/ui/pages/Login/Login.js +++ b/imports/ui/pages/Login/Login.js @@ -9,6 +9,7 @@ import OAuthLoginButtons from '../../components/OAuthLoginButtons/OAuthLoginButt import AccountPageFooter from '../../components/AccountPageFooter/AccountPageFooter'; import validate from '../../../modules/validate'; import { translate } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; class Login extends React.Component { constructor(props) { @@ -48,7 +49,7 @@ class Login extends React.Component { Meteor.loginWithPassword(this.emailAddress.value, this.password.value, (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { Bert.alert(this.t('Bienvenid@ de nuevo'), 'success'); } diff --git a/imports/ui/pages/Profile/Profile.js b/imports/ui/pages/Profile/Profile.js index d6cf46d..e200aae 100644 --- a/imports/ui/pages/Profile/Profile.js +++ b/imports/ui/pages/Profile/Profile.js @@ -12,6 +12,7 @@ import { createContainer } from 'meteor/react-meteor-data'; import InputHint from '../../components/InputHint/InputHint'; import validate from '../../../modules/validate'; import { translate } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; import './Profile.scss'; @@ -97,7 +98,7 @@ class Profile extends React.Component { Meteor.call('users.editProfile', profile, (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { Bert.alert(this.t("¡Perfíl actualizado!"), 'success'); } @@ -106,7 +107,7 @@ class Profile extends React.Component { if (this.newPassword.value) { Accounts.changePassword(this.currentPassword.value, this.newPassword.value, (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { this.currentPassword.value = ''; this.newPassword.value = ''; diff --git a/imports/ui/pages/RecoverPassword/RecoverPassword.js b/imports/ui/pages/RecoverPassword/RecoverPassword.js index adc7235..f3b5d65 100644 --- a/imports/ui/pages/RecoverPassword/RecoverPassword.js +++ b/imports/ui/pages/RecoverPassword/RecoverPassword.js @@ -8,6 +8,7 @@ import { Bert } from 'meteor/themeteorchef:bert'; import AccountPageFooter from '../../components/AccountPageFooter/AccountPageFooter'; import validate from '../../../modules/validate'; import { translate } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; class RecoverPassword extends React.Component { constructor(props) { @@ -28,8 +29,8 @@ class RecoverPassword extends React.Component { }, messages: { emailAddress: { - required: 'Need an email address here.', - email: 'Is this email address correct?', + required: this.t("Necesitamos un correo aquí."), + email: this.t("¿Es este correo correcto?"), }, }, submitHandler() { component.handleSubmit(); }, @@ -43,7 +44,7 @@ class RecoverPassword extends React.Component { Accounts.forgotPassword({ email, t }, (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { Bert.alert(t("checkResetEmail", {email: email}), 'success'); history.push('/login'); diff --git a/imports/ui/pages/ResetPassword/ResetPassword.js b/imports/ui/pages/ResetPassword/ResetPassword.js index 7cc14b0..9789b8b 100644 --- a/imports/ui/pages/ResetPassword/ResetPassword.js +++ b/imports/ui/pages/ResetPassword/ResetPassword.js @@ -6,6 +6,7 @@ import { Accounts } from 'meteor/accounts-base'; import { Bert } from 'meteor/themeteorchef:bert'; import validate from '../../../modules/validate'; import { translate } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; class ResetPassword extends React.Component { constructor(props) { @@ -50,7 +51,7 @@ class ResetPassword extends React.Component { Accounts.resetPassword(token, this.newPassword.value, (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { history.push('/documents'); } diff --git a/imports/ui/pages/Signup/Signup.js b/imports/ui/pages/Signup/Signup.js index fdc0a85..8f9e99f 100644 --- a/imports/ui/pages/Signup/Signup.js +++ b/imports/ui/pages/Signup/Signup.js @@ -13,6 +13,7 @@ import validate from '../../../modules/validate'; import Icon from '../../components/Icon/Icon'; import './Signup.scss'; import { translate } from 'react-i18next'; +import { T9n } from 'meteor-accounts-t9n'; class Signup extends React.Component { constructor(props) { @@ -43,18 +44,18 @@ class Signup extends React.Component { }, messages: { firstName: { - required: 'What\'s your first name?', + required: this.t("¿Cuál es tu nombre?"), }, lastName: { - required: 'What\'s your last name?', + required: this.t("¿Cuál es tu apellido?"), }, emailAddress: { - required: 'Need an email address here.', - email: 'Is this email address correct?', + required: this.t("Necesitamos una contraseña aquí."), + email: this.t("¿Es correcto este correo?"), }, password: { - required: 'Need a password here.', - minlength: 'Please use at least six characters.', + required: this.t("Necesitamos una contraseña aquí."), + minlength: this.t("Usa al menos seis caracteres."), }, }, submitHandler() { component.handleSubmit(); }, @@ -75,7 +76,7 @@ class Signup extends React.Component { }, }, (error) => { if (error) { - Bert.alert(error.reason, 'danger'); + Bert.alert(T9n.get(`error.accounts.${error.reason}`), 'danger'); } else { Meteor.call('users.sendVerificationEmail'); Bert.alert('Welcome!', 'success'); @@ -90,13 +91,13 @@ class Signup extends React.Component {