You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.7 KiB
155 lines
5.7 KiB
package org.jetbrains.compose.resources |
|
|
|
import androidx.compose.runtime.* |
|
import org.jetbrains.compose.resources.plural.PluralCategory |
|
import org.jetbrains.compose.resources.plural.PluralRuleList |
|
|
|
/** |
|
* Represents a quantity string resource in the application. |
|
* |
|
* @param id The unique identifier of the resource. |
|
* @param key The key used to retrieve the string resource. |
|
* @param items The set of resource items associated with the string resource. |
|
*/ |
|
@Immutable |
|
class PluralStringResource |
|
@InternalResourceApi constructor(id: String, val key: String, items: Set<ResourceItem>) : Resource(id, items) |
|
|
|
/** |
|
* Retrieves the string for the pluralization for the given quantity using the specified quantity string resource. |
|
* |
|
* @param resource The quantity string resource to be used. |
|
* @param quantity The quantity of the pluralization to use. |
|
* @return The retrieved string resource. |
|
* |
|
* @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. |
|
*/ |
|
@Composable |
|
fun pluralStringResource(resource: PluralStringResource, quantity: Int): String { |
|
val resourceReader = LocalResourceReader.current |
|
val pluralStr by rememberResourceState(resource, quantity, { "" }) { env -> |
|
loadPluralString(resource, quantity, resourceReader, env) |
|
} |
|
return pluralStr |
|
} |
|
|
|
/** |
|
* Loads a string using the specified string resource. |
|
* |
|
* @param resource The string resource to be used. |
|
* @param quantity The quantity of the pluralization to use. |
|
* @return The loaded string resource. |
|
* |
|
* @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. |
|
*/ |
|
suspend fun getPluralString(resource: PluralStringResource, quantity: Int): String = |
|
loadPluralString(resource, quantity, DefaultResourceReader, getSystemResourceEnvironment()) |
|
|
|
/** |
|
* Loads a string using the specified string resource. |
|
* |
|
* @param environment The resource environment. |
|
* @param resource The string resource to be used. |
|
* @param quantity The quantity of the pluralization to use. |
|
* @return The loaded string resource. |
|
* |
|
* @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. |
|
*/ |
|
@ExperimentalResourceApi |
|
suspend fun getPluralString( |
|
environment: ResourceEnvironment, |
|
resource: PluralStringResource, |
|
quantity: Int |
|
): String = loadPluralString(resource, quantity, DefaultResourceReader, environment) |
|
|
|
private suspend fun loadPluralString( |
|
resource: PluralStringResource, |
|
quantity: Int, |
|
resourceReader: ResourceReader, |
|
environment: ResourceEnvironment |
|
): String { |
|
val resourceItem = resource.getResourceItemByEnvironment(environment) |
|
val item = getStringItem(resourceItem, resourceReader) as StringItem.Plurals |
|
val pluralRuleList = PluralRuleList.getInstance( |
|
environment.language, |
|
environment.region, |
|
) |
|
val pluralCategory = pluralRuleList.getCategory(quantity) |
|
val str = item.items[pluralCategory] |
|
?: item.items[PluralCategory.OTHER] |
|
?: error("Quantity string ID=`${resource.key}` does not have the pluralization $pluralCategory for quantity $quantity!") |
|
return str |
|
} |
|
|
|
/** |
|
* Retrieves the string for the pluralization for the given quantity using the specified quantity string resource. |
|
* |
|
* @param resource The quantity string resource to be used. |
|
* @param quantity The quantity of the pluralization to use. |
|
* @param formatArgs The arguments to be inserted into the formatted string. |
|
* @return The retrieved string resource. |
|
* |
|
* @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. |
|
*/ |
|
@Composable |
|
fun pluralStringResource(resource: PluralStringResource, quantity: Int, vararg formatArgs: Any): String { |
|
val resourceReader = LocalResourceReader.current |
|
val args = formatArgs.map { it.toString() } |
|
val pluralStr by rememberResourceState(resource, quantity, args, { "" }) { env -> |
|
loadPluralString(resource, quantity, args, resourceReader, env) |
|
} |
|
return pluralStr |
|
} |
|
|
|
/** |
|
* Loads a string using the specified string resource. |
|
* |
|
* @param resource The string resource to be used. |
|
* @param quantity The quantity of the pluralization to use. |
|
* @param formatArgs The arguments to be inserted into the formatted string. |
|
* @return The loaded string resource. |
|
* |
|
* @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. |
|
*/ |
|
suspend fun getPluralString(resource: PluralStringResource, quantity: Int, vararg formatArgs: Any): String = |
|
loadPluralString( |
|
resource, quantity, |
|
formatArgs.map { it.toString() }, |
|
DefaultResourceReader, |
|
getSystemResourceEnvironment(), |
|
) |
|
|
|
/** |
|
* Loads a string using the specified string resource. |
|
* |
|
* @param environment The resource environment. |
|
* @param resource The string resource to be used. |
|
* @param quantity The quantity of the pluralization to use. |
|
* @param formatArgs The arguments to be inserted into the formatted string. |
|
* @return The loaded string resource. |
|
* |
|
* @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. |
|
*/ |
|
@ExperimentalResourceApi |
|
suspend fun getPluralString( |
|
environment: ResourceEnvironment, |
|
resource: PluralStringResource, |
|
quantity: Int, |
|
vararg formatArgs: Any |
|
): String = loadPluralString( |
|
resource, quantity, |
|
formatArgs.map { it.toString() }, |
|
DefaultResourceReader, |
|
environment |
|
) |
|
|
|
private suspend fun loadPluralString( |
|
resource: PluralStringResource, |
|
quantity: Int, |
|
args: List<String>, |
|
resourceReader: ResourceReader, |
|
environment: ResourceEnvironment |
|
): String { |
|
val str = loadPluralString(resource, quantity, resourceReader, environment) |
|
return str.replaceWithArgs(args) |
|
}
|
|
|