স্থানীয়করণ এবং স্ট্রিং এবং লেবেলের বিশ্বায়নের জন্য সেরা অনুশীলন [বন্ধ]


124

আমি ২০ টিরও বেশি বিকাশকারী একটি দলের একজন সদস্য। প্রতিটি বিকাশকারী পৃথক মডিউল (10 টি মডিউলের কাছাকাছি কিছু) নিয়ে কাজ করে। প্রতিটি মডিউলে আমাদের কমপক্ষে 50 টি সিআরইউডি ফর্ম থাকতে পারে যার অর্থ বর্তমানে আমাদের কাছে প্রায় 500 টি অ্যাড বাটন , সেভ বোতাম , সম্পাদনা বোতাম ইত্যাদি রয়েছে etc.

তবে, আমরা আমাদের অ্যাপ্লিকেশনটিকে বিশ্বায়িত করতে চাই বলে আমাদের প্রয়োগে পাঠ্য অনুবাদ করতে সক্ষম হওয়া দরকার able উদাহরণস্বরূপ, সর্বত্র, যুক্ত শব্দটি ফরাসি ব্যবহারকারীদের জন্য অজটার হয়ে উঠতে হবে

আমরা এখন অবধি যা করেছি, তা হ'ল ইউআই বা উপস্থাপনা স্তর প্রতিটি দর্শনের জন্য আমাদের কাছে কী / মান জোড়ার অনুবাদগুলির একটি অভিধান রয়েছে। তারপরে ভিউটি রেন্ডার করার সময় আমরা এই অভিধানটি ব্যবহার করে প্রয়োজনীয় পাঠ্য এবং স্ট্রিং অনুবাদ করি। যাইহোক, এই পদ্ধতির, আমরা 500 অভিধানে 500 সংযোজনের কাছাকাছি কিছু পেয়েছি । এর অর্থ এই যে আমরা DRY অধ্যক্ষকে লঙ্ঘন করেছি।

অন্যদিকে, যদি আমরা সাধারণ স্ট্রিং, নির্বাণ মত কেন্দ্রীভূত অ্যাড এক জায়গায়, এবং এটি সর্বত্র ব্যবহার করতে ডেভেলপারদের জিজ্ঞাসা, আমরা নিশ্চিত করে একটি স্ট্রিং ইতিমধ্যে বা না কেন্দ্রীভূত অভিধানে সংজ্ঞায়িত করা হয় হচ্ছে না সমস্যা সম্মুখীন।

অন্য একটি বিকল্প হতে পারে কোনও অনুবাদ অভিধান না থাকে এবং গুগল ট্রান্সলেট, বিং অনুবাদক ইত্যাদির মতো অনলাইন অনুবাদ পরিষেবা ব্যবহার করা যায় etc.

আর একটি সমস্যা যা আমরা মুখোমুখি হয়েছি তা হ'ল সময়কালে প্রকল্প সরবরাহ করার চাপে কিছু বিকাশকারী অনুবাদ কীগুলি মনে করতে পারে না । উদাহরণস্বরূপ, অ্যাড বোতামের পাঠ্যের জন্য, একজন বিকাশকারী অ্যাড ব্যবহার করেছেন এবং অন্য বিকাশকারী নতুন ব্যবহার করেছেন ইত্যাদি used

কোনও প্রয়োগের স্ট্রিং রিসোর্সগুলির বিশ্বায়ন ও স্থানীয়করণের জন্য সবচেয়ে ভাল অনুশীলন, বা সবচেয়ে সুপরিচিত পদ্ধতি কী?


2
আলাপ দ্বারা অ্যালেক্স সেক্সটন উপর বিষয় ক্লায়েন্ট সাইড আন্তর্জাতিকীকরণ জাতীয় ইইউ সম্মেলনে থেকে একটি শুভ সূচনা।
মিনকো গেচেভ

উত্তর:


51

আমি যতদূর জানি, localeplanetজাভাস্ক্রিপ্টে স্থানীয়করণ এবং আন্তর্জাতিকীকরণের জন্য একটি ভাল গ্রন্থাগার রয়েছে । তদুপরি, আমি মনে করি এটি নেটিভ এবং অন্যান্য গ্রন্থাগারের সাথে কোনও নির্ভরতা নেই (যেমন jQuery)

গ্রন্থাগারের ওয়েবসাইটটি এখানে: http://www.localeplanet.com/

মোজিলার এই নিবন্ধটি দেখুন, আপনি ক্লায়েন্ট-পক্ষী অনুবাদের জন্য খুব ভাল পদ্ধতি এবং অ্যালগরিদমগুলি দেখতে পারেন: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- একটি-লিটল-সাহায্যের-থেকে-JSON-এবং--সার্ভার /

এই সমস্ত নিবন্ধ / লাইব্রেরির সাধারণ অংশটি হ'ল এটিকে পুনরুদ্ধার / রূপান্তর করার জন্য তারা একটি i18nশ্রেণি এবং একটি getপদ্ধতি (কিছু উপায়ে একটি ছোট ফাংশন নামও সংজ্ঞায়িত করে _) ব্যবহার keyকরে value। আমার ব্যাখ্যা করে keyআপনি যে স্ট্রিংটি অনুবাদ করতে চান তার valueঅর্থ এবং অনুবাদিত স্ট্রিং।
তারপর, আপনি শুধু দোকান থেকে একটি JSON- ডকুমেন্ট প্রয়োজন key's এবং valueএর।

উদাহরণ স্বরূপ:

var _ = document.webL10n.get;
alert(_('test'));

এবং এখানে JSON:

{ test: "blah blah" }

আমি বিশ্বাস করি বর্তমান জনপ্রিয় লাইব্রেরি সমাধানগুলি ব্যবহার করা একটি ভাল পদ্ধতির।


1
কোন অপরাধ না কিন্তু আফশিন এরই মধ্যে যা চেষ্টা করেছিল তা কি নয়? তার সমস্যাটি হ'ল বিভিন্ন বিকাশকারীরা কোন কীগুলি ব্যবহার করবেন তা মনে রাখতে অসুবিধা হয়। আমি সম্মত হই যে আপনার বর্ণিত পদ্ধতিটি হ'ল উপায়। অন্যথায় এটি কীভাবে হতে পারে তা আমি দেখছি না। বিটিডব্লিউ লিংকগুলির জন্য ধন্যবাদ।
স্পোক

47

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

  • নির্দিষ্ট সমস্যাটিকে ছোট ছোট উপ-সমস্যার একটি সেট হিসাবে ধারণা করুন as
  • প্রতিটি ছোট সমস্যা সমাধান করুন।
  • ফলাফল নির্দিষ্ট সমস্যার সমাধানের সাথে একত্রিত করুন।

তবে "বিভাজন এবং জয়" একমাত্র সম্ভাব্য কৌশল নয়। আমরা আরও সাধারণবাদী পদ্ধতি গ্রহণ করতে পারি:

  • সুনির্দিষ্ট সমস্যাটিকে আরও সাধারণ সমস্যার বিশেষ কেস হিসাবে ধারণা করুন।
  • একরকম সাধারণ সমস্যা সমাধান করুন।
  • সাধারণ সমস্যার সমাধানটি নির্দিষ্ট সমস্যার সাথে মানিয়ে নিন।

- এরিক লিপার্ট

আমি বিশ্বাস করি এএসপি. নেট / সি# এর মতো সার্ভার-সাইড ভাষায় এই সমস্যার জন্য ইতিমধ্যে অনেকগুলি সমাধান রয়েছে।

আমি সমস্যার কয়েকটি প্রধান দিকের রূপরেখা করেছি

  • সমস্যা : আমাদের কেবলমাত্র কাঙ্ক্ষিত ভাষার জন্য ডেটা লোড করতে হবে

    সমাধান : এই উদ্দেশ্যে আমরা প্রতিটি ভাষার জন্য পৃথক ফাইলে ডেটা সংরক্ষণ করি

প্রাক্তন। res.de.js, res.fr.js, res.en.js, res.js (ডিফল্ট ভাষার জন্য)

  • সমস্যা: প্রতিটি পৃষ্ঠার জন্য রিসোর্স ফাইলগুলি পৃথক করা উচিত যাতে আমরা কেবল আমাদের প্রয়োজনীয় ডেটা পাই

    সমাধান : আমরা এমন কিছু সরঞ্জাম ব্যবহার করতে পারি যা ইতিমধ্যে https://github.com/rgrove/lazyload এর মতো বিদ্যমান

  • সমস্যা: আমাদের ডেটা সংরক্ষণ করতে আমাদের একটি কী / মান জোড় কাঠামো প্রয়োজন

    সমাধান : আমি স্ট্রিং / স্ট্রিং এয়ারের পরিবর্তে একটি জাভাস্ক্রিপ্ট অবজেক্টটি প্রস্তাব করছি। আমরা একটি আইডিই থেকে ইন্টেলিজেন্স থেকে উপকৃত হতে পারি

  • সমস্যা: সাধারণ সদস্যদের একটি সর্বজনীন ফাইলে সংরক্ষণ করা উচিত এবং সমস্ত পৃষ্ঠাতে তাদের অ্যাক্সেস করা উচিত

    সমাধান : এই উদ্দেশ্যে আমি গ্লোবাল_সোর্স নামে পরিচিত ওয়েব অ্যাপ্লিকেশনটির মূলের মধ্যে একটি ফোল্ডার এবং প্রতিটি উপ ফোল্ডারের জন্য বিশ্বব্যাপী ফাইল সংরক্ষণ করার জন্য একটি ফোল্ডার তৈরি করি যার নাম দিয়েছি 'স্থানীয়_সম্পাত'

  • ইস্যু: প্রতিটি সাবসিস্টেম / সাবফোল্ডার / মডিউল সদস্যদের গ্লোবাল_সোর্স সদস্যদের তাদের সুযোগগুলিতে ওভাররাইড করা উচিত

    সমাধান : আমি প্রত্যেকের জন্য একটি ফাইল বিবেচনা করেছি

অ্যাপ্লিকেশন স্ট্রাকচার

root/
    Global_Resources/
        default.js
        default.fr.js
    UserManagementSystem/
        Local_Resources/
            default.js
            default.fr.js
            createUser.js
        Login.htm
        CreateUser.htm

ফাইলগুলির জন্য সংশ্লিষ্ট কোড:

Global_Resources / default.js

var res = {
    Create : "Create",
    Update : "Save Changes",
    Delete : "Delete"
};

Global_Resources / default.fr.js

var res = {
    Create : "créer",
    Update : "Enregistrer les modifications",
    Delete : "effacer"
};

গ্লোবাল_ রিসোর্স থেকে নির্বাচিত পৃষ্ঠায় কাঙ্ক্ষিত ভাষার জন্য রিসোর্স ফাইলটি লোড করা উচিত - এটি সমস্ত পৃষ্ঠায় লোড হওয়া প্রথম ফাইল হতে হবে is

UserManagementSystem / Local_Resources / default.js

res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";

UserManagementSystem / Local_Resources / default.fr.js

res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";

UserManagementSystem / Local_Resources / createUser.js

// Override res.Create on Global_Resources/default.js
res.Create = "Create User"; 

UserManagementSystem / Local_Resources / createUser.fr.js

// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";

ম্যানেজার.জেএস ফাইল (এই ফাইলটি শেষের দিকে লোড হওয়া উচিত)

res.lang = "fr";

var globalResourcePath = "Global_Resources";
var resourceFiles = [];

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;

if(!IsFileExist(currentFile))
    currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");

resourceFiles.push(currentFile);

// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";

    if(!IsExist(currentFile))
        currentFile = folder + "\\Local_Resource\\default.js";
    if(!IsExist(currentFile)) throw new Exception("File Not Found");

    resourceFiles.push(currentFile);
}

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }

// Get current page name
var pageNameWithoutExtension = "SomePage";

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;

if(!IsExist(currentFile))
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");

আশা করি এটা সাহায্য করবে :)


7
এই পদ্ধতির বিষয়ে আমি কেবল পছন্দ করি না তা হ'ল স্থানীয়করণ এবং বিকাশ শক্তভাবে মিলিত হয় ... সুতরাং যখন কোনও ইংরেজী (যে কোনও ডিফল্টই হোক) স্ট্রিং যুক্ত করা হয় তখন বাকী ভাষাগুলি কোডের মাধ্যমে আপডেট করতে হয়। আমি বরং কোনও ধরণের অনুবাদ ফাইল থেকে একটি সরঞ্জাম দিয়ে জেএসএন তৈরি করতাম। তবুও ভাল উপস্থাপনা!
নাট-উইলকিনস

আপনি স্থানীয়করণের জন্য যেমন করেছিলেন তেমনভাবে কাজ করেছেন, আপনি দেখতে পারেন এই ক্যোয়ারিতে: stackoverflow.com/q/53864279/4061006 । কেবলমাত্র আপনি কীভাবে গ্লোবাল_সোর্স / ডিফল্ট.জেএসকে গ্লোবাল_ রিসোর্স / ডিফল্ট.ফারজজেস অনুবাদ করছেন? এই ফাইলগুলি কাঙ্ক্ষিত ভাষায় রূপান্তর করতে আপনি কোন সরঞ্জাম / কিট ব্যবহার করছেন। যেহেতু আমারও এটি দরকার
জয়ায়াভেল

স্ট্রিংটি কোথায় যায় এবং এর অর্থ কী তা বর্ণনা করে প্রতিটি কী পাশাপাশি আপনার একটি মানব-পঠনযোগ্য মন্তব্য সংরক্ষণ করা উচিত, যাতে আপনি কোনও নতুন ভাষা যুক্ত করতে গিয়ে অনুবাদককে (বা নিজেকে) আরও প্রসঙ্গ সরবরাহ করতে পারেন এবং আপনি কিছু ভুলে গেছেন স্ট্রিং মানে। উদাহরণস্বরূপ, ক্রোম এক্সটেনশানগুলি স্থানীয়করণের"Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"} জন্য তারা যেমন করে তেমন কিছু করুন । অথবা এই মন্তব্যগুলি ধারণ করে একটি পৃথক ফাইল তৈরি করুন।
বোরিস

13

jQuery.i18n আপনার ওয়েব পৃষ্ঠাগুলিতে আন্তর্জাতিকীকরণ সক্ষম করার জন্য একটি হালকা jQuery প্লাগইন। এটি আপনাকে জাভা রিসোর্স বান্ডিলের মতো '.properties' ফাইলগুলিতে কাস্টম রিসোর্স স্ট্রিংগুলি প্যাকেজ করতে দেয়। এটি ব্রাউজারের দ্বারা প্রতিবেদন করা ভাষা বা ভাষার উপর ভিত্তি করে রিসোর্স বান্ডিলগুলি (.properties) লোড করে এবং পার্স করে।

এই সম্পর্কে আরও জানতে কীভাবে JQuery ব্যবহার করে আপনার পৃষ্ঠাগুলিকে আন্তর্জাতিকীকরণ করবেন কীভাবে একবার দেখুন ?


লিঙ্কটি চলে গেছে
আলেকজান্ডার ফারবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.