জেএসএনের জন্য এক্সএসএলটি সমতুল্য


15

আমি জেএসএনের জন্য একটি এক্সএসএলটি সমতুল্য (বা প্রয়োজন বিকাশকারী) সন্ধানে আগ্রহী ছিলাম।

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

আমি JSONPath, JSONQuery এবং RQL সম্পর্কে JSON ক্যোয়ারী ভাষা হিসাবে সচেতন (যদিও RQL নিরঙ্কুশ এবং আপেক্ষিক পাথ সমর্থন করে কিনা সে সম্পর্কে আমি পুরোপুরি পরিষ্কার ছিলাম না)। এই জাতীয় ব্যবহারের জন্য প্রতিটিগুলির বিবেচনার জন্য উপাদানগুলির বিষয়ে কোনও পরামর্শ।


কেবল একটি এলোমেলো চিন্তা, জাভাস্ক্রিপ্ট এবং গোঁফ / হ্যান্ডলবারস সম্ভবত? :)
কিনার্ড

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


1
আমি এটি আকর্ষণীয়ও পেয়েছি: json-template.googlecode.com/svn/trunk/doc/…
রবার্ট হার্ভে

আমি জেসন -> এক্সএমএল -> এক্সএসএলটি -> জসন আগে করেছি - এটি সবচেয়ে কার্যকর সমাধান না হলেও, এটি দুর্দান্ত কাজ করে
ব্যবহারকারী 2813274

উত্তর:


27

এক্সএমএল: XSLT :: তাদেরকে JSON: এক্সএক্স কি? ?

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

কয়েকটি স্ট্যান্ডেলোন জেএসএন কোয়েরি ভাষা রয়েছে, যেমন জেএসওনপথ , জেএসোনিক এবং আরকিউএল যা এক্সএমএল: এক্সপাথ :: জেএসওন: y (অথবা সম্ভবত এক্সপথের পরিবর্তে এক্সকুয়েরি) এর মাঝের মাঠের পক্ষে দাঁড়াতে পারে। এবং প্রতিটি JSON- কেন্দ্রীক নথির ডাটাবেসের একটি JSON- সম্পর্কিত কোয়েরি ভাষা থাকে

তবে বাস্তবতাটি হ'ল স্পাহকিউএল-এর মতো পূর্ণ এক্সএসএলটি পদের জন্য কয়েকজন প্রতিযোগী থাকা সত্ত্বেও সাধারণভাবে অনুমোদিত, বিস্তৃতভাবে সমর্থিত সমতুল্য নেই are

কেন?

বিশ্বের সব JSON সঙ্গে, কেন নয় সেখানে (আরও সরাসরি) XSLT করার এনালগ? কারণ অনেক বিকাশকারী এক্সএসএলটিকে একটি ব্যর্থ পরীক্ষা হিসাবে দেখে। যে কোনও সার্চ ইঞ্জিন "এক্সএসএলটি ব্যথায় আবৃত ব্যর্থতা like" এর মতো উদ্ধৃতিগুলিতে নিয়ে যাবে। অন্যরা যুক্তি দেখিয়েছেন যে এটি যদি আরও ভাল ফর্ম্যাট করা হয় তবে এটি আরও জনপ্রিয় হবে। তবে এক্সএসএলটির প্রতি আগ্রহ বছরের পর বছর ধরে হ্রাস পেয়েছে । অনেকগুলি সরঞ্জাম যা এটি সমর্থন করে কেবলমাত্র 1.0 সংস্করণ সমর্থন করে যা 1999 এর নির্দিষ্টকরণ। পনেরো বছরের চশমা? এখানে আরও অনেক নতুন 2.0 বৈশিষ্ট রয়েছে, এবং লোকেরা যদি এক্সএসএলটি সম্পর্কে উত্সাহী হয় তবে এটি সমর্থিত হবে। এটা না।

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


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

স্পাহকিউএল এর নিজস্ব টেমপ্লেট রয়েছে বলে মনে হয় না, সুতরাং এখনও মনে হচ্ছে এমন কোনও প্রতিযোগী নেই যা প্রকৃত জাভাস্ক্রিপ্ট বা জেএসএন ব্যবহার করে টেম্পলেট কোডের জন্য (ডেটা স্ট্রাকচার সহ) এমনকি লাইব্রেরি রয়েছে যা জেএসএন / জাতীয়।
ব্রেট জমির

1
এক্সএসএলটি সম্পর্কে এমন কিছু আছে যা সুনির্দিষ্ট থাকা সত্ত্বেও +1 যা অন্য কোনও কিছুই অনুলিপি করতে সক্ষম হয় না। JSON অবশ্যই এর সাথে ব্যবহারযোগ্য সমতুল্য লেখার জন্য আরও শক্ত বাক্য গঠন হতে চলেছে।
ব্যবহারকারী52889

7

যদিও জোনাথন তার উত্তরে একটি ভাষা হিসাবে এক্সএসএলটি-র প্রকৃতি সম্পর্কে বেশিরভাগ ক্ষেত্রে কথা বলেছেন, আমি মনে করি এর আরও একটি কোণ রয়েছে to

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

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

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


যদি কোনও সন্দেহ থাকে তবে আমি মনে করি জোনাথনের উত্তর দুর্দান্ত; আমি কেবল একটি বিকল্প দৃষ্টিভঙ্গি যুক্ত করতে চেয়েছিলাম।
ড্যানক্রাম্ব

হ্যাঁ, ন্যায্য পয়েন্টগুলি (এবং হ্যাঁ পুনরায়: এক্সপথ দ্বিতীয় অংশের সমতুল্য হওয়া), তবে আমি আমার জেএস এক্সএসএল (এটিটি জেটিএলটি বলছে) দেখতে একটি আগ্রহী জেএসওএনপাথ জেএসওএনকে অন্য একটি ভাষাতে রূপান্তরিত করতেও (অর্থাত্ HTML হিসাবে একটি হিসাবে) স্ট্রিং বা ডিওএম)।
ব্রেট জমির

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

3

আমার (ছোট [jslt.min.js] ) জেএসএলটি - জাভাস্ক্রিপ্ট লাইটওয়েট ট্রান্সফর্মগুলির সাথে আপনি কী করতে পারেন তার কয়েকটি উদাহরণ এখানে রয়েছে :

https://jsfiddle.net/YSharpLanguage/c7usrpsL/10

( [jslt.min.js] ওজন ~ 3.1 কেবি মাইনাইফড )

এটি, কেবল একটি ফাংশন,

function Per ( subject ) { ... }

... যা আসলে এক্সএসএলটি (1.0) এর প্রসেসিং মডেলের নকল করে ।

(সিএফ। পেরের শরীরে "রূপান্তর" এবং "টেমপ্লেট" অভ্যন্তরীণ ফাংশন)

সুতরাং, সংক্ষেপে, এটি কেবলমাত্র সমস্ত একটিকেই বেকড করা হয়েছে function Per ( subject ) { ... }যা এর (এছাড়াও) অনন্য যুক্তির ধরণের উপর ভিত্তি করে মূল্যায়নের জন্য কাঁটাচামচ করে, বাস্তবায়ন করতে হয়:

1) অ্যারে বিষয়

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

যেমন, পের :: অ্যারে --> অ্যারে ray

(ফলস্বরূপ অ্যারের এক্সটেনশন পদ্ধতিগুলির স্ব-ব্যাখ্যামূলক নাম যেমন, গ্রুপবাই, অর্ডারবি, ফ্ল্যাটনি বাই ইত্যাদি রয়েছে - উদাহরণস্বরূপ সিএফ ব্যবহার)

2) স্ট্রিং বিষয়

স্ট্রিং ইন্টারপোলেশন , যদি বিষয়টি একটি স্ট্রিং হয়

("পের" তারপরে একটি পদ্ধতির সাহায্যে কোনও বস্তু ফেরত দেয় map ( source )যা বিষয় টেম্পলেট স্ট্রিংয়ের সাথে আবদ্ধ )

যেমন, পার :: স্ট্রিং --> {ম্যাপ :: ( যেকোনও ভ্যালু --> স্ট্রিং )}

যেমন,

Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })

উৎপাদনের:

"Hi honey, my name is Bond. James, Bond."

উভয় যখন

Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])

অথবা

Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

একই ফলন:

"Those '0123456789' are our 10 digits."

কিন্তু শুধুমাত্র

Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")

উৎপাদনের

"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."

3) বিষয় রূপান্তর

এক্সএসএলটি চেহারা-অনুরূপ রূপান্তর , যদি বিষয়টি একটি হ্যাশ হয় যা প্রচলিতভাবে সংজ্ঞায়িত "$" সদস্যের সাথে পুনর্লিখনের নিয়মের অ্যারে সরবরাহ করে (এবং (2) এর মতো, "পের") map ( source )থাকে তবে বিষয়টির সাথে আবদ্ধ পদ্ধতিতে কোনও বস্তু ফেরত দেয় রূপান্তর - যেখানে

"नियमনাম" in alচ্ছিক Per ( subjectTransform [ , ruleName ])এবং <xsl: কল-টেম্পলেট নাম = "টেম্পলেটনাম"> ...) এর মতো কার্যকারিতা সরবরাহ করে)

অর্থাত্, পের :: ( রূপান্তর [, नियमের নাম :: স্ট্রিং ]) -->{মানচিত্র :: ( যেকোনও --> মূল্য )}

সঙ্গে

রূপান্তর :: {$ :: পুনর্লিখনের নিয়মের অ্যারে [rw.r.] }

( [rw.r.] পূর্বাভাস এবং টেম্পলেট ফাংশন জোড়া)

উদাহরণস্বরূপ, প্রদত্ত (... আরও স্বীকৃত উদাহরণ)

// (A "Member" must have first and last names, and a gender)
function Member(obj) {
  return obj.first && obj.last && obj.sex;
}

var a_transform = { $: [
//...
  [ [ Member ], // (alike <xsl:template match="...">...)
      function(member) {
        return {
          li: Per("{first} {last}").map(member) +
              " " +
              Per(this).map({ gender: member.sex })
        };
      }
  ],

  [ [ function(info) { return info.gender; } ], // (alike <xsl:template match="...">...)
      function(info) { return Per("(gender: {gender})").map(info); }
  ],

  [ [ "betterGenderString" ], // (alike <xsl:template name="betterGenderString">...)
      function(info) {
        info.pronoun = info.pronoun || "his/her";
        return Per("({pronoun} gender is {gender})").map(info);
      }
  ]
//...
] };

তারপর

Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })

উৎপাদনের:

{ "li": "John Smith (gender: Male)" }

যখন ... (অনেকটা সমান <xsl:call-template name="betterGenderString">...)

"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })

উৎপাদনের:

"James Bond... (his gender is Male)"

এবং

"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })

উৎপাদনের:

"Someone... (his/her gender is Male or Female)"

4) অন্যথায়

অন্যান্য সমস্ত ক্ষেত্রে পরিচয় ফাংশন

যেমন, পার :: টি --> টি

(যেমন, Per === function ( value ) { return value ; })

বিঃদ্রঃ

উপরের (3) এ, কোনও টেম্পলেট ফাংশনের মূল অংশে একটি জাভাস্ক্রিপ্টের "এটি" ধারক / মালিক ট্রান্সফর্ম এবং এর নিয়মের সেটকে আবদ্ধ করা হয়েছে (...: [...] অ্যারে দ্বারা সংজ্ঞায়িত) - সুতরাং, এই প্রসঙ্গে XSLT এর সাথে একটি কার্যত বন্ধ-সমতুল্য, "পরিপ্রেক্ষিতে" এই অভিব্যক্তিটি তৈরি করা

<xsl:apply-templates select="..."/>

'আছে HTH,


1
যে বেশ শান্ত.
রবার্ট হার্ভে

@ রবার্টহারভে: ৫.১ সেকেন্ডের স্বচ্ছতা ছাড়াও এবং আমি নিজেও অনেক আগে লক্ষ্য করেছি যে, অবশেষে আমিও আগ্রহী হয়ে ওঠে এবং ইভান লেঞ্জের আকর্ষণীয় মন্তব্য দ্বারা অনুপ্রাণিত হয়েছি "এক্সএসএলটি আপনার ভাবার চেয়ে সহজ!", Http: // www। lenzconsulting.com/how-xslt-works - এবং তাই আমি জাভাস্ক্রিপ্ট হ'ল খুব কৃপণযোগ্য ভাষায় সেই দাবিটি (কেবল কৌতূহলের বাইরে থাকলে) যাচাই করার জন্য একটি শট দেওয়ার সিদ্ধান্ত নিয়েছি।
ওয়াইশার্প

আপনার বিস্তারিত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। আমি কিছু অন্যান্য জিনিস (আমার নিজের এক্সএসএলটি সমতুল্য সহ) নিয়ে ব্যস্ত, তবে আরও সতর্কতার সাথে দেখার জন্য আমি এটিতে ফিরে আসার ইচ্ছা করি।
ব্রেট জমির

3

আমি সম্প্রতি ঠিক এই উদ্দেশ্যে একটি লাইব্রেরি, জসন-ট্রান্সফর্ম তৈরি করেছি :

https://github.com/ColinEberhardt/json-transforms

এটি জেএসপ্যাথ , এক্সপথে মডেল করা একটি ডিএসএল এবং এক্সএসএলটি দ্বারা সরাসরি অনুপ্রাণিত একটি পুনরাবৃত্ত প্যাটার্নের মিলের পদ্ধতির সংমিশ্রণ ব্যবহার করে।

এখানে একটি দ্রুত উদাহরণ। নিম্নলিখিত JSON অবজেক্ট দেওয়া:

const json = {
  "automobiles": [
    { "maker": "Nissan", "model": "Teana", "year": 2011 },
    { "maker": "Honda", "model": "Jazz", "year": 2010 },
    { "maker": "Honda", "model": "Civic", "year": 2007 },
    { "maker": "Toyota", "model": "Yaris", "year": 2008 },
    { "maker": "Honda", "model": "Accord", "year": 2011 }
  ]
};

এখানে একটি রূপান্তর:

const jsont = require('json-transforms');
const rules = [
  jsont.pathRule(
    '.automobiles{.maker === "Honda"}', d => ({
      Honda: d.runner()
    })
  ),
  jsont.pathRule(
    '.{.maker}', d => ({
      model: d.match.model,
      year: d.match.year
    })
  ),
  jsont.identity
];

const transformed  = jsont.transform(json, rules);

নিম্নলিখিত আউটপুট:

{
  "Honda": [
    { "model": "Jazz", "year": 2010 },
    { "model": "Civic", "year": 2007 },
    { "model": "Accord", "year": 2011 }
  ]
}

এই রূপান্তরটি তিনটি বিধি দ্বারা গঠিত। প্রথমে কোনও কোনও অটোমোবাইল মেলে যা হন্ডা দ্বারা তৈরি করা হয়, কোনও সংখ্যার সাথে কোনও বস্তু নির্গত করে Honda, তারপরে পুনরাবৃত্তির সাথে মিলে যায়। দ্বিতীয় নিয়ম কোনও সংখ্যার সাথে কোনও makerসম্পত্তি মেলে , modelএবং yearবৈশিষ্ট্যগুলি আউটপুট করে । ফাইনালটি হ'ল পরিচয় রূপান্তর যা পুনরাবৃত্তভাবে মেলে।


+1 এবং তথ্যের জন্য ধন্যবাদ। আমি আশা করি যে আমার নিজস্ব github.com/brettz9/jtlt কিছু পর্যায়ে সম্পূর্ণ হবে তবে তুলনা করার জন্য আরও বাস্তবায়ন করা সহায়ক।
ব্রেট জমির

-1

আমি মনে করি না যে আপনি কখনই প্রতি সেএস জেএসএনের জন্য একটি জেএসএন ভেরিয়েন্ট পাবেন। পাইথনের জিনজা 2, জাভাস্ক্রিপ্টস নুনজাকস, গ্রোভি মার্কআপটেম্পলেট এজেনিন এবং আরও অনেকগুলি টেম্প্লেটিং ইঞ্জিন রয়েছে যা আপনি যা চান তার জন্য উপযুক্ত হতে হবে well .NET এর কাছে টি 4 এবং জেএসওএন সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন সমর্থন রয়েছে যাতে আপনার এটিও থাকে।

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

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