programing

실행 시 값으로 strings.xml에 플레이스 홀더를 지정할 수 있습니까?

showcode 2023. 4. 10. 22:26
반응형

실행 시 값으로 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$d10번입니다.애플리케이션의 인수를 사용하여 다음과 같이 문자열 형식을 지정할 수 있습니다.

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 소수점

회색 부분이 프로그램 방식으로 삽입되는 다음과 같은 형식화된 문자열을 만듭니다.

여동생 ★★★★★Mary12아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

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$sxml을 사용하다
  • %%%★★★★★★ 。
  • 상세한 것에 대하여는, 다음의 편리한 튜토리얼을 참조해 주세요.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개뿐입니다.

을 사용법는 '먹다'로 할 수 .pluralsxml을 사용하다, 고, 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

반응형