i18next.com
Version:
i18next website
238 lines (207 loc) • 7.09 kB
JSX
import React from 'react';
import i18next from 'i18next';
import Backend from 'i18next-xhr-backend';
import Highlight from 'react-highlight';
import cloneDeep from 'lodash/lang/cloneDeep';
import values from 'lodash/object/values';
import Typography from 'typography';
var typography = new Typography();
var rhythm = typography.rhythm;
function jsonToJSText(str) {
return str
.replace(/"([^"]+(?=":))"/g, '$1') // remove " from "lng":
.replace(/:/g, ': ') // adds whitespace after :
.replace(/,/g, ', ') // adds whitespace after ,
.replace(/"/g, '\''); // replaces " with '
}
export default React.createClass({
getInitialState() {
return {
ready: false,
log: [],
filesLoaded: []
}
},
componentWillMount() {
var self = this;
let instance = i18next.createInstance();
this.setState({
origOptions: cloneDeep(this.props.options)
})
const stateLogger = {
type: 'logger',
log(args) {
this._output('log', args);
},
warn(args) {
this._output('warn', args);
},
error(args) {
this._output('error', args);
},
_output(type, args) {
let loadedFiles = [];
if (args[0].indexOf('i18next::backendConnector: loaded ') === 0) {
let regexp = new RegExp('namespace (.*) for language (.*)', 'g');
let match = regexp.exec(args[0]);
let loaded = instance.options.backend.loadPath.replace('{{lng}}', match[2]).replace('{{ns}}', match[1]);
if (loaded) loadedFiles.push(loaded);
}
self.setState({
log: [args].concat(self.state.log),
filesLoaded: loadedFiles.length ? [loadedFiles].concat(self.state.filesLoaded) : self.state.filesLoaded
});
if (console && console[type]) console[type].apply(console, Array.prototype.slice.call(args));
}
};
let ready = (err, t) => {
this.setState({
ready: true,
samples: this.runSamples()
});
}
if (this.props.options.backend) {
instance
.use(Backend)
.use(stateLogger);
} else {
instance
.use(stateLogger);
}
if (this.props.use) {
this.props.use.forEach(module => {
instance.use(module);
});
}
instance.init(this.props.options, ready);
instance.on('loaded', (loaded) => {
this.setState({
loaded: true,
resources: instance.services.resourceStore.toJSON()
});
});
this.i18next = instance;
},
runSamples() {
let samples = cloneDeep(this.props.samples);
samples.map((sample) => {
sample.run.map((item) => {
let res = this.i18next[item.fc].apply(this.i18next, item.args);
item.res = typeof res === 'object' ? JSON.stringify(res) : res;
})
});
return samples;
},
render() {
return (
<div>
<div>
<h4>{this.props.options.backend ? 'loaded resources' : 'passed in resources' }</h4>
{
this.props.options.backend &&
this.state.filesLoaded.map((resPath) => {
return <p key={resPath} style={{margin: 0}}><a href={resPath} target="blank">{resPath}</a></p>;
})
}
<div style={{maxHeight: 250, overflowY: 'auto'}}>
<Highlight className='json'>
{JSON.stringify(this.state.resources, null, 2)}
</Highlight>
</div>
</div>
<div style={{marginTop: 20}}>
{
this.state.samples &&
this.state.samples.map((sample) => {
let anchorName = `${sample.title.replace(/ /g, '')}`
anchorName = anchorName.toLowerCase();
return (
<div key={sample.title}>
<a name={anchorName}></a>
<h4><a href={`#${anchorName}`}>{sample.title}</a></h4>
<Highlight className='js'>
{
sample.run &&
sample.run.map((item) => {
let lines = [];
let parsedArgs = item.args.map((arg) => { return jsonToJSText(JSON.stringify(arg)); });
if (item.fc === 't') {
let txt = `i18next.${item.fc}(${parsedArgs.join(', ')}); // output: '${item.res}'`;
txt += item.comment ? ` ${item.comment}\n` : '\n';
lines.push(txt);
}
return lines.join('\n');
})
}
</Highlight>
</div>
)
})
}
</div>
<hr style={{marginTop: 60}} />
<div
style={{
overflowY: 'auto',
maxHeight: 400
}}
>
<div
style={{
overflowY: 'auto',
paddingRight: `calc(${rhythm(1/2)} - 1px)`,
position: 'absolute',
width: `calc(${rhythm(16)} - 1px)`
}}
>
<h6>Init options</h6>
<div className='code-10'>
<Highlight className='json'>
{JSON.stringify(this.state.origOptions, function(key, val) {
if (typeof val === 'function') {
return val + ''; // implicitly `toString` it
}
return val;
}, 2)}
</Highlight>
</div>
</div>
<div
style={{
padding: `0 ${rhythm(1)}`,
paddingLeft: `calc(${rhythm(16)} + ${rhythm(1)})`
}}
>
<h6>Console</h6>
{
this.state.log.map((item, i) => {
if (item.length === 1) return <div key={i} style={{fontSize: 12, marginBottom: 20}}><span>{item[0]}</span></div>;
if (item.length === 2) return (
<div key={i} style={{fontSize: 12, marginBottom: 20}}>
<span>{item[0]}</span>
<div className='code-10' style={{fontSize: 8, padding: 2, maxHeight: 100, overflowY: 'auto'}}>
<Highlight className='json'>
{JSON.stringify(item[1], null, 2)}
</Highlight>
</div>
</div>
);
if (item.length > 2) return (
<div key={i} style={{fontSize: 12, marginBottom: 20}}>
<span>{item[0]}</span>
<div className='code-10' style={{fontSize: 8, padding: 2, maxHeight: 100, overflowY: 'auto'}}>
<Highlight className='json'>
{JSON.stringify(values(item).slice(1).join(', '), null, 2)}
</Highlight>
</div>
</div>
);
return null;
})
}
</div>
</div>
</div>
);
},
});