সেরা অনুশীলন মাল্টি ভাষার ওয়েবসাইট


179

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

প্রথমে আমি যে পরিস্থিতিটি সন্ধান করছি তা আমার স্কেচ করুন

আমি একটি কন্টেন্ট ম্যানেজমেন্ট সিস্টেমকে আপগ্রেড / পুনর্নির্মাণ করতে যাচ্ছি যা আমি বেশ কিছুদিন ধরে ব্যবহার করছি। যাইহোক, আমি বহু ভাষা অনুভব করছি এই ব্যবস্থার জন্য একটি দুর্দান্ত উন্নতি। এর আগে আমি কোনও ফ্রেমওয়ার্ক ব্যবহার করিনি তবে আমি আসন্ন প্রকল্পের জন্য লারাওয়াল ৪ ব্যবহার করব। লারাভেল কোড পিএইচপি করার জন্য একটি ক্লিনার উপায়ের সেরা পছন্দ বলে মনে হচ্ছে। Sidenote: Laraval4 should be no factor in your answer। আমি অনুবাদের সাধারণ উপায়গুলি খুঁজছি যা প্ল্যাটফর্ম / কাঠামো স্বাধীন।

কি অনুবাদ করা উচিত

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

তদুপরি, আমি অতিরিক্ত টেবিল তৈরির প্রয়োজন ছাড়াই একাধিক ডাটাবেস টেবিল অনুবাদ করার সবচেয়ে সহজ উপায়টি খুঁজছি।

আমি নিজের সাথে কী এলাম

আমি ইতিমধ্যে নিজেরাই জিনিসগুলি অনুসন্ধান, পড়া এবং চেষ্টা করে যাচ্ছি। আমার কাছে বেশ কয়েকটি বিকল্প রয়েছে। তবে আমি এখনও মনে করি না যে আমি সত্যিই যা খুঁজছি তার জন্য আমি একটি সর্বোত্তম অনুশীলনের পদ্ধতিতে পৌঁছেছি। এই মুহুর্তে, আমি এটি নিয়ে এসেছি, তবে এই পদ্ধতিতে এর পার্শ্ব প্রতিক্রিয়াও রয়েছে।

  1. পিএইচপি পার্সড টেমপ্লেটস : টেমপ্লেট সিস্টেমটি পিএইচপি দ্বারা বিশ্লেষণ করা উচিত। এইভাবে আমি টেমপ্লেটগুলি খোলার ও তাদের সংশোধন না করে অনুবাদ করা প্যারামিটারগুলি এইচটিএমএলে সন্নিবেশ করতে সক্ষম হয়েছি। তদ্ব্যতীত, পিএইচপি পার্সড টেমপ্লেটগুলি আমাকে প্রতিটি ভাষার জন্য সাবফোল্ডার না রেখে সম্পূর্ণ ওয়েবসাইটের জন্য 1 টি টেমপ্লেট রাখার ক্ষমতা দেয় (যা আমার আগে ছিল)। এই লক্ষ্যে পৌঁছানোর পদ্ধতিটি স্মার্ট, টেম্পলেট শক্তি, লারাভেলের ব্লেড বা অন্য কোনও টেম্পলেট পার্সার হতে পারে। আমি যেমন বলেছি এটি লিখিত সমাধানের জন্য স্বাধীন হওয়া উচিত।
  2. ডাটাবেস চালিত : সম্ভবত আমার আর এটি উল্লেখ করার দরকার নেই। তবে সমাধানটি ডাটাবেস চালিত হওয়া উচিত। সিএমএসের উদ্দেশ্য অবজেক্ট ওরিয়েন্টেড এবং এমভিসি হওয়া, সুতরাং স্ট্রিংগুলির জন্য আমার একটি লজিকাল ডেটা কাঠামো সম্পর্কে ভাবতে হবে। আমার টেমপ্লেট গঠিত হতে হবে হিসাবে: টেমপ্লেট / কন্ট্রোলার / View.php সম্ভবত এই কাঠামো সবচেয়ে জানার জন্য হবে: Controller.View.parameter। ডাটাবেস টেবিলের ক্ষেত্রগুলির সাথে এই ক্ষেত্রগুলি দীর্ঘ থাকবে value। টেম্পলেটগুলির অভ্যন্তরে আমরা কিছু ধরণের পদ্ধতি ব্যবহার করতে পারি echo __('Controller.View.welcome', array('name', 'Joshua'))এবং প্যারামিটার ধারণ করে Welcome, :name। সুতরাং ফলাফল হচ্ছে Welcome, Joshua। এটি এটি করার একটি ভাল উপায় বলে মনে হচ্ছে, কারণ: প্যারামিটারগুলি যেমন: নামটি সম্পাদক দ্বারা বোঝা সহজ।
  3. নিম্ন ডাটাবেস লোড : অবশ্যই উপরের সিস্টেমটি যদি এই স্ট্রিংগুলি চলতে থাকে তবে ডেটাবেস লোডের কারণ হতে পারে। তাই আমার প্রশাসনিক পরিবেশে সম্পাদনা / সংরক্ষণের সাথে সাথে ভাষা ফাইলগুলি পুনরায় রেন্ডার করে এমন একটি ক্যাচিং সিস্টেমের প্রয়োজন হবে। যেহেতু ফাইলগুলি উত্পন্ন হয়, একটি ভাল ফাইল সিস্টেমের বিন্যাসও প্রয়োজন। আমি অনুমান করি যে আমরা languages/en_EN/Controller/View.phpবা .ini এর সাথে যেতে পারি, যা আপনার পক্ষে সবচেয়ে বেশি উপযুক্ত। সম্ভবত একটি .ini এমনকি দ্রুত পার্স করা হয়। এই ফোল্ডারে ডাটা থাকা উচিত format parameter=value; । আমি অনুমান করি এটি এটি করার সর্বোত্তম উপায়, যেহেতু রেন্ডার করা প্রতিটি ভিউতে এটি উপস্থিত থাকলে এটির নিজস্ব ভাষা ফাইল অন্তর্ভুক্ত থাকতে পারে। প্যারামিটারগুলি একে অপরকে ওভাররাইট করা থেকে বিরত রাখতে ভাষার প্যারামিটারগুলি তখন নির্দিষ্ট দৃষ্টিতে লোড করা উচিত এবং বিশ্বব্যাপী সুযোগে নয়।
  4. ডাটাবেস সারণির অনুবাদ : এটি আসলে আমি সবচেয়ে বেশি উদ্বিগ্ন। আমি নিউজ / পৃষ্ঠাগুলি / ইত্যাদির অনুবাদ তৈরির উপায় খুঁজছি। যত দ্রুত সম্ভব. প্রতিটি মডিউলের জন্য দুটি টেবিল থাকা (উদাহরণস্বরূপ Newsএবং News_translations) একটি বিকল্প তবে এটি একটি ভাল সিস্টেম পাওয়ার জন্য অনেক বেশি কাজ করার মতো মনে হয়। কিছু আমি সঙ্গে একটি উপর ভিত্তি করে তৈরি এসেছেন এক data versioningসিস্টেম আমি লিখেছি: এক ডাটাবেস সারণি নাম Translations, এই টেবিল একটি অনন্য সমন্নয় আছে language, tablenameএবংprimarykey। উদাহরণস্বরূপ: এন_ইন / নিউজ / 1 (আইডি = 1 সহ নিউজ আইটেমটির ইংরেজি সংস্করণ উল্লেখ করে)। তবে এই পদ্ধতির 2 টি বড় অসুবিধাগুলি রয়েছে: প্রথমত এই টেবিলটি ডাটাবেসে প্রচুর ডেটা নিয়ে দীর্ঘ দীর্ঘায়িত হয় এবং দ্বিতীয়ত, টেবিলটি অনুসন্ধান করতে এই সেটআপটি ব্যবহার করা কোনও কাজের কাজেই খুব খারাপ কাজ। যেমন আইটেমের এসইও স্লাগ অনুসন্ধান করা একটি সম্পূর্ণ পাঠ্য অনুসন্ধান হবে, যা বেশ বোবা। তবে অন্যদিকে: এটি প্রতিটি টেবিলে খুব দ্রুত অনুবাদযোগ্য সামগ্রী তৈরি করার একটি দ্রুত উপায়, তবে আমি বিশ্বাস করি না যে এই সমর্থকটি কনটির উপরের চেয়ে বেশি প্রভাব ফেলবে।
  5. ফ্রন্ট-এন্ড ওয়ার্ক : এছাড়াও ফ্রন্ট-এন্ডের জন্য কিছু চিন্তাভাবনা প্রয়োজন। অবশ্যই আমরা উপলভ্য ভাষাগুলি একটি ডেটাবেজে সংরক্ষণ করব এবং (ডি) আমাদের প্রয়োজনীয় ভাষাগুলি সক্রিয় করব। স্ক্রিপ্টটি কোনও ভাষা নির্বাচন করতে ড্রপডাউন তৈরি করতে পারে এবং সিএমএস ব্যবহার করে কী অনুবাদ করা যায় তা ব্যাক-এন্ড স্বয়ংক্রিয়ভাবে সিদ্ধান্ত নিতে পারে। নির্বাচনের জন্য ভাষাটি (উদাহরণস্বরূপ en_EN) এর পরে ভাষার ফাইলটি দেখার জন্য বা ওয়েবসাইটে কোনও সামগ্রী আইটেমের জন্য সঠিক অনুবাদ পাওয়ার জন্য ব্যবহৃত হত।

সুতরাং, তারা আছে। আমার ধারণা এখন পর্যন্ত। এমনকি তারা এখনো তারিখ ইত্যাদি জন্য স্থানীয়করণ বিকল্পগুলি অন্তর্ভুক্ত না, কিন্তু আমার সার্ভারে সমর্থন যেমন PHP5.3.2 + + ভাল বিকল্প এখানে ব্যাখ্যা Intl এক্সটেনশানটি ব্যবহারের জন্য হল: http://devzone.zend.com/1500/internationalization-in -pp-53 / - তবে এটি পরবর্তী কোনও উন্নয়নের স্টেডিয়ামে কার্যকর হবে। আপাতত মূল বিষয়টি হ'ল কোনও ওয়েবসাইটে সামগ্রীতে অনুবাদ করার সর্বোত্তম অনুশীলন কীভাবে করা যায়।

আমি এখানে যা বুঝিয়েছি তার সাথে সাথে আমার আরও একটি জিনিস রয়েছে যা আমি এখনও স্থির করি নি, এটি একটি সাধারণ প্রশ্নের মতো মনে হচ্ছে, তবে আসলে এটি আমার মাথাব্যথা দিচ্ছে:

ইউআরএল অনুবাদ? আমাদের এই করা উচিত নাকি? এবং কোন উপায়ে?

সুতরাং .. যদি আমার এই url থাকে: http://www.domain.com/about-usএবং ইংরেজি হ'ল আমার ডিফল্ট ভাষা। http://www.domain.com/over-onsআমি যখন ডাচকে আমার ভাষা হিসাবে বেছে নিই তখন এই URL টি অনুবাদ করা উচিত ? অথবা আমাদের কি সহজ রাস্তাটি যেতে হবে এবং কেবলমাত্র পৃষ্ঠার সামগ্রীটি দৃশ্যমান /about। শেষ জিনিসটি একটি বৈধ বিকল্প বলে মনে হচ্ছে না কারণ এটি একই URL এর একাধিক সংস্করণ তৈরি করবে, এই বিষয়বস্তুটিকে সূচীকরণ সঠিকভাবে ব্যর্থ করবে।

http://www.domain.com/nl/about-usপরিবর্তে অন্য একটি বিকল্প ব্যবহার করা হচ্ছে। এটি প্রতিটি সামগ্রীর জন্য কমপক্ষে একটি অনন্য URL তৈরি করে। এছাড়াও এটি অন্য ভাষায় যাওয়া আরও সহজ হবে, উদাহরণস্বরূপ http://www.domain.com/en/about-usএবং প্রদত্ত ইউআরএল Google এবং হিউম্যান দর্শকদের পক্ষে বোঝা সহজ। এই বিকল্পটি ব্যবহার করে, আমরা ডিফল্ট ভাষাগুলি দিয়ে কী করব? ডিফল্ট ভাষাটি কি ডিফল্টরূপে নির্বাচিত ভাষাটি সরিয়ে ফেলা উচিত? তাই পুনঃনির্দেশিত http://www.domain.com/en/about-usহচ্ছে http://www.domain.com/about-us... আমার দৃষ্টিতে এটিই সেরা সমাধান, কারণ যখন কেবলমাত্র একটি ভাষার জন্য সিএমএস সেটআপ হয় তখন ইউআরএলটিতে এই ভাষা সনাক্তকরণের প্রয়োজন হয় না।

এবং একটি তৃতীয় বিকল্প হ'ল উভয় বিকল্পের সংমিশ্রণ: http://www.domain.com/about-usমূল ভাষার জন্য "ভাষা-সনাক্তকরণ-কম"-URL ( ) ব্যবহার করে। এবং সাবল্যাংগুয়েজগুলির জন্য অনুবাদকৃত এসইও স্লাগ সহ একটি ইউআরএল ব্যবহার করুন: http://www.domain.com/nl/over-ons&http://www.domain.com/de/uber-uns

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

আমি এই পাঠ্যের গুচ্ছটি পড়তে সময় দেওয়ার জন্য ইতিমধ্যে আপনাকে ধন্যবাদ জানাতে চাই!

// Edit #1:

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


3
গেটেক্সটেক্স সম্পর্কে কী? php.net/manual/en/book.gettext.php
ফ্রাঙ্কোইস বুর্জোয়া

উত্তর:


115

টপিকের ভিত্তি

একটি বহুভাষিক সাইটে তিনটি স্বতন্ত্র দিক রয়েছে:

  • ইন্টারফেস অনুবাদ
  • সন্তুষ্ট
  • url রাউটিং ing

তারা সকলেই বিভিন্ন উপায়ে সংযুক্ত থাকাকালীন সিএমএসের দৃষ্টিকোণ থেকে তারা বিভিন্ন ইউআই উপাদান ব্যবহার করে পরিচালিত হয় এবং আলাদাভাবে সংরক্ষণ করা হয়। আপনি নিজের প্রয়োগ এবং প্রথম দুটি বোঝার বিষয়ে আত্মবিশ্বাসী বলে মনে হয়। প্রশ্নটি পরবর্তী দিকটি সম্পর্কে ছিল - "ইউআরএল অনুবাদ? আমাদের এটি করা উচিত বা করা উচিত? এবং কোন উপায়ে?"

ইউআরএল কী তৈরি করা যায়?

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

  • কিছু ব্রাউজারের মতো নন- ASCII অক্ষর চালু হবে 'ч'বা 'ž'মধ্যে '%D1%87'এবং'%C5%BE'
  • ব্যবহারকারীর কাস্টম থিম থাকলে থিমের ফন্টের এই অক্ষরগুলির জন্য প্রতীক না থাকার খুব সম্ভবত

আমি আসলে কয়েক বছর আগে ইআইআই ভিত্তিক প্রকল্পে (ভয়াবহ কাঠামো, আইএমএইচও) আইডিএন পদ্ধতির চেষ্টা করেছি। সেই সমাধানটি স্ক্র্যাপ করার আগে আমি উল্লিখিত উভয় সমস্যার মুখোমুখি হয়েছি। এছাড়াও, আমি সন্দেহ করি এটি আক্রমণ আক্রমণকারী হতে পারে।

উপলভ্য বিকল্পগুলি ... যেমন আমি তাদের দেখছি।

মূলত আপনার দুটি পছন্দ আছে, এটিকে বিমূর্ত করা যেতে পারে:

  • http://site.tld/[:query]: যেখানে [:query]ভাষা এবং সামগ্রীর পছন্দ উভয়ই নির্ধারণ করে

  • http://site.tld/[:language]/[:query]: যেখানে [:language]URL এর অংশটি ভাষার পছন্দকে সংজ্ঞায়িত করে এবং [:query]কেবলমাত্র সামগ্রীটি সনাক্ত করতে ব্যবহৃত হয়

প্রশ্নটি হ'ল Α এবং Ω ..

আপনাকে বাছাই করতে বলুন http://site.tld/[:query]

সেক্ষেত্রে আপনার কাছে ভাষার একটি প্রাথমিক উত্স রয়েছে: [:query]বিভাগের বিষয়বস্তু ; এবং দুটি অতিরিক্ত উত্স:

  • $_COOKIE['lang']নির্দিষ্ট ব্রাউজারের জন্য মান
  • HTTP স্বীকৃতি-ভাষা (1) , (2) শিরোনামে ভাষার তালিকা

প্রথমত, আপনি সংজ্ঞায়িত রাউটিং প্যাটার্নগুলির একটিতে ক্যোয়ারির সাথে মিল রাখতে হবে (যদি আপনার চয়নটি লারাভেল হয় তবে এখানে পড়ুন )। প্যাটার্নের সফল ম্যাচে আপনার তখন ভাষাটি সন্ধান করতে হবে।

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

উদাহরণস্বরূপ নিন: http://site.tld/blog/novinka

এটি "блог, новинка"হ'ল ট্রান্সলিটেশন , এর ইংরেজি অর্থ প্রায় "blog", "latest"

আপনি ইতিমধ্যে লক্ষ্য করতে পারেন, রাশিয়ান ভাষায় "блог" "ব্লগ" হিসাবে অনুলিপি করা হবে। যার অর্থ আপনার প্রথম অংশের জন্য [:query]( সেরা ক্ষেত্রে দৃশ্যে ) ['en', 'ru']সম্ভাব্য ভাষাগুলির তালিকা সমাপ্ত হবে । তারপরে আপনি পরবর্তী বিভাগটি নেবেন - "নোভিঙ্কা"। যে সম্ভাবনার তালিকায় শুধুমাত্র এক ভাষা থাকতে পারে: ['ru']

তালিকার একটি আইটেম রয়েছে, আপনি সাফল্যের সাথে ভাষাটি খুঁজে পেয়েছেন।

তবে যদি আপনি 2 (উদাহরণস্বরূপ: রাশিয়ান এবং ইউক্রেনীয়) বা আরও বেশি সম্ভাবনা .. বা 0 সম্ভাবনা দিয়ে শেষ করেন তবে কেস হতে পারে। সঠিক বিকল্পটি খুঁজতে আপনাকে কুকি এবং / অথবা শিরোনাম ব্যবহার করতে হবে।

এবং যদি সমস্ত কিছু ব্যর্থ হয় তবে আপনি সাইটের ডিফল্ট ভাষা বেছে নিন।

প্যারামিটার হিসাবে ভাষা

বিকল্পটি হল ইউআরএল ব্যবহার করা, এটি হিসাবে সংজ্ঞায়িত করা যায় http://site.tld/[:language]/[:query]। এই ক্ষেত্রে, কোয়েরি অনুবাদ করার সময়, আপনার ভাষাটি অনুমান করার দরকার নেই, কারণ সেই সময়ে আপনি কোনটি ব্যবহার করবেন তা ইতিমধ্যে আপনি জানেন।

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

পরিবর্তে আপনার কাছে 3 টি সহজ, অগ্রাধিকারযুক্ত বিকল্প রয়েছে:

  1. যদি [:language]বিভাগটি সেট করা থাকে তবে এটি ব্যবহার করুন
  2. যদি $_COOKIE['lang']সেট করা থাকে তবে এটি ব্যবহার করুন
  3. ডিফল্ট ভাষা ব্যবহার করুন

আপনার যদি ভাষা থাকে, আপনি কেবল ক্যোরির অনুবাদ করার চেষ্টা করেন এবং যদি অনুবাদ ব্যর্থ হয় তবে নির্দিষ্ট বিভাগটির জন্য "ডিফল্ট মান" ব্যবহার করুন (রাউটিং ফলাফলের ভিত্তিতে)।

এখানে কি তৃতীয় বিকল্প নেই?

হ্যাঁ, টেকনিক্যালি আপনি উভয় পন্থা একত্রিত করতে পারেন, কিন্তু যে প্রক্রিয়া জটিল এবং শুধুমাত্র যারা এর ম্যানুয়ালি URL পরিবর্তন করুন করতে চান মিটমাট হবে http://site.tld/en/newsথেকে http://site.tld/de/newsএবং জার্মান পরিবর্তন করতে সংবাদ পৃষ্ঠা আশা।

তবে এমনকি এই কেসটি কম যাদু এবং আশা দিয়ে বাস্তবায়নের জন্য কুকি মান (যা ভাষার পূর্ববর্তী পছন্দ সম্পর্কে তথ্য ধারণ করে) ব্যবহার করে প্রশমিত হতে পারে।

কোন পদ্ধতির ব্যবহার?

আপনি ইতিমধ্যে অনুমান হিসাবে, আমি http://site.tld/[:language]/[:query]আরও বোধগম্য বিকল্প হিসাবে সুপারিশ করব ।

বাস্তব শব্দের পরিস্থিতিতে আপনার ইউআরএল মধ্যে তৃতীয় প্রধান অংশ থাকবে: "শিরোনাম"। অনলাইন শপ বা পণ্য সাইটের নিবন্ধ শিরোনাম পণ্য হিসাবে।

উদাহরণ: http://site.tld/en/news/article/121415/EU-as-global-reserve-currency

এই ক্ষেত্রে '/news/article/121415'কোয়েরি হবে, এবং 'EU-as-global-reserve-currency'শিরোনাম। নিখুঁতভাবে এসইও উদ্দেশ্যে

এটা কি লারাভেলে করা যায়?

কিন্ডা, কিন্তু ডিফল্টরূপে নয়।

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

এটি রুটে গেছে এখন কি?

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

মূলত, নিম্নলিখিত ইউআরএল: http://site.tld/ru/blog/novinka(বা সংস্করণ ছাড়াই '/ru') এমন কিছুতে রূপান্তরিত হয়

$parameters = [
   'language' => 'ru',
   'classname' => 'blog',
   'method' => 'latest',
];

যা আপনি কেবল প্রেরণের জন্য ব্যবহার করেন:

$instance = new {$parameter['classname']};
$instance->{'get'.$parameters['method']}( $parameters );

.. বা এটির কিছু প্রয়োগ, নির্দিষ্ট প্রয়োগের উপর নির্ভর করে।


1
আর একটি অন্তর্দৃষ্টি জন্য ধন্যবাদ! খুব চিন্তিত! আমি ইউআরএল পাশাপাশি ভাষা প্যারামিটার থাকার কথা ভাবছিলাম। এটি কেবল কোনও ব্যবহারকারীকেই নয় তবে এসইওর উদ্দেশ্যেও নির্দিষ্ট ভাষা সনাক্ত করার সেরা উপায় বলে মনে হয়। কোনও ব্যবহারকারী / এন / নিউজকে / ডি / নিউজে পরিবর্তন করার ক্ষেত্রে, আমার ধারণাটি 301 (স্থায়ী) উদাহরণ হিসাবে উদাহরণস্বরূপ / ডি / ন্যাচারটাইনে পুনর্নির্দেশ করা উচিত। প্রতিটি পৃষ্ঠায় প্রতি পৃষ্ঠায় মাত্র একটি অনন্য ইউআরএল রয়েছে তা নিশ্চিত করতে (আবার এসইও উদ্দেশ্যে)
জোশুয়া - পেনডো

সেরা উত্তরটি নির্বাচন করা আরও কঠিন এবং কঠিন হচ্ছে, বর্তমানে প্রায় 3/4 টি উত্তর রয়েছে যা প্রতিটি অনুগ্রহের অন্তত একটি অংশের জন্য প্রাপ্য। একত্রিত হয়ে তারা আমি একসাথে পরিষ্কার করতে চেয়েছি এমন সমস্ত কিছুর জবাব হয়ে যায় :)
জোশুয়া - পেনডো

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

52

টমাস ব্লির পরামর্শ অনুসারে প্রি-প্রসেসর ব্যবহার করে পারফরম্যান্স ছাড়াই আই 18 এন বাস্তবায়ন করা

কর্মক্ষেত্রে, আমরা সম্প্রতি আমাদের কয়েকটি সম্পত্তি নিয়ে আই 18 এন প্রয়োগ করেছি এবং আমরা যে জিনিসগুলির সাথে লড়াই করে চলেছিলাম তার মধ্যে একটি হ'ল অন-ফ্লাই ট্রান্সলেশনের সাথে সম্পর্কিত হ'ল, তখন আমি টমাস ব্লির এই দুর্দান্ত ব্লগ পোস্টটি আবিষ্কার করেছিলাম Tho যা আমরা ন্যূনতম পারফরম্যান্স সমস্যার সাথে বড় ট্র্যাফিক লোডগুলি হ্যান্ডেল করতে i18n ব্যবহার করছি inspired

প্রতিটি অনুবাদ ক্রিয়াকলাপের জন্য কল করার পরিবর্তে, যা আমরা জানি পিএইচপিতে ব্যয়বহুল, আমরা আমাদের বেস ফাইলগুলি স্থানধারকদের সাথে সংজ্ঞায়িত করি, তারপরে সেই ফাইলগুলি ক্যাশে করার জন্য একটি প্রসেসর ব্যবহার করি (আমরা ফাইলটি পরিমার্জনের সময়টি সংরক্ষণ করছি তা নিশ্চিত করার জন্য সর্বদা সর্বশেষতম সামগ্রী)।

অনুবাদ ট্যাগস

থমাস অনুবাদগুলি শুরু এবং শেষ কোথায় তা সংজ্ঞায়িত করতে ট্যাগ {tr}এবং ব্যবহার করে {/tr}। সত্য যে আমরা TWIG ব্যবহার করছেন কারণে, আমরা ব্যবহার করতে না চান {, যাতে আমরা ব্যবহার দ্বিধা এড়াতে আপনি [%tr%]এবং [%/tr%]পরিবর্তে। মূলত, এটি এর মতো দেখাচ্ছে:

`return [%tr%]formatted_value[%/tr%];`

নোট করুন যে থমাস ফাইলটিতে বেস ইংলিশ ব্যবহার করার পরামর্শ দিয়েছিল। আমরা এটি করি না কারণ আমরা যদি ইংরেজিতে মান পরিবর্তন করি তবে আমাদের সমস্ত অনুবাদ ফাইলগুলি সংশোধন করতে হবে না।

INI ফাইলগুলি

তারপরে, আমরা প্রতিটি ভাষার জন্য একটি ফর্ম্যাটে একটি INI ফাইল তৈরি করি placeholder = translated:

// lang/fr.ini
formatted_value = number_format($value * Model_Exchange::getEurRate(), 2, ',', ' ') . '€'

// lang/en_gb.ini
formatted_value = '£' . number_format($value * Model_Exchange::getStgRate())

// lang/en_us.ini
formatted_value = '$' . number_format($value)

এটা একটা ব্যবহারকারী, CMS ভিতরে এই সংশোধন করার অনুমতি দিতে তুচ্ছ হবে, শুধু একটি দ্বারা keypairs পেতে preg_splitউপর \nবা =এবং CMS INI এ ফাইল লিখতে সক্ষম করে।

প্রাক প্রসেসর উপাদান

মূলত, থমাস আপনার অনুবাদ ফাইলগুলি নেওয়ার জন্য এবং ডিস্কে স্থির পিএইচপি ফাইলগুলি তৈরি করতে এই জাতীয় একটি ফাংশন (যদিও সত্য সত্য এটি প্রিপ্রসেসর) ব্যবহার করার পরামর্শ দেয়। এইভাবে, আমরা মূলত আমাদের অনুবাদকৃত ফাইলগুলি ফাইলের প্রতিটি স্ট্রিংয়ের জন্য অনুবাদ ফাংশন কল করার পরিবর্তে ক্যাশে করি:

// This function was written by Thomas Bley, not by me
function translate($file) {
  $cache_file = 'cache/'.LANG.'_'.basename($file).'_'.filemtime($file).'.php';
  // (re)build translation?
  if (!file_exists($cache_file)) {
    $lang_file = 'lang/'.LANG.'.ini';
    $lang_file_php = 'cache/'.LANG.'_'.filemtime($lang_file).'.php';

    // convert .ini file into .php file
    if (!file_exists($lang_file_php)) {
      file_put_contents($lang_file_php, '<?php $strings='.
        var_export(parse_ini_file($lang_file), true).';', LOCK_EX);
    }
    // translate .php into localized .php file
    $tr = function($match) use (&$lang_file_php) {
      static $strings = null;
      if ($strings===null) require($lang_file_php);
      return isset($strings[ $match[1] ]) ? $strings[ $match[1] ] : $match[1];
    };
    // replace all {t}abc{/t} by tr()
    file_put_contents($cache_file, preg_replace_callback(
      '/\[%tr%\](.*?)\[%\/tr%\]/', $tr, file_get_contents($file)), LOCK_EX);
  }
  return $cache_file;
}

দ্রষ্টব্য: আমি রেজিেক্স কাজ করে যাচাই করিনি, আমি এটি আমাদের কোম্পানির সার্ভার থেকে অনুলিপি করিনি, তবে আপনি দেখতে পাচ্ছেন যে কীভাবে কাজ করে।

কিভাবে এটি কল

আবার, এই উদাহরণটি আমার থেকে নয়, টমাস ব্লির কাছ থেকে:

// instead of
require("core/example.php");
echo (new example())->now();

// we write
define('LANG', 'en_us');
require(translate('core/example.php'));
echo (new example())->now();

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

কেন এই পদ্ধতিটি ব্যবহার করবেন?

আমরা তিনটি কারণে প্রিপ্রোসেসিংয়ের এই পদ্ধতিটি পছন্দ করি:

  1. খুব কমই পরিবর্তিত হয় এমন সামগ্রীর জন্য পুরো গুচ্ছ ফাংশনগুলি না বলা থেকে দুর্দান্ত পারফরম্যান্স লাভ (এই সিস্টেমটি সহ, ফরাসী ভাষায় 100k দর্শক কেবলমাত্র একবারে পুনরায় অনুবাদ প্রতিস্থাপন শেষ করবে)।
  2. এটি আমাদের ডাটাবেসে কোনও বোঝা যুক্ত করে না, কারণ এটি সাধারণ ফ্ল্যাট-ফাইল ব্যবহার করে এবং খাঁটি-পিএইচপি সমাধান।
  3. আমাদের অনুবাদগুলির মধ্যে পিএইচপি এক্সপ্রেশন ব্যবহার করার ক্ষমতা।

অনুবাদকৃত ডাটাবেস সামগ্রী প্রাপ্ত করা

আমরা কেবল আমাদের ডাটাবেসে থাকা কন্টেন্টের জন্য একটি কলাম যুক্ত languageকরি, তারপরে আমরা LANGধ্রুবকটির জন্য একটি অ্যাকসেসর পদ্ধতি ব্যবহার করি যা আমরা আগেই সংজ্ঞায়িত করেছি, তাই আমাদের এসকিউএল কলগুলি (জেডএফ 1 ব্যবহার করে, দুঃখের সাথে) এর মতো দেখতে:

$query = select()->from($this->_name)
                 ->where('language = ?', User::getLang())
                 ->where('id       = ?', $articleId)
                 ->limit(1);

আমাদের নিবন্ধগুলির একটি যৌগিক প্রাথমিক কী রয়েছে idএবং languageতাই নিবন্ধটি 54সমস্ত ভাষায় থাকতে পারে। নির্দিষ্ট না হলে আমাদের LANGডিফল্ট en_US

ইউআরএল স্লাগ অনুবাদ

আমি এখানে দুটি জিনিস একত্রিত করেছি, একটি আপনার বুটস্ট্র্যাপের একটি ফাংশন যা $_GETভাষার জন্য পরামিতি গ্রহণ করে এবং কুকি ভেরিয়েবলকে ওভাররাইড করে এবং অন্যটি রাউটিং যা একাধিক স্লাগ গ্রহণ করে। তারপরে আপনি নিজের রাউটিংয়ে এমন কিছু করতে পারেন:

"/wilkommen" => "/welcome/lang/de"
... etc ...

এগুলি কোনও ফ্ল্যাট ফাইলে সংরক্ষণ করা যেতে পারে যা আপনার অ্যাডমিন প্যানেল থেকে সহজেই লেখা যেতে পারে। জেএসএন বা এক্সএমএল তাদের সমর্থন করার জন্য একটি ভাল কাঠামো সরবরাহ করতে পারে।

কয়েকটি অন্যান্য বিকল্প সম্পর্কিত নোটসমূহ

পিএইচপি ভিত্তিক অন ফ্লাই অনুবাদ

আমি দেখতে পাচ্ছি না যে প্রাক-প্রক্রিয়াজাত অনুবাদগুলির তুলনায় এগুলি কোনও সুবিধা দেয়।

ফ্রন্ট-এন্ড ভিত্তিক অনুবাদসমূহ

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

আপনাকে এটিও ধরে নিতে হবে যে আপনার সমস্ত ব্যবহারকারী আপনার সাইটে জাভাস্ক্রিপ্টটি ব্যবহার করতে ইচ্ছুক এবং সক্ষম, তবে আমার পরিসংখ্যান থেকে দেখা যায়, আমাদের প্রায় 2.5% ব্যবহারকারী এটি ছাড়াই চলছে (বা আমাদের সাইটগুলিকে এটি ব্যবহার করতে বাধা দেওয়ার জন্য নসক্রিপ্ট ব্যবহার করছে) ।

ডাটাবেস-চালিত অনুবাদ

পিএইচপি-র ডাটাবেসের সংযোগের গতি বাড়ীতে লেখার মতো কিছুই নয় এবং এটি অনুবাদ করতে প্রতিটি বাক্যাংশে একটি ফাংশন কল করার ইতিমধ্যে হাই ওভারহেড যুক্ত করে। পারফরম্যান্স এবং স্কেলাবিলিটি সমস্যাগুলি এই পদ্ধতির সাথে অপ্রতিরোধ্য বলে মনে হচ্ছে।


আমি দেখতে পাচ্ছি যে আমি আপনাকে "ফ্রন্ট-এন্ড ট্রান্সলেটস" দিয়ে বিভ্রান্ত করেছি, আমি যা বোঝাতে চেয়েছি তা হ'ল স্ক্রিনে অনুবাদিত স্ট্রিংগুলি পার্স করার উপায়। আমি ক্লায়েন্ট পক্ষেই এটি অনুবাদ করার উপায় খুঁজছি না! আমি যা বোঝাতে চেয়েছি সেটি ছিল ফ্রন্ট এন্ডে ভাষা পরিবর্তন করার সহজতম উপায়, তবে এটি অবশ্যই একটি কুকি বা একটি ব্যবহারকারী সেটিংস ব্যবহার করছে :)
জোশুয়া - পেনডো

ওহ, এবং ডেটাবেস-চালিত দ্বারা আমি সমস্ত অনুবাদ পরিচালনার পদ্ধতির দিকে আরও লক্ষ্য রেখেছিলাম, সুতরাং আমার আদর্শ সমাধানটি এমন একটি ব্যাক-এন্ড হবে যা পিএইচপি তৈরি করে এমন প্রাক-প্রসেসিং উপাদান তৈরি করে এমন একটি ফাংশন অনুসরণ করে একটি ডাটাবেসে অনুবাদ লিখবে would ফাইল। Why?: সরল .. আমি পাঠ্যের সামান্য পরিবর্তন দেখে বিরক্ত হতে চাই না, ব্যবহারকারীরা কোনও কোড সম্পাদক এবং / বা এফটিপি প্রোগ্রাম ব্যবহার না করে নিজেই তা করতে সক্ষম হবেন :)
জোশুয়া - পেনডো

@ পেন্ডো আমি জানি যে আপনি ফ্রন্ট-এন্ড অনুবাদগুলি বোঝাতে চেয়েছিলেন না, এটি জেএস ব্যবহার করে ফ্রন্ট-এন্ড অনুবাদ ফ্রেমওয়ার্কের পরামর্শ দেওয়া ব্যবহারকারীটির প্রতি একটি পাতলা পর্দার মন্তব্য ছিল। ;)
গ্লিচ ডিজায়ার

@ পেন্ডো আমি সম্মত, আপনার পরামর্শ অনুসারে আমি ব্যাকএন্ডটি ব্যবহার করব তবে একটি ডাটাবেসের পরিবর্তে আমি পারফরম্যান্সের কারণে ফ্ল্যাট ফাইল ব্যবহার করব। অবশ্যই, কোর এখানে পরামর্শ প্রাক রেন্ডারিং পরিবর্তন উপর টেমপ্লেট যাতে আপনি প্রতিস্থাপন পারে .INIসঙ্গে একটি 3-কলাম ডাটাবেস সারণি ফাইল placeholder, replacement, languageplaceholderএবং উপর যৌগিক কী language। তারপরে tempfile(টেমপ্লেটের পথে) এবং modified(DATETIME) সহ আরও একটি 2-কল করুন ।
গ্লাচ ডিজায়ার

1
@ পেন্ডো ধন্যবাদ আমি 250 টি ব্যাক আপ রেখেছি এবং 24 ঘন্টা যখন সাইটটি আমাকে দেয় তখন আমি টেরেস্কোতে এটির পুরস্কার দেওয়ার পরিকল্পনা করি, কারণ আপনি উভয় উত্তরকে সঠিক হিসাবে বেছে নিয়েছেন এবং আমি মনে করি একটি বিভাজন আপনার উদ্দেশ্যকে উপস্থাপন করবে।
গ্লিচ ডিজায়ার

15

আমি আপনাকে চাকা উদ্ভাবন না করার এবং গেটেক্সটেক্স এবং আইএসও ভাষার সংক্ষিপ্ত তালিকাটি ব্যবহার না করার পরামর্শ দিচ্ছি। আপনি কি দেখেছেন যে জনপ্রিয় সিএমএস বা ফ্রেমওয়ার্কগুলিতে i18n / l10n কীভাবে প্রয়োগ করা হয়েছে?

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

এছাড়াও অনেক অনুবাদকের ইতিমধ্যে গেটেক্সটেক্স নিয়ে কাজ করার অভিজ্ঞতা রয়েছে।

দেখে নিন ব্যবহার করার CakePHP বা Drupal এর । উভয়ই বহুভাষিক সক্ষম। ইন্টারফেস স্থানীয়করণের উদাহরণ হিসাবে কেকপিএইচপি এবং সামগ্রী অনুবাদের উদাহরণ হিসাবে দ্রুপাল।

L10n এর জন্য ডেটাবেস ব্যবহার করা মোটেই কেস নয়। এটি প্রশ্নের উপর টন হবে। স্ট্যান্ডার্ড পদ্ধতির প্রাথমিক পর্যায়ে মেমরির সমস্ত l10n ডেটা পাওয়া (বা আপনি যদি অলস লোডিং পছন্দ করেন তবে i10n ফাংশনে প্রথম কল করার সময়)। এটি .po ফাইল বা ডিবি থেকে একবারে সমস্ত ডেটা পড়তে পারে। আর অ্যারে থেকে অনুরোধ করা স্ট্রিং পড়ার চেয়ে বেশি।

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

সুতরাং আপনি আপনার # 3 এ পুরোপুরি ঠিক আছেন। একটি ব্যতিক্রম সহ: সাধারণত এটি একটি বড় ফাইল প্রতি-নিয়ামক ফাইল বা তাই হয় না। কারণ একটি ফাইল খোলার জন্য পারফরম্যান্সের পক্ষে এটি সর্বোত্তম। আপনি সম্ভবত জানেন যে কিছু হাইলোডেড ওয়েব অ্যাপ্লিকেশনগুলি যখন অন্তর্ভুক্ত / প্রয়োজন হয় তখন ফাইল অপারেশন এড়ানোর জন্য একটি ফাইলে সমস্ত পিএইচপি কোড কম্পাইল করে।

ইউআরএল সম্পর্কে। গুগল পরোক্ষভাবে অনুবাদ ব্যবহার করার পরামর্শ দেয় :

ফরাসি বিষয়বস্তু পরিষ্কারভাবে ইঙ্গিত করতে: http://example.ca/fr/vélo-de-montagne.html

এছাড়াও আমি তোমাকে ডিফল্ট ভাষা উপসর্গ যেমন ব্যবহারকারীর পুনর্নির্দেশ করতে প্রয়োজন মনে http://examlpe.com/about-us হবে রিডাইরেক্ট http://examlpe.com/en/about-us তাই কিন্তু যদি আপনার সাইট ব্যবহারের জন্য শুধুমাত্র একটি ভাষা আপনি একেবারে উপসর্গের দরকার নেই।

পরীক্ষা করে দেখুন: http://www.audiomicro.com/trailer-hit-impact-psychodrama-sound-effects-836925 http://nl.audiomicro.com/aanhangwagen-hit-effect-psychodrama-geluidseffecten-836925 http: / /de.audiomicro.com/anhanger-hit-auswirkungen-psychodrama-sound-effekte-836925

বিষয়বস্তু অনুবাদ করা আরও কঠিন কাজ। আমি মনে করি এটি বিভিন্ন ধরণের সামগ্রী যেমন নিবন্ধ, মেনু আইটেম ইত্যাদির সাথে কিছুটা পার্থক্য হবে তবে # 4 এ আপনি সঠিক উপায়ে রয়েছেন। আরও ধারণা পেতে দ্রুপাল একবার দেখুন। এটিতে যথেষ্ট পরিস্কার ডিবি স্কিমা এবং অনুবাদ করার জন্য যথেষ্ট যথেষ্ট ইন্টারফেস রয়েছে। আপনি নিবন্ধ তৈরি করতে পছন্দ করেন এবং এর জন্য ভাষা নির্বাচন করুন। এবং এর চেয়ে পরে আপনি এটিকে অন্য ভাষায় অনুবাদ করতে পারেন।

ড্রুপাল অনুবাদ ইন্টারফেস

আমি মনে করি এটি URL স্লাগগুলির সাথে সমস্যা নয়। আপনি স্লাগগুলির জন্য পৃথক সারণী তৈরি করতে পারেন এবং এটি সঠিক সিদ্ধান্ত হবে। সঠিক সূচকগুলি ব্যবহার করে এমনকি বিপুল পরিমাণে ডেটা থাকা সারণীটি জিজ্ঞাসা করাও সমস্যা নয়। এবং এটি সম্পূর্ণ পাঠ্য অনুসন্ধান নয় তবে স্ট্রিংয়ের মিল ছিল যদি স্লাগের জন্য ভারচার ডেটা টাইপ ব্যবহার করা হয় এবং সেই ক্ষেত্রটিতে আপনারও একটি সূচক থাকতে পারে।

পিএস দুঃখিত, আমার ইংরেজি যদিও নিখুঁত থেকে দূরে।


আমার প্রশ্নের উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ। আপনার ইংরেজি আমার পক্ষে যথেষ্ট বোঝার পক্ষে যথেষ্ট! আমি আপনার প্রচেষ্টার জন্য ইতিমধ্যে +1 করব!
জোশুয়া - পেন্ডো

ইয়ারোস্লাভ, আবারও, আপনার উত্তরের জন্য ধন্যবাদ। তবে আমি আরও 2 টি উত্তর নিয়ে গিয়েছিলাম যেখানে কিছুটা আরও সম্পূর্ণ এবং কোডটির পিছনে ব্যবহৃত পন্থাগুলি এটি ইতিমধ্যে উপস্থিত রয়েছে তা নির্দেশ করার পরিবর্তে ব্যাখ্যা করে ।
জোশুয়া - পেন্ডো

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

12

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

ধরা যাক আপনার এই পাঠ্য রয়েছে:

Welcome!

আপনি অনুবাদ সহ এটি একটি ডাটাবেসে ইনপুট করতে পারেন, তবে আপনি এটি করতে পারেন:

$welcome = array(
"English"=>"Welcome!",
"German"=>"Willkommen!",
"French"=>"Bienvenue!",
"Turkish"=>"Hoşgeldiniz!",
"Russian"=>"Добро пожаловать!",
"Dutch"=>"Welkom!",
"Swedish"=>"Välkommen!",
"Basque"=>"Ongietorri!",
"Spanish"=>"Bienvenito!"
"Welsh"=>"Croeso!");

এখন, যদি আপনার ওয়েবসাইটটি কোনও কুকি ব্যবহার করে তবে আপনার কাছে এটি উদাহরণস্বরূপ রয়েছে:

$_COOKIE['language'];

এটিকে সহজ করার জন্য আসুন এটি একটি কোডে রূপান্তরিত করুন যা সহজেই ব্যবহার করা যায়:

$language=$_COOKIE['language'];

যদি আপনার কুকির ভাষা ওয়েলশ হয় এবং আপনার কাছে এই কোডের টুকরা রয়েছে:

echo $welcome[$language];

এর ফলাফলটি হবে:

Croeso!

আপনি যদি আপনার ওয়েবসাইটের জন্য প্রচুর অনুবাদ যুক্ত করতে চান এবং একটি ডাটাবেস খুব বেশি খরচ হয় তবে অ্যারে ব্যবহার করা একটি আদর্শ সমাধান হতে পারে।


1
আমি যে উত্তরটি চেয়েছিলাম তার কাছে এটিই নেই। এছাড়াও, প্রতিটি পৃষ্ঠায় সমস্ত ভাষা উপলভ্য হওয়ার পরিবর্তে, আপনি lang.en.phpঅন্তর্ভুক্ত থাকা মতো ফাইলগুলি তৈরি করতে এবং $lang['welcome']প্রতিটি ফাইলটিতে ঘোষিত হিসাবে ব্যবহার করতে চান ।
জোশুয়া - পেন্ডো

7

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

আমার সমস্যাটি সমাধানের জন্য আমি আগে একই ধরণের সমস্যার মুখোমুখি হয়েছিলাম এবং নিম্নলিখিত ক্লাসে লিখেছিলাম

অবজেক্ট: লোকেল \ লোকাল

<?php

  namespace Locale;

  class Locale{

// Following array stolen from Zend Framework
public $country_to_locale = array(
    'AD' => 'ca_AD',
    'AE' => 'ar_AE',
    'AF' => 'fa_AF',
    'AG' => 'en_AG',
    'AI' => 'en_AI',
    'AL' => 'sq_AL',
    'AM' => 'hy_AM',
    'AN' => 'pap_AN',
    'AO' => 'pt_AO',
    'AQ' => 'und_AQ',
    'AR' => 'es_AR',
    'AS' => 'sm_AS',
    'AT' => 'de_AT',
    'AU' => 'en_AU',
    'AW' => 'nl_AW',
    'AX' => 'sv_AX',
    'AZ' => 'az_Latn_AZ',
    'BA' => 'bs_BA',
    'BB' => 'en_BB',
    'BD' => 'bn_BD',
    'BE' => 'nl_BE',
    'BF' => 'mos_BF',
    'BG' => 'bg_BG',
    'BH' => 'ar_BH',
    'BI' => 'rn_BI',
    'BJ' => 'fr_BJ',
    'BL' => 'fr_BL',
    'BM' => 'en_BM',
    'BN' => 'ms_BN',
    'BO' => 'es_BO',
    'BR' => 'pt_BR',
    'BS' => 'en_BS',
    'BT' => 'dz_BT',
    'BV' => 'und_BV',
    'BW' => 'en_BW',
    'BY' => 'be_BY',
    'BZ' => 'en_BZ',
    'CA' => 'en_CA',
    'CC' => 'ms_CC',
    'CD' => 'sw_CD',
    'CF' => 'fr_CF',
    'CG' => 'fr_CG',
    'CH' => 'de_CH',
    'CI' => 'fr_CI',
    'CK' => 'en_CK',
    'CL' => 'es_CL',
    'CM' => 'fr_CM',
    'CN' => 'zh_Hans_CN',
    'CO' => 'es_CO',
    'CR' => 'es_CR',
    'CU' => 'es_CU',
    'CV' => 'kea_CV',
    'CX' => 'en_CX',
    'CY' => 'el_CY',
    'CZ' => 'cs_CZ',
    'DE' => 'de_DE',
    'DJ' => 'aa_DJ',
    'DK' => 'da_DK',
    'DM' => 'en_DM',
    'DO' => 'es_DO',
    'DZ' => 'ar_DZ',
    'EC' => 'es_EC',
    'EE' => 'et_EE',
    'EG' => 'ar_EG',
    'EH' => 'ar_EH',
    'ER' => 'ti_ER',
    'ES' => 'es_ES',
    'ET' => 'en_ET',
    'FI' => 'fi_FI',
    'FJ' => 'hi_FJ',
    'FK' => 'en_FK',
    'FM' => 'chk_FM',
    'FO' => 'fo_FO',
    'FR' => 'fr_FR',
    'GA' => 'fr_GA',
    'GB' => 'en_GB',
    'GD' => 'en_GD',
    'GE' => 'ka_GE',
    'GF' => 'fr_GF',
    'GG' => 'en_GG',
    'GH' => 'ak_GH',
    'GI' => 'en_GI',
    'GL' => 'iu_GL',
    'GM' => 'en_GM',
    'GN' => 'fr_GN',
    'GP' => 'fr_GP',
    'GQ' => 'fan_GQ',
    'GR' => 'el_GR',
    'GS' => 'und_GS',
    'GT' => 'es_GT',
    'GU' => 'en_GU',
    'GW' => 'pt_GW',
    'GY' => 'en_GY',
    'HK' => 'zh_Hant_HK',
    'HM' => 'und_HM',
    'HN' => 'es_HN',
    'HR' => 'hr_HR',
    'HT' => 'ht_HT',
    'HU' => 'hu_HU',
    'ID' => 'id_ID',
    'IE' => 'en_IE',
    'IL' => 'he_IL',
    'IM' => 'en_IM',
    'IN' => 'hi_IN',
    'IO' => 'und_IO',
    'IQ' => 'ar_IQ',
    'IR' => 'fa_IR',
    'IS' => 'is_IS',
    'IT' => 'it_IT',
    'JE' => 'en_JE',
    'JM' => 'en_JM',
    'JO' => 'ar_JO',
    'JP' => 'ja_JP',
    'KE' => 'en_KE',
    'KG' => 'ky_Cyrl_KG',
    'KH' => 'km_KH',
    'KI' => 'en_KI',
    'KM' => 'ar_KM',
    'KN' => 'en_KN',
    'KP' => 'ko_KP',
    'KR' => 'ko_KR',
    'KW' => 'ar_KW',
    'KY' => 'en_KY',
    'KZ' => 'ru_KZ',
    'LA' => 'lo_LA',
    'LB' => 'ar_LB',
    'LC' => 'en_LC',
    'LI' => 'de_LI',
    'LK' => 'si_LK',
    'LR' => 'en_LR',
    'LS' => 'st_LS',
    'LT' => 'lt_LT',
    'LU' => 'fr_LU',
    'LV' => 'lv_LV',
    'LY' => 'ar_LY',
    'MA' => 'ar_MA',
    'MC' => 'fr_MC',
    'MD' => 'ro_MD',
    'ME' => 'sr_Latn_ME',
    'MF' => 'fr_MF',
    'MG' => 'mg_MG',
    'MH' => 'mh_MH',
    'MK' => 'mk_MK',
    'ML' => 'bm_ML',
    'MM' => 'my_MM',
    'MN' => 'mn_Cyrl_MN',
    'MO' => 'zh_Hant_MO',
    'MP' => 'en_MP',
    'MQ' => 'fr_MQ',
    'MR' => 'ar_MR',
    'MS' => 'en_MS',
    'MT' => 'mt_MT',
    'MU' => 'mfe_MU',
    'MV' => 'dv_MV',
    'MW' => 'ny_MW',
    'MX' => 'es_MX',
    'MY' => 'ms_MY',
    'MZ' => 'pt_MZ',
    'NA' => 'kj_NA',
    'NC' => 'fr_NC',
    'NE' => 'ha_Latn_NE',
    'NF' => 'en_NF',
    'NG' => 'en_NG',
    'NI' => 'es_NI',
    'NL' => 'nl_NL',
    'NO' => 'nb_NO',
    'NP' => 'ne_NP',
    'NR' => 'en_NR',
    'NU' => 'niu_NU',
    'NZ' => 'en_NZ',
    'OM' => 'ar_OM',
    'PA' => 'es_PA',
    'PE' => 'es_PE',
    'PF' => 'fr_PF',
    'PG' => 'tpi_PG',
    'PH' => 'fil_PH',
    'PK' => 'ur_PK',
    'PL' => 'pl_PL',
    'PM' => 'fr_PM',
    'PN' => 'en_PN',
    'PR' => 'es_PR',
    'PS' => 'ar_PS',
    'PT' => 'pt_PT',
    'PW' => 'pau_PW',
    'PY' => 'gn_PY',
    'QA' => 'ar_QA',
    'RE' => 'fr_RE',
    'RO' => 'ro_RO',
    'RS' => 'sr_Cyrl_RS',
    'RU' => 'ru_RU',
    'RW' => 'rw_RW',
    'SA' => 'ar_SA',
    'SB' => 'en_SB',
    'SC' => 'crs_SC',
    'SD' => 'ar_SD',
    'SE' => 'sv_SE',
    'SG' => 'en_SG',
    'SH' => 'en_SH',
    'SI' => 'sl_SI',
    'SJ' => 'nb_SJ',
    'SK' => 'sk_SK',
    'SL' => 'kri_SL',
    'SM' => 'it_SM',
    'SN' => 'fr_SN',
    'SO' => 'sw_SO',
    'SR' => 'srn_SR',
    'ST' => 'pt_ST',
    'SV' => 'es_SV',
    'SY' => 'ar_SY',
    'SZ' => 'en_SZ',
    'TC' => 'en_TC',
    'TD' => 'fr_TD',
    'TF' => 'und_TF',
    'TG' => 'fr_TG',
    'TH' => 'th_TH',
    'TJ' => 'tg_Cyrl_TJ',
    'TK' => 'tkl_TK',
    'TL' => 'pt_TL',
    'TM' => 'tk_TM',
    'TN' => 'ar_TN',
    'TO' => 'to_TO',
    'TR' => 'tr_TR',
    'TT' => 'en_TT',
    'TV' => 'tvl_TV',
    'TW' => 'zh_Hant_TW',
    'TZ' => 'sw_TZ',
    'UA' => 'uk_UA',
    'UG' => 'sw_UG',
    'UM' => 'en_UM',
    'US' => 'en_US',
    'UY' => 'es_UY',
    'UZ' => 'uz_Cyrl_UZ',
    'VA' => 'it_VA',
    'VC' => 'en_VC',
    'VE' => 'es_VE',
    'VG' => 'en_VG',
    'VI' => 'en_VI',
    'VN' => 'vn_VN',
    'VU' => 'bi_VU',
    'WF' => 'wls_WF',
    'WS' => 'sm_WS',
    'YE' => 'ar_YE',
    'YT' => 'swb_YT',
    'ZA' => 'en_ZA',
    'ZM' => 'en_ZM',
    'ZW' => 'sn_ZW'
);

/**
 * Store the transaltion for specific languages
 *
 * @var array
 */
protected $translation = array();

/**
 * Current locale
 *
 * @var string
 */
protected $locale;

/**
 * Default locale
 *
 * @var string
 */
protected $default_locale;

/**
 *
 * @var string
 */
protected $locale_dir;

/**
 * Construct.
 *
 *
 * @param string $locale_dir            
 */
public function __construct($locale_dir)
{
    $this->locale_dir = $locale_dir;
}

/**
 * Set the user define localte
 *
 * @param string $locale            
 */
public function setLocale($locale = null)
{
    $this->locale = $locale;

    return $this;
}

/**
 * Get the user define locale
 *
 * @return string
 */
public function getLocale()
{
    return $this->locale;
}

/**
 * Get the Default locale
 *
 * @return string
 */
public function getDefaultLocale()
{
    return $this->default_locale;
}

/**
 * Set the default locale
 *
 * @param string $locale            
 */
public function setDefaultLocale($locale)
{
    $this->default_locale = $locale;

    return $this;
}

/**
 * Determine if transltion exist or translation key exist
 *
 * @param string $locale            
 * @param string $key            
 * @return boolean
 */
public function hasTranslation($locale, $key = null)
{
    if (null == $key && isset($this->translation[$locale])) {
        return true;
    } elseif (isset($this->translation[$locale][$key])) {
        return true;
    }

    return false;
}

/**
 * Get the transltion for required locale or transtion for key
 *
 * @param string $locale            
 * @param string $key            
 * @return array
 */
public function getTranslation($locale, $key = null)
{
    if (null == $key && $this->hasTranslation($locale)) {
        return $this->translation[$locale];
    } elseif ($this->hasTranslation($locale, $key)) {
        return $this->translation[$locale][$key];
    }

    return array();
}

/**
 * Set the transtion for required locale
 *
 * @param string $locale
 *            Language code
 * @param string $trans
 *            translations array
 */
public function setTranslation($locale, $trans = array())
{
    $this->translation[$locale] = $trans;
}

/**
 * Remove transltions for required locale
 *
 * @param string $locale            
 */
public function removeTranslation($locale = null)
{
    if (null === $locale) {
        unset($this->translation);
    } else {
        unset($this->translation[$locale]);
    }
}

/**
 * Initialize locale
 *
 * @param string $locale            
 */
public function init($locale = null, $default_locale = null)
{
    // check if previously set locale exist or not
    $this->init_locale();
    if ($this->locale != null) {
        return;
    }

    if ($locale == null || (! preg_match('#^[a-z]+_[a-zA-Z_]+$#', $locale) && ! preg_match('#^[a-z]+_[a-zA-Z]+_[a-zA-Z_]+$#', $locale))) {
        $this->detectLocale();
    } else {
        $this->locale = $locale;
    }

    $this->init_locale();
}

/**
 * Attempt to autodetect locale
 *
 * @return void
 */
private function detectLocale()
{
    $locale = false;

    // GeoIP
    if (function_exists('geoip_country_code_by_name') && isset($_SERVER['REMOTE_ADDR'])) {

        $country = geoip_country_code_by_name($_SERVER['REMOTE_ADDR']);

        if ($country) {

            $locale = isset($this->country_to_locale[$country]) ? $this->country_to_locale[$country] : false;
        }
    }

    // Try detecting locale from browser headers
    if (! $locale) {

        if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {

            $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

            foreach ($languages as $lang) {

                $lang = str_replace('-', '_', trim($lang));

                if (strpos($lang, '_') === false) {

                    if (isset($this->country_to_locale[strtoupper($lang)])) {

                        $locale = $this->country_to_locale[strtoupper($lang)];
                    }
                } else {

                    $lang = explode('_', $lang);

                    if (count($lang) == 3) {
                        // language_Encoding_COUNTRY
                        $this->locale = strtolower($lang[0]) . ucfirst($lang[1]) . strtoupper($lang[2]);
                    } else {
                        // language_COUNTRY
                        $this->locale = strtolower($lang[0]) . strtoupper($lang[1]);
                    }

                    return;
                }
            }
        }
    }

    // Resort to default locale specified in config file
    if (! $locale) {
        $this->locale = $this->default_locale;
    }
}

/**
 * Check if config for selected locale exists
 *
 * @return void
 */
private function init_locale()
{
    if (! file_exists(sprintf('%s/%s.php', $this->locale_dir, $this->locale))) {
        $this->locale = $this->default_locale;
    }
}

/**
 * Load a Transtion into array
 *
 * @return void
 */
private function loadTranslation($locale = null, $force = false)
{
    if ($locale == null)
        $locale = $this->locale;

    if (! $this->hasTranslation($locale)) {
        $this->setTranslation($locale, include (sprintf('%s/%s.php', $this->locale_dir, $locale)));
    }
}

/**
 * Translate a key
 *
 * @param
 *            string Key to be translated
 * @param
 *            string optional arguments
 * @return string
 */
public function translate($key)
{
    $this->init();
    $this->loadTranslation($this->locale);

    if (! $this->hasTranslation($this->locale, $key)) {

        if ($this->locale !== $this->default_locale) {

            $this->loadTranslation($this->default_locale);

            if ($this->hasTranslation($this->default_locale, $key)) {

                $translation = $this->getTranslation($this->default_locale, $key);
            } else {
                // return key as it is or log error here
                return $key;
            }
        } else {
            return $key;
        }
    } else {
        $translation = $this->getTranslation($this->locale, $key);
    }
    // Replace arguments
    if (false !== strpos($translation, '{a:')) {
        $replace = array();
        $args = func_get_args();
        for ($i = 1, $max = count($args); $i < $max; $i ++) {
            $replace['{a:' . $i . '}'] = $args[$i];
        }
        // interpolate replacement values into the messsage then return
        return strtr($translation, $replace);
    }

    return $translation;
  }
}

ব্যবহার

 <?php
    ## /locale/en.php

    return array(
       'name' => 'Hello {a:1}'
       'name_full' => 'Hello {a:1} {a:2}'
   );

$locale = new Locale(__DIR__ . '/locale');
$locale->setLocale('en');// load en.php from locale dir
//want to work with auto detection comment $locale->setLocale('en');

echo $locale->translate('name', 'Foo');
echo $locale->translate('name', 'Foo', 'Bar');

কিভাবে এটা কাজ করে

{a:1}পদ্ধতিতে পাস হওয়া প্রথম আর্গুমেন্ট দ্বারা প্রতিস্থাপিত হয় পদ্ধতিতে পাস হওয়া Locale::translate('key_name','arg1') {a:2}দ্বিতীয় আর্গুমেন্ট দ্বারা প্রতিস্থাপিত হয়Locale::translate('key_name','arg1','arg2')

সনাক্তকরণ কীভাবে কাজ করে

  • ডিফল্টরূপে যদি geoipতারপর ইনস্টল করা এটি দ্বারা কান্ট্রি কোড ফিরে আসবে geoip_country_code_by_nameএবং যদি geoip ফলব্যাক ইনস্টল করা নেই HTTP_ACCEPT_LANGUAGEহেডার

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

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

আমি একমত, আমি সেখানে নিজেকে কিছুটা ট্র্যাক করেছি। উল্লেখ করার জন্য ধন্যবাদ, বহু বিট চরিত্রগুলিও এই প্রশ্নে উল্লেখ করার জন্য যথেষ্ট গুরুত্বপূর্ণ :)
জোশুয়া - পেনডো

5

কেবলমাত্র একটি সাব উত্তর: সম্পূর্ণরূপে একটি ভাষা শনাক্তকারী এর সাথে অনুবাদিত ইউআরএলগুলি অবশ্যই তাদের সামনে ব্যবহার করুন: http://www.domain.com/nl/over-ons
হাইব্রিড সমাধানগুলি জটিল হয়ে যায়, তাই আমি কেবল এটির সাথে আটকে থাকব। কেন? ইউআরএল এসইও জন্য প্রয়োজনীয়।

ডিবি অনুবাদ সম্পর্কে: ভাষার সংখ্যা কম-বেশি স্থির? না বরং অনাকাঙ্ক্ষিত এবং গতিশীল? যদি এটি স্থির হয়ে থাকে তবে আমি কেবল নতুন কলামগুলি যুক্ত করব, অন্যথায় একাধিক সারণী নিয়ে যাব।

তবে সাধারণত, দ্রুপাল কেন ব্যবহার করবেন না? আমি জানি যে প্রত্যেকে তাদের নিজস্ব সিএমএস তৈরি করতে চায় কারণ এটি দ্রুত, ঝুঁকিপূর্ণ, ইত্যাদি। তবে এটি সত্যিই একটি খারাপ ধারণা!


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

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

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

1
তদুপরি, আমি আমার কাজটি যথাযথভাবে নথিভুক্ত করার প্রবণতা রাখি, যেহেতু আমি একজন "ওয়ান ম্যান আর্মি" লোক যারা আমার পক্ষে কাজ করে তাদের এই সিস্টেমটি সম্পর্কে জানতে কোনও অসুবিধা না করা উচিত।
জোশুয়া - পেন্ডো

খারাপ ধারণা হ'ল দ্রুপাল বাছাই করা এবং এমনকি গুগলও বলেছে যে ইউআরএল অনুবাদ করা আছে কিনা সেগুলি তাদের যত্ন নেই। এটি অবশ্যই একটি স্থানীয় শনাক্তকারী থাকতে হবে।
undefinedman

5

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

অভ্যন্তরীণভাবে, আমার কাঠামোটিতে এন, ফ্র, এস, সিএন এবং আরও কিছু কোড ব্যবহার করা হয়। একটি অ্যারে ওয়েবসাইট দ্বারা সমর্থিত ভাষাগুলি ধারণ করে: অ্যারে ('এন', 'ফ্র', 'এস', 'সিএন') ভাষা কোডটি $ _GET (ল্যাং = ফ্রি) এর মাধ্যমে পাস করা হয় এবং যদি পাস হয় না বা বৈধ না হয় তবে এটি অ্যারেতে প্রথম ভাষাতে সেট করা আছে। সুতরাং প্রোগ্রাম প্রয়োগের সময় এবং শুরু থেকেই যে কোনও সময়ে, বর্তমান ভাষাটি জানা যায়।

একটি সাধারণ অ্যাপ্লিকেশনটিতে যে ধরণের সামগ্রী অনুবাদ করা দরকার তা বোঝার জন্য এটি দরকারী:

1) ক্লাসগুলি থেকে ত্রুটি বার্তা (বা পদ্ধতিগত কোড) 2) ক্লাসের অ-ত্রুটি বার্তা (বা পদ্ধতিগত কোড) 3) পৃষ্ঠার সামগ্রী (সাধারণত কোনও ডাটাবেজে সংরক্ষণ করুন) 4) সাইট-প্রশস্ত স্ট্রিং (ওয়েবসাইটের নামের মতো) 5) স্ক্রিপ্ট- নির্দিষ্ট স্ট্রিং

প্রথম টাইপটি বুঝতে সহজ। মূলত, আমরা "ডাটাবেসের সাথে সংযোগ করতে পারিনি ..." এর মতো বার্তাগুলির কথা বলছি। এই বার্তাগুলি কেবল তখনই লোড হওয়া দরকার যখন কোনও ত্রুটি ঘটে। আমার ম্যানেজার ক্লাসটি অন্যান্য ক্লাসের কাছ থেকে কল পেয়ে থাকে এবং পরামিতি হিসাবে পাস করা তথ্য ব্যবহার করে কেবল প্রাসঙ্গিক শ্রেণীর ফোল্ডারে যায় এবং ত্রুটি ফাইলটি পুনরুদ্ধার করে।

দ্বিতীয় ধরণের ত্রুটি বার্তাটি কোনও ফর্মের বৈধতা ভুল হওয়ার সময় আপনি যে বার্তাগুলি পেয়েছেন তার মতো। ("আপনি ... ফাঁকা ছেড়ে" বা "দয়া করে 5 টিরও বেশি অক্ষরের একটি পাসওয়ার্ড চয়ন করুন")। ক্লাসটি চালুর আগে স্ট্রিংগুলি লোড করা দরকার I আমি জানি কী

আসল পৃষ্ঠাগুলির জন্য, আমি প্রতি ভাষাতে একটি টেবিল ব্যবহার করি, প্রতিটি সারণী ভাষার কোড দ্বারা উপস্থাপিত হয়। সুতরাং এন_ কনটেন্টটি হ'ল ইংরাজী ভাষার বিষয়বস্তুযুক্ত টেবিল, এস্ক কনটেন্টটি স্পেনের জন্য, চীনের জন্য সিএন_ কনটেন্ট এবং ফ্রা-কনটেন্ট হ'ল ফরাসি সামগ্রী।

চতুর্থ ধরণের স্ট্রিং আপনার ওয়েবসাইট জুড়ে প্রাসঙ্গিক। এটি ভাষাটির কোড ব্যবহার করে একটি কনফিগারেশন ফাইলের মাধ্যমে লোড করা হয়, সেটি হল en_lang.php, es_lang.php এবং। বিশ্বব্যাপী ভাষার ফাইলটিতে আপনাকে ইংরেজী গ্লোবাল ফাইল এবং অ্যারে ('অ্যাংলাইস', 'চিনোইস', 'অ্যারে (' ইংলিশ ',' চীনা ',' স্প্যানিশ ',' ফরাসী ') এর মতো অনুবাদিত ভাষাগুলি লোড করতে হবে will ফ্রেঞ্চ ফাইলে এস্পাগনল ',' ফ্রাঙ্কাইস ')। সুতরাং আপনি যখন ভাষা নির্বাচনের জন্য একটি ড্রপডাউনটি তৈরি করেন, এটি সঠিক ভাষায় হয়;)

শেষ পর্যন্ত আপনার কাছে স্ক্রিপ্ট-নির্দিষ্ট স্ট্রিং রয়েছে। সুতরাং আপনি যদি কোনও রান্নার অ্যাপ্লিকেশন লিখেন তবে এটি হতে পারে "আপনার চুলা যথেষ্ট গরম ছিল না"।

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

দ্বিতীয় এবং শেষ ভাষার ফাইল যা ডিস্ক থেকে পঠিত হয় তা হ'ল স্ক্রিপ্ট ভাষার ফাইল। lang_en_home_welcome.php হোম / স্বাগত স্ক্রিপ্টের জন্য ভাষা ফাইল। একটি স্ক্রিপ্ট একটি মোড (হোম) এবং একটি ক্রিয়া (স্বাগত) দ্বারা সংজ্ঞায়িত করা হয়। প্রতিটি স্ক্রিপ্টের কনফিগারেশন এবং ল্যাং ফাইলগুলির সাথে নিজস্ব ফোল্ডার রয়েছে।

স্ক্রিপ্টটি উপরে বর্ণিত হিসাবে টেক্সট টেবিলের নামকরণ করে ডাটাবেস থেকে সামগ্রীটি টানবে।

যদি কিছু ভুল হয়ে যায় তবে ভাষা নির্ভর ত্রুটি ফাইলটি কোথায় পাবেন তা ম্যানেজার জানেন knows এই ফাইলটি শুধুমাত্র ত্রুটির ক্ষেত্রে লোড হয়।

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

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

আমি এখানে এই পোস্টে পোস্ট করে আশা করি যে এটি কারও কারও চাকা পুনর্নবীকরণের কাজটি বাঁচাতে পারে যেমন কয়েক বছর আগে আমাকে করতে হয়েছিল।


4

আমি একই probem একটি সময় আগে ছিল, ব্যবহার শুরু করার আগে Symfony ফ্রেমওয়ার্ক।

  1. কেবলমাত্র একটি ফাংশন __ () ব্যবহার করুন যার অ্যারেমিটার পৃষ্ঠা রয়েছে (অথবা অবজেক্টআইড, # 2 তে বর্ণিত অবজেক্ট টেবিল), লক্ষ্য ভাষা এবং ফালব্যাক (ডিফল্ট) ভাষার একটি meচ্ছিক প্যারামিটার রয়েছে। এটির পরিবর্তে আরও সহজ উপায় পাওয়ার জন্য ডিফল্ট ভাষাটি কিছু বৈশ্বিক কনফিগারেশনে সেট করা যেতে পারে।

  2. ডাটাবেসে সামগ্রী সংরক্ষণের জন্য আমি নিম্নলিখিত কাঠামোটি ব্যবহার করেছি: (পেজআইডি, ভাষা, বিষয়বস্তু, ভেরিয়েবল)।

    • পৃষ্ঠাটি আপনি অনুবাদ করতে চান আপনার পৃষ্ঠায় একটি এফকে হবে। নিউজ, গ্যালারী বা যেকোনো কিছু যেমন আপনার কাছে অন্য অবজেক্ট থাকে তবে এটিকে কেবল 2 ফিল্ড অবজেক্ট আইড, অবজেক্ট টেবিলে বিভক্ত করুন।

    • ভাষা - স্পষ্টতই এটি আইএসও ভাষার স্ট্রিং EN_en, LT_lt, EN_us ইত্যাদি সঞ্চয় করবে etc.

    • সামগ্রী - আপনি পাঠ্যটি প্রতিস্থাপনের জন্য ওয়াইল্ডকার্ডের সাথে একসাথে অনুবাদ করতে চান। উদাহরণ "হ্যালো মি। %% নাম %% Your আপনার অ্যাকাউন্টের ব্যালেন্স %% ব্যালেন্স %%%"

    • ভেরিয়েবল - জসন এনকোড ভেরিয়েবল। পিএইচপি দ্রুত এগুলি পার্স করার জন্য ফাংশন সরবরাহ করে। উদাহরণ "নাম: লরিণাস, ভারসাম্য: 15.23"।

    • আপনি স্লাগ ফিল্ডও উল্লেখ করেছেন। এটির সন্ধানের দ্রুত উপায় পেতে আপনি এই টেবিলটিতে অবাধে এটিকে যুক্ত করতে পারেন।

  3. অনুবাদগুলি ক্যাশে করার সাথে আপনার ডাটাবেস কলগুলি সর্বনিম্ন হ্রাস করতে হবে। এটি অবশ্যই পিএইচপি অ্যারেতে সঞ্চয় করা উচিত, কারণ এটি পিএইচপি ভাষার দ্রুততম কাঠামো। আপনি এই ক্যাচিংটি কীভাবে করবেন তা আপনার উপর নির্ভর করে। আমার অভিজ্ঞতা থেকে আপনার প্রতিটি ভাষার সমর্থিত ফোল্ডার এবং প্রতিটি পৃষ্ঠার জন্য একটি অ্যারে থাকা উচিত। অনুবাদটি আপডেট করার পরে ক্যাশেটি পুনরায় তৈরি করা উচিত। কেবলমাত্র পরিবর্তিত অ্যারেটি পুনরায় তৈরি করা উচিত।

  4. আমি মনে করি আমি উত্তরটি উত্তর # 2 এ দিয়েছি

  5. আপনার ধারণা পুরোপুরি যৌক্তিক। এটি একদম সহজ এবং আমি মনে করি আপনাকে কোনও সমস্যা করবে না।

অনুবাদ টেবিলের সঞ্চিত স্লাগগুলি ব্যবহার করে URL গুলি অনুবাদ করা উচিত।

চূড়ান্ত শব্দ

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

কটাক্ষপাত করা Symfony অনুবাদ উপাদান । এটি আপনার জন্য একটি ভাল কোড বেস হতে পারে।


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

1

আমি বারবার নিজেকে সম্পর্কিত প্রশ্ন জিজ্ঞাসা করছি, তারপর আনুষ্ঠানিক ভাষায় হারিয়ে গেলাম ... তবে আপনাকে কিছুটা সাহায্য করতে আমি কিছু অনুসন্ধান ভাগ করতে চাই:

আমি উন্নত সিএমএসে একবার দেখার পরামর্শ দিই

Typo3জন্য PHP (আমি জানি সেখানে পণ্যদ্রব্য একটি অনেক আছে কিন্তু এক আমি মনে করি সবচেয়ে পরিপক্ক হয় thats)

Plone ভিতরে Python

যদি আপনি জানতে পারেন যে 2013 এর ওয়েবে তখন অন্যরকম কাজ করা উচিত, স্ক্র্যাচ থেকে শুরু করুন। এর অর্থ হ'ল নতুন সিএমএস তৈরির জন্য অত্যন্ত দক্ষ / অভিজ্ঞ ব্যক্তিদের একটি দলকে একত্র করা। আপনি সেই উদ্দেশ্যে পলিমারটি একবার দেখতে চান।

যদি কোডিং এবং বহুভাষিক ওয়েবসাইট / স্থানীয় ভাষার সহায়তার কথা আসে তবে আমি মনে করি প্রতিটি প্রোগ্রামারটির ইউনিকোড সম্পর্কে একটি ধারণা থাকা উচিত। আপনি যদি ইউনিকোড না জানেন তবে আপনি অবশ্যই আপনার ডেটা গোলমাল করবেন। হাজার হাজার আইএসও কোড নিয়ে যাবেন না। তারা কেবল আপনাকে কিছু স্মৃতি সঞ্চয় করবে। তবে আপনি ইউটিএফ -8 দিয়ে আক্ষরিক সবকিছু করতে পারেন এমনকি চীনা অক্ষরও সঞ্চয় করতে পারেন। তবে এর জন্য আপনার 2 বা 4 বাইট অক্ষর সংরক্ষণ করতে হবে যা এটি মূলত একটি utf-16 বা utf-32 তৈরি করে।

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

ofankofamerica.com বা bankofamerica.com সমসামবুটডেফারেন্স;)

অবশ্যই আপনার সমস্ত এনকোডিংয়ের সাথে কাজ করার জন্য ফাইল সিস্টেমের প্রয়োজন। ইউটিফোড -8 ফাইল সিস্টেম ব্যবহার করে ইউনিকোডের জন্য আরও একটি প্লাস।

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

যদি ফ্রেমওয়ার্কগুলি সম্পর্কে এটি হয় তবে আমি সবচেয়ে পরিচিত হিসাবে এমভিসির মতো সাধারণ স্টাফগুলি করতে পারি (buzzword আমি সত্যিই এটি ঘৃণা করি! "পারফরম্যান্স" এর মতো আপনি যদি কিছু বিক্রি করতে চান তবে পারফরম্যান্স এবং ফিচাররিচ শব্দটি ব্যবহার করুন এবং আপনি বিক্রয় করুন ... কী নরক) হয় Zend। পিএইচপি বিশৃঙ্খলা কোডারকে স্ট্যান্ডার্ড আনতে এটি একটি ভাল জিনিস হিসাবে প্রমাণিত হয়েছে। তবে, টাইপ 3 এর সিএমএস ছাড়াও একটি ফ্রেমওয়ার্ক রয়েছে। সম্প্রতি এটি পুনর্নবীকরণ করা হয়েছে এবং এখন ফ্লো 3 নামে পরিচিত। অবশ্যই ফ্রেমওয়ার্কগুলি ডেটাবেস বিমূর্তি, টেম্প্লেটিং এবং ক্যাশে দেওয়ার জন্য ধারণাগুলি কভার করে তবে স্বতন্ত্র শক্তি রয়েছে have

যদি এটি ক্যাচিংয়ের বিষয়ে হয় ... তবে এটিকে বিস্ময়করভাবে জটিল / বহু স্তরযুক্ত করা যেতে পারে। পিএইচপি-তে আপনি অ্যাকসিলিলেটর, অপকোড, তবে এইচটিএমএল, এইচডিডিডি, মাইএসকিএল, এক্সএমএল, সিএসএস, জেএস ... যে কোনও ধরণের ক্যাশে সম্পর্কে চিন্তা করবেন। অবশ্যই কিছু অংশ ক্যাশে হওয়া উচিত এবং গতিশীল অংশগুলি যেমন ব্লগের উত্তরগুলি দেওয়া উচিত নয়। কিছু উত্পন্ন url সহ AJAX এর মাধ্যমে অনুরোধ করা উচিত। জেএসএন, হ্যাশব্যাংস ইত্যাদি

তারপরে, আপনি কেবলমাত্র নির্দিষ্ট ব্যবহারকারীরাই অ্যাক্সেস করতে বা পরিচালনা করতে আপনার ওয়েবসাইটে কোনও সামান্য উপাদান রাখতে চান , তাই ধারণাগতভাবে এটি একটি বড় ভূমিকা পালন করে।

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

ভাল, আমি আপাতত যথেষ্ট মনে করি। আপনি যদি টাইপ 3 / প্লোন বা উল্লিখিত ফ্রেমওয়ার্কগুলির কথা না শুনে থাকেন তবে আপনার অধ্যয়ন করার যথেষ্ট পরিমাণ রয়েছে। সেই পথে আপনি এখনও জিজ্ঞাসা করেননি এমন অনেক প্রশ্নের সমাধান পাবেন solutions

তারপরে যদি আপনি ভাবেন, একটি নতুন সিএমএস তৈরি করুন কারণ এর 2013 এবং পিএইচপি যেভাবেই মরতে চলেছে, তবে আশা করি আপনি অন্য কোনও বিকাশকারীদের সাথে যোগ দেবেন আশা করি যে হারিয়ে যাবেন না।

শুভকামনা!

এবং বিটিডব্লিউ। ভবিষ্যতে লোকেরা আর কোনও ওয়েবসাইট পাবে না? এবং আমরা সবাই গুগল + এ থাকব? আমি আশা করি বিকাশকারীরা কিছুটা আরও সৃজনশীল হয়ে উঠুন এবং ব্যবহারযোগ্য কিছু করবেন (বোরগলের সাথে একীভূত হবেন না)

//// সম্পাদনা /// আপনার বিদ্যমান অ্যাপ্লিকেশনটির জন্য কেবল একটু চিন্তাভাবনা করুন:

আপনার যদি একটি পিএইচপি মাইএসকিএল সিএমএস থাকে এবং আপনি মাল্টল্যাং সমর্থন এম্বেড করতে চেয়েছিলেন। আপনি যে কোনও ভাষার জন্য একটি অ্যাডিশনাল কলাম দিয়ে আপনার টেবিলটি ব্যবহার করতে পারেন বা একই টেবিলটিতে কোনও অবজেক্ট আইডি এবং একটি ভাষা আইডি দিয়ে অনুবাদ সন্নিবেশ করতে পারেন বা কোনও ভাষার জন্য একটি অভিন্ন টেবিল তৈরি করতে পারেন এবং সেখানে বস্তু সন্নিবেশ করতে পারেন, তবে আপনি যদি চান তবে একটি নির্বাচন ইউনিয়ন তৈরি করতে পারেন তাদের সব প্রদর্শিত আছে। ডাটাবেসের জন্য utf8 সাধারণ সিআই ব্যবহার করুন এবং অবশ্যই সামনে / ব্যাকএন্ডে utf8 পাঠ্য / এনকোডিং ব্যবহার করুন। আপনি ইতিমধ্যে যেমন ব্যাখ্যা করেছেন তেমনভাবে আমি ইউআরএলগুলির জন্য url পাথ বিভাগগুলি ব্যবহার করেছি

ডোমেইন.অর্গ /en / এ সম্পর্কে আপনি আপনার সামগ্রীর টেবিলটিতে ল্যাং আইডি মানচিত্র করতে পারেন। যাইহোক আপনার ইউআরএলগুলির জন্য প্যারামিটারগুলির একটি মানচিত্র থাকা দরকার যাতে আপনি আপনার ইউআরএল এর কোনও প্যাসেজমেন্ট থেকে ম্যাপ করার জন্য একটি পরামিতিটি সংজ্ঞায়িত করতে চান যা উদাহরণস্বরূপ would

domain.org/en/about/employees/IT/administrators/

চেহারা কনফিগারেশন

pageid | URL

1 | /about/employees/../ ..

1 | /../about/employees../../

ইউআরএল প্যাসেগমেন্টে মানচিত্রের প্যারামিটারগুলি ""

$parameterlist[lang] = array(0=>"nl",1=>"en"); // default nl if 0
$parameterlist[branch] = array(1=>"IT",2=>"DESIGN"); // default nl if 0
$parameterlist[employertype] = array(1=>"admin",1=>"engineer"); //could be a sql result 

$websiteconfig[]=$userwhatever;
$websiteconfig[]=$parameterlist;
$someparameterlist[] = array("branch"=>$someid);
$someparameterlist[] = array("employertype"=>$someid);
function getURL($someparameterlist){ 
// todo foreach someparameter lookup pathsegment 
return path;
}

প্রতি বলা, thats ইতিমধ্যে উপরের পোস্টে আচ্ছাদিত করা হয়েছে।

এবং ভুলে যাওয়ার জন্য, আপনাকে আপনার উত্পাদিত পিএইচপি ফাইলের url "পুনর্লিখন" করতে হবে যা বেশিরভাগ ক্ষেত্রে সূচি.পি.পি.


মন্তব্যের জন্য ধন্যবাদ, আমার অবশ্যই চিন্তাভাবনা করা উচিত। আমি ইতিমধ্যে ইতিমধ্যে কয়েক বছর ধরে utf8 এনকোডিং ব্যবহার করছি, আমি একবার চরিত্রের সাথে লড়াই করতাম ;-) অন্যদিকে সিএমএস / ফ্রেমওয়ার্কের ধরণটি আপনার উত্তরটির কোনও কারণ নয় বলে আমি খুঁজছিলাম প্ল্যাটফর্মের স্বাধীন পদ্ধতি যেন আমরা স্ক্র্যাচ থেকে কোডিং করছি।
জোশুয়া - পেন্ডো

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

ডাটাবেসআউটআউট এবং প্রজন্মের যুক্তি প্রধান কাজ। নোবিডিস আপনার জন্য এখানে এটি করতে যাচ্ছেন ... তবে আইডিয়া নিজেই গণনা করে। যেহেতু আমি লবিগুলির বিষয়ে চিন্তা করি না তবে জিনিসগুলি সম্পন্ন করি, তাই আমি আশা করি আপনি মডেলগুলি তৈরি করতে এবং কিছু জিনিস ভাগ করতে পারেন। আমি এই মুহূর্তে একই ধরনের কাজ করছি। তবে আমি এখনও প্ল্যানিং করছি। আমি টাইপ 3 কে ব্যাকেন্ড হিসাবে বিবেচনা করছি এবং একটি নতুন ক্লায়েন্ট কাঠামো তৈরি করব। বহুভাষিক প্যাটার্নটি ব্যাকএন্ডে সমাধান করা হয়েছে এবং অনুসন্ধান ইঞ্জিন / ওয়েবসার্চগুলির জন্য উত্সর্গীকৃত উপায়ে তথ্য ভাগ করবে। যাইহোক, এটির সমস্ত প্রাসঙ্গিক এবং একটি ক্রমাগত বিল্ডিং কাজ
ডামা ডামা

-1

ডাটাবেস কাজ:

ভাষার সারণী 'ভাষা' তৈরি করুন:

কর্মক্ষেত্র

language_id(primary and auto increamented)

language_name

created_at

created_by

updated_at

updated_by

ডাটাবেস 'সামগ্রীতে' একটি সারণী তৈরি করুন:

কর্মক্ষেত্র

content_id(primary and auto incremented)

main_content

header_content

footer_content

leftsidebar_content

rightsidebar_content

language_id(foreign key: referenced to languages table)

created_at

created_by

updated_at

updated_by

সামনের কাজ শেষ:

ব্যবহারকারী যখন ড্রপডাউন বা যে কোনও অঞ্চল থেকে কোনও ভাষা নির্বাচন করেন তবে সেশনে যেমন নির্বাচিত ভাষা আইডি সংরক্ষণ করুন,

$_SESSION['language']=1;

এখন সেশনে সংরক্ষণ করা ভাষা আইডির ভিত্তিতে ডাটাবেস টেবিলের 'সামগ্রী' থেকে ডেটা আনুন।

বিশদটি এখানে পাওয়া যেতে পারে http://skillrow.com/m মাল্টলিংসিং- ওয়েবসাইট- ইন- php-2/


1
এটি সরল ভাষার সংহতকরণের একটি উপায় যা তখন প্রয়োজন হয়, আপনি কি সম্পূর্ণ পোস্ট এবং উত্তর দেওয়ার চেষ্টা করেছিলেন?
জোশুয়া -

-2

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

https://wordpress.org/plugins/mqtranslate/


1
হ্যাঁ, ডাব্লুপি প্রশ্নটির কোনও কারণ ছিল না। এটি কোনও মন্তব্য হতে পারে
জোশুয়া - পেন্ডো

-3

ওয়ার্ডপ্রেস + MULTI-LANGUAGE SITE BASIS(প্লাগইন) সম্পর্কে কী ? সাইটের কাঠামো থাকবে:

  • উদাহরণ. com / ইঞ্জি / বিভাগ 1 / ....
  • উদাহরণ. com / এনজি / আমার পৃষ্ঠা ....
  • উদাহরণ. com / rus / বিভাগ 1 / ....
  • উদাহরণ. com / rus / আমার পৃষ্ঠা ....

প্লাগইন সরল যুক্তি সহ সমস্ত বাক্যাংশ অনুবাদ করার জন্য ইন্টারফেস সরবরাহ করে:

(ENG) my_title - "Hello user"
(SPA) my_title - "Holla usuario"

তাহলে এটি আউটপুট করা যেতে পারে:
echo translate('my_title', LNG); // LNG is auto-detected

PS তবে, প্লাগইন এখনও সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন।


3
এবং স্প্যানিশ ভাষায় "হোলা ইউজারিও" নয় "হোলা উসারিও"
ভেটকোকার

1
লোল হোলার ইউরিরিও, মজার ছিল!
স্পেকড্রাম

যে কারণে আমি স্প্যানিশ জানতাম না (কেবল ব্যবহৃত উদাহরণ), তাড়াতাড়ি ডাউনভোট করার জন্য তাড়াতাড়ি !! :)
টুডো

-5

আপনি জাভাস্ক্রিপ্ট আপলোড করতে পারেন এমন কোনও ওয়েবসাইটের সাথে কাজ করে এমন একটি সত্যিই সহজ বিকল্পটি হ'ল www.m Multilingualizer.com

এটি আপনাকে সমস্ত পৃষ্ঠার জন্য সমস্ত পাঠ্যকে একটি পৃষ্ঠায় রাখতে দেয় এবং তারপরে ব্যবহারকারীদের যে ভাষাগুলি দেখার প্রয়োজন হয় না সেগুলি লুকায়। ভাল কাজ করে.


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

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