ওয়েব পৃষ্ঠাগুলি অনুবাদ করার সময় সম্পূর্ণ HTML প্রতিস্থাপন করবেন না: শুধুমাত্র অনুমোদিত পাঠ্য নোডগুলি প্রক্রিয়া করুন৷

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

ওয়েব পৃষ্ঠাগুলি অনুবাদ করার সময়, অনেকেই প্রথম যে সমস্যার সম্মুখীন হন তা হল অনুবাদটি ভুল নয়, তবে স্ক্রিপ্ট এবং শৈলীগুলি একসাথে অনুবাদ করা হয়। উদাহরণস্বরূপ, <script>-এ পরিবর্তনশীল নাম এবং <style>-এ ক্লাসের নামগুলি পাঠ্য হিসাবে প্রতিস্থাপিত হওয়ার পরে, ব্রাউজার সরাসরি একটি ত্রুটি রিপোর্ট করতে পারে এবং পৃষ্ঠার শৈলীটি এলোমেলো হয়ে যাবে। এই নিবন্ধটি ডেভেলপার এবং ডকুমেন্টেশন টিমের জন্য যাদের পাইথনে HTML পৃষ্ঠার অনুবাদ পরিচালনা করতে হবে।

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

কিভাবে ওয়েব পেজ অনুবাদে শুধুমাত্র বডি টেক্সট প্রতিস্থাপন করবেন? এক বাক্যে উপসংহার

প্রতিস্থাপনের আগে, প্রথমে স্ক্রিপ্ট, স্টাইলশীট এবং টাইপ রায়ের মাধ্যমে মন্তব্যের মতো বিশেষ স্ট্রিংগুলি বাদ দিন এবং শুধুমাত্র সাধারণ NavigableString প্রতিস্থাপন করুন।

আপনার অবস্থাপ্রস্তাবিত অভ্যাসকারণ
পাঠ্যটি <p>, <span>, <li> এর মধ্যে অবস্থিতপ্রতিস্থাপনের অনুমতি দিনস্ট্যান্ডার্ড অনুবাদের পরিস্থিতির অন্তর্গত
পাঠ্যটি <script>, <style> এর মধ্যে অবস্থিত৷জোর করে এড়িয়ে যানভুল পরিবর্তন JS সিনট্যাক্স ত্রুটি বা শৈলী বিভ্রান্তি হতে পারে.
নোডের ধরন হল Commentউপর লাফমন্তব্য পৃষ্ঠা প্রদর্শন বিষয়বস্তুর অংশ নয়
পাঠ্যটি <code>, <pre> এর মধ্যে অবস্থিতডিফল্টরূপে এড়িয়ে যানপ্রযুক্তিগত নথিতে সাধারণ ব্যতিক্রমগুলির জন্য ম্যানুয়াল নিশ্চিতকরণ প্রয়োজন
সুন্দর স্যুপের একটি পুরানো সংস্করণ ব্যবহার করাডাউনগ্রেড দৃশ্যকল্প হিসাবে অভিভাবক ট্যাগ নাম পরীক্ষা করুনস্পষ্ট টাইপ চেকিং এখনও পছন্দের, 4.9.0 বা তার উপরে সুপারিশ করা হয়

কেন NavigableString কে প্রথমে টাইপ জাজমেন্ট করতে হবে?

অনেক ডেভেলপার soup.find_all(text=True) ব্যবহার করতে বা পৃষ্ঠার পাঠ্য পেতে .strings অতিক্রম করতে অভ্যস্ত। বিশুদ্ধ বিষয়বস্তু নিষ্কাশনের ক্ষেত্রে এই পদ্ধতিটি কাজ করে, কিন্তু অনুবাদের পরিস্থিতিতে ঝুঁকিপূর্ণ। Beautiful Soup 4.9.0 পরে HTML নথির জন্য বিশেষ স্ট্রিং সাবক্লাস চালু করেছে। যদিও তারা NavigableString থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, তাদের শব্দার্থবিদ্যা সম্পূর্ণ ভিন্ন।

  • Comment: মন্তব্য
  • Script: জাভাস্ক্রিপ্ট কোড
  • Stylesheet: CSS শৈলী
  • Template: HTML টেমপ্লেট সামগ্রী

আপনি যদি এই বস্তুগুলিতে .replace_with() কল করেন, অ-প্রস্তুতি স্তরের বিষয়বস্তু পরিবর্তন করা হবে। উদাহরণস্বরূপ, var userName = "admin"; থেকে var 用户名 = "管理员"; অনুবাদ করার ফলে একটি JS সিনট্যাক্স ত্রুটি দেখা দেবে। সঠিক পদ্ধতি হল প্রতিস্থাপনের আগে একটি টাইপ দাবী করা যাতে লক্ষ্যটি শুধুমাত্র একটি সাধারণ NavigableString এবং একটি কার্যকরী উপশ্রেণী নয়।

XML নথিগুলি প্রক্রিয়া করার সময়, আপনাকে বিশেষ ধরনের যেমন CData, ProcessingInstruction, ইত্যাদির দিকেও মনোযোগ দিতে হবে৷ সেগুলিকে সাধারণ পাঠ্য হিসাবে অনুবাদ করা উচিত নয়৷

সংশ্লেষণ উদাহরণ: সঠিক এবং ভুলের মধ্যে সীমানা

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

ইনপুট নমুনা (সিন্থেটিক উদাহরণ):

<div class="content">
  Welcome user
  <script>var msg = "Welcome user";</script>
  <style>.msg { color: red; }</style>
  <!-- Welcome user -->
</div>

প্রত্যাশিত সঠিক আউটপুট:

  • <div> ট্যাগের মধ্যে শুধুমাত্র সরাসরি টেক্সট নোড "Welcome user" কে "Welcome user" দিয়ে প্রতিস্থাপিত করা হয়েছে।
  • <script>-এর মধ্যে স্ট্রিংগুলি অক্ষত থাকে৷
  • <style> এর বিষয়বস্তু অপরিবর্তিত থাকে এবং টীকাটির বিষয়বস্তু অপরিবর্তিত থাকে।
  • DOM অনুক্রমিক সম্পর্ক সম্পূর্ণরূপে সংরক্ষিত।

সাধারণ ভুল ইনপুট এবং ফলাফল:

আপনি যদি টাইপ চেকিং যোগ না করেন এবং সরাসরি সমস্ত NavigableString-এ বিশ্বব্যাপী প্রতিস্থাপন করেন, তাহলে <script> ট্যাগ var msg = "欢迎用户"; হয়ে যাবে। কিছু আলগা দোভাষী একটি ত্রুটি রিপোর্ট নাও করতে পারে, কিন্তু যদি পরিবর্তনশীল অ্যাসাইনমেন্টে যৌক্তিক বিচার বা আন্তর্জাতিক কী-মান ম্যাপিং জড়িত থাকে, তাহলে প্রোগ্রাম লজিক ব্যর্থ হবে। যদি অনুবাদ প্রক্রিয়াটি উদ্ধৃতি প্রকার বা এস্কেপ অক্ষর পরিবর্তন করে, তাহলে স্ক্রিপ্ট পার্সিং বাধাগ্রস্ত হতে পারে এবং পুরো পৃষ্ঠাটি একটি সাদা পর্দা হিসাবে প্রদর্শিত হবে।

পাঠ্য নোডের নিরাপদ প্রতিস্থাপনের পাইথন বাস্তবায়ন

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

from bs4 import BeautifulSoup, NavigableString, Comment
# BS4 4.9.0+ 才引入 Script, Stylesheet 等子类
try:
    from bs4 import Script, Stylesheet, Template
    HAS_SPECIAL_STRINGS = True
except ImportError:
    HAS_SPECIAL_STRINGS = False

def safe_translate_text(html_content: str, translation_map: dict) -> str:
    """
    仅替换普通文本节点,跳过脚本、样式、注释及模板。
    :param html_content: 原始HTML字符串(若处理文件请先读取为字符串)
    :param translation_map: 原文到译文的映射字典
    :return: 替换后的HTML字符串
    """
    soup = BeautifulSoup(html_content, 'html.parser')

    # 收集所有需要处理的字符串节点
    # 注意:不能边遍历边修改,需先收集再处理
    targets = []
    for element in soup.descendants:
        if not isinstance(element, NavigableString):
            continue
        # 核心防护:排除特殊功能字符串
        if isinstance(element, Comment):
            continue
        if HAS_SPECIAL_STRINGS and isinstance(element, (Script, Stylesheet, Template)):
            continue
        # 可选:跳过纯空白节点以减少无效API调用
        if not str(element).strip():
            continue

        targets.append(element)

    # 执行安全替换
    for node in targets:
        original = str(node)
        if original in translation_map:
            # 显式创建NavigableString确保DOM引用完整性
            new_node = NavigableString(translation_map[original])
            node.replace_with(new_node)

    return str(soup)

# --- 合成数据验证 ---
SAMPLE_HTML = '''<div>Welcome user<script>var x="Welcome user";</script><!-- Welcome user --></div>'''
DICT_MAP = {"Welcome user": "欢迎用户"}

result = safe_translate_text(SAMPLE_HTML, DICT_MAP)
assert "欢迎用户" in result, "正文应被翻译"
assert 'var x="Welcome user";' in result, "脚本内容不应被修改"
assert "<!-- Welcome user -->" in result, "注释不应被修改"
print("逻辑校验通过(教学示例,非生产环境实测证明)")

এই কোডের চাবিকাঠি হল একাধিক isinstance চেক। এমনকি যদি বিউটিফুল স্যুপ পুরানো হয় এবং Script এর মতো ক্লাস সমর্থন করে না, আপনি ফলব্যাক সমাধান হিসাবে প্যারেন্ট ট্যাগ নামটি পরীক্ষা করতে পারেন, তবে স্পষ্ট টাইপ চেকিং সর্বদা পছন্দ করা হয়। স্পষ্ট NavigableString নির্মাণের সাথে replace_with ব্যবহার করা সরাসরি অ্যাসাইনমেন্টের চেয়ে নিরাপদ। এটি গাছের মধ্যে নোডের রেফারেন্স সম্পর্ক সঠিকভাবে পরিচালনা করতে পারে এবং এতিম বস্তু বা টাইপ বিভ্রান্তি এড়াতে পারে।

গ্রহণযোগ্যতার মানদণ্ড এবং ম্যানুয়াল পর্যালোচনা সীমানা

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

ঘটনা পর্যবেক্ষণ করুনস্বয়ংক্রিয় প্রক্রিয়াকরণ সিদ্ধান্তম্যানুয়াল পর্যালোচনা ট্রিগার শর্তাবলীমন্তব্য
পাঠ্যটি <p>, <span>, <li> এর মধ্যে অবস্থিতপ্রতিস্থাপনের অনুমতি দিনকোনটিস্ট্যান্ডার্ড অনুবাদ দৃশ্যকল্প
পাঠ্যটি <script>, <style> এর মধ্যে অবস্থিতজোর করে এড়িয়ে যানসন্দেহজনক কনফিগারেশন JSON ডেটা পাওয়া গেছেএটি একটি i18n সম্পদ কিনা তা নিশ্চিত করতে হবে
পাঠ্যটি <code>, <pre> এর মধ্যে অবস্থিতডিফল্টরূপে এড়িয়ে যানস্পষ্টভাবে লেবেলযুক্ত "কোড মন্তব্য" বা "ডকুমেন্টেশন স্ট্রিং"প্রযুক্তিগত নথির সাধারণ বিশেষ ক্ষেত্রে
বৈশিষ্ট্যের মান যেমন alt, title, placeholderএই নিবন্ধের সুযোগের মধ্যে নয়অ্যাট্রিবিউট মান HTML সত্তা বা পরিবর্তনশীল ইন্টারপোলেশন ধারণ করেপ্রপার্টি ট্রাভার্সাল লজিক আলাদাভাবে লিখতে হবে
নোডের ধরন হল Commentউপর লাফটীকা ব্যবহারকারীদের জন্য ব্যাখ্যামূলক পাঠ্য ধারণ করেকিছু CMS প্রম্পট হিসাবে মন্তব্য ব্যবহার করে
প্রতিস্থাপনের পরে HTML দৈর্ঘ্য 300% এর বেশি পরিবর্তিত হয়েছেপতাকা সতর্কতাঅনুবাদে অনাবৃত বিশেষ অক্ষর রয়েছেইনজেকশন বা লেআউট ওভারফ্লো প্রতিরোধ করুন

এই টেবিলটি শুধুমাত্র কোড প্রদর্শনের স্তরে যুক্তি যাচাইয়ের জন্য উপযুক্ত। এন্ড-টু-এন্ড ইফেক্টের জন্য একটি বাস্তব ব্রাউজারে রেন্ডারিং ফলাফল যাচাই করা প্রয়োজন। যদিও <meta> ট্যাগ, ARIA ট্যাগ ইত্যাদির content বৈশিষ্ট্যগুলি NavigableString-এর অন্তর্গত নয়, সেগুলিকে অনুবাদ করারও প্রয়োজন হতে পারে৷ এর জন্য পার্সারের অ্যাট্রিবিউট ট্রাভার্সাল ক্ষমতা থাকা প্রয়োজন এবং এই নিবন্ধের এই নোডের সুযোগের বাইরে।

আরও পড়া

নথি অনুবাদের জন্য চেকলিস্ট ব্যবহার করুন

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

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

📊 মূল তুলনা

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

🎯 কোন পদ্ধতি আপনার জন্য উপযুক্ত?

যদি তুমি......

  • ওয়েব পৃষ্ঠার মূল অংশের অনুবাদ পরিচালনা করুন: স্পষ্ট টাইপ দিয়ে ফিল্টার করুন এবং শুধুমাত্র প্লেইন নেভিগেবল স্ট্রিং প্রতিস্থাপন করুন।
  • <script> এবং <style>-এর বিষয়বস্তু অনুবাদ করতে হবে: প্রথমে এটি একটি i18n রিসোর্স কিনা তা নিশ্চিত করুন এবং তারপরে এটি প্রক্রিয়া করবেন কিনা তা স্থির করুন। এটি ডিফল্টরূপে এড়িয়ে যাওয়া হয়।
  • বিউটিফুল স্যুপের একটি পুরানো সংস্করণ ব্যবহার করা: ডাউনগ্রেড রায়ের জন্য আপনি প্যারেন্ট ট্যাগ নাম ব্যবহার করতে পারেন, তবে এটি 4.9.0 বা তার উপরে আপগ্রেড করার পরামর্শ দেওয়া হচ্ছে।
  • alt, title এবং অন্যান্য বৈশিষ্ট্যগুলি অনুবাদ করতে: অ্যাট্রিবিউট ট্রাভার্সাল লজিক আলাদাভাবে লিখতে হবে এবং এই পদ্ধতিটি এই অংশটিকে কভার করে না।

❓ প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)

1. অনুবাদ করার জন্য পাঠ্য পেতে আমি কি সরাসরি find_all(text=True) ব্যবহার করতে পারি?

এই পদ্ধতিটি বিশুদ্ধ বিষয়বস্তু নিষ্কাশনের জন্য উপযুক্ত, তবে অনুবাদের পরিস্থিতিতে, স্ক্রিপ্ট এবং স্টাইলশীটের মতো বিশেষ উপশ্রেণীগুলিকেও সাধারণ পাঠ্য হিসাবে গণ্য করা হবে, যা ঝুঁকিপূর্ণ।

2. সুন্দর স্যুপের সংস্করণটি পুরানো হলে আমার কী করা উচিত?

একটি ডাউনগ্রেড দৃশ্যকল্প হিসাবে অভিভাবক ট্যাগের নাম পরীক্ষা করা সম্ভব, তবে স্পষ্ট টাইপ চেকিং সর্বদা পছন্দ করা হয় এবং সংস্করণ 4.9.0+ সুপারিশ করা হয়।

3. প্রতিস্থাপনের পরে HTML এর দৈর্ঘ্য ব্যাপকভাবে পরিবর্তিত হয়। আমরা কি মনোযোগ দিতে হবে?

দৈর্ঘ্য 300% এর বেশি পরিবর্তিত হলে একটি সতর্কতা পতাকাঙ্কিত করা উচিত এবং ইনজেকশন বা লেআউট ওভারফ্লো রোধ করতে অনাবৃত বিশেষ অক্ষরগুলির জন্য অনুবাদটি পরীক্ষা করা উচিত।

4. এই কোড দ্বারা alt এবং title-এর মতো বৈশিষ্ট্যের মানগুলি প্রক্রিয়া করা হবে?

হবে না। অ্যাট্রিবিউটের মানগুলি এই নিবন্ধের সুযোগের বাইরে, এবং অ্যাট্রিবিউট ট্রাভার্সাল লজিক আলাদাভাবে লিখতে হবে।

5. এটা কি সরাসরি বাস্তব ফাইলে ব্যবহার করা যায়?

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

📝 সারাংশ

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

এটি এখনই চেষ্টা করুন: অনুবাদ শুরু করতে নথিটি আপলোড করুন, মূল বিন্যাস বজায় রেখে৷

আপডেট করা হয়েছে 2026-11-15