langselector: fixed locale settings

tower:https://tower.im/projects/69dc94f2e66248d5b722b7d9609b8fe7/todos/3805f89343a34d92be306955572db9b7/
Change-Id: Ifb5c3bd8b1b303b5152f3b2411b21f2008ffa561
This commit is contained in:
jouyouyun 2015-04-03 11:18:53 +08:00
parent f030709af1
commit 7fd2d75dd4
5 changed files with 103 additions and 104 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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

View File

@ -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) {

View File

@ -56,7 +56,7 @@ func Start() *LangSelector {
return nil
}
_lang.onGenLocaleStatus()
_lang.onLocaleSuccess()
return _lang
}