অ্যান্ড্রয়েডে স্ট্রিং.এক্সএমএল এ স্ট্রিং যুক্ত করা কি গতিশীলভাবে সম্ভব?


494

স্ট্রিং ভ্যালুতে স্থানধারকরা string.xmlকী রান চালানোর সময় নির্ধারিত মান নির্ধারণ করতে পারবেন?

উদাহরণ:

কিছু স্ট্রিং PLACEHOLDER1 আরও কিছু স্ট্রিং



@ হরিশজ্ঞানী না, এই একজন বয়স্ক, তার পরিবর্তে এইটিকে একীভূত করা উচিত
— ড্যানহ

উত্তর:


1033

বিন্যাস এবং স্টাইলিং

হ্যাঁ, স্ট্রিং রিসোর্সগুলি থেকে নিম্নলিখিতটি দেখুন : ফর্ম্যাট এবং স্টাইলিং

যদি আপনার স্ট্রিংগুলি ব্যবহার করে বিন্যাস String.format(String, Object...)করতে হয় তবে স্ট্রিং রিসোর্সে আপনার ফর্ম্যাট আর্গুমেন্টগুলি রেখে আপনি এটি করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত উত্স সহ:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

এই উদাহরণে, ফর্ম্যাট স্ট্রিংয়ের দুটি আর্গুমেন্ট রয়েছে: %1$sএটি একটি স্ট্রিং এবং %2$dদশমিক সংখ্যা। আপনি আপনার অ্যাপ্লিকেশন থেকে যুক্তিগুলি দিয়ে স্ট্রিংটি ফর্ম্যাট করতে পারেন:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

বেসিক ব্যবহার

নোটটিতে getStringএকটি ওভারলোড রয়েছে যা স্ট্রিংটিকে ফর্ম্যাট স্ট্রিং হিসাবে ব্যবহার করে:

String text = res.getString(R.string.welcome_messages, username, mailCount);

বহুবচন গুলো

আপনার যদি বহুবচনগুলি পরিচালনা করতে হয় তবে এটি ব্যবহার করুন:

<plurals name="welcome_messages">
    <item quantity="one">Hello, %1$s! You have a new message.</item>
    <item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>

প্রথম mailCountপ্যারামটি কোন ফর্ম্যাটটি (একক বা বহুবচন) ব্যবহার করবেন তা সিদ্ধান্ত নিতে ব্যবহার করা হয়, অন্যান্য প্যারামগুলি আপনার বিকল্পগুলি:

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

স্ট্রিং রিসোর্সগুলি দেখুন : আরও তথ্যের জন্য বহুবচন ।


61
প্রথম কোডের নমুনায় স্ট্রিং.ফর্ম্যাট কলটি আসলে প্রয়োজন হয় না, রিসোর্স.সেটস্ট্রিং () ফর্ম্যাটিং সমর্থন করে, দেখুন: ডেভেলপার.আ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / কনটেন্ট / ড্রেস , জাভা.লং.অবজেক্ট ...)
— আর্নৌড

16
স্ট্রিং.এক্সএমএল-তে বহুবচনগুলির জন্য আপনাকে আর. স্ট্রিং.ওয়েলকম_মেসেজের পরিবর্তে আর.পি্লুরালস.উইলকম_মেসেজ হিসাবে আইডি দিতে হবে
— om252345

বহুবচন জিনিস শুধুমাত্র শেষ আইটেম স্ট্রিং ফিরে ... কোন ধারণা কীভাবে সংযোজন স্ট্রিং পেতে পারে।
— CoDe

1
আপনার স্ট্রিংটি ফর্ম্যাট করতে এই পদ্ধতিটি ব্যবহার করার সময়, এটি আপনি যে কোনও মেটা ট্যাগ ব্যবহার করেছেন যেমন হাইপারলিঙ্কস ইত্যাদি এক্সএমএল স্ট্রিং টেক্সটে অন্তর্ভুক্ত থাকতে পারে
— জোনাথন

4
স্ট্রিং% 1 $ s, দশমিক% 2 $ d এর জন্য এবং পূর্ণসংখ্যাটি কী? % 1,% 2. এর অর্থ কী? প্যারামিটারের এই গণনাটি কি?? আমি কি তৃতীয় প্যারামিটারটি% 3 উল্লেখ করি?
— reegan29

259

পরিপূরক উত্তর

আমি যখন প্রথম দেখেছি %1$sএবং %2$dস্বীকৃত উত্তরে, তখন তা কোনও অর্থহীন হয়নি। এখানে আরও কিছু ব্যাখ্যা দেওয়া হল।

এগুলিকে ফর্ম্যাট স্পেসিফায়ার বলা হয়। এক্সএমএল স্ট্রিং এ তারা আকারে রয়েছে

%[parameter_index$][format_type] 
  • % : শতাংশ চিহ্নটি বিন্যাস নির্দিষ্টকরণের সূচনা চিহ্নিত করে।
  • প্যারামিটার সূচক : এটি ডলারের চিহ্ন অনুসারে একটি সংখ্যা। আপনি তিনটি প্যারামিটার আপনি STRING মধ্যে সন্নিবেশ করতে চেয়েছিলেন ছিল, তাহলে তাদের বলা হবে 1$, 2$এবং 3$। আপনি তাদের উত্সের পংক্তিতে যে অর্ডারটি রেখেছেন তাতে কিছু আসে যায় না, কেবলমাত্র প্যারামিটারগুলি সরবরাহ করে।
  • বিন্যাসের ধরণ : এমন অনেকগুলি উপায় রয়েছে যা আপনি জিনিসগুলিকে ফর্ম্যাট করতে পারেন ( ডকুমেন্টেশন দেখুন )। এখানে কিছু সাধারণ রয়েছে:

    • s দড়ি
    • d দশমিক পূর্ণসংখ্যা
    • f ফ্লোটিং পয়েন্ট সংখ্যা

উদাহরণ

আমরা নিম্নলিখিত ফর্ম্যাট স্ট্রিং তৈরি করব যেখানে ধূসর অংশগুলি প্রোগ্রামিকভাবে .োকানো হয়।

আমার বোন Maryহয় 12বছর বয়সী।

string.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

MyActivity.java

String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);

মন্তব্য

  • আমি ব্যবহার করতে পারি getStringকারণ আমি একটি ক্রিয়াকলাপে ছিলাম। context.getResources().getString(...)এটি উপলভ্য না হলে আপনি ব্যবহার করতে পারেন ।
  • String.format() একটি স্ট্রিং ফর্ম্যাট করবে।
  • 1$এবং 2$পদ যাতে ব্যবহার করা প্রয়োজন হবে না। অর্থাৎ 2$আগে আসতে পারে 1$। যে ভাষাগুলি ভিন্ন শব্দের ক্রম ব্যবহার করে তাদের জন্য কোনও অ্যাপ্লিকেশনকে আন্তর্জাতিককরণ করার সময় এটি কার্যকর useful
  • আপনি %1$sযদি এটির পুনরাবৃত্তি করতে চান তবে আপনি এক্সএমএলে একাধিকবারের মতো ফর্ম্যাট স্পেসিফায়ার ব্যবহার করতে পারেন ।
  • %%আসল %চরিত্রটি পেতে ব্যবহার করুন ।
  • আরও তথ্যের জন্য নিম্নলিখিত সহায়ক টিউটোরিয়ালটি পড়ুন: অ্যান্ড্রয়েড এসডিকে দ্রুত টিপ: ফর্ম্যাট করা রিসোর্স স্ট্রিং

125

যখন আপনি কোনও জাভা কোড ব্যবহার না করে প্রকৃত স্ট্রিংস.এমএমএল ফাইল থেকে একটি প্যারামিটার ব্যবহার করতে চান:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "WhereDat">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

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


আপনার অভ্যন্তরে <! [সিডিএটিএ [& পরম; ]]>
— হারমান পোইলপ্রেস

2
কোনও <!DOCTYPE... ]>পৃথক ফাইলের অংশটি সংজ্ঞায়িত করার এবং এটি একাধিক সংস্থানীয় ফাইলগুলিতে অন্তর্ভুক্ত করার কোনও উপায় আছে কি ? এটি অর্জনের জন্য কোন কৌশল?
— 85

18

একই সন্ধান করছিল এবং অবশেষে নিম্নলিখিত খুব সাধারণ সমাধান খুঁজে পেয়েছিল। সেরা: এটি বক্সের বাইরে কাজ করে।
1. আপনার স্ট্রিং রিসোর্স পরিবর্তন করুন:

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2. স্ট্রিং প্রতিস্থাপন ব্যবহার:

c.getString(R.string.welcome_messages,name,count);

যেখানে সি প্রসঙ্গ হয়, নামটি একটি স্ট্রিং ভেরিয়েবল এবং আপনার int ভেরিয়েবল গণনা করে

আপনাকে অন্তর্ভুক্ত করতে হবে

<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">

আপনার রেজ / স্ট্রিং.এক্সএমএল এ। আমার জন্য কাজ কর. :)


2
xliffবিন্যাস নির্দিষ্টকরণের চারপাশে ট্যাগগুলির বিন্দুটি কী ? তারা নিজেরাই কেবলমাত্র %sএবং %dস্পেসিফায়ার ব্যবহারের বিপরীতে কোন অতিরিক্ত মান যুক্ত করে ?
— রিচার্ড লে ম্যাসুরিয়ার

এক্সলিফ ট্যাগের "নাম" বৈশিষ্ট্যটি অনুবাদককে সেখানে কী কী প্রতিস্থাপন করা হবে সে সম্পর্কে একটি ইঙ্গিত দেওয়ার একমাত্র উপায়। কখনও কখনও "% s" এর অর্থ কী তা অনুমান করা সহজ নয়।
— hugomg

3

কোটলিনে আপনাকে কেবল আপনার স্ট্রিংয়ের মানটি সেট করতে হবে:

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

আপনার লেআউটে একটি পাঠ্য দর্শন তৈরি করুন:

<TextView android:id="@+id/song_number_and_title"/>

তারপরে আপনার কোডে এটি করুন যদি আপনি অঙ্কো ব্যবহার করেন:

val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))  

আপনার প্রয়োজন হতে পারে অ্যাপ্লিকেশন প্রসঙ্গে আপনার সংস্থানগুলি পেতে।


5
কীভাবে জাভা উদাহরণগুলির চেয়ে আলাদা? আমি কোনও পার্থক্য দেখছি না
— জানুশ হেইন


1

res / মান / স্ট্রিং.এক্সএমএল এ

<resources>
    <string name="app_name">Hello World</string>
    <string name="my_application">Application name: %s, package name: %s</string>
</resources>

জাভা কোডে

String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);


1

আপনি যদি শতাংশ (%) লিখতে চান তবে এটির নকল করুন:

<string name="percent">%1$d%%</string>

label.text = getString(R.string.percent, 75) // Output: 75%.

আপনি কেবল লেখেন, তাহলে %1$d%, আপনার ত্রুটিটি পাবেন: Format string 'percent' is not a valid format string so it should not be passed to String.format।


0

হ্যাঁ! আপনি কোনও জাভা / কোটলিন কোড না লিখে এটি করতে পারেন, আমি তৈরি করা এই ছোট্ট লাইব্রেরিটি ব্যবহার করে কেবল এক্সএমএল, যা বিল্ডটাইমের সময় এমনটি করে, তাই আপনার অ্যাপ্লিকেশন এটি দ্বারা প্রভাবিত হবে না: https://github.com/LikeTheSalad/android -string-রেফারেন্স

ব্যবহার

আপনার স্ট্রিং:

<resources>
    <string name="app_name">My App Name</string>
    <string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>

বিল্ডিংয়ের পরে উত্পন্ন স্ট্রিং:

<!--resolved.xml-->
<resources>
    <string name="welcome_message">Welcome to My App Name</string>
</resources>

0

সমস্যার প্রত্যক্ষ কোটলিন সমাধান:

strings.xml

<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>

kotlinActivityORFragmentFile.kt:

val username = "Andrew"
val products = 1000
val text: String = String.format(
      resources.getString(R.string.customer_message), username, products )

0

আপনার স্ট্রিং ফাইল এ ব্যবহার করুন

<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>

এবং আপনার কোড অনুসারে ব্যবহার করুন

coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
                        , rewardPoints.getConversion_rate(), getString(R.string.rs)));

-1

গৃহীত উত্তরের কোটলিন সংস্করণ ...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)

3
আরও সঠিক উপায় resources.getString(int, ... args)পরিবর্তে আর্গুমেন্টের সাহায্যে পদ্ধতি ব্যবহার করা String.format। এই কোডটিতে কোনও কোটলিন সুনির্দিষ্ট নয়, অন্য তারপর valকীওয়ার্ড। Msbodw001
— dant3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.