저는 새로운 reactjs 프로젝트를 대신했습니다. 언어 전환이 어떻게 호출되었는지 검토하려고합니다.Reactjs, reducers, 언어 전환
이렇게하면이 언어 전환을 수행하는 바닥 글에 두 개의 링크가 있습니다.
//footer.js
import React from 'react'
import { Link } from 'react-router-dom'
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import { selectLanguage, getLangDetails } from '../../actions/action_language'
import langObject from './Footer.lang'
class Footer extends React.Component {
constructor (props) {
super(props)
this.changeLanguageToGerman = this.changeLanguageToGerman.bind(this)
this.changeLanguageToEnglish = this.changeLanguageToEnglish.bind(this)
}
changeLanguageToGerman() {
this.props.selectLanguage('de')
}
changeLanguageToEnglish() {
this.props.selectLanguage('en')
}
render() {
let activeLang = 'language--active'
let alternativeLang = 'language--hover'
const lang = getLangDetails(this.props.active_language, langObject)
return (
<div>
<footer className='main-footer show-for-medium-only'>
<div className='medium-15 columns'>
<p className='text--white grid__row--offset--15 footer-text'>
<Link to={this.props.deURL} className={`text--white footer-text ${this.props.active_language === 'de' ? activeLang : alternativeLang}`} onClick={this.changeLanguageToGerman}>DE</Link>
|
<Link to={this.props.enURL} className={`text--white footer-text ${this.props.active_language === 'en' ? activeLang : alternativeLang}`} onClick={this.changeLanguageToEnglish}>EN</Link>
</p>
</div>
</footer>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
active_language: state.active_language
}
}
function mapDispatchToProps (dispatch) {
return bindActionCreators({selectLanguage: selectLanguage}, dispatch)
}
const { string, func } = React.PropTypes
Footer.propTypes = {
deURL: string,
enURL: string,
selectLanguage: func,
active_language: string
}
export default connect(mapStateToProps, mapDispatchToProps)(Footer)
// header.js
import React from 'react'
import { connect } from 'react-redux'
import { getLangDetails } from '../../actions/action_language'
import langObject from './Header.lang'
class Header extends React.Component {
render() {
let transparent
transparent = this.props.transparent ? 'transparent' : ''
const lang = getLangDetails(this.props.active_language, langObject)
return (
<div>
<header className={` main_headerbar__landing transition show-for-large-up ${transparent} `}>
<div className='contain-to-grid'>
{lang}
</div>
</header>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
active_language: state.active_language
}
}
const { bool, string } = React.PropTypes
Header.propTypes = {
transparent: bool,
active_language: string
}
export default connect(mapStateToProps)(Header)
---이 머리글/바닥 글의 구성 요소 - 그래서 각은로 분할하는 JSON 파일이 lang의 배열.
이 나는이에 후크를 생각하는 일부 글로벌 JS처럼 보이는 파일이 -하지만 사이트 구성 요소/페이지의 나머지 부분에이 기능을 확장
//action_language.js 위해 고군분투하고
export const LANGUAGE_SELECTED = 'LANGUAGE_SELECTED'
export function selectLanguage (language) {
return {
type: LANGUAGE_SELECTED,
payload: language
}
}
export function getLangDetails (language = 'de', langObject) {
const langData = langObject.langs.filter((langVar) => langVar.lang === language)
return langData['0'].lines
}
확인 - 서비스라고하는 첫 번째 페이지가 여기 있습니다. 이제 첫 번째로 나를 던지게하는 것은 active_language를 이제는 단지 언어로 사용하는 것입니다.
//services.js
import React from 'react'
import Header from '../HeaderLanding/Header'
import Footer from '../Footer/Footer'
import NoBundle from './NoBundle'
import HowTiles from './HowTiles'
import CarouselTiles from './CarouselTiles'
import YourAdvantages from './YourAdvantages'
import InformationTiles from './InformationTiles'
import ContactTiles from './ContactTiles'
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import { selectLanguage, getLangDetails } from '../../actions/action_language'
// language file
import langObject from './services.lang.json'
// services css
import './services.css'
// getting the distinct URLs from the lang files
const deURL = langObject.langs[0].pageURL
const enURL = langObject.langs[1].pageURL
const Spacers =() => (
<div>
<div className='row show-for-large-up' style={{ height: '250px' }} />
<div className='row show-for-medium-only' style={{ height: '150px' }} />
<div className='row show-for-small-only' style={{ height: '80px' }} />
</div>
)
class Services extends React.Component {
constructor (props) {
super(props)
this.language = props.match.params.langURL
}
componentWillMount() {
document.getElementById('body').className = 'overlay-background-services'
this.updateLanguage()
}
updateLanguage() {
console.log('updatelang', this.language)
if (this.language === 'de' || !this.language) {
this.props.selectLanguage('de')
} else {
this.props.selectLanguage('en')
}
}
componentWillUnmount() {
document.getElementById('body').className = ''
}
render() {
const lang = getLangDetails(this.language, langObject)
return (
<div>
<Header transparent />
<Spacers />
<NoBundle lang={lang} />
<HowTiles />
<CarouselTiles />
<YourAdvantages />
<InformationTiles />
<ContactTiles />
<Footer deURL={deURL} enURL={enURL} />
</div>
)
}
}
const mapStateToProps = (state) => {
return {
language: state.language
}
}
function mapDispatchToProps (dispatch) {
return bindActionCreators({selectLanguage: selectLanguage}, dispatch)
}
const { func, string, object } = React.PropTypes
Services.propTypes = {
selectLanguage: func,
langURL: string,
params: object,
match: object
}
export default connect(mapStateToProps, mapDispatchToProps)(Services)
로 장식? 당신의 질문에 대답하기가 어렵습니다. 당신은 정말로 아직 질문을하지 않고 있습니다. – azium
괜찮습니다. - 질문하기에 조금 어렵습니다. 본질적으로 바닥 글에있는 두 개의 링크로 호출되는 스위치가 있으므로 json 파일의 데이터를 사용하여 바닥 글의 언어 내용을 변경하게됩니다. - 헤더가이 변경 사항을 제대로 인식하고 있습니다. 머리말/꼬리말 코드에만 초점을 맞춘이 문제를 해결하는 가장 좋은 방법은 무엇입니까? - 두 번째 질문은 사이트의 다른 부분에서이 논리를 전달하는 것입니다. –
첫 번째 질문 : 알지 못함 귀하의 애플 리케이션에 대해 다른 건 모르겠지만 .. 그것은 합리적인 것 같습니다. 두 번째 질문은 여전히 질문이 아닙니다. 어쩌면 어딘가에 어쩌면 시도해보십시오. 어쩌면 작동하거나 오류가 발생하거나 시도가 멈추게 될 것입니다. 그럼 다시 와서 물어 – azium