react-native-ensys-camera-x 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CustomCamera.podspec +20 -0
- package/LICENSE +20 -0
- package/README.md +833 -0
- package/android/build.gradle +135 -0
- package/android/consumer-rules.pro +47 -0
- package/android/src/main/AndroidManifest.xml +72 -0
- package/android/src/main/java/android/print/PdfPrint.java +51 -0
- package/android/src/main/java/com/customcamera/AnimatedImageViewManager.kt +199 -0
- package/android/src/main/java/com/customcamera/AudioPlayerView.kt +322 -0
- package/android/src/main/java/com/customcamera/AudioRecorder.kt +506 -0
- package/android/src/main/java/com/customcamera/BarcodeScannerActivity.kt +361 -0
- package/android/src/main/java/com/customcamera/BlurBackgroundView.kt +199 -0
- package/android/src/main/java/com/customcamera/CacheCleanupManager.kt +386 -0
- package/android/src/main/java/com/customcamera/CameraAspectRatioMode.kt +77 -0
- package/android/src/main/java/com/customcamera/CameraAsset.kt +211 -0
- package/android/src/main/java/com/customcamera/CameraTheme.kt +479 -0
- package/android/src/main/java/com/customcamera/CompressionCacheStore.kt +504 -0
- package/android/src/main/java/com/customcamera/CompressionFileNameUtils.kt +7 -0
- package/android/src/main/java/com/customcamera/CompressionProfile.kt +195 -0
- package/android/src/main/java/com/customcamera/CustomCameraActivity.kt +7291 -0
- package/android/src/main/java/com/customcamera/CustomCameraFileProvider.kt +9 -0
- package/android/src/main/java/com/customcamera/CustomCameraModule.kt +2479 -0
- package/android/src/main/java/com/customcamera/CustomCameraPackage.kt +53 -0
- package/android/src/main/java/com/customcamera/DisplayUtils.kt +9 -0
- package/android/src/main/java/com/customcamera/DocumentPreviewView.kt +846 -0
- package/android/src/main/java/com/customcamera/DrawingView.kt +214 -0
- package/android/src/main/java/com/customcamera/EmojiPickerData.kt +228 -0
- package/android/src/main/java/com/customcamera/FilterStripAdapter.kt +158 -0
- package/android/src/main/java/com/customcamera/GifSupport.kt +215 -0
- package/android/src/main/java/com/customcamera/GlobalAudioPlayer.kt +320 -0
- package/android/src/main/java/com/customcamera/ImageExporter.kt +1394 -0
- package/android/src/main/java/com/customcamera/ImageFormatSupport.kt +163 -0
- package/android/src/main/java/com/customcamera/Localization.kt +206 -0
- package/android/src/main/java/com/customcamera/MediaAdapters.kt +758 -0
- package/android/src/main/java/com/customcamera/MediaCacheManager.kt +782 -0
- package/android/src/main/java/com/customcamera/MediaExportFormats.kt +201 -0
- package/android/src/main/java/com/customcamera/MediaFileIo.kt +310 -0
- package/android/src/main/java/com/customcamera/MediaMetadataStore.kt +494 -0
- package/android/src/main/java/com/customcamera/MediaPreviewEditor.kt +14865 -0
- package/android/src/main/java/com/customcamera/MediaPublisher.kt +423 -0
- package/android/src/main/java/com/customcamera/MediaStorageWorkflow.kt +722 -0
- package/android/src/main/java/com/customcamera/MediaStoreRepository.kt +378 -0
- package/android/src/main/java/com/customcamera/MediaThumbnailView.kt +286 -0
- package/android/src/main/java/com/customcamera/MediaUtils.kt +37 -0
- package/android/src/main/java/com/customcamera/NativeVideoViewManager.kt +845 -0
- package/android/src/main/java/com/customcamera/OfficeDocumentConverter.kt +2791 -0
- package/android/src/main/java/com/customcamera/PendingCaptureCrops.kt +88 -0
- package/android/src/main/java/com/customcamera/PowerPointPreview.kt +4077 -0
- package/android/src/main/java/com/customcamera/RecentPickerStore.kt +74 -0
- package/android/src/main/java/com/customcamera/SecureFileEraser.kt +411 -0
- package/android/src/main/java/com/customcamera/SecureKeyModule.kt +88 -0
- package/android/src/main/java/com/customcamera/SecureMediaDeleter.kt +493 -0
- package/android/src/main/java/com/customcamera/StickerPickerData.kt +107 -0
- package/android/src/main/java/com/customcamera/SvgDrawable.kt +175 -0
- package/android/src/main/java/com/customcamera/SvgIconViewManager.kt +77 -0
- package/android/src/main/java/com/customcamera/TextEntryController.kt +553 -0
- package/android/src/main/java/com/customcamera/ThumbnailLoader.kt +455 -0
- package/android/src/main/java/com/customcamera/UploadService.kt +909 -0
- package/android/src/main/java/com/customcamera/VideoEditUtils.kt +210 -0
- package/android/src/main/java/com/customcamera/VideoRotationTranscoder.kt +1992 -0
- package/android/src/main/java/com/customcamera/gif/AnimatedGifEncoder.kt +473 -0
- package/android/src/main/java/com/customcamera/gif/GifDecoder.kt +690 -0
- package/android/src/main/java/com/customcamera/gif/GifFramesDrawable.kt +160 -0
- package/android/src/main/java/com/customcamera/gif/GifHttp.kt +112 -0
- package/android/src/main/java/com/customcamera/gif/GifImageLoader.kt +186 -0
- package/android/src/main/java/com/customcamera/gif/GifModels.kt +74 -0
- package/android/src/main/java/com/customcamera/gif/GifProvider.kt +49 -0
- package/android/src/main/java/com/customcamera/gif/GifProviders.kt +27 -0
- package/android/src/main/java/com/customcamera/gif/GifRepository.kt +124 -0
- package/android/src/main/java/com/customcamera/gif/GifSafety.kt +33 -0
- package/android/src/main/java/com/customcamera/gif/GiphyGifProvider.kt +146 -0
- package/android/src/main/java/com/customcamera/gif/LZWEncoder.kt +258 -0
- package/android/src/main/java/com/customcamera/gif/NeuQuant.kt +435 -0
- package/android/src/main/java/com/customcamera/gif/TenorGifProvider.kt +147 -0
- package/android/src/main/res/drawable/bg_brush_selected.xml +5 -0
- package/android/src/main/res/drawable/bg_color_swatch.xml +5 -0
- package/android/src/main/res/drawable/bg_editor_toolbar.xml +6 -0
- package/android/src/main/res/drawable/bg_icon_circle.xml +5 -0
- package/android/src/main/res/drawable/bg_icon_circle_light.xml +5 -0
- package/android/src/main/res/drawable/bg_mode_tab_active.xml +6 -0
- package/android/src/main/res/drawable/bg_pill.xml +6 -0
- package/android/src/main/res/drawable/bg_recording_dot.xml +6 -0
- package/android/src/main/res/drawable/bg_selection_badge.xml +8 -0
- package/android/src/main/res/drawable/bg_send_button.xml +5 -0
- package/android/src/main/res/drawable/bg_shutter_inner.xml +5 -0
- package/android/src/main/res/drawable/bg_shutter_recording.xml +6 -0
- package/android/src/main/res/drawable/bg_shutter_ring.xml +8 -0
- package/android/src/main/res/drawable/bg_shutter_video_idle.xml +5 -0
- package/android/src/main/res/drawable/bg_thumbnail.xml +9 -0
- package/android/src/main/res/drawable/ic_aspect_ratio.xml +17 -0
- package/android/src/main/res/drawable/ic_audio.xml +10 -0
- package/android/src/main/res/drawable/ic_back.xml +10 -0
- package/android/src/main/res/drawable/ic_brush_medium.xml +12 -0
- package/android/src/main/res/drawable/ic_brush_thick.xml +12 -0
- package/android/src/main/res/drawable/ic_brush_thin.xml +12 -0
- package/android/src/main/res/drawable/ic_check.xml +17 -0
- package/android/src/main/res/drawable/ic_chevron_down.xml +10 -0
- package/android/src/main/res/drawable/ic_chevron_up.xml +13 -0
- package/android/src/main/res/drawable/ic_clear_drawing.xml +10 -0
- package/android/src/main/res/drawable/ic_close.xml +10 -0
- package/android/src/main/res/drawable/ic_cover.xml +9 -0
- package/android/src/main/res/drawable/ic_crop.xml +10 -0
- package/android/src/main/res/drawable/ic_delete.xml +9 -0
- package/android/src/main/res/drawable/ic_document.xml +10 -0
- package/android/src/main/res/drawable/ic_done.xml +10 -0
- package/android/src/main/res/drawable/ic_download.xml +10 -0
- package/android/src/main/res/drawable/ic_emoji.xml +10 -0
- package/android/src/main/res/drawable/ic_filter.xml +10 -0
- package/android/src/main/res/drawable/ic_flash_auto.xml +7 -0
- package/android/src/main/res/drawable/ic_flash_off.xml +23 -0
- package/android/src/main/res/drawable/ic_flash_on.xml +16 -0
- package/android/src/main/res/drawable/ic_flip.xml +15 -0
- package/android/src/main/res/drawable/ic_gallery.xml +10 -0
- package/android/src/main/res/drawable/ic_gif.xml +24 -0
- package/android/src/main/res/drawable/ic_lock.xml +19 -0
- package/android/src/main/res/drawable/ic_lock_open.xml +22 -0
- package/android/src/main/res/drawable/ic_marker.xml +10 -0
- package/android/src/main/res/drawable/ic_more_vert.xml +18 -0
- package/android/src/main/res/drawable/ic_overlay_close.xml +19 -0
- package/android/src/main/res/drawable/ic_overlay_resize.xml +18 -0
- package/android/src/main/res/drawable/ic_pause.xml +10 -0
- package/android/src/main/res/drawable/ic_photo_mode.xml +10 -0
- package/android/src/main/res/drawable/ic_play.xml +10 -0
- package/android/src/main/res/drawable/ic_redo.xml +10 -0
- package/android/src/main/res/drawable/ic_rotate.xml +9 -0
- package/android/src/main/res/drawable/ic_send.xml +10 -0
- package/android/src/main/res/drawable/ic_share.xml +10 -0
- package/android/src/main/res/drawable/ic_stat_upload.xml +10 -0
- package/android/src/main/res/drawable/ic_sticker.xml +24 -0
- package/android/src/main/res/drawable/ic_text.xml +10 -0
- package/android/src/main/res/drawable/ic_text_align_center.xml +11 -0
- package/android/src/main/res/drawable/ic_text_align_left.xml +11 -0
- package/android/src/main/res/drawable/ic_text_align_right.xml +11 -0
- package/android/src/main/res/drawable/ic_text_bg.xml +11 -0
- package/android/src/main/res/drawable/ic_trim.xml +23 -0
- package/android/src/main/res/drawable/ic_undo.xml +10 -0
- package/android/src/main/res/drawable/ic_video_mode.xml +10 -0
- package/android/src/main/res/drawable/ic_video_note.xml +13 -0
- package/android/src/main/res/drawable/ic_volume_off.xml +9 -0
- package/android/src/main/res/drawable/ic_volume_on.xml +9 -0
- package/android/src/main/res/drawable/sticker_heart.xml +9 -0
- package/android/src/main/res/drawable/sticker_smile.xml +9 -0
- package/android/src/main/res/drawable/sticker_star.xml +9 -0
- package/android/src/main/res/drawable/sticker_thumbsup.xml +9 -0
- package/android/src/main/res/values/colors.xml +34 -0
- package/android/src/main/res/values/ids.xml +15 -0
- package/android/src/main/res/values/strings.xml +15 -0
- package/android/src/main/res/values/styles.xml +20 -0
- package/android/src/main/res/xml/file_paths.xml +34 -0
- package/ios/CustomCamera.h +5 -0
- package/ios/CustomCamera.mm +214 -0
- package/lib/module/AudioPlayerContext.js +233 -0
- package/lib/module/AudioPlayerContext.js.map +1 -0
- package/lib/module/CameraPreview.js +304 -0
- package/lib/module/CameraPreview.js.map +1 -0
- package/lib/module/NativeAnimatedImageView.js +41 -0
- package/lib/module/NativeAnimatedImageView.js.map +1 -0
- package/lib/module/NativeAudioPlayerView.js +33 -0
- package/lib/module/NativeAudioPlayerView.js.map +1 -0
- package/lib/module/NativeBlurView.js +35 -0
- package/lib/module/NativeBlurView.js.map +1 -0
- package/lib/module/NativeCustomCamera.js +128 -0
- package/lib/module/NativeCustomCamera.js.map +1 -0
- package/lib/module/NativeCustomCamera.web.js +143 -0
- package/lib/module/NativeCustomCamera.web.js.map +1 -0
- package/lib/module/NativeCustomVideoView.js +5 -0
- package/lib/module/NativeCustomVideoView.js.map +1 -0
- package/lib/module/NativeDocumentPreviewView.js +156 -0
- package/lib/module/NativeDocumentPreviewView.js.map +1 -0
- package/lib/module/NativeMediaThumbnailView.js +110 -0
- package/lib/module/NativeMediaThumbnailView.js.map +1 -0
- package/lib/module/NativeSvgIcon.js +32 -0
- package/lib/module/NativeSvgIcon.js.map +1 -0
- package/lib/module/ResponsivePreviewContainer.js +171 -0
- package/lib/module/ResponsivePreviewContainer.js.map +1 -0
- package/lib/module/accessibility.js +61 -0
- package/lib/module/accessibility.js.map +1 -0
- package/lib/module/config.js +352 -0
- package/lib/module/config.js.map +1 -0
- package/lib/module/cpuOptimization.js +296 -0
- package/lib/module/cpuOptimization.js.map +1 -0
- package/lib/module/db/DatabaseManager.js +191 -0
- package/lib/module/db/DatabaseManager.js.map +1 -0
- package/lib/module/db/MediaMapper.js +284 -0
- package/lib/module/db/MediaMapper.js.map +1 -0
- package/lib/module/db/MediaRepository.js +242 -0
- package/lib/module/db/MediaRepository.js.map +1 -0
- package/lib/module/db/index.js +41 -0
- package/lib/module/db/index.js.map +1 -0
- package/lib/module/db/migrations.js +180 -0
- package/lib/module/db/migrations.js.map +1 -0
- package/lib/module/db/react-native-sqlcipher.d.js +2 -0
- package/lib/module/db/react-native-sqlcipher.d.js.map +1 -0
- package/lib/module/db/secureKey.js +87 -0
- package/lib/module/db/secureKey.js.map +1 -0
- package/lib/module/db/types.js +57 -0
- package/lib/module/db/types.js.map +1 -0
- package/lib/module/db/useMediaDatabase.js +123 -0
- package/lib/module/db/useMediaDatabase.js.map +1 -0
- package/lib/module/defaultIcons.js +2259 -0
- package/lib/module/defaultIcons.js.map +1 -0
- package/lib/module/deviceCapabilities.js +408 -0
- package/lib/module/deviceCapabilities.js.map +1 -0
- package/lib/module/errors.js +267 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/iconConfig.js +796 -0
- package/lib/module/iconConfig.js.map +1 -0
- package/lib/module/icons.js +514 -0
- package/lib/module/icons.js.map +1 -0
- package/lib/module/index.js +251 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/jest-globals.d.js +2 -0
- package/lib/module/jest-globals.d.js.map +1 -0
- package/lib/module/library/MediaLibrary.js +107 -0
- package/lib/module/library/MediaLibrary.js.map +1 -0
- package/lib/module/library/MediaLibraryScreen.js +2597 -0
- package/lib/module/library/MediaLibraryScreen.js.map +1 -0
- package/lib/module/library/components/AudioPreview.js +74 -0
- package/lib/module/library/components/AudioPreview.js.map +1 -0
- package/lib/module/library/components/DocumentPreview.js +331 -0
- package/lib/module/library/components/DocumentPreview.js.map +1 -0
- package/lib/module/library/components/ExpandableFab.js +343 -0
- package/lib/module/library/components/ExpandableFab.js.map +1 -0
- package/lib/module/library/components/FileTiles.js +251 -0
- package/lib/module/library/components/FileTiles.js.map +1 -0
- package/lib/module/library/components/ImagePreview.js +70 -0
- package/lib/module/library/components/ImagePreview.js.map +1 -0
- package/lib/module/library/components/MediaMetadataHeader.js +175 -0
- package/lib/module/library/components/MediaMetadataHeader.js.map +1 -0
- package/lib/module/library/components/RecordAudioScreen.js +816 -0
- package/lib/module/library/components/RecordAudioScreen.js.map +1 -0
- package/lib/module/library/components/VideoPreview.js +453 -0
- package/lib/module/library/components/VideoPreview.js.map +1 -0
- package/lib/module/library/components/ViewerCounter.js +55 -0
- package/lib/module/library/components/ViewerCounter.js.map +1 -0
- package/lib/module/library/compressionEstimate.js +507 -0
- package/lib/module/library/compressionEstimate.js.map +1 -0
- package/lib/module/library/fileMetadata.js +196 -0
- package/lib/module/library/fileMetadata.js.map +1 -0
- package/lib/module/library/index.js +42 -0
- package/lib/module/library/index.js.map +1 -0
- package/lib/module/library/libraryIconRegistry.js +69 -0
- package/lib/module/library/libraryIconRegistry.js.map +1 -0
- package/lib/module/library/libraryIcons.js +858 -0
- package/lib/module/library/libraryIcons.js.map +1 -0
- package/lib/module/library/localizedFormat.js +181 -0
- package/lib/module/library/localizedFormat.js.map +1 -0
- package/lib/module/library/palette.js +225 -0
- package/lib/module/library/palette.js.map +1 -0
- package/lib/module/library/responsive.js +53 -0
- package/lib/module/library/responsive.js.map +1 -0
- package/lib/module/locales.js +416 -0
- package/lib/module/locales.js.map +1 -0
- package/lib/module/localization.js +1064 -0
- package/lib/module/localization.js.map +1 -0
- package/lib/module/logger.js +20 -0
- package/lib/module/logger.js.map +1 -0
- package/lib/module/lowMemoryCache.js +206 -0
- package/lib/module/lowMemoryCache.js.map +1 -0
- package/lib/module/mediaHistory.js +33 -0
- package/lib/module/mediaHistory.js.map +1 -0
- package/lib/module/mediaStorageService.js +402 -0
- package/lib/module/mediaStorageService.js.map +1 -0
- package/lib/module/memory.js +79 -0
- package/lib/module/memory.js.map +1 -0
- package/lib/module/nativeActions.js +307 -0
- package/lib/module/nativeActions.js.map +1 -0
- package/lib/module/nativeComponentSupport.js +61 -0
- package/lib/module/nativeComponentSupport.js.map +1 -0
- package/lib/module/networkPerformance.js +24 -0
- package/lib/module/networkPerformance.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/performance.js +104 -0
- package/lib/module/performance.js.map +1 -0
- package/lib/module/performanceMonitor.js +155 -0
- package/lib/module/performanceMonitor.js.map +1 -0
- package/lib/module/permissions.js +370 -0
- package/lib/module/permissions.js.map +1 -0
- package/lib/module/rendering.js +40 -0
- package/lib/module/rendering.js.map +1 -0
- package/lib/module/security.js +18 -0
- package/lib/module/security.js.map +1 -0
- package/lib/module/state.js +266 -0
- package/lib/module/state.js.map +1 -0
- package/lib/module/storage.js +400 -0
- package/lib/module/storage.js.map +1 -0
- package/lib/module/theme.js +390 -0
- package/lib/module/theme.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils.js +115 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/module/validation.js +288 -0
- package/lib/module/validation.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/AudioPlayerContext.d.ts +27 -0
- package/lib/typescript/src/AudioPlayerContext.d.ts.map +1 -0
- package/lib/typescript/src/CameraPreview.d.ts +13 -0
- package/lib/typescript/src/CameraPreview.d.ts.map +1 -0
- package/lib/typescript/src/NativeAnimatedImageView.d.ts +33 -0
- package/lib/typescript/src/NativeAnimatedImageView.d.ts.map +1 -0
- package/lib/typescript/src/NativeAudioPlayerView.d.ts +12 -0
- package/lib/typescript/src/NativeAudioPlayerView.d.ts.map +1 -0
- package/lib/typescript/src/NativeBlurView.d.ts +12 -0
- package/lib/typescript/src/NativeBlurView.d.ts.map +1 -0
- package/lib/typescript/src/NativeCustomCamera.d.ts +167 -0
- package/lib/typescript/src/NativeCustomCamera.d.ts.map +1 -0
- package/lib/typescript/src/NativeCustomCamera.web.d.ts +47 -0
- package/lib/typescript/src/NativeCustomCamera.web.d.ts.map +1 -0
- package/lib/typescript/src/NativeCustomVideoView.d.ts +30 -0
- package/lib/typescript/src/NativeCustomVideoView.d.ts.map +1 -0
- package/lib/typescript/src/NativeDocumentPreviewView.d.ts +48 -0
- package/lib/typescript/src/NativeDocumentPreviewView.d.ts.map +1 -0
- package/lib/typescript/src/NativeMediaThumbnailView.d.ts +54 -0
- package/lib/typescript/src/NativeMediaThumbnailView.d.ts.map +1 -0
- package/lib/typescript/src/NativeSvgIcon.d.ts +25 -0
- package/lib/typescript/src/NativeSvgIcon.d.ts.map +1 -0
- package/lib/typescript/src/ResponsivePreviewContainer.d.ts +92 -0
- package/lib/typescript/src/ResponsivePreviewContainer.d.ts.map +1 -0
- package/lib/typescript/src/accessibility.d.ts +20 -0
- package/lib/typescript/src/accessibility.d.ts.map +1 -0
- package/lib/typescript/src/config.d.ts +145 -0
- package/lib/typescript/src/config.d.ts.map +1 -0
- package/lib/typescript/src/cpuOptimization.d.ts +63 -0
- package/lib/typescript/src/cpuOptimization.d.ts.map +1 -0
- package/lib/typescript/src/db/DatabaseManager.d.ts +48 -0
- package/lib/typescript/src/db/DatabaseManager.d.ts.map +1 -0
- package/lib/typescript/src/db/MediaMapper.d.ts +77 -0
- package/lib/typescript/src/db/MediaMapper.d.ts.map +1 -0
- package/lib/typescript/src/db/MediaRepository.d.ts +66 -0
- package/lib/typescript/src/db/MediaRepository.d.ts.map +1 -0
- package/lib/typescript/src/db/index.d.ts +23 -0
- package/lib/typescript/src/db/index.d.ts.map +1 -0
- package/lib/typescript/src/db/migrations.d.ts +31 -0
- package/lib/typescript/src/db/migrations.d.ts.map +1 -0
- package/lib/typescript/src/db/secureKey.d.ts +10 -0
- package/lib/typescript/src/db/secureKey.d.ts.map +1 -0
- package/lib/typescript/src/db/types.d.ts +115 -0
- package/lib/typescript/src/db/types.d.ts.map +1 -0
- package/lib/typescript/src/db/useMediaDatabase.d.ts +41 -0
- package/lib/typescript/src/db/useMediaDatabase.d.ts.map +1 -0
- package/lib/typescript/src/defaultIcons.d.ts +139 -0
- package/lib/typescript/src/defaultIcons.d.ts.map +1 -0
- package/lib/typescript/src/deviceCapabilities.d.ts +92 -0
- package/lib/typescript/src/deviceCapabilities.d.ts.map +1 -0
- package/lib/typescript/src/errors.d.ts +95 -0
- package/lib/typescript/src/errors.d.ts.map +1 -0
- package/lib/typescript/src/iconConfig.d.ts +176 -0
- package/lib/typescript/src/iconConfig.d.ts.map +1 -0
- package/lib/typescript/src/icons.d.ts +217 -0
- package/lib/typescript/src/icons.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +104 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/library/MediaLibrary.d.ts +57 -0
- package/lib/typescript/src/library/MediaLibrary.d.ts.map +1 -0
- package/lib/typescript/src/library/MediaLibraryScreen.d.ts +51 -0
- package/lib/typescript/src/library/MediaLibraryScreen.d.ts.map +1 -0
- package/lib/typescript/src/library/components/AudioPreview.d.ts +6 -0
- package/lib/typescript/src/library/components/AudioPreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/DocumentPreview.d.ts +10 -0
- package/lib/typescript/src/library/components/DocumentPreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/ExpandableFab.d.ts +39 -0
- package/lib/typescript/src/library/components/ExpandableFab.d.ts.map +1 -0
- package/lib/typescript/src/library/components/FileTiles.d.ts +8 -0
- package/lib/typescript/src/library/components/FileTiles.d.ts.map +1 -0
- package/lib/typescript/src/library/components/ImagePreview.d.ts +5 -0
- package/lib/typescript/src/library/components/ImagePreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts +16 -0
- package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts.map +1 -0
- package/lib/typescript/src/library/components/RecordAudioScreen.d.ts +8 -0
- package/lib/typescript/src/library/components/RecordAudioScreen.d.ts.map +1 -0
- package/lib/typescript/src/library/components/VideoPreview.d.ts +20 -0
- package/lib/typescript/src/library/components/VideoPreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/ViewerCounter.d.ts +13 -0
- package/lib/typescript/src/library/components/ViewerCounter.d.ts.map +1 -0
- package/lib/typescript/src/library/compressionEstimate.d.ts +313 -0
- package/lib/typescript/src/library/compressionEstimate.d.ts.map +1 -0
- package/lib/typescript/src/library/fileMetadata.d.ts +33 -0
- package/lib/typescript/src/library/fileMetadata.d.ts.map +1 -0
- package/lib/typescript/src/library/index.d.ts +40 -0
- package/lib/typescript/src/library/index.d.ts.map +1 -0
- package/lib/typescript/src/library/libraryIconRegistry.d.ts +35 -0
- package/lib/typescript/src/library/libraryIconRegistry.d.ts.map +1 -0
- package/lib/typescript/src/library/libraryIcons.d.ts +85 -0
- package/lib/typescript/src/library/libraryIcons.d.ts.map +1 -0
- package/lib/typescript/src/library/localizedFormat.d.ts +49 -0
- package/lib/typescript/src/library/localizedFormat.d.ts.map +1 -0
- package/lib/typescript/src/library/palette.d.ts +104 -0
- package/lib/typescript/src/library/palette.d.ts.map +1 -0
- package/lib/typescript/src/library/responsive.d.ts +15 -0
- package/lib/typescript/src/library/responsive.d.ts.map +1 -0
- package/lib/typescript/src/locales.d.ts +103 -0
- package/lib/typescript/src/locales.d.ts.map +1 -0
- package/lib/typescript/src/localization.d.ts +1051 -0
- package/lib/typescript/src/localization.d.ts.map +1 -0
- package/lib/typescript/src/logger.d.ts +4 -0
- package/lib/typescript/src/logger.d.ts.map +1 -0
- package/lib/typescript/src/lowMemoryCache.d.ts +64 -0
- package/lib/typescript/src/lowMemoryCache.d.ts.map +1 -0
- package/lib/typescript/src/mediaHistory.d.ts +3 -0
- package/lib/typescript/src/mediaHistory.d.ts.map +1 -0
- package/lib/typescript/src/mediaStorageService.d.ts +155 -0
- package/lib/typescript/src/mediaStorageService.d.ts.map +1 -0
- package/lib/typescript/src/memory.d.ts +21 -0
- package/lib/typescript/src/memory.d.ts.map +1 -0
- package/lib/typescript/src/nativeActions.d.ts +174 -0
- package/lib/typescript/src/nativeActions.d.ts.map +1 -0
- package/lib/typescript/src/nativeComponentSupport.d.ts +30 -0
- package/lib/typescript/src/nativeComponentSupport.d.ts.map +1 -0
- package/lib/typescript/src/networkPerformance.d.ts +12 -0
- package/lib/typescript/src/networkPerformance.d.ts.map +1 -0
- package/lib/typescript/src/performance.d.ts +32 -0
- package/lib/typescript/src/performance.d.ts.map +1 -0
- package/lib/typescript/src/performanceMonitor.d.ts +45 -0
- package/lib/typescript/src/performanceMonitor.d.ts.map +1 -0
- package/lib/typescript/src/permissions.d.ts +132 -0
- package/lib/typescript/src/permissions.d.ts.map +1 -0
- package/lib/typescript/src/rendering.d.ts +9 -0
- package/lib/typescript/src/rendering.d.ts.map +1 -0
- package/lib/typescript/src/security.d.ts +6 -0
- package/lib/typescript/src/security.d.ts.map +1 -0
- package/lib/typescript/src/state.d.ts +102 -0
- package/lib/typescript/src/state.d.ts.map +1 -0
- package/lib/typescript/src/storage.d.ts +117 -0
- package/lib/typescript/src/storage.d.ts.map +1 -0
- package/lib/typescript/src/theme.d.ts +15 -0
- package/lib/typescript/src/theme.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +802 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils.d.ts +50 -0
- package/lib/typescript/src/utils.d.ts.map +1 -0
- package/lib/typescript/src/validation.d.ts +52 -0
- package/lib/typescript/src/validation.d.ts.map +1 -0
- package/package.json +204 -0
- package/react-native.config.js +17 -0
- package/src/AudioPlayerContext.tsx +220 -0
- package/src/CameraPreview.tsx +352 -0
- package/src/NativeAnimatedImageView.tsx +71 -0
- package/src/NativeAudioPlayerView.tsx +39 -0
- package/src/NativeBlurView.tsx +40 -0
- package/src/NativeCustomCamera.ts +305 -0
- package/src/NativeCustomCamera.web.ts +192 -0
- package/src/NativeCustomVideoView.ts +30 -0
- package/src/NativeDocumentPreviewView.tsx +196 -0
- package/src/NativeMediaThumbnailView.tsx +167 -0
- package/src/NativeSvgIcon.tsx +46 -0
- package/src/ResponsivePreviewContainer.tsx +227 -0
- package/src/accessibility.ts +80 -0
- package/src/config.ts +406 -0
- package/src/cpuOptimization.ts +365 -0
- package/src/db/DatabaseManager.ts +212 -0
- package/src/db/MediaMapper.ts +377 -0
- package/src/db/MediaRepository.ts +313 -0
- package/src/db/index.ts +73 -0
- package/src/db/migrations.ts +222 -0
- package/src/db/react-native-sqlcipher.d.ts +76 -0
- package/src/db/secureKey.ts +100 -0
- package/src/db/types.ts +123 -0
- package/src/db/useMediaDatabase.ts +191 -0
- package/src/defaultIcons.tsx +2390 -0
- package/src/deviceCapabilities.ts +438 -0
- package/src/errors.ts +350 -0
- package/src/iconConfig.tsx +962 -0
- package/src/icons.tsx +788 -0
- package/src/index.tsx +763 -0
- package/src/jest-globals.d.ts +9 -0
- package/src/library/MediaLibrary.tsx +141 -0
- package/src/library/MediaLibraryScreen.tsx +3003 -0
- package/src/library/components/AudioPreview.tsx +73 -0
- package/src/library/components/DocumentPreview.tsx +361 -0
- package/src/library/components/ExpandableFab.tsx +342 -0
- package/src/library/components/FileTiles.tsx +252 -0
- package/src/library/components/ImagePreview.tsx +72 -0
- package/src/library/components/MediaMetadataHeader.tsx +208 -0
- package/src/library/components/RecordAudioScreen.tsx +845 -0
- package/src/library/components/VideoPreview.tsx +478 -0
- package/src/library/components/ViewerCounter.tsx +71 -0
- package/src/library/compressionEstimate.ts +662 -0
- package/src/library/fileMetadata.ts +212 -0
- package/src/library/index.ts +66 -0
- package/src/library/libraryIconRegistry.tsx +86 -0
- package/src/library/libraryIcons.tsx +928 -0
- package/src/library/localizedFormat.ts +207 -0
- package/src/library/palette.ts +281 -0
- package/src/library/responsive.ts +49 -0
- package/src/locales.ts +381 -0
- package/src/localization.ts +1947 -0
- package/src/logger.ts +20 -0
- package/src/lowMemoryCache.ts +218 -0
- package/src/mediaHistory.ts +42 -0
- package/src/mediaStorageService.ts +546 -0
- package/src/memory.ts +102 -0
- package/src/nativeActions.ts +422 -0
- package/src/nativeComponentSupport.ts +60 -0
- package/src/networkPerformance.ts +30 -0
- package/src/performance.ts +137 -0
- package/src/performanceMonitor.ts +219 -0
- package/src/permissions.ts +403 -0
- package/src/rendering.ts +47 -0
- package/src/security.ts +19 -0
- package/src/state.ts +333 -0
- package/src/storage.ts +453 -0
- package/src/theme.tsx +467 -0
- package/src/types.ts +946 -0
- package/src/utils.ts +177 -0
- package/src/validation.ts +372 -0
package/src/locales.ts
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* locales.ts — the plugin's locale engine.
|
|
3
|
+
*
|
|
4
|
+
* This file is the ONLY place that knows how to interpret a language identifier.
|
|
5
|
+
* It is deliberately data-driven rather than language-driven: there is no list of
|
|
6
|
+
* "supported languages" anywhere in the plugin and no `switch (language)` branch.
|
|
7
|
+
* Anything that is a well-formed BCP-47 tag works, including every language the
|
|
8
|
+
* host app happens to support today and every one it adds later.
|
|
9
|
+
*
|
|
10
|
+
* What that means in practice:
|
|
11
|
+
*
|
|
12
|
+
* - Right-to-left is derived from the tag's *script*, either written explicitly
|
|
13
|
+
* (`ku-Arab`) or implied by the language subtag (`ar`, `fa`, `he`, `ur`, …).
|
|
14
|
+
* Adding Hebrew or Urdu to the host app needs no plugin change.
|
|
15
|
+
* - Region and script are peeled off one at a time to build a fallback chain,
|
|
16
|
+
* so `zh-Hans-CN` finds a `zh-Hans` bundle, and `pt-BR` finds a `pt` bundle.
|
|
17
|
+
* - Legacy and macro tags are folded onto their modern equivalents, because
|
|
18
|
+
* host i18n libraries disagree about them (`zh-CN` vs `zh-Hans`, `iw` vs `he`).
|
|
19
|
+
*
|
|
20
|
+
* The engine is pure and side-effect free. `localization.ts` owns the state.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** Canonical shape of a parsed language identifier. */
|
|
24
|
+
export interface ParsedLocale {
|
|
25
|
+
/** Lowercase ISO-639 language subtag, e.g. `zh`. Empty for an unusable tag. */
|
|
26
|
+
language: string;
|
|
27
|
+
/** Title-case ISO-15924 script subtag, e.g. `Hans`. Empty when absent. */
|
|
28
|
+
script: string;
|
|
29
|
+
/** Uppercase ISO-3166 region subtag, e.g. `CN`. Empty when absent. */
|
|
30
|
+
region: string;
|
|
31
|
+
/** The normalized tag these three parts recombine into, e.g. `zh-Hans-CN`. */
|
|
32
|
+
tag: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The locale used whenever the host has not told us anything else. */
|
|
36
|
+
export const DEFAULT_LOCALE = 'en';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* ISO-15924 scripts written right-to-left.
|
|
40
|
+
*
|
|
41
|
+
* This is the primary RTL signal. A tag that names its script (`ku-Arab`,
|
|
42
|
+
* `pa-Arab`, `sr-Hebr`) is classified from this set alone, which is why the
|
|
43
|
+
* plugin needs no per-language RTL table for scripts it has never seen.
|
|
44
|
+
*/
|
|
45
|
+
export const RTL_SCRIPTS: ReadonlySet<string> = new Set([
|
|
46
|
+
'Adlm', // Adlam
|
|
47
|
+
'Arab', // Arabic
|
|
48
|
+
'Aran', // Nastaliq variant of Arabic
|
|
49
|
+
'Armi', // Imperial Aramaic
|
|
50
|
+
'Avst', // Avestan
|
|
51
|
+
'Cprt', // Cypriot
|
|
52
|
+
'Egyp', // Egyptian hieroglyphs
|
|
53
|
+
'Hatr', // Hatran
|
|
54
|
+
'Hebr', // Hebrew
|
|
55
|
+
'Hung', // Old Hungarian
|
|
56
|
+
'Khar', // Kharoshthi
|
|
57
|
+
'Lydi', // Lydian
|
|
58
|
+
'Mand', // Mandaic
|
|
59
|
+
'Mani', // Manichaean
|
|
60
|
+
'Mend', // Mende Kikakui
|
|
61
|
+
'Merc', // Meroitic cursive
|
|
62
|
+
'Mero', // Meroitic hieroglyphs
|
|
63
|
+
'Narb', // Old North Arabian
|
|
64
|
+
'Nbat', // Nabataean
|
|
65
|
+
'Nkoo', // N'Ko
|
|
66
|
+
'Orkh', // Old Turkic
|
|
67
|
+
'Palm', // Palmyrene
|
|
68
|
+
'Phli', // Inscriptional Pahlavi
|
|
69
|
+
'Phlp', // Psalter Pahlavi
|
|
70
|
+
'Phnx', // Phoenician
|
|
71
|
+
'Prti', // Inscriptional Parthian
|
|
72
|
+
'Rohg', // Hanifi Rohingya
|
|
73
|
+
'Samr', // Samaritan
|
|
74
|
+
'Sarb', // Old South Arabian
|
|
75
|
+
'Sogd', // Sogdian
|
|
76
|
+
'Sogo', // Old Sogdian
|
|
77
|
+
'Syrc', // Syriac
|
|
78
|
+
'Thaa', // Thaana
|
|
79
|
+
'Yezi', // Yezidi
|
|
80
|
+
]);
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Languages whose default script is right-to-left.
|
|
84
|
+
*
|
|
85
|
+
* Used only when the tag does not name a script — `fa` has to resolve to RTL
|
|
86
|
+
* without the host having to write `fa-Arab`. Each entry is the *language*
|
|
87
|
+
* subtag; regions never change direction, so `ar-EG` and `ar` behave the same.
|
|
88
|
+
*
|
|
89
|
+
* Of the languages a typical host app ships, Arabic (`ar`) and Persian/Farsi
|
|
90
|
+
* (`fa`) are the RTL ones. The rest of this set costs nothing and means Hebrew,
|
|
91
|
+
* Urdu, Kurdish and friends work the day the host adds them.
|
|
92
|
+
*/
|
|
93
|
+
export const RTL_LANGUAGES: ReadonlySet<string> = new Set([
|
|
94
|
+
'ar', // Arabic
|
|
95
|
+
'arc', // Aramaic
|
|
96
|
+
'ary', // Moroccan Arabic
|
|
97
|
+
'arz', // Egyptian Arabic
|
|
98
|
+
'ckb', // Central Kurdish / Sorani
|
|
99
|
+
'dv', // Divehi
|
|
100
|
+
'fa', // Persian / Farsi
|
|
101
|
+
'he', // Hebrew
|
|
102
|
+
'iw', // Hebrew (deprecated code, still emitted by older libraries)
|
|
103
|
+
'ji', // Yiddish (deprecated code)
|
|
104
|
+
'kmr', // Northern Kurdish
|
|
105
|
+
'ks', // Kashmiri
|
|
106
|
+
'ku', // Kurdish
|
|
107
|
+
'mzn', // Mazanderani
|
|
108
|
+
'nqo', // N'Ko
|
|
109
|
+
'pnb', // Western Punjabi
|
|
110
|
+
'prs', // Dari
|
|
111
|
+
'ps', // Pashto
|
|
112
|
+
'sd', // Sindhi
|
|
113
|
+
'skr', // Saraiki
|
|
114
|
+
'syr', // Syriac
|
|
115
|
+
'ug', // Uyghur
|
|
116
|
+
'ur', // Urdu
|
|
117
|
+
'yi', // Yiddish
|
|
118
|
+
]);
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Tags that host i18n libraries spell differently from the modern canonical form.
|
|
122
|
+
*
|
|
123
|
+
* The left side is a lowercased tag as it might arrive; the right side is what
|
|
124
|
+
* the plugin resolves it to. This exists because a host that says `zh-CN` and a
|
|
125
|
+
* host that says `zh-Hans` mean the same language, and bundles should not have
|
|
126
|
+
* to be registered twice.
|
|
127
|
+
*/
|
|
128
|
+
const LOCALE_ALIASES: Readonly<Record<string, string>> = {
|
|
129
|
+
// Chinese: region-style tags are by far the most common way hosts spell
|
|
130
|
+
// Simplified and Traditional, but the script is what actually selects the text.
|
|
131
|
+
'zh-cn': 'zh-Hans-CN',
|
|
132
|
+
'zh-sg': 'zh-Hans-SG',
|
|
133
|
+
'zh-my': 'zh-Hans-MY',
|
|
134
|
+
'zh-tw': 'zh-Hant-TW',
|
|
135
|
+
'zh-hk': 'zh-Hant-HK',
|
|
136
|
+
'zh-mo': 'zh-Hant-MO',
|
|
137
|
+
'zh-chs': 'zh-Hans',
|
|
138
|
+
'zh-cht': 'zh-Hant',
|
|
139
|
+
'zh-simplified': 'zh-Hans',
|
|
140
|
+
'zh-traditional': 'zh-Hant',
|
|
141
|
+
// Deprecated ISO-639 codes still emitted by older i18n stacks.
|
|
142
|
+
'iw': 'he',
|
|
143
|
+
'ji': 'yi',
|
|
144
|
+
'in': 'id',
|
|
145
|
+
'mo': 'ro',
|
|
146
|
+
'tl': 'fil',
|
|
147
|
+
// Persian and Dari.
|
|
148
|
+
'per': 'fa',
|
|
149
|
+
'fas': 'fa',
|
|
150
|
+
'prs': 'fa-AF',
|
|
151
|
+
// Other three-letter forms that occasionally show up.
|
|
152
|
+
'ara': 'ar',
|
|
153
|
+
'ben': 'bn',
|
|
154
|
+
'zho': 'zh',
|
|
155
|
+
'chi': 'zh',
|
|
156
|
+
'dan': 'da',
|
|
157
|
+
'deu': 'de',
|
|
158
|
+
'ger': 'de',
|
|
159
|
+
'fra': 'fr',
|
|
160
|
+
'fre': 'fr',
|
|
161
|
+
'hin': 'hi',
|
|
162
|
+
'ita': 'it',
|
|
163
|
+
'jpn': 'ja',
|
|
164
|
+
'kor': 'ko',
|
|
165
|
+
'pol': 'pl',
|
|
166
|
+
'por': 'pt',
|
|
167
|
+
'ron': 'ro',
|
|
168
|
+
'rum': 'ro',
|
|
169
|
+
'rus': 'ru',
|
|
170
|
+
'spa': 'es',
|
|
171
|
+
'swe': 'sv',
|
|
172
|
+
'tur': 'tr',
|
|
173
|
+
'ukr': 'uk',
|
|
174
|
+
'vie': 'vi',
|
|
175
|
+
'eng': 'en',
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
/** Splits on the separators host apps actually use: `-`, `_` and `.` */
|
|
179
|
+
const SEPARATORS = /[-_.]+/;
|
|
180
|
+
|
|
181
|
+
function titleCaseScript(value: string): string {
|
|
182
|
+
const head = value.charAt(0).toUpperCase();
|
|
183
|
+
return head + value.slice(1).toLowerCase();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Reduces any language identifier to a canonical BCP-47-ish tag.
|
|
188
|
+
*
|
|
189
|
+
* Accepts what hosts really pass: `en`, `en-US`, `en_us`, `EN-us`, `zh_CN`,
|
|
190
|
+
* `pt-BR.UTF-8`, `fa-IR`, and returns `en`, `en-US`, `en-US`, `en-US`,
|
|
191
|
+
* `zh-Hans-CN`, `pt-BR`, `fa-IR`. Returns an empty string for junk so callers
|
|
192
|
+
* can fall back rather than guess.
|
|
193
|
+
*/
|
|
194
|
+
export function normalizeLocale(input?: string | null): string {
|
|
195
|
+
if (typeof input !== 'string') return '';
|
|
196
|
+
|
|
197
|
+
const trimmed = input.trim();
|
|
198
|
+
if (trimmed.length === 0) return '';
|
|
199
|
+
|
|
200
|
+
// Strip POSIX charset/modifier suffixes: `ar_EG.UTF-8@calendar=islamic`.
|
|
201
|
+
const withoutModifier = trimmed.split('@')[0] ?? '';
|
|
202
|
+
const cleaned = withoutModifier.replace(/\.(utf-?8|iso[\w-]*)$/i, '');
|
|
203
|
+
|
|
204
|
+
const direct = LOCALE_ALIASES[cleaned.toLowerCase()];
|
|
205
|
+
if (direct) return direct;
|
|
206
|
+
|
|
207
|
+
const parts = cleaned.split(SEPARATORS).filter((part) => part.length > 0);
|
|
208
|
+
const rawLanguage = parts.shift();
|
|
209
|
+
if (!rawLanguage) return '';
|
|
210
|
+
|
|
211
|
+
const language = rawLanguage.toLowerCase();
|
|
212
|
+
if (!/^[a-z]{2,8}$/.test(language)) return '';
|
|
213
|
+
|
|
214
|
+
let script = '';
|
|
215
|
+
let region = '';
|
|
216
|
+
|
|
217
|
+
for (const part of parts) {
|
|
218
|
+
if (!script && /^[a-z]{4}$/i.test(part)) {
|
|
219
|
+
script = titleCaseScript(part);
|
|
220
|
+
} else if (!region && /^([a-z]{2}|\d{3})$/i.test(part)) {
|
|
221
|
+
region = part.toUpperCase();
|
|
222
|
+
}
|
|
223
|
+
// Variants, extensions and private-use subtags are dropped: they never
|
|
224
|
+
// affect which translation bundle or text direction the plugin should use.
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const rebuilt = [language, script, region].filter(Boolean).join('-');
|
|
228
|
+
|
|
229
|
+
// Re-check aliases now that the shape is canonical, so `ZH_cn` also folds.
|
|
230
|
+
const aliased = LOCALE_ALIASES[rebuilt.toLowerCase()];
|
|
231
|
+
return aliased ?? rebuilt;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** Breaks a language identifier into its language / script / region parts. */
|
|
235
|
+
export function parseLocale(input?: string | null): ParsedLocale {
|
|
236
|
+
const tag = normalizeLocale(input);
|
|
237
|
+
if (tag.length === 0) {
|
|
238
|
+
return { language: '', script: '', region: '', tag: '' };
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const parts = tag.split('-');
|
|
242
|
+
const language = (parts[0] ?? '').toLowerCase();
|
|
243
|
+
let script = '';
|
|
244
|
+
let region = '';
|
|
245
|
+
|
|
246
|
+
for (const part of parts.slice(1)) {
|
|
247
|
+
if (part.length === 4) script = titleCaseScript(part);
|
|
248
|
+
else region = part.toUpperCase();
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return { language, script, region, tag };
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* True when text in this locale reads right-to-left.
|
|
256
|
+
*
|
|
257
|
+
* Script wins when present (`ku-Arab` is RTL even though bare `ku` may be
|
|
258
|
+
* written either way in practice); otherwise the language's default script
|
|
259
|
+
* decides. An unrecognised or empty tag is left-to-right, matching the
|
|
260
|
+
* English fallback.
|
|
261
|
+
*/
|
|
262
|
+
export function isRtlLocale(input?: string | null): boolean {
|
|
263
|
+
const { language, script } = parseLocale(input);
|
|
264
|
+
if (language.length === 0) return false;
|
|
265
|
+
|
|
266
|
+
// An explicit script is authoritative: `ku-Arab` is RTL, `ku-Latn` is not,
|
|
267
|
+
// and a script the plugin has never seen still resolves correctly.
|
|
268
|
+
if (script.length > 0) return RTL_SCRIPTS.has(script);
|
|
269
|
+
|
|
270
|
+
return RTL_LANGUAGES.has(language);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Ordered list of tags to try for a locale, most specific first.
|
|
275
|
+
*
|
|
276
|
+
* `zh-Hans-CN` → `['zh-Hans-CN', 'zh-Hans', 'zh-CN', 'zh', 'en']`
|
|
277
|
+
* `pt-BR` → `['pt-BR', 'pt', 'en']`
|
|
278
|
+
* `fa` → `['fa', 'en']`
|
|
279
|
+
*
|
|
280
|
+
* The fallback locale is appended last and deduplicated, so a bundle registered
|
|
281
|
+
* under any of these spellings is found. English stays the final fallback.
|
|
282
|
+
*/
|
|
283
|
+
export function localeFallbackChain(
|
|
284
|
+
input?: string | null,
|
|
285
|
+
fallbackLocale: string = DEFAULT_LOCALE
|
|
286
|
+
): string[] {
|
|
287
|
+
const { language, script, region, tag } = parseLocale(input);
|
|
288
|
+
const chain: string[] = [];
|
|
289
|
+
|
|
290
|
+
const push = (candidate: string) => {
|
|
291
|
+
if (candidate.length > 0 && !chain.includes(candidate)) {
|
|
292
|
+
chain.push(candidate);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// Script outranks region: a `zh-Hans` bundle is a far better match for
|
|
297
|
+
// `zh-Hans-CN` than a `zh-CN` one, even though both drop a single subtag.
|
|
298
|
+
push(tag);
|
|
299
|
+
if (script.length > 0) push(`${language}-${script}`);
|
|
300
|
+
if (region.length > 0) push(`${language}-${region}`);
|
|
301
|
+
push(language);
|
|
302
|
+
|
|
303
|
+
const fallback = normalizeLocale(fallbackLocale);
|
|
304
|
+
if (fallback.length > 0) {
|
|
305
|
+
const parsedFallback = parseLocale(fallback);
|
|
306
|
+
push(parsedFallback.tag);
|
|
307
|
+
push(parsedFallback.language);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
push(DEFAULT_LOCALE);
|
|
311
|
+
|
|
312
|
+
return chain;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Picks the best matching key out of a locale-keyed record.
|
|
317
|
+
*
|
|
318
|
+
* Lookups are case-insensitive and separator-insensitive, so a bundle
|
|
319
|
+
* registered as `zh_TW`, `zh-tw` or `zh-Hant-TW` is all found by the same
|
|
320
|
+
* request. Returns `undefined` when nothing in the chain matches.
|
|
321
|
+
*/
|
|
322
|
+
export function matchLocaleKey<T>(
|
|
323
|
+
locale: string | null | undefined,
|
|
324
|
+
entries: Readonly<Record<string, T>> | undefined,
|
|
325
|
+
fallbackLocale: string = DEFAULT_LOCALE
|
|
326
|
+
): string | undefined {
|
|
327
|
+
if (!entries) return undefined;
|
|
328
|
+
|
|
329
|
+
// Index the record by normalized tag once, so host spelling never matters.
|
|
330
|
+
const index = new Map<string, string>();
|
|
331
|
+
for (const key of Object.keys(entries)) {
|
|
332
|
+
const normalized = normalizeLocale(key).toLowerCase();
|
|
333
|
+
if (normalized.length > 0 && !index.has(normalized)) {
|
|
334
|
+
index.set(normalized, key);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
for (const candidate of localeFallbackChain(locale, fallbackLocale)) {
|
|
339
|
+
const hit = index.get(candidate.toLowerCase());
|
|
340
|
+
if (hit !== undefined) return hit;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return undefined;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Merges every bundle along the fallback chain into one map.
|
|
348
|
+
*
|
|
349
|
+
* Least specific wins first and is then overwritten by more specific entries,
|
|
350
|
+
* so a `zh` bundle can carry the shared strings while `zh-Hant` overrides only
|
|
351
|
+
* the handful that differ. Missing keys simply stay missing here — the caller
|
|
352
|
+
* layers this on top of the shipped English defaults.
|
|
353
|
+
*/
|
|
354
|
+
export function resolveLocaleTranslations<T extends object>(
|
|
355
|
+
locale: string | null | undefined,
|
|
356
|
+
bundles: Readonly<Record<string, T>> | undefined,
|
|
357
|
+
fallbackLocale: string = DEFAULT_LOCALE
|
|
358
|
+
): Partial<T> {
|
|
359
|
+
if (!bundles) return {};
|
|
360
|
+
|
|
361
|
+
const index = new Map<string, T>();
|
|
362
|
+
for (const [key, value] of Object.entries(bundles)) {
|
|
363
|
+
const normalized = normalizeLocale(key).toLowerCase();
|
|
364
|
+
if (normalized.length > 0 && !index.has(normalized)) {
|
|
365
|
+
index.set(normalized, value);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const chain = localeFallbackChain(locale, fallbackLocale);
|
|
370
|
+
let merged: Partial<T> = {};
|
|
371
|
+
|
|
372
|
+
// Walk the chain backwards: broadest first, most specific applied last.
|
|
373
|
+
for (let i = chain.length - 1; i >= 0; i -= 1) {
|
|
374
|
+
const candidate = chain[i];
|
|
375
|
+
if (candidate === undefined) continue;
|
|
376
|
+
const bundle = index.get(candidate.toLowerCase());
|
|
377
|
+
if (bundle) merged = { ...merged, ...bundle };
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return merged;
|
|
381
|
+
}
|