Add English as an overlay localization following the device language,
keeping Simplified Chinese as the base/development language. Untranslated
strings fall back to Chinese automatically.
- project.yml: set developmentLanguage zh-Hans and knownRegions (zh-Hans/en/Base)
- Resources/en.lproj/{Localizable,InfoPlist}.strings: ~230 English strings
- Resources/zh-Hans.lproj/InfoPlist.strings: Chinese permission prompts
- Restructure ternary Text/Label and String-typed UI messages so they
localize (String(localized:), LocalizedStringKey helper params); replace
a .contains("通过") success check with a dedicated flag
- Localize user-facing model/coordinator/error messages across App and Shared
Internal RuntimeLogger logs and diagnostic/report bodies remain in Chinese.
Third-party mode no longer probes /wloc-settings/version or capability
metadata since the upstream scripts are unmaintained. Settings now show:
- APP mode: motion-state simulation toggle only
- third-party mode: random-perturbation (randomRadius) toggle only
save() sends randomRadius so upstream wloc.js applies the offset.
- subscription URLs now resolve directly to upstream modules (gh-proxy
mirror / raw), dropping project-owned module and script copies
- remove Resources/ThirdPartyProxyModules and ThirdParty/WlocScripts,
their pbxproj references, and the contract-test module checks
- third-party save sends lon/lat/acc matching the upstream settings
script; motion-state simulation is unavailable (upstream lacks it)
- surface the iOS 27 beta 6 gs-loc MITM limitation in the app setup and
README (zh/en)
All five module files now match Yu9191/wloc exactly (author, description,
icon, wloc-settings/save pattern, argument config). The only difference is
the mirror variant wraps GitHub Raw URLs in gh-proxy for regions where raw
is unreachable.
The upstream wloc.js already applies randomRadius. Surf/Loon/Stash/
Shadowrocket modules now pass the perturbation argument through so users
can configure it in the proxy client UI (QX rewrite cannot carry args).
Modules now load wloc.js and wloc-settings.js directly from Yu9191/wloc
(raw for direct, gh-proxy for the mirror path) instead of the project's
own dist copies, so proxy clients run the battle-tested upstream scripts.
The Shadowrocket module also carries the upstream argument config and icon.
Vendor the Yu9191/wloc dist scripts so the third-party modules run the
battle-tested response/settings handlers instead of the rewritten ones.
The upstream scripts read the wloc_settings key, module $argument, and
handle the save/query/clear settings endpoints.
Devices in China can send clls/wloc requests to gsp-ssl.ls.apple.com or
bluedot.is.autonavi.com instead of gs-loc.apple.com, so the third-party
modules only MITM'd gs-loc hosts and silently failed to spoof location.
- Add gsp-ssl.ls.apple.com, bluedot.is.autonavi.com and
bluedot.is.autonavi.com.gds.alibabadns.com to all 10 module files
(pattern + MITM hostname) and to the built-in proxy isWlocHost
- Update app interceptionHostnames and the copy-hostnames guidance
- Bump module subscription version to 1.0.1 to bust proxy client cache