This document is also available in English: I18N_GUIDE.md
Esta implementación añade un sistema de internacionalización manual para la librería ImagePickerKMP, permitiendo a los desarrolladores mostrar textos en el idioma del dispositivo sin depender de librerías externas.
- Sistema completamente manual (sin dependencias externas)
- Soporte para múltiples idiomas (inglés, español, francés, etc.)
- Type-safe con enum class para evitar errores
- Implementado para Android e iOS
- Compatible con el patrón expect/actual de Kotlin Multiplatform
- Strings.kt: Define el enum
StringResourcey las funcionesexpect
- Strings.kt: Implementación
actualpara Android - res/values/strings.xml: Strings en inglés
- res/values-es/strings.xml: Strings en español
- res/values-fr/strings.xml: Strings en francés
- Strings.kt: Implementación
actualpara iOS - resources/en.lproj/Localizable.strings: Strings en inglés
- resources/es.lproj/Localizable.strings: Strings en español
- resources/fr.lproj/Localizable.strings: Strings en francés
StringResource.CAMERA_PERMISSION_REQUIRED
StringResource.CAMERA_PERMISSION_DESCRIPTION
StringResource.OPEN_SETTINGS
StringResource.CAMERA_PERMISSION_DENIED
StringResource.CAMERA_PERMISSION_DENIED_DESCRIPTION
StringResource.GRANT_PERMISSION
StringResource.CAMERA_PERMISSION_PERMANENTLY_DENIEDStringResource.IMAGE_CONFIRMATION_TITLE
StringResource.ACCEPT_BUTTON
StringResource.RETRY_BUTTONStringResource.SELECT_OPTION_DIALOG_TITLE
StringResource.TAKE_PHOTO_OPTION
StringResource.SELECT_FROM_GALLERY_OPTION
StringResource.CANCEL_OPTIONStringResource.PREVIEW_IMAGE_DESCRIPTION
StringResource.HD_QUALITY_DESCRIPTION
StringResource.SD_QUALITY_DESCRIPTIONStringResource.INVALID_CONTEXT_ERROR
StringResource.PHOTO_CAPTURE_ERROR
StringResource.GALLERY_SELECTION_ERROR
StringResource.PERMISSION_ERROR@Composable
fun MyComponent() {
Text(
text = stringResource(StringResource.IMAGE_CONFIRMATION_TITLE)
)
}fun myFunction() {
val errorMessage = getStringResource(StringResource.PHOTO_CAPTURE_ERROR)
// Usar el mensaje...
}val config = PermissionConfig() // Usa strings en inglésval config = PermissionConfig.createLocalized() // Usa traducciones según el idioma del dispositivo@Composable
fun MyPermissionHandler() {
val config = PermissionConfig.createLocalizedComposable() // Usa traducciones con contexto de Compose
RequestCameraPermission(
titleDialogConfig = config.titleDialogConfig,
descriptionDialogConfig = config.descriptionDialogConfig,
btnDialogConfig = config.btnDialogConfig,
titleDialogDenied = config.titleDialogDenied,
descriptionDialogDenied = config.descriptionDialogDenied,
btnDialogDenied = config.btnDialogDenied,
onPermissionPermanentlyDenied = { /* ... */ },
onResult = { granted -> /* ... */ }
)
}¡Importante! La librería ahora usa automáticamente traducciones por defecto en todos los componentes internos:
CameraCaptureViewusaPermissionConfig.createLocalizedComposable()automáticamenterememberImagePickerKMP(iOS) usaPermissionConfig.createLocalizedComposable()automáticamente- Los diálogos de permisos aparecerán en el idioma del dispositivo sin configuración adicional
La librería ahora usa automáticamente los strings localizados según el idioma del dispositivo:
- Lee desde
res/values/strings.xml(inglés por defecto) - Lee desde
res/values-es/strings.xml(español) - Lee desde
res/values-fr/strings.xml(francés) - Añade más idiomas creando
res/values-{código}/strings.xml
- Lee desde
en.lproj/Localizable.strings(inglés por defecto) - Lee desde
es.lproj/Localizable.strings(español) - Lee desde
fr.lproj/Localizable.strings(francés) - Añade más idiomas creando
{código}.lproj/Localizable.strings
- Crea
res/values-{código}/strings.xml - Traduce todos los strings
Ejemplo para francés (res/values-fr/strings.xml):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="camera_permission_required">Permission d'appareil photo requise</string>
<string name="image_confirmation_title">Confirmer l'image</string>
<!-- ... más traducciones -->
</resources>- Crea
{código}.lproj/Localizable.stringsen tu proyecto iOS - Traduce todos los strings
- Asegúrate de que los archivos están incluidos en el target de tu app
Ejemplo para francés (fr.lproj/Localizable.strings):
"camera_permission_required" = "Permission d'appareil photo requise";
"image_confirmation_title" = "Confirmer l'image";
/* ... más traducciones */Ver Guía de Localización para iOS para instrucciones detalladas.
En commonMain/kotlin/io/github/ismoy/imagepickerkmp/Strings.kt:
enum class StringResource {
// ... strings existentes ...
NEW_STRING_ID,
}En androidMain/kotlin/io/github/ismoy/imagepickerkmp/Strings.kt:
val resourceId = when (id) {
// ... casos existentes ...
StringResource.NEW_STRING_ID -> R.string.new_string_id
}En iosMain/kotlin/io/github/ismoy/imagepickerkmp/Strings.kt:
val key = when (id) {
// ... casos existentes ...
StringResource.NEW_STRING_ID -> "new_string_id"
}- Android: Añadir a todos los archivos
strings.xml - iOS: Añadir a todos los archivos
Localizable.strings
Text(text = "Are you satisfied with the photo?")Text(text = stringResource(StringResource.IMAGE_CONFIRMATION_TITLE))const val TITLE_DIALOG_CONFIG = "Camera permission required"// Usar directamente
stringResource(StringResource.CAMERA_PERMISSION_REQUIRED)- Type Safety: El enum previene errores de tipeo
- Centralizado: Todos los strings en un lugar
- Automático: Detección automática del idioma del dispositivo
- Extensible: Fácil añadir nuevos idiomas
- Sin dependencias: No requiere librerías externas
- Compatible: Funciona con el patrón expect/actual de KMP
Solución:
- Verifica que los archivos de recursos están en la ubicación correcta
- En iOS, asegúrate de que los archivos están incluidos en el bundle de la app
- Limpia y recompila el proyecto
Solución:
- Usa
PermissionConfig.createLocalizedComposable()dentro de Composables - Usa
PermissionConfig.createLocalized()fuera de Composables - O usa
PermissionConfig()para valores por defecto en inglés
Solución:
- La librería ahora usa traducciones automáticamente por defecto
- Si sigues viendo textos en inglés, verifica que los archivos de recursos estén en la ubicación correcta
- En iOS, asegúrate de incluir los archivos de recursos en el bundle de la app
Solución:
- En Android, reinicia la app después de cambiar el idioma
- En iOS, asegúrate de que los archivos de recursos están actualizados