select the language from registry

This commit is contained in:
RomikB
2025-03-13 19:44:10 +02:00
parent a9cee076bc
commit fb42168fbb
4 changed files with 88 additions and 0 deletions
+1
View File
@@ -18,6 +18,7 @@ In addition to this [`README.md`](README.md), the following documents are also a
- [`buildrun.md`](docs/buildrun.md) – Instructions on building, localizing, running, and developing for this repository.
- [`enterprise.md`](docs/enterprise.md) – A summary of various features and tips for making the application usable in enterprise settings.
- [`netquirk.md`](docs/netquirk.md) – A description of various networking quirks and "kill-switch" semantics.
- [`userregistry.md`](docs/userregistry.md) – A list of registry keys settable by the user for changing the behavior of the application.
## License
+9
View File
@@ -0,0 +1,9 @@
# Registry Keys for Users
#### `HKCU\Software\AmneziaWG\Language`
When this key is set, the UI will try to use the specified language as display language.
```
> reg add HKCU\Software\AmneziaWG /v LimitedOperatorUI /t REG_SZ /d "en" /f
```
+13
View File
@@ -8,11 +8,16 @@ package l18n
import (
"sync"
"github.com/amnezia-vpn/amneziawg-windows-client/services"
"golang.org/x/sys/windows"
"golang.org/x/text/language"
"golang.org/x/text/message"
)
const (
LanguageUserKey = "Language"
)
var (
printer *message.Printer
printerLock sync.Mutex
@@ -35,6 +40,14 @@ func prn() *message.Printer {
// lang returns the user preferred UI language we have most confident translation in the default catalog available.
func lang() (tag language.Tag) {
keyString, res := services.UserKeyString(LanguageUserKey)
if res {
keyTag := message.MatchLanguage(keyString)
if keyTag.String() == keyString {
tag = keyTag
return
}
}
tag = language.English
confidence := language.No
languages, err := windows.GetUserPreferredUILanguages(windows.MUI_LANGUAGE_NAME)
+65
View File
@@ -0,0 +1,65 @@
package services
import (
"golang.org/x/sys/windows/registry"
)
const userRegKey = `Software\AmneziaWG`
var userKey registry.Key
func openUserKey() (registry.Key, error) {
if userKey != 0 {
return userKey, nil
}
var err error
userKey, err = registry.OpenKey(registry.CURRENT_USER, userRegKey, registry.QUERY_VALUE)
if err != nil {
return 0, err
}
return userKey, nil
}
func createUserKey() (registry.Key, error) {
closeUserKey()
var err error
userKey, _, err = registry.CreateKey(registry.CURRENT_USER, userRegKey, registry.SET_VALUE)
if err != nil {
return 0, err
}
return userKey, nil
}
func closeUserKey() {
if userKey == 0 {
return
}
userKey.Close()
userKey = 0
}
func UserKeyString(name string) (string, bool) {
key, err := openUserKey()
if err != nil {
return err.Error(), false
}
val, _, err := key.GetStringValue(name)
if err != nil {
return err.Error(), false
}
return val, true
}
func SetUserKeyString(name string, value string) error {
key, err := createUserKey()
if err != nil {
return err
}
defer closeUserKey()
err = key.SetStringValue(name, value)
if err != nil {
return err
}
return nil
}