diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bd28dc..7c2ab02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ### Removed - Full Disk Access detection, guide alert, and settings UI - `PermissionChecker.hasFullDiskAccess()` and related FDA methods +- Language picker in Settings (language is now fully auto-detected) +- Custom language detection logic (`AppLanguage` enum, `currentLanguage`, `localizedBundle`) ## [2.0.4] - 2026-07-05 diff --git a/CLAUDE.md b/CLAUDE.md index 40ad139..07b8ec3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -134,6 +134,14 @@ When working with files outside app sandbox: - Category parameter should describe the subsystem - Example: `@AppLog(category: "AppState") private var logger` +### Localization +- Default language is **English** (also the fallback) +- **Simplified Chinese** (`zh-Hans`) is the primary localization target +- **Japanese** (`ja`) is supported — activated when system language is Japanese +- All string keys in code use English, localized via `Localizable.xcstrings` (xcstrings format) +- Language detection is fully automatic via `Bundle.main.localizedString` — no manual language picker +- To add a new language: add entries to `Localizable.xcstrings` and register in Xcode project + ### Data Persistence - SwiftData models use `@Model` macro - Shared container via app group: `.group` `UserDefaults` diff --git a/RClick.xcodeproj/project.pbxproj b/RClick.xcodeproj/project.pbxproj index 84351be..602e611 100644 --- a/RClick.xcodeproj/project.pbxproj +++ b/RClick.xcodeproj/project.pbxproj @@ -559,7 +559,7 @@ CODE_SIGN_ENTITLEMENTS = RClick/RClickDebug.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260705001; + CURRENT_PROJECT_VERSION = 20260712001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -575,7 +575,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.4; + MARKETING_VERSION = 2.1.0; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -597,7 +597,7 @@ CODE_SIGN_ENTITLEMENTS = RClick/RClick.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260705001; + CURRENT_PROJECT_VERSION = 20260712001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -613,7 +613,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.4; + MARKETING_VERSION = 2.1.0; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -676,7 +676,7 @@ CODE_SIGN_ENTITLEMENTS = FinderSyncExt/FinderSyncExt.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260705001; + CURRENT_PROJECT_VERSION = 20260712001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -692,7 +692,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.4; + MARKETING_VERSION = 2.1.0; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick.FinderSyncExt; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -711,7 +711,7 @@ CODE_SIGN_ENTITLEMENTS = FinderSyncExt/FinderSyncExt.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260705001; + CURRENT_PROJECT_VERSION = 20260712001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -727,7 +727,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.4; + MARKETING_VERSION = 2.1.0; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick.FinderSyncExt; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; diff --git a/README.md b/README.md index f3708eb..a63ba01 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ [![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE) [![GitHub release](https://img.shields.io/github/v/release/wflixu/RClick)](https://github.com/wflixu/RClick/releases) [![GitHub downloads](https://img.shields.io/github/downloads/wflixu/RClick/total)](https://github.com/wflixu/RClick/releases) -[⭐ Star History](https://star-history.com/#wflixu/RClick&Date) Enhance your macOS Finder context menu with custom actions. Built with Swift 6.2 and SwiftUI for macOS 15.6+. Full dark mode support with adaptive icons. @@ -91,6 +90,22 @@ xcodebuild -project RClick.xcodeproj -scheme RClick -configuration Release - **FinderSync** framework for Finder extension - **DistributedNotificationCenter** for IPC +### 🌐 Localization + +RClick supports three languages with the following priority: + +| Language | Code | Notes | +|----------|------|-------| +| **English** | `en` | Default/base language | +| **Simplified Chinese** | `zh-Hans` | Primary localization target | +| **Japanese** | `ja` | Activated when system language is Japanese | + +**Principles:** +- Default language is English (also the fallback for unsupported system languages) +- All string keys are in English in the code, localized via `Localizable.xcstrings` +- System language is auto-detected — no manual language picker in the app +- To add a new language, add an entry to `Localizable.xcstrings` and register it in the Xcode project + ## 👥 Contributors Thanks to all the people who have contributed to RClick! @@ -99,10 +114,6 @@ Thanks to all the people who have contributed to RClick! -## 📈 Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=wflixu/RClick&type=Date)](https://star-history.com/#wflixu/RClick&Date) - ## Similar Projects - [SzContext](https://github.com/RoadToDream/SzContext)