Я использую React-admin и слежу за демонстрацией, которую они раздают. Пока все работает, кроме перевода названия / заголовка вкладки. Я сделал перевод правильно, потому что другие компоненты, у которых есть атрибут метка, отлично работают с переводом.
Переводы берутся из файла en.js и добавляются в app.js согласно документации реагировать-админ.
Вот мой код:
class TabbedDatagrid extends React.Component {
tabs = [
{ id: 'countries', name: 'root.countries.title' },
{ id: 'languages', name: 'root.languages.title' },
];
state = { countries: [], languages: [] };
static getDerivedStateFromProps(props, state) {
if (props.ids !== state[props.filterValues.status]) {
return { ...state, [props.filterValues.status]: props.ids };
}
return null;
}
handleChangeEvent = (event, value) => {
const { filterValues, setFilters } = this.props;
setFilters({ ...filterValues, status: value });
};
render() {
const { classes, filterValues, ...props } = this.props;
return (
<Fragment>
<Tabs
fullWidth
centered
value = {filterValues.status}
indicatorColor = "primary"
onChange = {this.handleChangeEvent}
>
{this.tabs.map(choice => (
<Tab
key = {choice.id}
label = {choice.name}
value = {choice.id}
/>
))}
</Tabs>
<Divider />
<Responsive
small = {<SimpleList primaryText = {record => record.title} />}
medium = {
<div>
{filterValues.status === 'countries' && (
<Datagrid hover = {false}
{...props}
ids = {this.state['countries']}
>
<TextField source = "id" />
<TextField source = "name" label = "root.countries.fields.name"/>
</Datagrid>
)}
{filterValues.status === 'languages' && (
<Datagrid hover = {false}
{...props}
ids = {this.state['languages']}
>
<TextField source = "id" />
<TextField source = "name" label = "root.languages.fields.name"/>
</Datagrid>
)}
</div>
}
/>
</Fragment>
);
}
}
Кажется, что перевод работает везде, кроме метки Tab. Вместо заголовка я получаю строку в верхнем регистре этого root.countries.title.
Есть ли обходной путь или как решить эту проблему?





Вы, вероятно, использовали <Tab/> «напрямую» из material-ui.
Вам необходимо использовать (создать) «расширенную версию» (с использованием translate prop) этого компонента.
Вдохновляйтесь меню или другими переводимыми компонентами.
Вам необходимо передать свои переводы в свой App.js следующим образом:
import React from 'react';
import { Admin, Resource } from 'react-admin';
import frenchMessages from 'ra-language-french';
import englishMessages from 'ra-language-english';
const messages = {
fr: { component:{label:'test'},...frenchMessages },
en: { component:{label:'test'},...englishMessages },,
}
const i18nProvider = locale => messages[locale];
const App = () => (
<Admin locale = "en" i18nProvider = {i18nProvider}>
...
</Admin>
);
export default App;
чем когда вы хотите использовать переводы внутри компонента, вам нужно подключить его к функции translate response-admin следующим образом:
import { TextInput, translate } from 'react-admin';
const translatedComponent = ({translate, ...props}) => {
return <TextInput label = {translate('component.label')} />
}
export default translate(translatedComponent);
Важно связать компонент с translate и получить функцию translate от props, чтобы получить работу по переводу.
переводы берутся из файла en.js, который включен в файл app.js, он не получает значения из состояния