2017-12-26 15 views
1

나는 런타임 번역을 간단하게하고 있습니다. 로케일 스위처를 누르면 아무 일도 없었습니다. 페이지를 새로 고치면 제목이으로 변경되었습니다. 따라서 런타임은입니다.번역 런타임을 만드는 방법

번역 이미지 : 여기 enter image description here

내 코드 :

관리자 :

import { en } from './languages/English'; 
import { fr } from './languages/French'; 
const messages = { 
en, 
fr 
} 
<Admin ... 
    locale={localStorage.getItem('language') ? localStorage.getItem('language') : 'en'} 
    messages={messages} 
> 
.... 
</Admin> 

로케일 스위처 :

switchToFrench =() => this.props.changeLocale('fr'); 
switchToEnglish =() => this.props.changeLocale('en'); 
switchLanguage(language) { 
    localStorage.setItem('language', language); 
    this.props.changeLocale(language); 
} 

render() { 
    return (
     <div> 
      <div>Language</div> 
      <button label="en" onClick={() => this.switchLanguage('en')}>English</button> 
      <button label="fr" onClick={() => this.switchLanguage('fr')}>French</button> 
     </div> 
    ); 
} 

영어/프랑스어 파일 :

export const en = { 
name: 'English', 
locale: 'en', 
user: { 
    no: 'No', 
    name: 'Name', 
    username: 'User Name', 
    email: 'Email', 
} 
} 
export const fr = { 
name: 'French', 
locale: 'fr', 
user: { 
    no: 'No', 
    name: 'Nom', 
    username: 'Nom d\'utilisateur', 
    email: 'Email', 
} 
} 

UserList에 :

class UserList extends Component { 
render() { 
    const { translate } = this.props; 
    return(
     <div> 
      <LocaleSwitcher /> 
      <List title="All users" {...this.props}> 
       <Datagrid> 
        <TextField source="id" label={translate('user.no')}/> 
        <TextField source="name" label={translate('user.name')}/> 
        <TextField source="username" label={translate('user.username')}/> 
        <EmailField source="email" label={translate('user.email')}/> 
       </Datagrid> 
      </List> 
     </div> 
    ) 
} 
} 
export default translate(UserList); 

내가 AOR에서 모든 기본 구성 요소를 사용하고 있습니다. 런타임 번역을 만드는 방법을 보여주십시오.

답변

2

LocaleSwitcher 구성 요소는 Admin 구성 요소에 넣을 수 있으며 callBack 함수에는 this.forceUpdate()를 사용할 수 있습니다. 이렇게하면 관리 구성 요소가 다시 렌더링되고 올바른 로켈은 로컬 저장소에서 가져옵니다. 같은 :

당신이이 답변에 같은 저장소를 사용하는 것이 좋습니다 돌아 오는 사용할 경우
<Admin ... 
    locale={localStorage.getItem('language') ? 
    localStorage.getItem('language') 
    : 'en'} 
    messages={messages} 
> 
    <LocaleSwitcher onChange={() => this.forceUpdate()}/> 
</Admin> 

:

locale switcher in action : Changing state/props of root component with Redux?

+0

의견을 보내 주셔서 감사합니다. 이 문서의 내용 [link] (https://marmelab.com/admin-on-rest/Translation.html) 런타임 변환이 가능합니다. 그리고 다른 구성 요소 (aor 구성 요소가 아님)를 만들려고합니다. 잘 작동합니다. 나는 redux를 사용하기를 기대했다. forceUpdate 함수가 나에게 좋지 않습니다. –

+0

@ LinhTrần 해결책을 찾았습니까? – llioor

+0

Daniel, ''아래에''를 추가하면 다음과 같은 오류가 나타납니다. '''경고 : 배열이나 반복기의 각 하위에는 고유 한 "키"소품이 있어야합니다. 'AdminRoutes'의 render 메소드를 확인하십시오. AdminRoutes에서 (AdminRoutes에서 생성) (Connect (AdminRoutes)에 의해 생성됨) – llioor

1

AOR 그렇게 할 로케일 변경 작업을 제공합니다 (여기 a working example on the demo입니다) marmelab/admin-on-rest-demo

:

소스 코드는 github에 볼 수 있습니다

+2

알아. 런타임 액션이 아닌 것 같습니다. 예를 들어, 언어 부분을 탐색 모음 (프랑스어 및 영어)에 입력합니다. 그런 다음 로케일을 변경하고 일부 기본 구성 요소가 변경되지 않았습니다 (** Datagrid, List, Texfield **). –

+0

@ LinhTrần 코멘트 해 주셔서 감사합니다! 그것은 내 문제를 이해하는 데 도움이 ...하지만 여전히 changeLocale() 후 모든 관리자 구성 요소를 업데이트하는 솔루션을 찾지 못했습니다. 뭐 찾았 니? – llioor

0

Custom App 로캘을 전환하기 위해 전체 프로젝트를 변경하지 않기 때문에이 솔루션으로 끝납니다.

나는 (event, index, value)을 받음으로서 SelectFieldonChange={this.switchToLocale}을 사용하고 있습니다. 문서에서 예제를 자유롭게 사용할 수 있습니다. 중요한 부분은 reload() 기능입니다.

switchToLocale = (event, index, value) => { 
    localStorage.setItem('locale', value); 
    this.props.changeLocale(value); 
    window.location.reload(); 
}; 

저는 만족스럽지 않지만 관리자가 매분 자신의 로케일을 변경하지 않을 것이라고 생각합니다.

+0

예. 네가 옳아. 하지만 내가 말할 때 그것은 ** 런타임 **입니다. 페이지를 새로 고침하고 싶지는 않습니다. –

+0

예 예 * 사용자 정의 앱을 구현해야하는 경우 * WE *로 사용하기 위해 알았습니다 ... 동의하십니까? 때문에 "나는 사용자 정의 응용 프로그램을 사용하는 전체 프로젝트를 변경하지 않을거야"로 시작했다. 좋은 해결책을 찾으면 커뮤니티와 공유하십시오. 고마워요! – llioor