Skip to content

Instantly share code, notes, and snippets.

@thanhtungdp
Created January 15, 2018 02:14

Revisions

  1. thanhtungdp created this gist Jan 15, 2018.
    69 changes: 69 additions & 0 deletions createLang.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,69 @@
    // hoc/create-lang.js

    /*eslint-disable*/
    import React from 'react'
    import PropTypes from 'prop-types'
    import objectPath from 'object-path'
    import { connectAutoDispatch } from 'redux/connect'
    import { changeLanguage } from 'redux/actions/languageAction'
    import { autobind } from 'core-decorators'
    import dot from 'dot'

    // eslint-disable-next-line
    export const langPropTypes = PropTypes.shape({
    t: PropTypes.func,
    changeLanguage: PropTypes.func
    })

    export function translate(key, params = {}, isParse = true) {
    const languageData = (typeof window !== "undefined" ? window.currentLanguage : global.currentLanguage)
    let translated = objectPath.get(languageData, key)
    if (translated && isParse) {
    return dot.template(translated)(params).toString()
    } else return translated ? translated : ''
    }

    const createLanguageHoc = Component => {
    @connectAutoDispatch(
    state => ({
    languageData: state.language.data[state.language.locale],
    languageLocale: state.language.locale
    }),
    { changeLanguage }
    )
    @autobind
    class LanguageHoc extends React.PureComponent {
    static propTypes = {
    changeLanguage: PropTypes.func
    }

    static getInitialProps = Component.getInitialProps

    constructor(props) {
    super(props)
    }

    translate(key, params = {}, isParse = true) {
    let translated = objectPath.get(this.props.languageData, key)
    if (translated && isParse) {
    return dot.template(translated)(params)
    } else return translated ? translated : ''
    }

    changeLanguage(lang) {
    this.props.changeLanguage(lang)
    }

    render() {
    const langProps = {
    t: this.translate,
    locale: this.props.languageLocale,
    changeLanguage: this.changeLanguage
    }
    return <Component {...this.props} ref={this.props.ref} lang={langProps} />
    }
    }
    return LanguageHoc
    }

    export default createLanguageHoc
    27 changes: 27 additions & 0 deletions language.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,27 @@
    // redux/reducers/language.js

    import update from 'react-addons-update'
    import { CHANGE_LANGUAGE } from '../actions/languageAction'
    import languages from 'languages'

    const initialState = {
    locale: 'en',
    data: languages
    }

    export default function createReducer (state = initialState, action) {
    switch (action.type) {
    case CHANGE_LANGUAGE:
    return changeLanguage(state, action)
    default:
    return state
    }
    }

    export function changeLanguage (state, { locale }) {
    return update(state, {
    locale: {
    $set: locale
    }
    })
    }
    10 changes: 10 additions & 0 deletions languageAction.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,10 @@
    // redux/reducers/lang.js

    export const CHANGE_LANGUAGE = 'LANGUAGE/change-language'

    export function changeLanguage (locale = 'en') {
    return {
    type: CHANGE_LANGUAGE,
    locale
    }
    }