Im utilisant reac-i18next. La chose est qu'il s'attend à ce que le <I18nextProvider>
soit emballé sur l'extérieur de mon application. Je ne peux pas l'envelopper dans mon composant lui-même, car cela déclenchera des erreurs.Traduction de chaque composant pour reac-i18next
Est-il même possible d'exécuter plusieurs instances de ce fournisseur? Depuis j'ai environ 12 composants réutilisables que je veux offrir avec un support multilingue. Comment dois-je gérer cela puisque je veux gérer les traductions, si possible, dans ces composants lui-même.
La chose que j'ai en ce moment est de me donner des erreurs que les options ne sont pas définies. Je suppose que cela arrive parce que je veux traduire au niveau du composant externe où le composant est rendu à l'intérieur. Un composant wrapper intermédiaire pourrait faire ici cependant.
import React from 'react';
import { connect } from 'react-redux';
import { Form, Button, Input } from '@my/react-ui-elements';
import { authenticateUser } from '../../actions/index';
import { translate } from 'react-i18next';
import { I18nextProvider } from 'react-i18next';
import i18n from '../../i18n';
const styles = {
wrapper: {
padding: '30px 20px',
background: '#fff',
borderRadius: '3px',
border: '1px solid #e5e5e5'
},
subTitle: {
opacity: 0.3
}
};
@connect(store => {
return {
config: store.config.components.Authentication,
loading: store.authentication.loginform_loading,
errorMessage: store.authentication.loginform_errorMessage,
forgotpasswordEnabled: store.config.components.Authentication.forgotpassword_enabled
};
})
@translate(['common'], { wait: false })
class LoginForm extends React.Component {
constructor() {
super();
this.state = {
username: null,
password: null
};
this.handleForm = this.handleForm.bind(this);
}
handleForm(e) {
e.preventDefault();
this.props.dispatch(authenticateUser(this.state.username, this.state.password));
}
render() {
const { t } = this.props;
// Forgot password
var forgotPassword = null;
if(this.props.forgotpasswordEnabled) {
forgotPassword = <Form.Field>
<Button as='a' href={this.props.config.forgotpassword_path} secondary fluid>Forgot password</Button>
</Form.Field>;
}
// Full element
return (
<I18nextProvider i18n={ i18n }>
<Form style={styles.wrapper} onSubmit={this.handleForm}>
<h3>{t('Login')}</h3>
<p>{this.props.errorMessage}</p>
<Form.Field>
<Input onChange={e => this.setState({username: e.target.value})} label='Username'/>
</Form.Field>
<Form.Field>
<Input onChange={e => this.setState({password: e.target.value})} type='password' label='Password'/>
</Form.Field>
<Form.Field>
<Button loading={this.props.loading} disabled={this.props.loading} type='submit' primary fluid>Login</Button>
</Form.Field>
{forgotPassword}
</Form>
</I18nextProvider>
);
}
}
export default LoginForm;
Assez bien merci! J'ai une autre question sur la traduction des composants. Comment devriez-vous gérer la traduction de chaque composant que tous ces composants peuvent être livrés avec une traduction par défaut. Dans l'ensemble, l'implémentation de l'application devrait être capable de surcharger la traduction proprement dite – Dirkos
Par traduction par défaut, vous voulez dire simplement fournir du texte en langage de repli ou dans toutes les langues? Pour le repli, vous pouvez utiliser: defaultValue dans les options t: https://www.i18next.com/essentials.html#overview-options Pour plusieurs langues, je suggère d'utiliser https://www.i18next.com/essentials .html # multiple-fallback-keys et vous ajoutez vos traductions "par défaut" en les ajoutant via https://www.i18next.com/api.html#addresourcebundle – jamuhl
Non, je comprends le repli mais j'ai 10 composants. Je veux les expédier tous en français/allemand/anglais. Tous sont bien traduits, ce qui fonctionne très bien. Mais maintenant im les implémenter pour un client dans une application et mon client veut une autre traduction spécifique. Comment gérer cela si c'est même possible? – Dirkos