mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 17:33:05 +00:00
langselector: fixed locale settings
tower:https://tower.im/projects/69dc94f2e66248d5b722b7d9609b8fe7/todos/3805f89343a34d92be306955572db9b7/ Change-Id: Ifb5c3bd8b1b303b5152f3b2411b21f2008ffa561
This commit is contained in:
parent
f030709af1
commit
7fd2d75dd4
@ -27,9 +27,9 @@ import (
|
||||
. "pkg.linuxdeepin.com/lib/gettext"
|
||||
)
|
||||
|
||||
func (lang *LangSelector) onGenLocaleStatus() {
|
||||
lang.setDate.ConnectGenLocaleStatus(func(ok bool, state string) {
|
||||
err := lang.handleLocaleChanged(ok, state)
|
||||
func (lang *LangSelector) onLocaleSuccess() {
|
||||
lang.lhelper.ConnectSuccess(func(ok bool, reason string) {
|
||||
err := lang.handleLocaleChanged(ok, reason)
|
||||
if err != nil {
|
||||
lang.logger.Warning(err)
|
||||
lang.setPropCurrentLocale(getLocale())
|
||||
@ -48,7 +48,7 @@ func (lang *LangSelector) onGenLocaleStatus() {
|
||||
})
|
||||
}
|
||||
|
||||
func (lang *LangSelector) handleLocaleChanged(ok bool, state string) error {
|
||||
func (lang *LangSelector) handleLocaleChanged(ok bool, reason string) error {
|
||||
if !ok || lang.LocaleState != LocaleStateChanging {
|
||||
return ErrLocaleChangeFailed
|
||||
}
|
||||
|
@ -22,7 +22,7 @@
|
||||
package langselector
|
||||
|
||||
import (
|
||||
"dbus/com/deepin/api/setdatetime"
|
||||
"dbus/com/deepin/api/localehelper"
|
||||
libnetwork "dbus/com/deepin/daemon/network"
|
||||
"dbus/org/freedesktop/notifications"
|
||||
"fmt"
|
||||
@ -31,7 +31,6 @@ import (
|
||||
"path"
|
||||
"pkg.linuxdeepin.com/dde-daemon/langselector/language_info"
|
||||
"pkg.linuxdeepin.com/lib/log"
|
||||
dutils "pkg.linuxdeepin.com/lib/utils"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@ -59,11 +58,17 @@ type LangSelector struct {
|
||||
|
||||
LocaleState int32
|
||||
logger *log.Logger
|
||||
setDate *setdatetime.SetDateTime
|
||||
lhelper *localehelper.LocaleHelper
|
||||
}
|
||||
|
||||
type envInfo struct {
|
||||
key string
|
||||
value string
|
||||
}
|
||||
type envInfos []envInfo
|
||||
|
||||
func newLangSelector(l *log.Logger) *LangSelector {
|
||||
lang := LangSelector{}
|
||||
lang := LangSelector{LocaleState: LocaleStateChanged}
|
||||
|
||||
if l != nil {
|
||||
lang.logger = l
|
||||
@ -72,11 +77,11 @@ func newLangSelector(l *log.Logger) *LangSelector {
|
||||
}
|
||||
|
||||
var err error
|
||||
lang.setDate, err = setdatetime.NewSetDateTime(
|
||||
"com.deepin.api.SetDateTime",
|
||||
"/com/deepin/api/SetDateTime")
|
||||
lang.lhelper, err = localehelper.NewLocaleHelper(
|
||||
"com.deepin.api.LocaleHelper",
|
||||
"/com/deepin/api/LocaleHelper")
|
||||
if err != nil {
|
||||
lang.logger.Warning("New SetDateTime Failed:", err)
|
||||
lang.logger.Warning("New LocaleHelper Failed:", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -86,12 +91,12 @@ func newLangSelector(l *log.Logger) *LangSelector {
|
||||
}
|
||||
|
||||
func (lang *LangSelector) Destroy() {
|
||||
if lang.setDate == nil {
|
||||
if lang.lhelper == nil {
|
||||
return
|
||||
}
|
||||
|
||||
setdatetime.DestroySetDateTime(lang.setDate)
|
||||
lang.setDate = nil
|
||||
localehelper.DestroyLocaleHelper(lang.lhelper)
|
||||
lang.lhelper = nil
|
||||
}
|
||||
|
||||
func sendNotify(icon, summary, body string) error {
|
||||
@ -129,9 +134,9 @@ func isNetworkEnable() (bool, error) {
|
||||
func getLocale() string {
|
||||
filename := path.Join(os.Getenv("HOME"), userLocaleFilePAM)
|
||||
locale, err := getLocaleFromFile(filename)
|
||||
if err != nil {
|
||||
if err != nil || len(locale) == 0 {
|
||||
locale, err = getLocaleFromFile(systemLocaleFile)
|
||||
if err != nil {
|
||||
if err != nil || len(locale) == 0 {
|
||||
locale = defaultLocale
|
||||
}
|
||||
|
||||
@ -149,7 +154,6 @@ func getLocale() string {
|
||||
|
||||
func writeUserLocale(locale string) error {
|
||||
filename := path.Join(os.Getenv("HOME"), userLocaleFilePAM)
|
||||
|
||||
return writeUserLocalePam(locale, filename)
|
||||
}
|
||||
|
||||
@ -157,95 +161,83 @@ func writeUserLocale(locale string) error {
|
||||
* gnome locale config
|
||||
**/
|
||||
func writeUserLocalePam(locale, filename string) error {
|
||||
fp, err := os.Create(filename + "~")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fp.Close()
|
||||
|
||||
contents := constructPamFile(locale, filename)
|
||||
if _, err = fp.WriteString(contents); err != nil {
|
||||
return err
|
||||
}
|
||||
fp.Sync()
|
||||
os.Rename(filename+"~", filename)
|
||||
|
||||
return nil
|
||||
var content = generatePamEnvFile(locale, filename)
|
||||
return ioutil.WriteFile(filename, []byte(content), 0644)
|
||||
}
|
||||
|
||||
func constructPamFile(locale, filename string) string {
|
||||
if !dutils.IsFileExist(filename) {
|
||||
return generatePamContents(locale)
|
||||
}
|
||||
|
||||
contents, err := ioutil.ReadFile(filename)
|
||||
if err != nil {
|
||||
return generatePamContents(locale)
|
||||
}
|
||||
|
||||
lines := strings.Split(string(contents), "\n")
|
||||
var tmp string
|
||||
for i, line := range lines {
|
||||
if i != 0 {
|
||||
tmp += "\n"
|
||||
func generatePamEnvFile(locale, filename string) string {
|
||||
var (
|
||||
lFound bool //LANG
|
||||
lgFound bool //LANGUAGE
|
||||
content string
|
||||
infos, _ = readEnvFile(filename)
|
||||
length = len(infos)
|
||||
lang = strings.Split(locale, ".")[0]
|
||||
)
|
||||
for i, info := range infos {
|
||||
if info.key == "LANG" {
|
||||
lFound = true
|
||||
info.value = locale
|
||||
} else if info.key == "LANGUAGE" {
|
||||
lgFound = true
|
||||
info.value = lang
|
||||
}
|
||||
|
||||
strs := strings.Split(line, "=")
|
||||
if strs[0] == "LANG" {
|
||||
tmp += strs[0] + "=" + locale
|
||||
continue
|
||||
} else if strs[0] == "LANGUAGE" {
|
||||
lcode := strings.Split(locale, ".")[0]
|
||||
tmp += strs[0] + "=" + lcode
|
||||
continue
|
||||
content += fmt.Sprintf("%s=%s", info.key, info.value)
|
||||
if i != length-1 {
|
||||
content += "\n"
|
||||
}
|
||||
|
||||
tmp += line
|
||||
}
|
||||
if !lFound {
|
||||
content += fmt.Sprintf("LANG=%s", locale)
|
||||
if !lgFound {
|
||||
content += "\n"
|
||||
}
|
||||
}
|
||||
if !lgFound {
|
||||
content += fmt.Sprintf("LANGUAGE=%s", lang)
|
||||
}
|
||||
|
||||
return tmp
|
||||
}
|
||||
|
||||
func generatePamContents(locale string) string {
|
||||
contents := ""
|
||||
str := "LANG=" + locale + "\n"
|
||||
contents += str
|
||||
tmp := strings.Split(locale, ".")
|
||||
str = "LANGUAGE=" + tmp[0] + "\n"
|
||||
contents += str
|
||||
|
||||
return contents
|
||||
return content
|
||||
}
|
||||
|
||||
func getLocaleFromFile(filename string) (string, error) {
|
||||
if !dutils.IsFileExist(filename) {
|
||||
return "", ErrFileNotExist
|
||||
}
|
||||
|
||||
contents, err := ioutil.ReadFile(filename)
|
||||
infos, err := readEnvFile(filename)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var locale string
|
||||
lines := strings.Split(string(contents), "\n")
|
||||
for _, line := range lines {
|
||||
strs := strings.Split(line, "=")
|
||||
if len(strs) != 2 {
|
||||
for _, info := range infos {
|
||||
if info.key != "LANG" {
|
||||
continue
|
||||
}
|
||||
|
||||
if strs[0] != "LANG" {
|
||||
continue
|
||||
}
|
||||
|
||||
locale = strings.Trim(strs[1], "\"")
|
||||
break
|
||||
}
|
||||
|
||||
if len(locale) == 0 {
|
||||
return "", ErrLocaleNotFound
|
||||
locale = info.value
|
||||
}
|
||||
|
||||
return locale, nil
|
||||
}
|
||||
|
||||
func readEnvFile(file string) (envInfos, error) {
|
||||
content, err := ioutil.ReadFile(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var (
|
||||
infos envInfos
|
||||
lines = strings.Split(string(content), "\n")
|
||||
)
|
||||
for _, line := range lines {
|
||||
var array = strings.Split(line, "=")
|
||||
if len(array) != 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
infos = append(infos, envInfo{
|
||||
key: array[0],
|
||||
value: array[1],
|
||||
})
|
||||
}
|
||||
|
||||
return infos, nil
|
||||
}
|
||||
|
@ -33,33 +33,43 @@ type localeInfo struct {
|
||||
}
|
||||
|
||||
func (lang *LangSelector) SetLocale(locale string) error {
|
||||
if lang.LocaleState == LocaleStateChanging {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(locale) == 0 || !language_info.IsLocaleValid(locale,
|
||||
language_info.LanguageListFile) {
|
||||
return fmt.Errorf("Invalid locale: %v", locale)
|
||||
}
|
||||
if lang.setDate == nil {
|
||||
return fmt.Errorf("SetDateTime object is nil")
|
||||
if lang.lhelper == nil {
|
||||
return fmt.Errorf("LocaleHelper object is nil")
|
||||
}
|
||||
|
||||
if lang.CurrentLocale == locale {
|
||||
return nil
|
||||
}
|
||||
|
||||
lang.LocaleState = LocaleStateChanging
|
||||
lang.setPropCurrentLocale(locale)
|
||||
go func() {
|
||||
lang.LocaleState = LocaleStateChanging
|
||||
lang.setPropCurrentLocale(locale)
|
||||
if ok, _ := isNetworkEnable(); !ok {
|
||||
err := sendNotify("", "", Tr("System language is being changed, please wait..."))
|
||||
err := sendNotify("", "",
|
||||
Tr("System language is being changed, please wait..."))
|
||||
if err != nil {
|
||||
lang.logger.Warning("sendNotify failed:", err)
|
||||
}
|
||||
} else {
|
||||
err := sendNotify("", "", Tr("System language is being changed with an installation of lacked language packages, please wait..."))
|
||||
err := sendNotify("", "",
|
||||
Tr("System language is being changed with an installation of lacked language packages, please wait..."))
|
||||
if err != nil {
|
||||
lang.logger.Warning("sendNotify failed:", err)
|
||||
}
|
||||
}
|
||||
lang.setDate.GenLocale(locale)
|
||||
err := lang.lhelper.GenerateLocale(locale)
|
||||
if err != nil {
|
||||
lang.logger.Warning("GenerateLocale failed:", err)
|
||||
lang.LocaleState = LocaleStateChanged
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
|
@ -42,16 +42,13 @@ type localeDescTest struct {
|
||||
ret bool
|
||||
}
|
||||
|
||||
func (t *TestWrapper) TestConstructPamFile(c *C.C) {
|
||||
func (t *TestWrapper) TestGeneratePamEnvFile(c *C.C) {
|
||||
example := `LANG=en_US.UTF-8
|
||||
LANGUAGE=en_US
|
||||
LC_TIME="zh_CN.UTF-8"
|
||||
`
|
||||
LC_TIME="zh_CN.UTF-8"`
|
||||
|
||||
c.Check(constructPamFile("en_US.UTF-8",
|
||||
c.Check(generatePamEnvFile("en_US.UTF-8",
|
||||
"testdata/pam_environment"), C.Equals, example)
|
||||
c.Check(constructPamFile("en_US.UTF-8", "xxxxxx"),
|
||||
C.Equals, generatePamContents("en_US.UTF-8"))
|
||||
}
|
||||
|
||||
func (t *TestWrapper) TestGetLocale(c *C.C) {
|
||||
|
@ -56,7 +56,7 @@ func Start() *LangSelector {
|
||||
return nil
|
||||
}
|
||||
|
||||
_lang.onGenLocaleStatus()
|
||||
_lang.onLocaleSuccess()
|
||||
|
||||
return _lang
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user