लंबे तारों को छांटने का स्मार्ट तरीका


187

क्या किसी के पास जावास्क्रिप्ट के साथ तार काटकर और अंत में एक दीर्घवृत्त डालने के लिए एक अधिक परिष्कृत समाधान / पुस्तकालय है, जो स्पष्ट है:

if (string.length > 25) {
  string = string.substring(0, 24) + "...";
}

5
"अधिक परिष्कृत" से आपका क्या तात्पर्य है? शब्द सीमाएँ खाते में लेने वाले कार्य?
रेजिड्यूमन

2
और HTML टैग के बीच में नहीं काट रहा है।
एस.जे.

जवाबों:


366

अनिवार्य रूप से, आप दिए गए स्ट्रिंग की लंबाई की जांच करते हैं। यदि यह दी गई लंबाई से अधिक लंबा है n, तो इसे लंबाई n( substrया slice) पर क्लिप …करें और क्लिप की गई स्ट्रिंग में html एंटिटी (…) जोड़ें ।

ऐसा तरीका दिखता है

function truncate(str, n){
  return (str.length > n) ? str.substr(0, n-1) + '…' : str;
};

यदि 'अधिक परिष्कृत' से आपका मतलब किसी स्ट्रिंग के अंतिम शब्द सीमा पर छंटनी है तो आपको एक अतिरिक्त जांच की जरूरत है। पहले आप स्ट्रिंग को वांछित लंबाई पर क्लिप करते हैं, अगले आप उसके अंतिम शब्द सीमा के परिणाम को क्लिप करते हैं

function truncate( str, n, useWordBoundary ){
  if (str.length <= n) { return str; }
  const subString = str.substr(0, n-1); // the original check
  return (useWordBoundary 
    ? subString.substr(0, subString.lastIndexOf(" ")) 
    : subString) + "&hellip;";
};

आप Stringअपने फ़ंक्शन के साथ मूल प्रोटोटाइप का विस्तार कर सकते हैं । उस मामले में strपैरामीटर को हटा दिया जाना चाहिए और strफ़ंक्शन के भीतर इसे प्रतिस्थापित किया जाना चाहिए this:

String.prototype.truncate = String.prototype.truncate || 
function ( n, useWordBoundary ){
  if (this.length <= n) { return this; }
  const subString = this.substr(0, n-1); // the original check
  return (useWordBoundary 
    ? subString.substr(0, subString.lastIndexOf(" ")) 
    : subString) + "&hellip;";
};

अधिक हठधर्मिता करने वाले डेवलपर्स आपको इस पर दृढ़ता से पकड़ सकते हैं ("उन वस्तुओं को संशोधित न करें जो आपके पास नहीं हैं "। मुझे हालांकि बुरा नहीं लगेगा)।

Stringप्रोटोटाइप का विस्तार किए बिना एक दृष्टिकोण अपनी सहायक वस्तु बनाने के लिए है, जिसमें आपके द्वारा प्रदान की जाने वाली (लंबी) स्ट्रिंग और इसे कम करने के लिए पूर्व-निर्धारित विधि है। यही नीचे स्निपेट करता है।

अंत में, आप HTML नोड्स में लंबे स्ट्रिंग्स को छोटा करने के लिए केवल css का उपयोग कर सकते हैं। यह आपको कम नियंत्रण देता है, लेकिन अच्छी तरह से व्यवहार्य समाधान हो सकता है।


5
उदाहरण के लिए, "हार्ड" और "सॉफ्ट" सीमाएँ होने पर भी विचार करना चाहिए, जैसे, यदि स्ट्रिंग 500 वर्ण से अधिक लंबी है, तो इसे 400 पर काटें। यह तब उपयोगी हो सकता है, जब उपयोगकर्ता पूरा पाठ देखना चाहता है और कुछ लिंक पर क्लिक करता है इसके लिए। यदि, परिणामस्वरूप, आप सिर्फ 1 या 2 चार्ट अधिक लोड करते हैं, तो यह वास्तव में बदसूरत दिखाई देगा।
मैक्सिम सेल्को जू

2
दूसरा पैरामीटर substrएक लंबाई है इसलिए इसे substr(0,n)पहले nवर्णों तक सीमित करने के बजाय होना चाहिए ।
जॉनीएचके जुले

10
उन वस्तुओं को संशोधित न करें, जिनके आप स्वामी नहीं हैं। nczonline.net/blog/2010/03/02/…-
चार्ली किलियन

5
एक चीज जिस पर आप विचार कर सकते हैं, वह आपके कोड उदाहरण में &hellip;वास्तविक दीर्घवृत्त ( ...) के साथ बदल रही है । यदि आप API के साथ सहभागिता के लिए इसका उपयोग करने का प्रयास कर रहे हैं, तो आप वहां गैर-HTML इकाई चाहते हैं।
अल्बर्टबेंगल

1
@RuneJeppesen आप सही हैं। विधियों को समायोजित किया। मेरे बचाव के लिए: जवाब 7 साल पहले की तारीख;)
KooiInc

62

ध्यान दें कि यह केवल फ़ायरफ़ॉक्स के लिए किया जाना चाहिए।

अन्य सभी ब्राउज़र सीएसएस समाधान का समर्थन करते हैं ( समर्थन तालिका देखें ):

p {
    white-space: nowrap;
    width: 100%;                   /* IE6 needs any width */
    overflow: hidden;              /* "overflow" value must be different from  visible"*/ 
    -o-text-overflow: ellipsis;    /* Opera < 11*/
    text-overflow:    ellipsis;    /* IE, Safari (WebKit), Opera >= 11, FF > 6 */
}

विडंबना यह है कि मुझे मोज़िला एमडीसी से कोड स्निपेट मिला है।


1
mattsnider.com/css/css-string-truncation-with-ellipsis इसे FF के साथ भी काम करने के लिए।
नील

वाह यह मोबाइल सफारी के लिए एक सही समाधान है। धन्यवाद!
समवसरण

9
बहुत अच्छा CSS दृष्टिकोण। एक नोट हो सकता है, कि यह केवल पाठ की एक पंक्ति के साथ काम करता है (जैसा कि इच्छित white-space: nowrap;)। जब यह एक से अधिक पंक्ति में आता है तो आप जावास्क्रिप्ट के साथ फंस जाते हैं।
सम्मिलित

यह केवल संपूर्ण तत्व के लिए भी काम करता है। यदि आप किसी स्ट्रिंग के भाग को छोटा करना चाहते हैं, तो उस बिट को लपेटे बिना, जिसे आप स्पैन या अन्य html तत्व में छोटा करना चाहते हैं, यह काम नहीं करेगा जैसे:Your picture ('some very long picture filename truncated...') has been uploaded.
क्रिस

1
ओपी ने विशेष रूप से एक जावास्क्रिप्ट समाधान के लिए कहा
vsync

25

वैध कारण हैं कि लोग सीएसएस के बजाय जावास्क्रिप्ट में ऐसा करना चाह सकते हैं।

जावास्क्रिप्ट में 8 वर्णों (दीर्घवृत्त सहित) को छोटा करने के लिए:

short = long.replace(/(.{7})..+/, "$1&hellip;");

या

short = long.replace(/(.{7})..+/, "$1…");

1
यदि आप दीर्घवृत्त की गणना करते हैं, तो यह 9 वर्ण होंगे। यदि आपको ट्रंकेशन के बाद 8 होने की आवश्यकता है, तो .replace(/^(.{7}).{2,}/, "$1…");इसके बजाय का उपयोग करें
ओकु

longऔर shortपुराने ECMAScript विनिर्देशों (ECMAScript 1 को 3 तक) द्वारा भविष्य के कीवर्ड के रूप में आरक्षित किया गया है। MDN
रिकार्डो


9
('long text to be truncated').replace(/(.{250})..+/, "$1…");

किसी तरह उपरोक्त कोड किसी प्रकार की कॉपी पेस्ट या लिखित पाठ के लिए vuejs ऐप में काम नहीं कर रहा था। इसलिए मैंने लॉश ट्रंकट का उपयोग किया और इसके अब ठीक काम कर रहा था।

_.truncate('long text to be truncated', { 'length': 250, 'separator': ' '});

अच्छा आधुनिक जवाब!
२१

मुझे यह जानने की उत्सुकता होगी कि पाठ क्या था। क्या यह गैर-लैटिन वर्णों का उपयोग कर रहा था?
एडम लेगेट 20


7

यहाँ मेरा समाधान है, जिसमें अन्य सुझावों पर कुछ सुधार है:

String.prototype.truncate = function(){
    var re = this.match(/^.{0,25}[\S]*/);
    var l = re[0].length;
    var re = re[0].replace(/\s$/,'');
    if(l < this.length)
        re = re + "&hellip;";
    return re;
}

// "This is a short string".truncate();
"This is a short string"

// "Thisstringismuchlongerthan25characters".truncate();
"Thisstringismuchlongerthan25characters"

// "This string is much longer than 25 characters and has spaces".truncate();
"This string is much longer&hellip;"

यह:

  • 25 अक्षरों के बाद पहले स्थान पर ट्रंकट
  • जावास्क्रिप्ट स्ट्रिंग ऑब्जेक्ट का विस्तार करता है, इसलिए इसे किसी भी स्ट्रिंग पर (और जंजीर पर) इस्तेमाल किया जा सकता है।
  • यदि ट्रंकेशन एक अनुगामी स्थान में होता है तो स्ट्रिंग को ट्रिम कर देगा;
  • यूनिकोड हेलिप इकाई (दीर्घवृत्त) जोड़ देगा यदि काटे गए तार 25 वर्णों से अधिक लंबे हैं

7

सबसे अच्छा कार्य मैंने पाया है। टेक्स्ट-एलिप्सिस को श्रेय ।

function textEllipsis(str, maxLength, { side = "end", ellipsis = "..." } = {}) {
  if (str.length > maxLength) {
    switch (side) {
      case "start":
        return ellipsis + str.slice(-(maxLength - ellipsis.length));
      case "end":
      default:
        return str.slice(0, maxLength - ellipsis.length) + ellipsis;
    }
  }
  return str;
}

उदाहरण :

var short = textEllipsis('a very long text', 10);
console.log(short);
// "a very ..."

var short = textEllipsis('a very long text', 10, { side: 'start' });
console.log(short);
// "...ng text"

var short = textEllipsis('a very long text', 10, { textEllipsis: ' END' });
console.log(short);
// "a very END"

5

यदि पाठ की एक पंक्ति उपलब्ध चौड़ाई से अधिक है, तो सभी आधुनिक ब्राउज़र अब स्वचालित रूप से एक दीर्घवृत्त जोड़ने के लिए एक सरल सीएसएस समाधान का समर्थन करते हैं:

p {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

(ध्यान दें कि इसके लिए किसी भी तरह से प्रभाव डालने के लिए तत्व की चौड़ाई को किसी तरह से सीमित करने की आवश्यकता होती है।)

Https://css-tricks.com/snippets/css/truncate-string-with-ellips// के आधार पर ।

यह ध्यान दिया जाना चाहिए कि यह दृष्टिकोण वर्णों की संख्या के आधार पर सीमित नहीं है। पाठ की कई पंक्तियों को अनुमति देने के लिए भी यह काम नहीं करता है ।


2
यह केवल एकल पंक्ति वाक्यों के लिए उपयोगी है, सीएसएस के माध्यम से एक बहु-पंक्ति उदाहरण करने का कोई तरीका (अभी तक मुझे पता है) नहीं है।
होमन असकरी

वहाँ किसी भी तरह से यह करने के लिए सही के बजाय बाईं ओर दीर्घवृत्त बनाने का एक मौका है?
ग्रीनएजजैड

1
@GreenAsJade मुझे विश्वास है कि आप इसका उपयोग करके text-direction: rtlऔर पूरा कर सकते हैं text-align: left। देखें davidwalsh.name/css-ellipsis-left
सेम बीन

4

अधिकांश आधुनिक जावास्क्रिप्ट फ्रेमवर्क ( JQuery , प्रोटोटाइप , आदि ...) एक उपयोगिता फ़ंक्शन है जो स्ट्रिंग को संभालता है जो इसे संभालता है।

यहाँ प्रोटोटाइप में एक उदाहरण दिया गया है:

'Some random text'.truncate(10);
// -> 'Some ra...'

ऐसा लगता है कि उन कार्यों में से एक है जो आप चाहते हैं कि कोई अन्य व्यक्ति इससे निपटे / बनाए रखे। मैंने अधिक कोड लिखने के बजाय फ्रेमवर्क को इसे संभालने दिया।


8
मुझे नहीं लगता कि jQuery के पास इसके लिए कुछ भी है।
एलेक्स

2
अंडरस्कोर। जेएस करता है - _ ('हैलो दुनिया')। ट्रंकट (5) => 'हैलो ...' _ ('हैलो')।
ट्रंकट

3
शुद्ध अंडरस्कोर truncate()या तो नहीं लगता है - आपको अंडरस्कोर।स्ट्रिंग जैसे एक्सटेंशन की आवश्यकता हो सकती है ।
मार्टिन

2
यह पूरी तरह से सही जवाब है। मैं अंडरस्कोर के बारे में नहीं जानता, लेकिन लॉश में _.truncऐसा होता है।
बाएंक्लबेन

2
मुझे लगता है कि सही उत्तर का उपयोग lodash.trunc या underscore.string.truncate का उपयोग करना है।
ऊँलाला o

2

शायद मुझे एक उदाहरण याद आया कि कोई व्यक्ति नल को कैसे संभाल रहा है, लेकिन 3 शीर्ष उत्तर मेरे लिए काम नहीं करते थे जब मेरे पास नल थे (निश्चित रूप से मुझे पता है कि त्रुटि से निपटने और मिलियन अन्य चीजें सवाल का जवाब देने वाले व्यक्ति की जिम्मेदारी नहीं है, लेकिन तब से मैंने एक मौजूदा फ़ंक्शन का उपयोग किया था, साथ ही एक उत्कृष्ट ट्रंकेशन इलिप्सिस के उत्तर के साथ मैंने सोचा था कि मैं इसे दूसरों के लिए प्रदान करूंगा।

जैसे

जावास्क्रिप्ट:

news.comments

ट्रंकेशन फ़ंक्शन का उपयोग करना

news.comments.trunc(20, true);

हालाँकि, news.comments पर अशक्त है यह "टूट जाएगा"

अंतिम

checkNull(news.comments).trunc(20, true) 

KooiInc के ट्रंक समारोह शिष्टाचार

String.prototype.trunc =
 function (n, useWordBoundary) {
     console.log(this);
     var isTooLong = this.length > n,
         s_ = isTooLong ? this.substr(0, n - 1) : this;
     s_ = (useWordBoundary && isTooLong) ? s_.substr(0, s_.lastIndexOf(' ')) : s_;
     return isTooLong ? s_ + '&hellip;' : s_;
 };

मेरा साधारण अशक्त चेकर (शाब्दिक "अशक्त" चीज़ों के लिए भी जाँच करता है (यह अपरिभाषित है, "", अशक्त, "अशक्त", आदि)।

  function checkNull(val) {
      if (val) {
          if (val === "null") {
              return "";
          } else {
              return val;
          }
      } else {
          return "";
      }
  }

यहाँ एक संशोधित संस्करण है - प्रोटोटाइप के उपयोग से बचा जाता है, फ़ंक्शन में अशक्त जाँच को शामिल करता है, और इसमें कुछ परीक्षण / डेमो उपयोग होता है। codepen.io/mahemoff/pen/LGEdzy
mahemoff

क्या आप प्रोटोटाइप को समस्याग्रस्त पाते हैं? बस जिज्ञासु
टॉम स्टिकेल

मेरे अलग नल के चेक फंक्शन का कारण यह है कि यह वास्तव में अशक्त, अपरिभाषित, NaN, खाली स्ट्रिंग (""), 0, गलत और "null" के लिए जाँच करेगा, लेकिन कुल मिलाकर मुझे आपका fx पसंद है
टॉम स्टिकेल

1
हां, यह राय और उपयोग के संदर्भ की बात है, लेकिन प्रोटोटाइप बदसूरत हो जाता है जब आप अन्य पुस्तकालयों के साथ काम कर रहे होते हैं क्योंकि वे भी एक ही चीज को ओवरराइड कर सकते हैं। (या दुर्लभ मामलों में, उसी नाम का एक फ़ंक्शन बाद में एक मानक भाषा सुविधा के रूप में पेश किया जा सकता है।)
mahemoff

हां, मैं आपसे सहमत हूं
टॉम स्टिकेल

2

कभी-कभी फ़ाइल नाम गिने जाते हैं, जहां सूचकांक शुरुआत या अंत में हो सकता है। इसलिए मैं स्ट्रिंग के केंद्र से छोटा करना चाहता था:

function stringTruncateFromCenter(str, maxLength) {
    const midChar = "…";      // character to insert into the center of the result
    var left, right;

    if (str.length <= maxLength) return str;

    // length of beginning part      
    left = Math.ceil(maxLength / 2);

    // start index of ending part   
    right = str.length - Math.floor(maxLength / 2) + 1;   

    return str.substr(0, left) + midChar + str.substring(right);
}

ज्ञात हो कि मैंने UTF-8 में 1 से अधिक बाइट के साथ एक भरण पात्र का उपयोग किया था।



1

मैंने कोइलनक के समाधान को उकसाया। वास्तव में अच्छा कॉम्पैक्ट समाधान। एक छोटा सा किनारा मामला है जिसे मैं संबोधित करना चाहूंगा। यदि कोई किसी भी कारण से वास्तव में लंबे चरित्र अनुक्रम में प्रवेश करता है, तो वह छोटा नहीं होगा:

function truncate(str, n, useWordBoundary) {
    var singular, tooLong = str.length > n;
    useWordBoundary = useWordBoundary || true;

    // Edge case where someone enters a ridiculously long string.
    str = tooLong ? str.substr(0, n-1) : str;

    singular = (str.search(/\s/) === -1) ? true : false;
    if(!singular) {
      str = useWordBoundary && tooLong ? str.substr(0, str.lastIndexOf(' ')) : str;
    }

    return  tooLong ? str + '&hellip;' : str;
}

1

एक त्वरित Googling के साथ मैंने यह पाया ... क्या यह आपके लिए काम करता है?

/**
 * Truncate a string to the given length, breaking at word boundaries and adding an elipsis
 * @param string str String to be truncated
 * @param integer limit Max length of the string
 * @return string
 */
var truncate = function (str, limit) {
    var bits, i;
    if (STR !== typeof str) {
        return '';
    }
    bits = str.split('');
    if (bits.length > limit) {
        for (i = bits.length - 1; i > -1; --i) {
            if (i > limit) {
                bits.length = i;
            }
            else if (' ' === bits[i]) {
                bits.length = i;
                break;
            }
        }
        bits.push('...');
    }
    return bits.join('');
};
// END: truncate

1

पाठ-अतिप्रवाह: दीर्घवृत्त वह संपत्ति है जिसकी आपको आवश्यकता है। इसके साथ और एक अतिप्रवाह: एक विशिष्ट चौड़ाई के साथ छिपा हुआ, जो कुछ भी हो, जो उस समय के अंत में तीन अवधि का प्रभाव प्राप्त करेगा ... व्हॉट्सएप को जोड़ना न भूलें: नॉरैप या टेक्स्ट को कई लाइनों में डाला जाएगा।

.wrap{
  text-overflow: ellipsis
  white-space: nowrap;
  overflow: hidden;
  width:"your desired width";
}
<p class="wrap">The string to be cut</p>

1
ब्रेवीटी स्वीकार्य है, लेकिन फुलर स्पष्टीकरण बेहतर हैं।
आर्मली

mwilcox और सीन द बीन ने पहले ही इस समाधान को पोस्ट कर दिया था।
एंड्रयू मायर्स

1
केवल एक-पंक्ति पाठ के लिए उपयोग किया जा सकता है
वैली पेप्यको

पाठ-अतिप्रवाह: दीर्घवृत्त सही है !!
जार्डिलियर

0

c_harm का जवाब मेरी राय में सबसे अच्छा है। कृपया ध्यान दें कि यदि आप उपयोग करना चाहते हैं

"My string".truncate(n)

आपको एक शाब्दिक के बजाय एक regexp ऑब्जेक्ट कंस्ट्रक्टर का उपयोग करना होगा। साथ ही आपको इसे \Sपरिवर्तित करते समय बचना होगा।

String.prototype.truncate =
    function(n){
        var p  = new RegExp("^.{0," + n + "}[\\S]*", 'g');
        var re = this.match(p);
        var l  = re[0].length;
        var re = re[0].replace(/\s$/,'');

        if (l < this.length) return re + '&hellip;';
    };

हर टिप्पणी और उचित चर नामकरण के बारे में सुना है?
साइकिल

@ साइकल कोड को ऊपर एक और उत्तर से कॉपी और संशोधित किया जाता है, इतना अशिष्ट और कर्कश होने की आवश्यकता नहीं है।
मैट फ्लेचर

0

निम्नलिखित कोड का उपयोग करें

 function trancateTitle (title) {
    var length = 10;
    if (title.length > length) {
       title = title.substring(0, length)+'...';
    }
    return title;
}

0

कोइलनक के समाधान को ठीक करना:

String.prototype.trunc = String.prototype.trunc ||
  function(n){
      return this.length>n ? this.substr(0,n-1)+'&hellip;' : this.toString();
  };

यदि स्ट्रिंग को छोटा करने की आवश्यकता नहीं है, तो यह स्ट्रिंग ऑब्जेक्ट के बजाय स्ट्रिंग मान लौटाता है।


यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका स्पष्टीकरण देने के लिए, उनकी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपने स्वयं के पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे ।
स्पेंसर Wieczorek

आह अब मुझे भेद दिखाई दे रहा है। संदर्भ के लिए धन्यवाद। मैं इस उम्मीद के साथ एक टिप्पणी छोड़ना चाहता था कि @Kooilnc इसे देखेगा, और संभवतः स्वीकार किए गए उत्तर को संपादित करेगा यदि वह सहमत है, लेकिन प्रतिष्ठा नहीं थी।
qwales1

0

मुझे हाल ही में ऐसा करना पड़ा और समाप्त हो गया:

/**
 * Truncate a string over a given length and add ellipsis if necessary
 * @param {string} str - string to be truncated
 * @param {integer} limit - max length of the string before truncating
 * @return {string} truncated string
 */
function truncate(str, limit) {
    return (str.length < limit) ? str : str.substring(0, limit).replace(/\w{3}$/gi, '...');
}

मुझे अच्छा और साफ लगता है :)


1
वह परिणामी स्ट्रिंग 3 वर्णों को सीमा से अधिक लंबा बना सकता है।
Hauke

0

मुझे .slice () का उपयोग करना पसंद है। पहला तर्क शुरुआती सूचकांक है और दूसरा समाप्त होने वाला सूचकांक है। बीच में सब कुछ है जो आपको वापस मिलता है।

var long = "hello there! Good day to ya."
// hello there! Good day to ya.

var short  = long.slice(0, 5)
// hello

0

कहीं स्मार्ट: डी

//My Huge Huge String
    let tooHugeToHandle = `It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).`
    
//Trim Max Length
 const maxValue = 50
// The barber.
 const TrimMyString = (string, maxLength, start = 0) => {
//Note - `start` is if I want to start after some point of the string
    	if (string.length > maxLength) {
    	let trimmedString = string.substr(start, maxLength)
    	 return (
    	   trimmedString.substr(
    	   start,
    	   Math.min(trimmedString.length,   trimmedString.lastIndexOf(' '))
           ) + ' ...'
         )
       }
    return string
}

console.log(TrimMyString(tooHugeToHandle, maxValue))


-1

यह फ़ंक्शन ट्रंककेट स्थान और शब्द भागों को भी करता है। (उदा: मदर इन मोथ ...)

String.prototype.truc= function (length) {
        return this.length>length ? this.substring(0, length) + '&hellip;' : this;
};

उपयोग:

"this is long length text".trunc(10);
"1234567890".trunc(5);

उत्पादन:

यह लो है ...

12345 ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.