প্রতিক্রিয়া / Redux এবং বহুভাষিক (আন্তর্জাতিকীকরণ) অ্যাপ্লিকেশন - আর্কিটেকচার


119

আমি এমন একটি অ্যাপ তৈরি করছি যা একাধিক ভাষা এবং লোকেলগুলিতে উপলব্ধ হওয়া দরকার।

আমার প্রশ্নটি নিখুঁতভাবে প্রযুক্তিগত নয়, বরং আর্কিটেকচার এবং এই সমস্যা সমাধানের জন্য লোকেরা প্রকৃতপক্ষে উত্পাদনে যে প্যাটার্নগুলি ব্যবহার করছে তা সম্পর্কে। আমি এর জন্য কোথাও কোনও "কুকবুক" খুঁজে পাইনি, তাই আমি আমার প্রিয় কিউ / এ ওয়েবসাইটে ঘুরছি :)

এখানে আমার প্রয়োজনীয়তা রয়েছে (সেগুলি সত্যই "স্ট্যান্ডার্ড"):

  • ব্যবহারকারী ভাষা বেছে নিতে পারেন (তুচ্ছ)
  • ভাষা পরিবর্তন করার পরে, ইন্টারফেসটি নতুন নির্বাচিত ভাষায় স্বয়ংক্রিয়ভাবে অনুবাদ করা উচিত
  • আমি এই মুহুর্তে সংখ্যা, তারিখ ইত্যাদির বিন্যাস সম্পর্কে খুব বেশি চিন্তিত নই, আমি কেবল স্ট্রিং অনুবাদ করার জন্য একটি সহজ সমাধান চাই

আমি ভাবতে পারি এমন সম্ভাব্য সমাধানগুলি এখানে:

বিচ্ছিন্নভাবে অনুবাদ সঙ্গে প্রতিটি উপাদান লেনদেন

এর অর্থ হ'ল প্রতিটি উপাদানগুলির জন্য উদাহরণস্বরূপ অনুবাদকৃত স্ট্রিংগুলির সাথে এন.জসন, ফ্র.জসন ইত্যাদি ফাইলের সেট রয়েছে। এবং নির্বাচিত ভাষার উপর নির্ভর করে মানগুলি পড়তে সহায়তা করার জন্য একটি সহায়ক ফাংশন।

  • প্রো: প্রতিক্রিয়া দর্শনের আরও শ্রদ্ধাশীল, প্রতিটি উপাদান হ'ল একক "
  • কনস: আপনি কোনও ফাইলের সমস্ত অনুবাদকে কেন্দ্রীভূত করতে পারবেন না (উদাহরণস্বরূপ অন্য কেউ নতুন ভাষায় যুক্ত করতে পারেন)
  • কনস: আপনার এখনও প্রতিটি রক্তাক্ত উপাদান এবং তাদের বাচ্চাদের প্রপোস হিসাবে বর্তমান ভাষাটি পাস করতে হবে

প্রতিটি উপাদান প্রপসের মাধ্যমে অনুবাদগুলি গ্রহণ করে

সুতরাং তারা বর্তমান ভাষা সম্পর্কে সচেতন নয়, তারা কেবল প্রপস হিসাবে স্ট্রিংগুলির একটি তালিকা নিয়ে থাকে যা বর্তমান ভাষার সাথে মেলে

  • প্রো: যেহেতু এই স্ট্রিংগুলি "শীর্ষ থেকে" আসছে, সেগুলি কোথাও কেন্দ্রীভূত করা যেতে পারে
  • কনস: প্রতিটি উপাদান এখন অনুবাদ সিস্টেমে আবদ্ধ, আপনি কেবল একটি পুনরায় ব্যবহার করতে পারবেন না, আপনাকে প্রতিটি সময় সঠিক স্ট্রিং নির্দিষ্ট করতে হবে

আপনি প্রপসকে কিছুটা বাইপাস করে এবং সম্ভবত বর্তমান ভাষাটি পাস করার জন্য প্রাসঙ্গিক জিনিসটি ব্যবহার করতে পারেন

  • প্রো: এটি বেশিরভাগ স্বচ্ছ, বর্তমান ভাষা এবং / অথবা অনুবাদগুলি প্রপসগুলির মাধ্যমে সর্বদা পাস করতে হবে না
  • কনস: এটি ব্যবহার করা জটিল looks

আপনার যদি অন্য কোনও ধারণা থাকে তবে দয়া করে বলুন!

তুমি এটা কিভাবে কর?


2
আমি অনুবাদ স্ট্রিংগুলির সাথে কীগুলির কোনও অবজেক্টের ধারণা পছন্দ করি যা প্রপ হিসাবে নিচে চলে যায়, আপনাকে প্রতিটি স্ট্রিং পৃথকভাবে প্রপ হিসাবে পাস করতে হবে না। শীর্ষ স্তরে এটিকে পরিবর্তন করা পুনরায় রেন্ডারকে ট্রিগার করা উচিত। আমি মনে করি না যে প্রসঙ্গটি ব্যবহার করা এটির জন্য একটি ভাল ধারণা, এবং অনুবাদ ফাইলে অ্যাক্সেস থাকা প্রতিটি উপাদান তাদের কম "বোবা" এবং পোর্টেবল আসলে ইমো করে তোলে (এবং অ্যাপ্লিকেশনটিকে ভাষা পরিবর্তনে পুনরায় রেন্ডার করতে আরও কঠিন)।
ডোমিনিক

1
প্রকৃতপক্ষে ফেসবুক. github.io/react/docs/context.html অনুসারে , বর্তমান ভাষা ভাগ করে নেওয়ার জন্য প্রসঙ্গ ব্যবহার করা বৈধ ব্যবহারের ক্ষেত্রে অন্যতম। আমি এখন যে পদ্ধতির চেষ্টা করছি সেটি হ'ল এই প্লাসটিকে উচ্চতর অর্ডার উপাদান ব্যবহার করে সেই নির্দিষ্ট উপাদানটির জন্য স্ট্রিংগুলি বের করার যুক্তি (সম্ভবত কিছু কী এর উপর ভিত্তি করে) ব্যবহার করতে হবে
এন্টোইন জাউসোইন

1
হতে পারে আপনি তাত্ক্ষণিকভাবে একবার দেখে নিতে পারেন । তারা এই সমস্যাটিকে একেবারে অন্যভাবে মোকাবেলা করে ফ্রন্টএন্ড আলা অপটিমাইজলি (ওরফে লোডের সময় ডমকে পরিবর্তন করে) এটিকে মোকাবেলা করে।
মার্সেল পানসে

1
মোটেও খারাপ নয়! এটি প্রকৃতপক্ষে একটি সম্পূর্ণ ভিন্ন জন্তু (যা আপনাকে এমন একটি পরিষেবার সাথে সংযুক্ত করে যা আপনার ওয়েবসাইটটি বাড়তে থাকলে আপনাকে অর্থ প্রদানের প্রয়োজন হতে পারে), তবে আমি ধারণাটি পছন্দ করি এবং এটি সম্ভবত একটি ছোট ওয়েবসাইটের জন্য এটির পক্ষে মূল্যবান যা আপনার দ্রুত দৌড়াতে হবে!
এন্টোইন জসসোইন

4
এছাড়াও, আপনি উল্লেখ করতে চাইতে পারেন যে আপনি "তাদের" বলার পরিবর্তে তাত্ক্ষণিকের একজন সহ প্রতিষ্ঠাতা, যেমন: তাদের সাথে আপনার কোনও
যোগসূত্র

উত্তর:


110

বেশ কয়েকটি সমাধানের চেষ্টা করার পরে, আমি মনে করি যে আমি একটি কার্যকরভাবে খুঁজে পেয়েছি এবং এটি প্রতিক্রিয়া 0.14 এর প্রতিক্রিয়া (যেমন এটি মিক্সিনগুলি ব্যবহার করে না, তবে উচ্চতর আদেশের উপাদানগুলি) হওয়া উচিত ( সম্পাদনা : অবশ্যই 15 টি প্রতিক্রিয়া সহ পুরোপুরি ঠিক আছে! )।

সুতরাং এখানে সমাধানটি নীচে থেকে শুরু করে (পৃথক উপাদানগুলি):

কম্পোনেন্ট

আপনার উপাদানগুলির কেবলমাত্র প্রয়োজন (কনভেনশন দ্বারা), একটি stringsপ্রপস। এটি এমন উপাদান হওয়া উচিত যা আপনার উপাদানগুলির বিভিন্ন স্ট্রিং যুক্ত করে তবে এটির আকারটি আপনার উপর নির্ভর করে।

এটিতে ডিফল্ট অনুবাদগুলি রয়েছে, সুতরাং আপনি কোনও অনুবাদ দেওয়ার প্রয়োজন ছাড়াই উপাদানটি অন্য কোথাও ব্যবহার করতে পারেন (এটি উদাহরণস্বরূপ ডিফল্ট ভাষা, ইংরেজী সহ বাক্সটির বাইরে কাজ করবে)

import { default as React, PropTypes } from 'react';
import translate from './translate';

class MyComponent extends React.Component {
    render() {

        return (
             <div>
                { this.props.strings.someTranslatedText }
             </div>
        );
    }
}

MyComponent.propTypes = {
    strings: PropTypes.object
};

MyComponent.defaultProps = {
     strings: {
         someTranslatedText: 'Hello World'
    }
};

export default translate('MyComponent')(MyComponent);

উচ্চতর আদেশের উপাদান

পূর্ববর্তী স্নিপেটে, আপনি এটি সম্ভবত শেষ লাইনে লক্ষ্য করেছেন: translate('MyComponent')(MyComponent)

translate এক্ষেত্রে একটি উচ্চতর অর্ডার উপাদান যা আপনার উপাদানটিকে মোড়ানো করে এবং কিছু অতিরিক্ত কার্যকারিতা সরবরাহ করে (এই নির্মাণটি প্রতিক্রিয়াটির পূর্ববর্তী সংস্করণগুলির মিশ্রণগুলি প্রতিস্থাপন করে)।

প্রথম যুক্তিটি একটি কী যা অনুবাদ ফাইলটিতে অনুবাদগুলি অনুসন্ধান করতে ব্যবহৃত হবে (আমি এখানে উপাদানটির নামটি ব্যবহার করেছি, তবে এটি কিছু হতে পারে)। দ্বিতীয়টি (খেয়াল করুন যে ফাংশনটি কারি করা হয়েছে, ES7 সজ্জকারকে অনুমতি দেওয়ার জন্য) নিজেই অংশটি মোড়ানো হয়।

অনুবাদ উপাদানটির কোড এখানে:

import { default as React } from 'react';
import en from '../i18n/en';
import fr from '../i18n/fr';

const languages = {
    en,
    fr
};

export default function translate(key) {
    return Component => {
        class TranslationComponent extends React.Component {
            render() {
                console.log('current language: ', this.context.currentLanguage);
                var strings = languages[this.context.currentLanguage][key];
                return <Component {...this.props} {...this.state} strings={strings} />;
            }
        }

        TranslationComponent.contextTypes = {
            currentLanguage: React.PropTypes.string
        };

        return TranslationComponent;
    };
}

এটি যাদু নয়: এটি প্রসঙ্গটি থেকে কেবলমাত্র বর্তমান ভাষাটি পড়বে (এবং সেই প্রসঙ্গটি কোড বেজ জুড়ে সমস্ত প্রবাহিত হয় না, কেবলমাত্র এই র‍্যাপারে এখানে ব্যবহৃত হয়) এবং তারপরে লোড হওয়া ফাইলগুলি থেকে প্রাসঙ্গিক স্ট্রিংগুলি পাওয়া যাবে। এই উদাহরণটিতে যুক্তির এই অংশটি বেশ নির্বোধ, আপনি যেভাবে চান সত্যিই এটি করা যেতে পারে।

গুরুত্বপূর্ণ অংশটি হ'ল এটি বর্তমান ভাষাটিকে প্রসঙ্গ থেকে নিয়ে যায় এবং কী সরবরাহ করে তা স্ট্রিংগুলিতে রূপান্তর করে।

শ্রেণিবিন্যাসের একেবারে শীর্ষে

মূল উপাদানটিতে, আপনার কেবলমাত্র আপনার বর্তমান অবস্থা থেকে বর্তমান ভাষা সেট করা দরকার। নিম্নলিখিত উদাহরণটি রেডাক্সকে ফ্লাক্স-এর মতো বাস্তবায়ন হিসাবে ব্যবহার করছে তবে এটি অন্য কোনও কাঠামো / প্যাটার্ন / লাইব্রেরি ব্যবহার করে সহজেই রূপান্তর করা যায়।

import { default as React, PropTypes } from 'react';
import Menu from '../components/Menu';
import { connect } from 'react-redux';
import { changeLanguage } from '../state/lang';

class App extends React.Component {
    render() {
        return (
            <div>
                <Menu onLanguageChange={this.props.changeLanguage}/>
                <div className="">
                    {this.props.children}
                </div>

            </div>

        );
    }

    getChildContext() {
        return {
            currentLanguage: this.props.currentLanguage
        };
    }
}

App.propTypes = {
    children: PropTypes.object.isRequired,
};

App.childContextTypes = {
    currentLanguage: PropTypes.string.isRequired
};

function select(state){
    return {user: state.auth.user, currentLanguage: state.lang.current};
}

function mapDispatchToProps(dispatch){
    return {
        changeLanguage: (lang) => dispatch(changeLanguage(lang))
    };
}

export default connect(select, mapDispatchToProps)(App);

এবং শেষ করতে, অনুবাদ ফাইলগুলি:

অনুবাদ ফাইল

// en.js
export default {
    MyComponent: {
        someTranslatedText: 'Hello World'
    },
    SomeOtherComponent: {
        foo: 'bar'
    }
};

// fr.js
export default {
    MyComponent: {
        someTranslatedText: 'Salut le monde'
    },
    SomeOtherComponent: {
        foo: 'bar mais en français'
    }
};

তোমরা কি ভাবো?

আমার মনে হয় যে আমি আমার প্রশ্নটি এড়াতে চাইছিলাম সে সমস্ত সমস্যার সমাধান করে: অনুবাদ যুক্তিটি উত্স কোডের সমস্ত অংশে রক্তপাত হয় না, এটি বেশ বিচ্ছিন্ন এবং এটিগুলি ছাড়াই উপাদানগুলি পুনরায় ব্যবহার করার অনুমতি দেয়।

উদাহরণস্বরূপ, মাইকম্পোনপোন্টটি অনুবাদ () দ্বারা মোড়ানোর দরকার নেই এবং এটি পৃথক হতে পারে, যার ফলে অন্য যে কোনও ব্যক্তি stringsতাদের নিজস্ব মাধ্যমে এটি সরবরাহ করতে ইচ্ছুক পুনরায় ব্যবহার করতে পারে ।

[সম্পাদনা: ৩১/০৩/২০১ Re]: আমি সম্প্রতি একটি প্রতিক্রিয়াশীল বোর্ডে (এগ্রিল রেট্রোস্পেক্টিভসের জন্য) কাজ করেছি, যা প্রতিক্রিয়া ও রেডাক্স দিয়ে নির্মিত, এবং বহুভাষিক। যেহেতু প্রচুর লোক মন্তব্যগুলিতে একটি বাস্তব জীবনের উদাহরণ চেয়েছিল, তাই এটি এখানে:

আপনি কোডটি এখানে পাবেন: https://github.com/antoinejaussoin/retro-board/tree/master


এটি একটি দুর্দান্ত সমাধান .. ভাবছেন আপনি যদি কয়েক মাস পরেও এই সাথে বসে থাকেন? আমি অনলাইনে এই নিদর্শনগুলির জন্য পরামর্শের পথে খুব বেশি পরামর্শ পাইনি
ড্যামন

2
আমি আসলে, আমি খুঁজে পেয়েছি নিখুঁতভাবে কাজ করতে (আমার প্রয়োজনের জন্য)। এটি ডিফল্টরূপে অনুবাদ ব্যতীত উপাদানটিকে কাজ করে এবং অনুবাদটি কেবল
অংশটির

1
@ l.cetinsoy আপনি প্রপটি ব্যবহার করতে পারেন dangerouslySetInnerHTML, কেবলমাত্র জড়িতদের সম্পর্কে মনোযোগ দিন (ম্যানুয়ালি ইনপুটটি স্যানিটাইজ করুন)। দেখুন ফেসবুক.
github.io/react/tips/danजेly-set

6
কেন আপনি প্রতিক্রিয়া-ইন্টেল চেষ্টা করেননি এমন কোনও কারণ আছে?
সুরেশসিএস

1
সত্যিই এই সমাধান পছন্দ। একটি জিনিস আমি যুক্ত করব যা আমরা ধারাবাহিকতা এবং সময় সাশ্রয়ের জন্য খুব দরকারী পেয়েছি তা হ'ল যদি আপনার কাছে প্রচলিত স্ট্রিং সহ প্রচুর উপাদান থাকে তবে আপনি ভেরিয়েবলগুলি ব্যবহার করতে পারেন এবং বস্তুর উপর ছড়িয়ে দিতে পারেন যেমনconst formStrings = { cancel, create, required }; export default { fooForm: { ...formStrings, foo: 'foo' }, barForm: { ...formStrings, bar: 'bar' } }
হু ডেভিস

18

আমার অভিজ্ঞতা থেকে সর্বোত্তম পন্থা হ'ল অনেক কারণেই একটি আই 18 এন রিডেক্স রাজ্য তৈরি করা এবং এটি ব্যবহার করা:

1- এটি আপনাকে ডাটাবেস, স্থানীয় ফাইল বা এমনকি কোনও টেম্পলেট ইঞ্জিন যেমন ইজেএস বা জেড থেকে প্রাথমিক মান পাস করার অনুমতি দেবে

2- ব্যবহারকারী যখন ভাষা পরিবর্তন করেন আপনি এমনকি ইউআইকে রিফ্রেশ না করে পুরো অ্যাপ্লিকেশন ভাষা পরিবর্তন করতে পারেন।

3- যখন ব্যবহারকারী ভাষা পরিবর্তন করেন এটি আপনাকে এপিআই, স্থানীয় ফাইল বা এমনকি ধ্রুবক থেকে নতুন ভাষা পুনরুদ্ধার করতে দেয়

4- আপনি টাইমজোন, মুদ্রা, দিকনির্দেশ (আরটিএল / এলটিআর) এবং উপলভ্য ভাষার তালিকার মতো স্ট্রিংগুলির সাহায্যে অন্যান্য গুরুত্বপূর্ণ জিনিসও সংরক্ষণ করতে পারেন

5- আপনি পরিবর্তনের ভাষাটিকে একটি সাধারণ রিডেক্স ক্রিয়া হিসাবে সংজ্ঞায়িত করতে পারেন

Your- আপনার ব্যাকএন্ড এবং সামনের দিকের স্ট্রিংগুলি এক জায়গায় থাকতে পারে, উদাহরণস্বরূপ আমার ক্ষেত্রে আমি স্থানীয়করণের জন্য আই 18 এন-নোড ব্যবহার করি এবং যখন ব্যবহারকারী ইউআই ভাষা পরিবর্তন করে আমি কেবল একটি সাধারণ এপিআই কল করি এবং ব্যাকএন্ডে, আমি কেবল ফিরে আসি i18n.getCatalog(req)এটি কেবলমাত্র বর্তমান ভাষার জন্য সমস্ত ব্যবহারকারীর স্ট্রিং প্রদান করবে

I18n প্রাথমিক অবস্থার জন্য আমার পরামর্শটি হ'ল:

{
  "language":"ar",
  "availableLanguages":[
    {"code":"en","name": "English"},
    {"code":"ar","name":"عربي"}
  ],
  "catalog":[
     "Hello":"مرحباً",
     "Thank You":"شكراً",
     "You have {count} new messages":"لديك {count} رسائل جديدة"
   ],
  "timezone":"",
  "currency":"",
  "direction":"rtl",
}

আই 18 এন এর জন্য অতিরিক্ত দরকারী মডিউল:

1- স্ট্রিং-টেম্পলেট এটি আপনাকে আপনার ক্যাটালগের স্ট্রিংগুলির মধ্যে উদাহরণগুলি উদাহরণ করে:

import template from "string-template";
const count = 7;
//....
template(i18n.catalog["You have {count} new messages"],{count}) // لديك ٧ رسائل جديدة

2- হিউম্যান-ফর্ম্যাট এই মডিউলটি আপনাকে একটি পাঠযোগ্য স্ট্রিং থেকে / থেকে কোনও সংখ্যা রূপান্তর করতে দেয়, উদাহরণস্বরূপ:

import humanFormat from "human-format";
//...
humanFormat(1337); // => '1.34 k'
// you can pass your own translated scale, e.g: humanFormat(1337,MyScale)

3- মুহুর্তগুলিতে সর্বাধিক বিখ্যাত তারিখ এবং সময়গুলি এনএমপি গ্রন্থাগার, আপনি মুহুর্তটি অনুবাদ করতে পারেন তবে এটির ইতিমধ্যে একটি অন্তর্নির্মিত অনুবাদ রয়েছে কেবলমাত্র আপনার বর্তমান রাষ্ট্র ভাষাটি পাস করতে হবে:

import moment from "moment";

const umoment = moment().locale(i18n.language);
umoment.format('MMMM Do YYYY, h:mm:ss a'); // أيار مايو ٢ ٢٠١٧، ٥:١٩:٥٥ م

আপডেট (14/06/2019)

বর্তমানে অনেকগুলি ফ্রেমওয়ার্ক একই প্রতিক্রিয়াটি বাস্তবায়িত করে রেঅ্যাক্ট কনটেক্স এপিআই ব্যবহার করে ( রেডুক্স ছাড়াই), আমি ব্যক্তিগতভাবে I18next এর প্রস্তাব দিয়েছি


এই পদ্ধতির পাশাপাশি আরও দুটি ভাষার জন্য কাজ করবে? ক্যাটালগটির সেটআপ বিবেচনা করে
টেমপ্রানোভা

ডাউন ভোট দিয়েছেন। এটি প্রশ্নের উত্তর দেয় না। ওপি কোনও আর্কিটেকচার ধারণা চেয়েছে, কোনও পরামর্শ বা তুলনা করে কোনও আই 18 এন লাইব্রেরি তুলনা করে না।
ট্রুংডিকিউ

9
আমি আই 18 এন ক্যাটালগকে রিডুএক্স স্টেট হিসাবে প্রস্তাব দিয়েছি, মনে হয় আপনি
রিডুএক্স

5

অ্যান্টোনির দ্রবণটি ভাল কাজ করে তবে কিছু সতর্কতা রয়েছে:

  • এটি সরাসরি প্রতিক্রিয়া প্রসঙ্গটি ব্যবহার করে যা আমি ইতিমধ্যে রেডাক্স ব্যবহার করার সময় এড়ানো পছন্দ করি
  • এটি কোনও ফাইল থেকে সরাসরি বাক্যাংশ আমদানি করে, যা আপনি রানটাইম, ক্লায়েন্ট-সাইডে প্রয়োজনীয় ভাষা আনতে চাইলে সমস্যা হতে পারে
  • এটি কোনও আই 18 টি গ্রন্থাগার ব্যবহার করে না, যা হালকা ওজনের, তবে আপনাকে বহুত্বকরণ এবং অন্তরঙ্গকরণের মতো সহজ অনুবাদ ক্রিয়াকলাপগুলিতে অ্যাক্সেস দেয় না

কেন আমরা নির্মিত যে redux-বহুভাষিক উভয় Redux এবং Airbnb এর উপরে পলিগ্লট
(আমি অন্যতম লেখক)

এটি উপলব্ধ করা হয় :

  • আপনার রেডাক্স স্টোরে ভাষা এবং সম্পর্কিত বার্তাগুলি সঞ্চয় করতে একটি রিডুসার। আপনি উভয় দ্বারা সরবরাহ করতে পারেন:
    • একটি মিডলওয়্যার যা আপনি সুনির্দিষ্ট ক্রিয়া ধরার জন্য, বর্তমানের ভাষাটি কেটে নেওয়া এবং সম্পর্কিত বার্তা পেতে / আনতে কনফিগার করতে পারেন।
    • সরাসরি প্রেরণ setLanguage(lang, messages)
  • একটি getP(state)নির্বাচক যা P4 টি পদ্ধতি উদ্ভাসিত করে এমন একটি বস্তু পুনরুদ্ধার করে:
    • t(key): মূল বহুভুজ টি ফাংশন
    • tc(key): মূলধন অনুবাদ
    • tu(key): বড় হাতের অনুবাদ
    • tm(morphism)(key): কাস্টম মোড়ফ অনুবাদ
  • getLocale(state)বর্তমান ভাষা পেতে একটি নির্বাচক
  • translateপ্রপসগুলিতে pবস্তুকে ইনজেকশন দিয়ে আপনার প্রতিক্রিয়া উপাদানগুলিকে বাড়ানোর জন্য একটি উচ্চতর অর্ডার উপাদান component

সাধারণ ব্যবহারের উদাহরণ:

নতুন ভাষা প্রেরণ করুন:

import setLanguage from 'redux-polyglot/setLanguage';

store.dispatch(setLanguage('en', {
    common: { hello_world: 'Hello world' } } }
}));

উপাদান মধ্যে:

import React, { PropTypes } from 'react';
import translate from 'redux-polyglot/translate';

const MyComponent = props => (
  <div className='someId'>
    {props.p.t('common.hello_world')}
  </div>
);
MyComponent.propTypes = {
  p: PropTypes.shape({t: PropTypes.func.isRequired}).isRequired,
}
export default translate(MyComponent);

আপনার যদি কোন প্রশ্ন / পরামর্শ থাকে তবে আমাকে বলুন!


1
অনেক ভাল মূল বাক্যাংশ অনুবাদ করা। এবং এমন একটি সরঞ্জাম তৈরি করতে যা _()ফাংশনগুলির জন্য সমস্ত উপাদানকে বিশ্লেষণ করে উদাহরণস্বরূপ str সমস্ত স্ট্রিং পেতে। সুতরাং আপনি ভাষা ফাইলটিতে এটি আরও সহজ অনুবাদ করতে পারেন এবং ক্রেজি ভেরিয়েবলগুলির সাথে গোলমাল করবেন না। কিছু ক্ষেত্রে ল্যান্ডিং পৃষ্ঠাগুলি আলাদাভাবে প্রদর্শিত করতে লেআউটের নির্দিষ্ট অংশের প্রয়োজন। সুতরাং ডিফল্ট বনাম অন্যান্য সম্ভাব্য পছন্দগুলি কীভাবে চয়ন করবেন তার কিছু স্মার্ট ফাংশনও পাওয়া উচিত।
রোমান এম কোস

হাই @ জলিল, মিডওয়্যারের সাথে কোথাও একটি সম্পূর্ণ উদাহরণ আছে?
আরকাদিবি

হাই @ আরকাদ্যবি, আমরা এটি বেশ কয়েকটি প্রকল্পে উত্পাদনে ব্যবহার করি যা খোলসা সোসাইড নয়। README মডিউলটিতে আপনি আরও তথ্য পেতে পারেন: npmjs.com/package/redux-polyglot আপনার এটি ব্যবহার করতে কোনও প্রশ্ন / অসুবিধা আছে?
জলিল

এই এবং পলিগ্লট.জেএস এর সাথে আমার বড় সমস্যাটি হ'ল এটি পিও ফাইলগুলির শীর্ষে না গিয়ে চাকাটিকে পুনরায় উদ্ভাবন করছে। এই বিকল্প গ্রন্থাগারটি আশ্বাসপ্রাপ্ত এনপিএমজেএস . com/package/redux-i18n দেখায় । আমি মনে করি না যে এটি অনেক আলাদা করছে - এটি পিও ফাইলগুলিতে এবং রূপান্তর করতে কেবল একটি অতিরিক্ত স্তর সরবরাহ করে।
icc97

2

এ সম্পর্কে আমার গবেষণা থেকে দেখা যাচ্ছে যে জাভাস্ক্রিপ্ট, আইসিইউ এবং গেটেক্সটেক্সে আই 18 এন ব্যবহৃত হচ্ছে দুটি প্রধান পন্থা ।

আমি কেবল কখনও গেটেক্সটেক্স ব্যবহার করেছি, তাই আমি পক্ষপাতদুষ্ট।

আমাকে যে অবাক করে তোলে তা হল সমর্থন কতটা দুর্বল। আমি পিএইচপি বিশ্ব থেকে এসেছি, হয় কেকপিএইচপি বা ওয়ার্ডপ্রেস। এই উভয় পরিস্থিতিতেই এটি একটি প্রাথমিক মান যা সমস্ত স্ট্রিংগুলি কেবল চারপাশে ঘিরে থাকে __(''), তারপরে লাইনটি আরও নীচে পিও ফাইলগুলি ব্যবহার করে খুব সহজেই অনুবাদগুলি পান get

gettext এর

স্ট্রিমিং স্ট্রিংয়ের জন্য আপনি স্প্রিন্টফের পরিচিতি পান এবং পিও ফাইলগুলি হাজার হাজার বিভিন্ন এজেন্সি দ্বারা সহজেই অনুবাদ করা হবে।

দুটি জনপ্রিয় বিকল্প রয়েছে:

  1. i18next সঙ্গে ব্যবহার এই দ্বারা বর্ণিত arkency.com ব্লগ পোস্ট
  2. জেড , সেন্ড্রি.ও পোস্ট এবং এই প্রতিক্রিয়া + রেডাক্স পোস্ট দ্বারা বর্ণিত ব্যবহারের সাথে ,

উভয়ের গেটেক্সটাইল স্টাইল সমর্থন, স্ট্রিংগুলির স্প্রিন্টফ স্টাইল বিন্যাস এবং পিও ফাইলগুলিতে আমদানি / রফতানি রয়েছে।

i18next তাদের দ্বারা তৈরি একটি প্রতিক্রিয়া এক্সটেনশন রয়েছে। জেড না। Sentry.io রিডের সাথে জেদের একটি কাস্টম সংহতকরণ ব্যবহার করার জন্য উপস্থিত হয়। প্রতিক্রিয়া + + Redux পোস্টে ব্যবহার সুপারিশ

সরঞ্জামগুলি: jed + po2json + jsxgettext

তবে জেডকে আরও গেটেক্সটেক্স ফোকাসযুক্ত প্রয়োগের মতো বলে মনে হচ্ছে - এটিই অভিপ্রায় প্রকাশ করা হয়েছে, যেখানে আই 18 এনেক্সট হিসাবে কেবল এটি একটি বিকল্প হিসাবে রয়েছে।

আইসিইউ

অনুবাদগুলির আশেপাশে প্রান্তের ক্ষেত্রে এটির পক্ষে আরও সমর্থন রয়েছে, যেমন লিঙ্গ নিয়ে কাজ করার জন্য। আমি মনে করি আপনার যদি আরও জটিল ভাষায় অনুবাদ করার জন্য থাকে তবে আপনি এর থেকে উপকারগুলি দেখতে পাবেন see

এর জন্য একটি জনপ্রিয় বিকল্প হ'ল ম্যাসেজফরম্যাট.জেএস । এই sentry.io ব্লগ টিউটোরিয়ালে সংক্ষেপে আলোচনা করা হয়েছে । messageformat.js আসলে একই ব্যক্তির দ্বারা বিকাশ করা হয়েছে যিনি জেড লিখেছিলেন। তিনি আইসিইউ ব্যবহারের জন্য যথেষ্ট দৃ claims় দাবি করেছেন :

জেড আমার মতে বৈশিষ্ট্য সম্পূর্ণ। আমি বাগগুলি ঠিক করতে পেরে খুশি, তবে সাধারণত গ্রন্থাগারে আরও যুক্ত করতে আগ্রহী নই।

আমি বার্তাটিও বজায় রাখি। Js। আপনার যদি বিশেষভাবে গেটেক্সটেক্স প্রয়োগের প্রয়োজন না হয় তবে আমি পরিবর্তে মেসেজফর্ম্যাটটি ব্যবহার করার পরামর্শ দিতে পারি, কারণ এতে বহুবচন / লিঙ্গের পক্ষে আরও ভাল সমর্থন রয়েছে এবং এতে অন্তর্নির্মিত স্থানীয় ডেটা রয়েছে।

রুক্ষ তুলনা

স্প্রিন্টফের সাথে গেটেক্সট:

i18next.t('Hello world!');
i18next.t(
    'The first 4 letters of the english alphabet are: %s, %s, %s and %s', 
    { postProcess: 'sprintf', sprintf: ['a', 'b', 'c', 'd'] }
);

messageformat.js (পড়া থেকে আমার সেরা অনুমান নির্দেশিকা ):

mf.compile('Hello world!')();
mf.compile(
    'The first 4 letters of the english alphabet are: {s1}, {s2}, {s3} and {s4}'
)({ s1: 'a', s2: 'b', s3: 'c', s4: 'd' });

ডাউন ভোট দিয়েছেন। এটি প্রশ্নের উত্তর দেয় না। ওপি কোনও আর্কিটেকচার ধারণা চেয়েছে, কোনও পরামর্শ বা তুলনা করে কোনও আই 18 এন লাইব্রেরি তুলনা করে না।
ট্রুংডিকিউ

@ ট্রুংডিকিউ এটিই ওপি জিজ্ঞাসা করেছিল: "আমার প্রশ্নটি নিখুঁতভাবে প্রযুক্তিগত নয়, বরং আর্কিটেকচার এবং এই সমস্যা সমাধানের জন্য লোকেরা প্রকৃতপক্ষে উত্পাদনে যে প্যাটার্নগুলি ব্যবহার করছে তা সম্পর্কে ।" । এগুলি দুটি নিদর্শন যা উত্পাদনে ব্যবহৃত হচ্ছে।
icc97

আমার মতে এই উত্তরটি আমার (এবং অন্যরা) সন্ধান করছে এমন তথ্য সরবরাহ করে না। আপনার প্রদত্ত তথ্য সহায়ক, তবে অন্য কোনও প্রশ্নের জন্য হতে পারে। সঠিক উত্তরটিকে শীর্ষে পপ আপ করতে আমি কেবল আমার ডাউনটাতে অবদান রাখতে চাই (আশা করি)।
TrungDQ

@ ট্রুংডিকিউ যদি আপনি যা সন্ধান করছেন সেটি না হয় তবে আপনার আগ্রহী প্রশ্নের নির্দিষ্ট অংশটির সাথে মেলে না এমন বর্ণনামূলকভাবে বৈধ উত্তরগুলির চেয়ে কম ব্যবহার করার চেয়ে আপনি যেটি ব্যবহার করেছেন কেবল তা উত্সাহিত করুন এবং অন্যকে উপেক্ষা করুন।
আইসিসি ৯7

1

যদি এখনও https://react.i18next.com/ এ একবার না দেখে থাকেন তবে ভাল পরামর্শ হতে পারে। এটি i18next এর উপর ভিত্তি করে: একবার শিখুন - সর্বত্র অনুবাদ করুন।

আপনার কোডটি এমন কিছু দেখবে:

<div>{t('simpleContent')}</div>
<Trans i18nKey="userMessagesUnread" count={count}>
  Hello <strong title={t('nameTitle')}>{{name}}</strong>, you have {{count}} unread message. <Link to="/msgs">Go to messages</Link>.
</Trans>

এর জন্য নমুনা নিয়ে আসে:

  • webpack
  • CRA
  • expo.js
  • next.js
  • স্টোরিবুক একীকরণ
  • হৈচৈপূর্ণ আমোদ-উল্লাস
  • দেয়
  • ...

https://github.com/i18next/react-i18next/tree/master/example

এর পাশাপাশি আপনার বিকাশের সময় এবং পরে আপনার অনুবাদকদের -> https://www.youtube.com/watch?v=9NOzJhgmyQE কর্মক্ষেত্রের বিষয়টিও বিবেচনা করা উচিত


এটি প্রশ্নের উত্তর দেয় না। ওপি কোনও আর্কিটেকচার ধারণা চেয়েছে, কোনও পরামর্শ বা তুলনা করে কোনও আই 18 এন লাইব্রেরি তুলনা করে না।
ট্রুংডিকিউ

@ ট্রাংডিকিউ আমার উত্তর সম্পর্কে আপনার মন্তব্যের সাথে যে আপনি হ্রাস পেয়েছেন - ওপি উত্পাদনে ব্যবহৃত বর্তমান সমাধানের জন্য বলেছিল। তবে আমি আমার উত্তরে ফেব্রুয়ারী থেকে i18next এর পরামর্শ দিয়েছিলাম।
icc97

0

আমি তৈরি-প্রতিক্রিয়া-অ্যাপ ব্যবহার করে একটি সাধারণ সমাধান প্রস্তাব করতে চাই ।

অ্যাপ্লিকেশনটি প্রতিটি ভাষার জন্য পৃথকভাবে তৈরি করা হবে, সুতরাং পুরো অনুবাদ যুক্তি প্রয়োগের বাইরে চলে যাবে moved

ওয়েব সার্ভারটি স্বীকৃত-ভাষা শিরোনামের উপর নির্ভর করে বা ম্যানুয়ালি একটি কুকি সেট করে সঠিক ভাষা পরিবেশন করবে ।

বেশিরভাগ ক্ষেত্রেই, আমরা একাধিকবার ভাষা পরিবর্তন করি না, যদি কখনও হয়)

অনুবাদ ডেটা একই উপাদান ফাইলের ভিতরে রাখে, এটি স্টাইল, এইচটিএমএল এবং কোড সহ ব্যবহার করে।

এবং এখানে আমাদের সম্পূর্ণ স্বাধীন উপাদান রয়েছে যা তার নিজস্ব রাষ্ট্রের জন্য দর্শন, অনুবাদ:

import React from 'react';
import {withStyles} from 'material-ui/styles';
import {languageForm} from './common-language';
const {REACT_APP_LANGUAGE: LANGUAGE} = process.env;
export let language; // define and export language if you wish
class Component extends React.Component {
    render() {
        return (
            <div className={this.props.classes.someStyle}>
                <h2>{language.title}</h2>
                <p>{language.description}</p>
                <p>{language.amount}</p>
                <button>{languageForm.save}</button>
            </div>
        );
    }
}
const styles = theme => ({
    someStyle: {padding: 10},
});
export default withStyles(styles)(Component);
// sets laguage at build time
language = (
    LANGUAGE === 'ru' ? { // Russian
        title: 'Транзакции',
        description: 'Описание',
        amount: 'Сумма',
    } :
    LANGUAGE === 'ee' ? { // Estonian
        title: 'Tehingud',
        description: 'Kirjeldus',
        amount: 'Summa',
    } :
    { // default language // English
        title: 'Transactions',
        description: 'Description',
        amount: 'Sum',
    }
);

আপনার প্যাকেজ.জসনে ভাষার পরিবেশ পরিবর্তনশীল যুক্ত করুন

"start": "REACT_APP_LANGUAGE=ru npm-run-all -p watch-css start-js",
"build": "REACT_APP_LANGUAGE=ru npm-run-all build-css build-js",

হ্যাঁ, ওটাই!

এছাড়াও আমার মূল উত্তরে প্রতিটি অনুবাদের জন্য একক জেসন ফাইলের সাথে আরও একঘেয়েমি পদ্ধতির অন্তর্ভুক্ত রয়েছে:

ল্যাঙ / ru.json

{"hello": "Привет"}

lib / অনুপস্থিত lang.js

export default require(`../lang/${process.env.REACT_APP_LANGUAGE}.json`);

src / App.jsx

import lang from '../lib/lang.js';
console.log(lang.hello);

এটি কি কেবল সংকলনের সময় কাজ করবে না? ব্যবহারকারীদের উড়ে যাওয়ার ভাষা পরিবর্তন করার ক্ষমতা না থাকলে? এটি তখন ভিন্ন ব্যবহারের ক্ষেত্রে হবে।
এন্টোইন জাউসোইন

অ্যাপ্লিকেশনটি প্রতিটি ভাষার প্রয়োজন অনুসারে সংকলিত হবে। ওয়েব সার্ভারটি "স্বীকৃতি-ভাষা" শিরোনামের উপর নির্ভর করে বা ফ্লাইতে ব্যবহারকারী দ্বারা সেট করা কোনও কুকি দ্বারা স্বয়ংক্রিয়ভাবে সঠিক সংস্করণ পরিবেশন করবে। এটি করে, পুরো অনুবাদ যুক্তিটিকে অ্যাপ থেকে সরিয়ে নেওয়া যেতে পারে।
ইগোর সুখেরেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.