JSON স্থানীয়করণের সময় কোন অংশগুলি অনুবাদ করা যেতে পারে এবং কোন অংশগুলি পরিবর্তন করা উচিত নয়?
পৃষ্ঠার বোতামগুলি ইংরেজিতে অনুবাদ করা হয়, কিন্তু প্রোগ্রামটি কনফিগারেশন আইটেম খুঁজে পায় না। JSON স্থানীয়করণে এই ধরনের ব্যর্থতা প্রায়শই ঘটে: বস্তুর প্রতিটি স্ট্রিং অনুবাদকের কাছে হস্তান্তর করা হয় এবং মূল নাম, রাউটিং এবং ব্যবসায়িক এনকোডিংও একসাথে পরিবর্তন করা হয়। একটি নিরাপদ পদ্ধতি হল কোন স্ট্রিংগুলি মানুষের বক্তৃতার মতো শোনাচ্ছে তা অনুমান করা নয়, তবে কোন পথের অনুবাদকে স্পষ্টভাবে অনুমতি দেওয়া।
JSON স্থানীয়করণে একটি সাধারণ ব্যর্থতা হল: পৃষ্ঠা বোতামগুলি ইংরেজিতে পরিবর্তিত হয়েছে, কিন্তু প্রোগ্রামটি সংশ্লিষ্ট কনফিগারেশন আইটেমগুলি খুঁজে পাচ্ছে না। কারণটি হল সাধারণত বস্তুর প্রতিটি স্ট্রিং প্রক্রিয়াকরণের জন্য অনুবাদকের কাছে হস্তান্তর করা হয় এবং মূল নাম, রাউটিং এবং ব্যবসায়িক এনকোডিংও সেই অনুযায়ী পরিবর্তিত হয়। এই নিবন্ধটি আন্তর্জাতিক কনফিগারেশনের জন্য দায়ী বিকাশকারী এবং স্থানীয়করণ কর্মীদের জন্য লেখা। এটি ব্যাখ্যা করে যে কীভাবে প্রথমে অনুবাদযোগ্য ক্ষেত্র পাথগুলিকে বর্ণনা করা যায় এবং তারপরে গ্রহণযোগ্যতা করা যায়।
উদাহরণগুলি প্রক্রিয়াকরণ পদ্ধতি প্রদর্শনের জন্য সিন্থেটিক নমুনা ব্যবহার করে, এবং কোডটি একটি বিচ্ছিন্ন পরিবেশে পরীক্ষা করা হয়েছে, তবে এটি সমস্ত বাস্তব ফাইল বা পণ্যের কার্যকারিতার গ্যারান্টি উপস্থাপন করে না। গুরুত্বপূর্ণ নথিগুলি প্রক্রিয়া করার আগে, দয়া করে মূলগুলি রাখুন এবং পাঠ্যের সীমানা এবং গ্রহণযোগ্য আইটেমগুলি অনুসারে সেগুলি পর্যালোচনা করুন৷
JSON স্থানীয়করণের সময় কি অনুবাদ করা যেতে পারে? এক বাক্যে উপসংহার
শুধুমাত্র অগ্রিম তালিকাভুক্ত কপিরাইটিং পাথগুলি অনুবাদ করা হবে, এবং মূল নাম, রাউটিং মান এবং ব্যবসায়িক কোডগুলি একই থাকবে এবং একটি স্বীকৃতি চেকলিস্ট নিশ্চিত করতে ব্যবহার করা হবে যে অপরিবর্তিত অংশগুলি প্রকৃতপক্ষে পরিবর্তিত হয়নি৷
| আপনার অবস্থা | প্রস্তাবিত অভ্যাস | কারণ |
|---|---|---|
ইন্টারফেস কপিরাইটিং, যেমন buttons.save | এটিকে অনুমোদিত পথের তালিকায় রাখুন এবং অনুবাদের আগে এটি নিশ্চিত করুন। | পথটি একটি স্পষ্ট ঠিকানা, যা স্ট্রিংটি মানুষের বক্তৃতার সাথে সাদৃশ্যপূর্ণ কিনা তা অনুমান করার চেয়ে বেশি নির্ভরযোগ্য। |
| রাউটিং মান, পরিষেবা কোড | এটিকে যেমন আছে তেমন ছেড়ে দিন এবং অনুবাদের সুযোগে প্রবেশ করবেন না | প্রোগ্রাম এই মান উপর নির্ভর করে. পরিবর্তনের পরে, একটি সমস্যা হবে যে কনফিগারেশন আইটেম খুঁজে পাওয়া যাবে না। |
| স্থানধারক, এইচটিএমএল স্নিপেট, কপি ক্ষেত্রের URL | পরবর্তী স্তরের সুরক্ষা নিয়ম যোগ করুন | অনুমোদিত পথের মধ্যে থাকা ক্ষেত্রগুলিতে এখনও এমন সামগ্রী থাকতে পারে যা সুরক্ষিত করা প্রয়োজন৷ |
| অ্যারে উপাদান | একটি স্থিতিশীল আইডি থাকলে আইডি ম্যাপিং ব্যবহার করুন | উপাদানগুলি পুনর্বিন্যাস করার পরে, সূচকটি অনুলিপির অন্য অংশের দিকে নির্দেশ করতে পারে |
| সোর্স ফাইল আপডেট হওয়ার পরে পথটি অদৃশ্য হয়ে যায় | একটি ত্রুটি রিপোর্ট করুন এবং পুরানো অনুবাদ স্বয়ংক্রিয়ভাবে ফিরে না লিখে উৎস সংস্করণ আপডেট করুন৷ | অনুরূপ ক্ষেত্রের নাম অনুবাদ ভুল অবস্থানে লেখা হতে পারে |
সমস্ত স্ট্রিং অতিক্রম করার পরিবর্তে ফিল্ড পাথ দিয়ে শুরু করুন
buttons.save কে ঠিকানা হিসাবে বিবেচনা করা "সংরক্ষণ করুন" স্ট্রিংটি প্রতিস্থাপন করার চেয়ে বেশি নির্ভরযোগ্য। একই বাক্য ইন্টারফেস কপি, লগ নমুনা এবং পরীক্ষার ক্ষেত্রে একই সময়ে প্রদর্শিত হতে পারে এবং তিনটি জায়গায় অনুবাদের প্রয়োজন নাও হতে পারে।
টিপলস বা JSON পয়েন্টার ব্যবহার করে পাথ দ্ব্যর্থহীনভাবে উপস্থাপন করা উচিত। বিন্দু দিয়ে বিভক্ত করার সময়, কী নামের মধ্যেই বিন্দু থাকলে অস্পষ্টতা দেখা দেবে।
নিম্নলিখিত উদাহরণটি শুধুমাত্র দুটি নির্দিষ্ট পাথকে সীমিত করে, অন্যান্য বিষয়বস্তু যেমন আছে তেমন রেখে। এটি এই নিবন্ধের জন্য একটি স্থানীয়করণ কৌশল, JSON ফর্ম্যাটের প্রয়োজন নয়। সিন্থেটিক নমুনায় ইন্টারফেস পাঠ্য এবং একটি রাউটিং মান উভয়ই রয়েছে যা সীমানা পরীক্ষা করার সুবিধার্থে পরিবর্তন করা উচিত নয়।
শুধুমাত্র একটি সময়ে স্পষ্টভাবে অনুমোদিত মান পরিবর্তন করুন
import copy
source = {"buttons": {"save": "保存", "cancel": "取消"},
"route": "/settings", "version": 1}
approved = {("buttons", "save"): "Save",
("buttons", "cancel"): "Cancel"}
def apply_texts(document, replacements):
result = copy.deepcopy(document)
for path, translated in replacements.items():
if not path or not isinstance(translated, str):
raise ValueError("invalid replacement")
parent = result
for key in path[:-1]:
parent = parent[key]
key = path[-1]
if key not in parent or not isinstance(parent[key], str):
raise ValueError("target must be an existing string")
parent[key] = translated
return result
result = apply_texts(source, approved)
assert result["buttons"]["save"] == "Save"
assert result["route"] == source["route"]
assert source["buttons"]["save"] == "保存"
try:
apply_texts(source, {("version",): "one"})
except ValueError:
pass
else:
raise AssertionError("numeric field must be rejected")
উদাহরণটি শুধুমাত্র অবজেক্ট লেভেল প্রদর্শন করে, অ্যারে ইন্ডেক্সিং প্রয়োগ করে না এবং অনুবাদ পরিষেবাকে কল করে না। আসল পাইপলাইনে জমা দেওয়ার সময়, অনুবাদের আগে অনুমোদিত পথের তালিকা নির্ধারণ করা উচিত এবং অনুবাদ তৈরিকারী পক্ষকে একই সময়ে তার নিজস্ব পরিবর্তনের সুযোগ প্রসারিত করার অনুমতি দেওয়া যাবে না।
গভীর অনুলিপি ইনপুট বস্তুর জায়গায় পরিবর্তন করা থেকে প্রতিরোধ করতে পারে, কিন্তু এটি একটি লেনদেন সিস্টেম নয়। অধ্যবসায় এখনও আলাদাভাবে ডিজাইন করা প্রয়োজন.
গ্রহণযোগ্যতা অপরিবর্তিত অংশের উপর নির্ভর করে
| পরীক্ষা | স্বাভাবিক ফলাফল | ব্যতিক্রম ক্ষেত্রে কর্ম |
|---|---|---|
| মূল নাম সংগ্রহ | উৎস ফাইলের সাথে সামঞ্জস্যপূর্ণ | মূল ফাইলের ওভাররাইট করা প্রতিরোধ করুন |
| অননুমোদিত পথ | মান অপরিবর্তিত থাকে | সীমার বাইরের পরিবর্তনগুলি খুঁজুন |
| টার্গেট ফিল্ডের ধরন | এখনও একটি স্ট্রিং | অন্তর্নিহিত টাইপ রূপান্তর প্রত্যাখ্যান করুন |
| অনুপস্থিত পথ | স্পষ্টভাবে একটি ত্রুটি রিপোর্ট করুন | স্বয়ংক্রিয়ভাবে ক্ষেত্র তৈরি না করে উৎস সংস্করণ আপডেট করুন |
শুধুমাত্র "লক্ষ্য ভাষা উপস্থিত" তা যাচাই করা যথেষ্ট নয়। সোর্স ফাইল হ্যাশ এবং পাথের একটি তালিকাও সংরক্ষণ করা উচিত। সোর্স ফাইল আপডেট করার পরে যদি পাথটি মুছে ফেলা হয়, তাহলে পুরানো অনুবাদটি স্বয়ংক্রিয়ভাবে অনুরূপ ক্ষেত্রের নাম দিয়ে লেখা যাবে না।
অ্যারে, নাল ভ্যালু এবং ডুপ্লিকেট কী আলাদাভাবে বিবেচনা করতে হবে
- অ্যারে: উপাদানগুলি পুনর্বিন্যাস করার পরে, সূচকটি এখনও মূল অনুলিপিতে নির্দেশ করতে পারে না। যখন একটি স্থিতিশীল আইডি থাকে, তখন আইডিটি প্রথমে ম্যাপিংয়ের জন্য ব্যবহার করা হয়।
- শূন্য:
nullএকটি খালি স্ট্রিং নয় এবং অনুবাদের সুবিধার জন্য আক্ষরিক "খালি" দিয়ে প্রতিস্থাপন করা উচিত নয়। - ডুপ্লিকেট কী: সাধারণ JSON পার্সিং সম্পূর্ণ হওয়ার পরে ডুপ্লিকেট কী তথ্য হারিয়ে যেতে পারে। আপনি যদি ডুপ্লিকেট কীগুলি প্রত্যাখ্যান করতে চান তবে অনুবাদ শেষ হওয়ার জন্য অপেক্ষা না করে পার্সিং পর্যায়ে আপনার সেগুলি পরিচালনা করা উচিত। রেফারেন্স পাইথন JSON ডকুমেন্টেশন.
এই উদাহরণটি সু-গঠিত কনফিগারেশন স্থানীয়করণের জন্য উপযুক্ত, একটি নির্বিচারে JSON স্বয়ং-অনুবাদক নয়। অনুবাদ গ্রহণ করার সময়, প্রথমে নিশ্চিত করুন যে কাঠামো এবং সুরক্ষিত ক্ষেত্রগুলি পরিবর্তিত হয়নি, এবং তারপর ভাষাটি প্রাকৃতিক কিনা তা নিয়ে আলোচনা করুন। সমস্যা সমাধানের ক্রম আরও পরিষ্কার হবে।
📊 মূল তুলনা
| পথ | অনুশীলন | প্রধান ঝুঁকি | প্রযোজ্য পরিস্থিতি |
|---|---|---|---|
| সব স্ট্রিং মাধ্যমে পুনরাবৃত্তি | প্রতিটি স্ট্রিং অনুবাদককে দেওয়া হয় | মূল নাম, রাউটিং এবং ব্যবসার কোড একসাথে পরিবর্তন করা যেতে পারে | মূল নিবন্ধে কভার করা হয়নি |
| ক্ষেত্র পাথ দ্বারা সাদা তালিকা | শুধুমাত্র আগে থেকে নির্দিষ্ট পাথ অনুবাদ করুন | পথ তালিকা বজায় রাখা প্রয়োজন | সুগঠিত কনফিগারেশন স্থানীয়করণ |
🎯 কোন পদ্ধতি আপনার জন্য উপযুক্ত?
যদি তুমি......
- ইন্টারফেস কনফিগারেশন ফাইল বজায় রাখার জন্য, আপনি যদি বোতামের অনুলিপি অনুবাদযোগ্য হতে চান এবং প্রোগ্রাম কনফিগারেশন অপরিবর্তিত থাকতে চান, অনুগ্রহ করে ফিল্ড পাথ হোয়াইটলিস্ট ব্যবহার করুন এবং অনুবাদের আগে পাথ তালিকা নির্ধারণ করুন।
- অ্যারে উপাদানগুলি পুনর্বিন্যাস করা যেতে পারে, অনুগ্রহ করে সূচীর উপর নির্ভর না করে ম্যাপিংয়ের জন্য স্থিতিশীল আইডি ব্যবহার করতে অগ্রাধিকার দিন৷
- উৎস ফাইল ক্রমাগত আপডেট করা হবে. উত্স ফাইল হ্যাশ এবং পথ তালিকা সংরক্ষণ করুন. যদি পথটি অদৃশ্য হয়ে যায়, একটি ত্রুটি ঘটবে এবং পুরানো অনুবাদ স্বয়ংক্রিয়ভাবে ফিরে লেখা হবে না।
- আপনার যদি বাস্তব নথিগুলির বিতরণ প্রক্রিয়া করার প্রয়োজন হয়, অনুগ্রহ করে অনুমোদিত পথ, মূল পাঠ্য এবং অনুবাদগুলির একটি পর্যালোচনা তালিকা তৈরি করুন এবং একের পর এক পর্যালোচনা করুন৷
❓ প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)
1. JSON-এ সমস্ত স্ট্রিং সরাসরি অনুবাদ করা হয় না কেন?
কারণ একই স্ট্রিং একই সময়ে ইন্টারফেস কপি, প্রোগ্রাম কী নাম বা ব্যবসার কোড হতে পারে। যখন প্রতিটি স্ট্রিং অনুবাদকের কাছে হস্তান্তর করা হয়, তখন মূল নাম, রাউটিং এবং ব্যবসায়িক এনকোডিং একসাথে পরিবর্তিত হতে পারে, যার ফলে প্রোগ্রামটি কনফিগারেশন আইটেম খুঁজে পায় না।
2. পাথ বিভক্ত করতে ডট ব্যবহার করতে সমস্যা কি?
যদি কী নামের নিজেই একটি পিরিয়ড থাকে, তাহলে ডট সংযোজন অস্পষ্টতা সৃষ্টি করবে। মূল নিবন্ধটি টিপল বা JSON পয়েন্টারগুলির মতো দ্ব্যর্থহীন উপস্থাপনা ব্যবহার করার পরামর্শ দেয়।
3. অনুবাদে টার্গেট ভাষা অন্তর্ভুক্ত করা হয়েছে কিনা তা পরীক্ষা করা কি যথেষ্ট?
যথেষ্ট নয় মূল নামের সেটটি সোর্স ফাইলের সাথে সামঞ্জস্যপূর্ণ কিনা, অননুমোদিত পাথের মান অপরিবর্তিত আছে কিনা, লক্ষ্য ক্ষেত্রটি এখনও একটি স্ট্রিং কিনা এবং অনুপস্থিত পথগুলি স্পষ্টভাবে ত্রুটি হিসাবে রিপোর্ট করা হয়েছে কিনা তাও পরীক্ষা করা উচিত।
4. null কি "খালি" টেক্সট দিয়ে প্রতিস্থাপন করা যেতে পারে?
পারে না। null একটি খালি স্ট্রিং নয় এবং অনুবাদের সুবিধার জন্য পাঠ্য দিয়ে প্রতিস্থাপন করা উচিত নয়।
5. অ্যারে অনুবাদ করার সময় ম্যাপিংয়ের জন্য কী ব্যবহার করা উচিত?
যখন একটি স্থিতিশীল আইডি থাকে, তখন আইডিটি প্রথমে ম্যাপিংয়ের জন্য ব্যবহার করা হয়। শুধুমাত্র সূচকের উপর নির্ভর করে, উপাদানগুলিকে পুনর্বিন্যাস করার পরে ভুল অনুলিপিটি অনুরূপ হতে পারে।
📝 সারাংশ
JSON কনফিগারেশন অনুবাদ করার আগে, প্রথমে সেই পথগুলি স্পষ্ট করুন যা অনুবাদের অনুমতি দেয় এবং তারপরে অপরিবর্তিত অংশগুলি পরীক্ষা করতে স্বীকৃতি চেকলিস্ট ব্যবহার করুন৷ কিছু ভুল হয়ে গেলে এটি সমস্যাটি সনাক্ত করা সহজ করে তোলে।
এটি এখনই চেষ্টা করুন: অনুবাদ শুরু করতে নথিটি আপলোড করুন, মূল বিন্যাস বজায় রেখে৷


