diff --git a/OSGKeyboard/AppIcon.icon/Assets/App Icon Template.svg b/OSGKeyboard/AppIcon.icon/Assets/App Icon Template.svg new file mode 100644 index 0000000..92bd30d --- /dev/null +++ b/OSGKeyboard/AppIcon.icon/Assets/App Icon Template.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSGKeyboard/AppIcon.icon/icon.json b/OSGKeyboard/AppIcon.icon/icon.json new file mode 100644 index 0000000..8608d5d --- /dev/null +++ b/OSGKeyboard/AppIcon.icon/icon.json @@ -0,0 +1,41 @@ +{ + "fill" : { + "linear-gradient" : [ + "extended-gray:0.25000,1.00000", + "display-p3:0.13763,0.15253,0.17418,1.00000" + ] + }, + "groups" : [ + { + "blur-material" : null, + "hidden" : false, + "layers" : [ + { + "fill" : "none", + "hidden" : false, + "image-name" : "App Icon Template.svg", + "name" : "App Icon Template", + "opacity" : 1 + } + ], + "lighting" : "individual", + "shadow" : { + "kind" : "none", + "opacity" : 0.5 + }, + "specular" : false, + "translucency" : { + "enabled" : false, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : [ + "iOS" + ] + } +} \ No newline at end of file diff --git a/OSGKeyboardExt/Utilities/ExtL10n.swift b/OSGKeyboardExt/Utilities/ExtL10n.swift index 0bb5f14..61cb664 100644 --- a/OSGKeyboardExt/Utilities/ExtL10n.swift +++ b/OSGKeyboardExt/Utilities/ExtL10n.swift @@ -1,17 +1,26 @@ // ExtL10n.swift // OSGKeyboard · Keyboard Extension // -// Loads strings from the keyboard extension bundle (not SwiftUI's default -// bundle, which may not see our Localizable.strings). +// Loads strings from Keyboard.strings in the extension bundle. We use a +// dedicated strings table (not Localizable.strings) because XcodeGen merges +// duplicate Localizable.strings variant groups into the main app target only. import Foundation import SwiftUI enum ExtL10n { + private static let table = "Keyboard" private static let bundle = Bundle(for: KeyboardViewController.self) static func string(_ key: String) -> String { - NSLocalizedString(key, bundle: bundle, comment: "") + let value = NSLocalizedString( + key, + tableName: table, + bundle: bundle, + value: key, + comment: "" + ) + return value } static func text(_ key: String) -> Text { diff --git a/OSGKeyboardExt/en.lproj/Localizable.strings b/OSGKeyboardExt/en.lproj/Keyboard.strings similarity index 100% rename from OSGKeyboardExt/en.lproj/Localizable.strings rename to OSGKeyboardExt/en.lproj/Keyboard.strings diff --git a/OSGKeyboardExt/zh-Hans.lproj/Localizable.strings b/OSGKeyboardExt/zh-Hans.lproj/Keyboard.strings similarity index 100% rename from OSGKeyboardExt/zh-Hans.lproj/Localizable.strings rename to OSGKeyboardExt/zh-Hans.lproj/Keyboard.strings diff --git a/docs/index.html b/docs/index.html index f1c377b..b49fada 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,172 +3,845 @@ - OSGKeyboard - + OSGKeyboard — Voice dictation keyboard for iOS + + -
-
-
- OSGKeyboard app icon + + + + +
+
+
-

OSGKeyboard

-

Tap to talk. Polished text in any app.

+
Open source · iOS 26+
+

Hold to talk.
Polished text in any app.

+

+ A custom keyboard that transcribes your voice on-device and optionally polishes the result with the LLM you configure — WeChat, Notes, Mail, ChatGPT, and everywhere else you type. +

+ +
+ On-device ASR + Bring your own API + Zero dependencies +
+
+ +
+
+ +
+
+
9:41●●●
+
+

Notes

+

OSGKeyboard active

+
+ Tomorrow at 3 PM, sync with the design team on the new onboarding flow. Send the draft before lunch. +
+
+
+
+
+
+
+ +
+
+
+
-

中文

-
+ -
-

Voice dictation keyboard for iOS

-

- OSGKeyboard is a custom keyboard extension that transcribes your voice on-device - and optionally polishes the result through an LLM you configure. - Works in WeChat, Notes, Mail, ChatGPT, and anywhere a keyboard appears. -

- -
- -
-

Privacy at a glance

-

- Audio is processed on your device for transcription. We do not log ordinary keystrokes. - In Cloud polish mode, only the transcribed text (not audio) is sent to your chosen API provider. -

- -
- - - -
- -
-
- OSGKeyboard 应用图标 -
-

OSGKeyboard

-

点按说话,任意 App 里获得润色文字。

+
+
+
+

Built for real typing workflows

+

Native SwiftUI, privacy-first architecture, and a Typeless-style push-to-talk experience.

+
+
+
+ +

Push-to-talk

+

Press and hold the mic key, speak naturally, release — polished text lands at your cursor.

+
+
+ +

On-device ASR

+

Speech stays on your iPhone. Apple's on-device speech stack handles transcription — audio never leaves the device.

+
+
+ +

AI polish

+

Optional cloud pass adds punctuation, structure, and clarity. Only the transcript is sent — not your voice.

+
+
+ +

Bring your own API

+

Works with any OpenAI-compatible endpoint: OpenAI, DeepSeek, Qwen DashScope, or your own server.

+
+
+ +

Privacy first

+

No ordinary keystroke logging. You choose when cloud polish runs and which provider receives text.

+
+
+ +

Lean & native

+

Pure Swift 6 and SwiftUI — no CocoaPods, no Carthage, no third-party packages.

+
-
+ -
-

iOS 语音输入键盘

-

- OSGKeyboard 是一款自定义键盘扩展:在设备端转写语音,并可选通过你配置的 LLM 润色结果。 - 适用于微信、备忘录、邮件、ChatGPT 等所有出现键盘的场景。 -

- + -
-

隐私摘要

-

- 音频在设备端转写。我们不会记录普通击键内容。 - 云端润色模式下,仅发送转写文字(非音频)到你选择的 API 服务商。 -

- + + - -
+ + + diff --git a/project.yml b/project.yml index ac870be..2bb16df 100644 --- a/project.yml +++ b/project.yml @@ -118,9 +118,12 @@ targets: excludes: - "en.lproj" - "zh-Hans.lproj" + - path: OSGKeyboardExt/en.lproj/Keyboard.strings + buildPhase: resources + - path: OSGKeyboardExt/zh-Hans.lproj/Keyboard.strings + buildPhase: resources resources: - - path: OSGKeyboardExt/en.lproj - - path: OSGKeyboardExt/zh-Hans.lproj + - path: OSGKeyboardExt/PrivacyInfo.xcprivacy settings: base: IPHONEOS_DEPLOYMENT_TARGET: "26.0"