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


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.