react-translatable-input
Version:
A ReactJS input component that manages multiple languages
157 lines (134 loc) • 4.35 kB
JSX
import React from 'react';
import ReactDOM from 'react-dom';
import 'react-translatable-input/dist/react-translatable-input.css';
import 'react-translatable-input/dist/react-translatable-input-subtag-lang-flags.css';
import TranslatableInput from 'react-translatable-input';
import tags from 'language-tags';
// an helper function to translate language codes to language name.
// in real life, this would be managed by an i18n manager such as polyglot.js
function translateLanguage(tagStr) {
let langDesc;
if (tagStr === 'default') {
return 'Default';
}
const tag = tags(tagStr);
const subtagLang = tag.language();
if (subtagLang !== null) {
langDesc = subtagLang.descriptions()[0];
const subtagRegion = tag.region();
if (subtagRegion !== null && subtagRegion !== undefined) {
langDesc = `${langDesc} - ${subtagRegion.descriptions()[0]}`;
}
} else {
langDesc = tag;
}
return langDesc;
}
const demoLanguages = ['it', 'en', 'en-US', 'de'];
class Demo extends React.Component {
constructor(props) {
super(props);
// Fill in demo data
const title = {
default: 'Default post title'
};
demoLanguages.forEach((c) => {
title[c] = `Post title in ${translateLanguage(c)}`;
});
const description = {
default: ''
};
demoLanguages.forEach((c) => {
description[c] = '';
});
const content = {
default: 'Default field is used when the user language is not supported/can\'t be detected'
};
demoLanguages.forEach((c) => {
content[c] = `Post content in ${translateLanguage(c)}`;
});
this.state = {
title,
description,
content,
editingLanguage: 'it'
};
}
handleValueChange(value, lang, stateName) {
const state = this.state[stateName];
state[lang] = value;
this.setState({
[stateName]: state
});
}
handleLanguageChange(editingLanguage) {
this.setState({
editingLanguage
});
}
render() {
const { title, description, content, editingLanguage } = this.state;
const nameError = false;
return (
<div>
<div className="line">
<h2>Create new post</h2>
</div>
<div className="line">
<label htmlFor="title">Title</label>
<label htmlFor="description">Description</label>
<TranslatableInput
id="title"
values={title}
lang={editingLanguage}
classes="inline"
onValueChange={(value, lang) => this.handleValueChange(value, lang, 'title')}
onLanguageChange={lang => this.handleLanguageChange(lang)}
showLanguageName
placeholder={'Post title'}
/>
<TranslatableInput
id="description"
values={description}
lang={editingLanguage}
classes={!description[editingLanguage] ? 'error inline' : 'inline'}
onValueChange={(value, lang) => this.handleValueChange(value, lang, 'description')}
onLanguageChange={lang => this.handleLanguageChange(lang)}
langTranslator={lang => translateLanguage(lang)}
placeholder={'Post description'}
/>
</div>
<div className="line">
<label htmlFor="content">Content</label>
<TranslatableInput
id="content"
values={content}
lang={editingLanguage}
classes={nameError ? 'error' : ''}
onValueChange={(value, lang) => this.handleValueChange(value, lang, 'content')}
onLanguageChange={lang => this.handleLanguageChange(lang)}
langTranslator={lang => translateLanguage(lang)}
showLanguageName
textarea
placeholder={'Post content'}
/>
</div>
<div className="line">
<label htmlFor="metatag">Metatag</label>
<TranslatableInput
id="metatag"
values={{ default: 'Belka, React, Input, Translatable, Form, Multilanguage, Internazionalization, i18n' }}
lang="default"
langTranslator={lang => translateLanguage(lang)}
showLanguageName
disabled
/>
</div>
</div>
);
}
}
ReactDOM.render(
<Demo />,
document.getElementById('demo')
);