실행 시 값으로 strings.xml에 플레이스 홀더를 지정할 수 있습니까?
「」의 문자열 값에 할 수 ?string.xml
행행 시시 ?당 당?? ???
예를 들어:
일부 문자열 PLACEHOLDER1 일부 문자열 추가
포맷 및 스타일링
예, String Resources에서 다음을 참조하십시오. 포맷 및 스타일링
" " 를을 포맷해야 하는
String.format(String, Object...)
포맷 인수를 문자열리소스에 넣으면 됩니다.예를 들어 다음과 같은 리소스를 사용합니다.<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
예에서는 에 두 인수가 . 즉, 형식 문자열은 두 가지 인수가 있습니다.
%1$s
이며, " " " 입니다.%2$d
10번입니다.애플리케이션의 인수를 사용하여 다음과 같이 문자열 형식을 지정할 수 있습니다.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);
자세한 내용은 문자열 리소스: 다중 항목을 참조하십시오.
보충 답변
때%1$s
★★★★★★★★★★★★★★★★★」%2$d
좀더 설명하겠습니다.을 사용하다
이들을 형식 지정자라고 합니다.xml 문자열의 형식은 다음과 같습니다.
%[parameter_index$][format_type]
%: 퍼센트 기호는 형식 지정자의 시작을 나타냅니다.
파라미터 인덱스:이것은 숫자 뒤에 달러 기호가 이어지는 것입니다.문자열에 삽입할 파라미터가 3개 있는 경우 이들 파라미터는 호출됩니다.
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$
이것은 다른 어순을 사용하는 언어의 앱을 국제화할 때 유용합니다.- 하다, 하다, 하다, 하다와 같은 할 수 있습니다.
%1$s
xml을 사용하다 %%
을%
★★★★★★ 。- 상세한 것에 대하여는, 다음의 편리한 튜토리얼을 참조해 주세요.Android SDK 퀵팁: 리소스 문자열 포맷
Java 코드를 사용하지 않고 실제 strings.xml 파일의 파라미터를 사용하는 경우:
<?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>
이것은 자원 파일 전체에서는 동작하지 않습니다.즉, 변수를 필요로 하는 각 XML 파일에 복사해야 합니다.
같은 것을 찾고 있었는데, 마침내 다음과 같은 매우 심플한 솔루션을 발견했습니다.베스트: 개봉 후 바로 사용할 수 있습니다.
합니다. 다음 중 하나:
<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);
여기서 c는 Context, name은 문자열 변수이며 int 변수를 카운트합니다.
다음을 포함해야 합니다.
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
res/cisco.xml저는 좋아요.:)
퍼센트(%)를 쓰는 경우 중복:
<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
.
또는 사용 formatted=false"
★★★★★★ 。
Kotlin에서는 문자열 값을 다음과 같이 설정하기만 하면 됩니다.
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
레이아웃에 텍스트 보기를 만듭니다.
<TextView android:text="@string/song_number_and_title"/>
Anko 를 사용하고 있는 경우는, 코드로 다음의 조작을 실시합니다.
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))
응용 프로그램 컨텍스트에서 리소스를 가져와야 할 수 있습니다.
문자열 파일에서 다음을 사용합니다.
<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)));
단, Android 다중 처리의 "제로"에 대한 Elias Mörtenson의 답변도 읽어보십시오."제로"와 같은 특정 값의 해석에 문제가 있습니다.
다국어 프로젝트용
변종별로 다양한 언어 및 구성을 가진 대규모 화이트 라벨 솔루션을 사용해 본 사람으로서 고려해야 할 점이 많다고 할 수 있습니다.텍스트 방향은 차치하고 문법만 해도 골칫거리가 될 수 있습니다.예를 들어 품목의 순서가 다음과 같이 변경될 수 있습니다.
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
보다 우선되어야 한다
<string name="welcome_messages">Hello, %s! You have %d new messages.</string>
그러나 문자열이나 정수가 무엇인지 모르는 경우가 많은 번역자, 각 타입에 어떤 포맷 문자를 사용해야 하는지 모르는 일반 사용자, 또는 사용자 자신도 이 파라미터가 코드에 어떤 순서로 적용되는지 모르는 사용자, 또는 여러 곳에서 동시에 업데이트해야 하는 사항을 잊어버린 경우,그래서 사용MessageFormat
<string name="welcome_message">Hello, {0}! You have {1} new messages.</string>
MessageFormat(R.string.welcome_message).format("Name", numMessages)
할 수 없게 되어 .xlift
즐길 수조차 없다.지금까지 내가 알고 있는 최고의 해결책은 명시적이고 명명된 플레이스 홀더를 사용하는 것이다.
<string name="placeholder_data" translatable="false">DATA</string>
<string name="placeholder_data" translatable="false">$DATA</string>
<string name="placeholder_data" translatable="false">%DATA%</string>
아니면 문자랑 충돌하지 않는 게 더 좋을 거야
DOSCTYPE를 다음과 같이 사용할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY placeholder_data "$DATA">
]>
<string name="text_with_data">Your data is &placeholder_data;.</string>
이것은 각 언어별로 다른 파일에서는 동작하지 않습니다.
당신의 ★★★★★★★★★★★★★★★★★★에main/res/values/strings.xml
및 기본 합니다.
<resources>
<string name="placeholder_data" translatable="false">$DATA</string>
<string name="placeholder_error" translatable="false">$ERROR</string>
<string name="app_name">The App</string>
<string name="content_loading">loading..</string>
<string name="content_success">success: $DATA</string>
<string name="content_error">error: $ERROR</string>
</resources>
으로 배리언트 「」를 참조해 주세요.variant/res/values-de/strings.xml
<resources>
<string name="app_name">Die Applikation</string>
<string name="content_loading">Ladevorgang..</string>
<string name="content_success">Erfolg: $DATA</string>
<string name="content_error">Netzwerkkommunikationsfehler: $ERROR</string>
</resources>
이걸 쓰려면 이렇게 쓰세요.
textView.text = when (response) {
is Data -> getText(content_success).resolveData(response.data)
is Error -> getText(content_error).resolveError(response.error)
is Loading -> getText(content_loading)
}
다음과 같은 도우미 기능을 사용하여
fun CharSequence.resolveData(data: JsonObject) =
toString().replace(getString(placeholder_data), data.toString())
fun CharSequence.resolveError(error: Throwable) =
toString().replace(getString(placeholder_error), error.toString())
번역 파일 및 개발에 대한 참조가 있다는 이유만으로 작성되었습니다.따라서 빌드 플레이버마다 기본 파일이 없어야 합니다.기본 파일은 1개뿐이고 언어 x 배리언트당 파일 1개뿐입니다.
을 사용법는 '먹다'로 할 수 .plurals
xml을 사용하다, 고, and and and and and and and and andzero
이치노이나 사전 할 수 UI를 .99+
100
fun Context.getText(
quantity: Int,
@PluralsRes resIdQuantity: Int,
@StringRes resIdNone: Int? = null,
@StringRes resIdMoreThan: Int? = null,
maxQuantity: Int? = null,
): CharSequence {
if (resIdMoreThan != null && maxQuantity != null && quantity > maxQuantity)
return getText(resIdMoreThan)
return if (resIdNone != null && quantity == 0) return getText(resIdNone)
else resources.getQuantityText(resIdQuantity, quantity)
}
다중 해결기의 동작을 재정의하고 확장합니다.
, 배리언트 마다는, 「」를 합니다.res/values/strings-beans.xml
들면 다음과 같습니다.
<resources>
<string name="placeholder_name" translatable="false">$NAME</string>
<string name="placeholder_count" translatable="false">$COUNT</string>
<string name="beans_content_bean_count_zero">Hello $NAME! You have no beans.</string>
<string name="beans_content_bean_count_one">Hello $NAME! You have one bean.</string>
<string name="beans_content_bean_count_many">Hello $NAME! You have $COUNT beans.</string>
<string name="beans_content_bean_count_more_than_9000">Hello $NAME! You have over $COUNT beans!</string>
<string name="beans_content_bean_count_two">@string/beans_content_bean_count_many</string>
<string name="beans_content_bean_count_few">@string/beans_content_bean_count_many</string>
<string name="beans_content_bean_count_other">@string/beans_content_bean_count_many</string>
<plurals name="beans_content_bean_count">
<item quantity="zero">@string/beans_content_bean_count_zero</item>
<item quantity="one">@string/beans_content_bean_count_one</item>
<item quantity="two">@string/beans_content_bean_count_two</item>
<item quantity="few">@string/beans_content_bean_count_few</item>
<item quantity="many">@string/beans_content_bean_count_many</item>
<item quantity="other">@string/beans_content_bean_count_other</item>
</plurals>
</resources>
, 「」의 variant-with-beans/res/value-en/strings-beans.xml
포함하기만 하면 됩니다.
<resources>
<string name="beans_content_bean_count_zero">Hello $NAME! You have no beans.</string>
<string name="beans_content_bean_count_one">Hello $NAME! You have one bean.</string>
<string name="beans_content_bean_count_many">Hello $NAME! You have $COUNT beans.</string>
<string name="beans_content_bean_count_more_than_9000">Hello $NAME! You have over 9000 beans!</string>
</resources>
파일 단위로 언어별 오버라이드를 제공할 수 있습니다.이것을 사용하려면 , 코드는 다음과 같이 될 수 있습니다.
val name = "Bob"
val beanCount = 3
val limit = 9000
text = getText(
beanCount,
beans_content_bean_count,
beans_content_bean_count_zero,
beans_content_bean_count_more_than_9000,
limit,
)
.resolveCount(beanCount)
.resolveName(name)
출력으로 해결됩니다.
beanCount = 0 -> "Hello Bob! You have no beans."
beanCount = 1 -> "Hello Bob! You have one bean."
beanCount = 3 -> "Hello Bob! You have 3 beans."
beanCount = 9001 -> "Hello Bob! You have over 9000 beans!"
그 결과 언어 고유의 리소스 파일이 단순해지기 때문에 스프레드시트나 회사 자체 서버 엔드포인트 등에서 배포 도구를 사용하여 생성할 수 있습니다.
Android용 동적인 문자열 자원의 세계에 대한 나의 열띤 여행이 즐거웠기를 바라며, 내 경험상 .xcodeproj 파일을 수정하고 빠른 코드를 생성하기 위해 python 스크립트를 필요로 했던 것과 같은 기능을 iOS에서 사용할 필요가 있는 불쌍한 바보들이 아님을 이해하길 바란다.
res/values/string.xml에 입력
<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);
하시면 됩니다.MessageFormat
:
<string name="customer_address">Wellcome: {0} {1}</string>
Java 코드:
String text = MessageFormat(R.string.customer_address).format("Name","Family");
API 레벨 1:
https://developer.android.com/reference/java/text/MessageFormat.html
네! Java/Kotlin 코드를 작성하지 않고 XML만 작성할 수 있습니다.이 작은 라이브러리는 빌드 시에 작성되므로 어플리케이션에 영향을 주지 않습니다.https://github.com/LikeTheSalad/android-stem
사용.
문자열:
<resources>
<string name="app_name">My App Name</string>
<string name="welcome_message">Welcome to ${app_name}</string>
</resources>
빌드 후 생성된 문자열:
<!-- Auto generated during compilation -->
<resources>
<string name="welcome_message">Welcome to My App Name</string>
</resources>
문제의 직접적인 해결 방법:
스트링스.xml
<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>
동작ORFragment File.kt:
val username = "Andrew"
val products = 1000
val text: String = String.format(
resources.getString(R.string.customer_message), username, products )
Kotlin 버전의 승인된 답변...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
언급URL : https://stackoverflow.com/questions/3656371/is-it-possible-to-have-placeholders-in-strings-xml-for-runtime-values
'programing' 카테고리의 다른 글
iOS 앱, 프로그래밍 방식으로 빌드 버전 가져오기 (0) | 2023.04.10 |
---|---|
새로운 기준 자동 계수 메커니즘은 어떻게 작동합니까? (0) | 2023.04.10 |
하위 디렉토리를 별도의 Git 저장소로 분리(이동) (0) | 2023.04.10 |
Microsoft Office Excel에서 'c:\inetpub\wwwroot\' 파일에 액세스할 수 없습니다.타임시트\App_Data\템플릿xlsx' (0) | 2023.04.10 |
서버와의 접속은 정상적으로 확립되었지만, 로그인 프로세스중에 에러가 발생했습니다.(에러 번호: 233) (0) | 2023.04.10 |