Skip to content

Commit 7c86100

Browse files
committed
fix: fix wired connection name showing English on Chinese locale
1. Add installSystemTranslator() to read system locale from /etc/locale.conf or /etc/deepin-installer/deepin-installer.conf when user account locale is unavailable via D-Bus 2. Add fallback in addFirstConnection(WiredDevice*) to install system translator when m_initilized is false, covering the onWiredDevicePropertyChanged signal path that bypasses the m_initilized guard in onInitDeviceConnection/onDeviceAdded 3. Add fallback in 3s timer to try system translator before creating connections with default English names 4. Only install QTranslator when qm file loads successfully 5. Update D-Bus service names to match v25 interfaces (org.deepin.dde.LockService1, org.deepin.dde.Accounts1) Log: Wired connection name displays in system language (e.g. "有线连接") instead of default English "Wired Connection" when system locale is Chinese Influence: 1. Set system language to Simplified Chinese, reboot and check control center -> Network -> Wired, verify connection name is "有线连接" not "Wired Connection" 2. Set system language to other locales, verify wired connection name displays in the corresponding language fix: 修复系统语言为中文时有线网络名称显示为英文的问题 1. 新增 installSystemTranslator() 从 /etc/locale.conf 或 /etc/deepin-installer/deepin-installer.conf 读取系统语言, 在无法通过 D-Bus 获取用户账户语言时作为回退 2. 在 addFirstConnection(WiredDevice*) 中增加回退逻辑, 当 m_initilized 为 false 时安装系统翻译器,覆盖 onWiredDevicePropertyChanged 信号路径绕过 onInitDeviceConnection/onDeviceAdded 中 m_initilized 守卫的情况 3. 在 3 秒定时器中增加系统翻译器回退,在以默认英文 创建连接之前尝试安装系统语言 4. 仅在 qm 文件加载成功时才安装 QTranslator 5. 更新 D-Bus 服务名以匹配 v25 接口 (org.deepin.dde.LockService1, org.deepin.dde.Accounts1) Log: 有线网络名称将显示为系统语言(如"有线连接")而非 默认英文 "Wired Connection" Influence: 1. 系统语言设置为简体中文,重启后进入控制中心-网络-有线网络, 验证连接名称为"有线连接"而非"Wired Connection" 2. 切换为其他语言,验证有线网络名称显示对应语言 PMS: BUG-359529
1 parent 9cf8e39 commit 7c86100

2 files changed

Lines changed: 119 additions & 67 deletions

File tree

network-service-plugin/src/system/networkinitialization.cpp

Lines changed: 113 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,33 @@
33
// SPDX-License-Identifier: LGPL-3.0-or-later
44

55
#include "networkinitialization.h"
6+
67
#include "settingconfig.h"
78
#include "systemservice.h"
89

10+
#include <NetworkManagerQt/Ipv4Setting>
11+
#include <NetworkManagerQt/Manager>
12+
#include <NetworkManagerQt/Settings>
13+
#include <NetworkManagerQt/WiredDevice>
14+
#include <NetworkManagerQt/WiredSetting>
15+
#include <NetworkManagerQt/WirelessDevice>
16+
917
#include <DSysInfo>
1018

1119
#include <QCoreApplication>
12-
#include <QEventLoop>
1320
#include <QDBusConnection>
1421
#include <QDBusConnectionInterface>
22+
#include <QDBusInterface>
1523
#include <QDBusServiceWatcher>
16-
#include <QTimer>
17-
#include <QMutex>
24+
#include <QEventLoop>
25+
#include <QFile>
1826
#include <QJsonDocument>
19-
#include <QJsonParseError>
2027
#include <QJsonObject>
28+
#include <QJsonParseError>
29+
#include <QMutex>
30+
#include <QTextStream>
31+
#include <QTimer>
2132
#include <QTranslator>
22-
#include <QDBusInterface>
23-
24-
#include <NetworkManagerQt/WiredDevice>
25-
#include <NetworkManagerQt/WirelessDevice>
26-
#include <NetworkManagerQt/Manager>
27-
#include <NetworkManagerQt/Settings>
28-
#include <NetworkManagerQt/WiredSetting>
29-
#include <NetworkManagerQt/Ipv4Setting>
3033

3134
using namespace network::systemservice;
3235

@@ -35,17 +38,17 @@ using namespace network::systemservice;
3538

3639
#define NETWORKMANAGER_SERVICE "org.freedesktop.NetworkManager"
3740

38-
#define LOCKERVICE "com.deepin.dde.LockService"
39-
#define LOCKPATH "/com/deepin/dde/LockService"
40-
#define LOCKINTERFACE "com.deepin.dde.LockService"
41+
#define LOCKSERVICE "org.deepin.dde.LockService1"
42+
#define LOCKPATH "/org/deepin/dde/LockService1"
43+
#define LOCKINTERFACE "org.deepin.dde.LockService1"
4144

42-
#define DEAMONACCOUNTSERVICE "com.deepin.daemon.Accounts"
43-
#define DEAMONACCOUNTPATH "/com/deepin/daemon/Accounts"
44-
#define DEAMONACCOUNTINTERFACE "com.deepin.daemon.Accounts"
45+
#define DAEMONACCOUNTSERVICE "org.deepin.dde.Accounts1"
46+
#define DAEMONACCOUNTPATH "/org/deepin/dde/Accounts1"
47+
#define DAEMONACCOUNTINTERFACE "org.deepin.dde.Accounts1"
4548

4649
NetworkInitialization::NetworkInitialization(QObject *parent)
4750
: QObject(parent)
48-
, m_initilized(false)
51+
, m_initialized(false)
4952
, m_accountServiceRegister(false)
5053
, m_hasAddFirstConnection(false)
5154
{
@@ -56,9 +59,9 @@ NetworkInitialization::NetworkInitialization(QObject *parent)
5659
void NetworkInitialization::updateLanguage(const QString &locale)
5760
{
5861
qWarning(DSM) << "update local language" << locale;
59-
installLaunguage(locale);
60-
m_initilized = true;
61-
updateConnectionLaunguage();
62+
installLanguage(locale);
63+
m_initialized = true;
64+
updateConnectionLanguage();
6265
}
6366

6467
void NetworkInitialization::initDeviceInfo()
@@ -78,31 +81,31 @@ void NetworkInitialization::initDeviceInfo()
7881

7982
void NetworkInitialization::initConnection()
8083
{
81-
QDBusMessage lock = QDBusMessage::createMethodCall(LOCKERVICE, LOCKPATH, LOCKINTERFACE, "CurrentUser");
84+
QDBusMessage lock = QDBusMessage::createMethodCall(LOCKSERVICE, LOCKPATH, LOCKINTERFACE, "CurrentUser");
8285
QDBusConnection::systemBus().callWithCallback(lock, this, SLOT(onUserChanged(QString)));
83-
QDBusConnection::systemBus().connect(LOCKERVICE, LOCKPATH, LOCKINTERFACE, "UserChanged", this, SLOT(onUserChanged(QString)));
84-
QDBusConnection::systemBus().connect(DEAMONACCOUNTSERVICE, DEAMONACCOUNTPATH, DEAMONACCOUNTINTERFACE, "UserAdded", this, SLOT(onUserAdded(QString)));
86+
QDBusConnection::systemBus().connect(LOCKSERVICE, LOCKPATH, LOCKINTERFACE, "UserChanged", this, SLOT(onUserChanged(QString)));
87+
QDBusConnection::systemBus().connect(DAEMONACCOUNTSERVICE, DAEMONACCOUNTPATH, DAEMONACCOUNTINTERFACE, "UserAdded", this, SLOT(onUserAdded(QString)));
8588

86-
m_accountServiceRegister = QDBusConnection::systemBus().interface()->isServiceRegistered(DEAMONACCOUNTINTERFACE);
89+
m_accountServiceRegister = QDBusConnection::systemBus().interface()->isServiceRegistered(DAEMONACCOUNTINTERFACE);
8790
if (!m_accountServiceRegister) {
8891
// 如果服务未启动,则等待服务启动
8992
QDBusServiceWatcher *serviceWatcher = new QDBusServiceWatcher(this);
9093
serviceWatcher->setConnection(QDBusConnection::systemBus());
9194
qCWarning(DSM) << m_accountServiceRegister << "service is not register";
92-
serviceWatcher->addWatchedService(DEAMONACCOUNTINTERFACE);
95+
serviceWatcher->addWatchedService(DAEMONACCOUNTINTERFACE);
9396
connect(serviceWatcher, &QDBusServiceWatcher::serviceRegistered, this, [ this ](const QString &service) {
94-
if (service != DEAMONACCOUNTSERVICE)
97+
if (service != DAEMONACCOUNTSERVICE)
9598
return;
9699

97-
qCDebug(DSM) << service << "register, initilized" << m_initilized;
100+
qCDebug(DSM) << service << "register, initilized" << m_initialized;
98101
m_accountServiceRegister = true;
99102

100103
// 如果需要初始化设备,则初始化设备
101104
checkAccountStatus();
102-
if (m_initilized) {
105+
if (m_initialized) {
103106
addFirstConnection();
104107
}
105-
updateConnectionLaunguage();
108+
updateConnectionLanguage();
106109
});
107110
}
108111
// 等待3秒过后再执行一次创建的动作,正常情况下,在500毫秒内系统肯定会发送当前账户变化的信号,
@@ -111,12 +114,7 @@ void NetworkInitialization::initConnection()
111114
// 3秒过后直接调用addFirstConnection函数,在这个函数中,如果连接已经创建了,就不再创建
112115
// 如果没有创建过连接,那么就执行创建的操作
113116
// 调用checkAccountStatus检查当前用户状态并安装当前用户的语言
114-
qCDebug(DSM) << "check connection status";
115-
checkAccountStatus();
116-
if (!m_initilized)
117-
qCWarning(DSM) << "can not found current user, used default lauguage to create connection";
118-
// 不管语言有没有安装上,直接添加新连接,如果语言没有安装上,这个时候肯定不会有当前用户的语言了,此时安装就安装默认的英文
119-
// 如果语言安装上了,此时就使用已经安装的语言来新建连接
117+
ensureTranslatorInstalled();
120118
addFirstConnection();
121119
});
122120
}
@@ -145,7 +143,8 @@ void NetworkInitialization::addFirstConnection(NetworkManager::WiredDevice *devi
145143
{
146144
if (!device)
147145
return;
148-
146+
// 还没安装语言场景,信号变化触发创建连接。回退读取系统配置文件获取语言
147+
ensureTranslatorInstalled();
149148
// 如果设备不被管理,而且被down掉,或者没有插入网线的情况下,是无需创建连接的
150149
qCDebug(DSM) << "device:" << device->interfaceName() << "managed:" << device->managed()
151150
<< "interfaceFlags:" << device->interfaceFlags() << "carrier:" << device->carrier();
@@ -194,7 +193,7 @@ void NetworkInitialization::addFirstConnection(NetworkManager::WiredDevice *devi
194193
QDBusPendingReply<QDBusObjectPath> reply = NetworkManager::addConnection(conn->toMap());
195194
reply.waitForFinished();
196195
qDebug() << "device" << device->interfaceName() << "create connection success,count:" << device->availableConnections().size();
197-
if (!m_initilized && matchName.first >= 0) {
196+
if (!m_initialized && matchName.first >= 0) {
198197
qCDebug(DSM) << "can't found user, add " << matchName.second << conn->uuid() << " to cache";
199198
m_untranslactionConnections[conn->uuid()] = matchName.first;
200199
}
@@ -314,7 +313,7 @@ QVariant NetworkInitialization::accountInterface(const QString &path, const QStr
314313

315314
bool NetworkInitialization::installUserTranslator(const QString &json)
316315
{
317-
if (m_initilized) {
316+
if (m_initialized) {
318317
qCDebug(DSM) << "environment is initialized";
319318
return true;
320319
}
@@ -358,20 +357,71 @@ bool NetworkInitialization::installUserTranslator(const QString &json)
358357

359358
if (localTmp != locale) {
360359
localTmp = locale;
361-
installLaunguage(locale);
360+
installLanguage(locale);
362361
}
363362

364363
return true;
365364
}
366365

367-
void NetworkInitialization::installLaunguage(const QString &locale)
366+
void NetworkInitialization::installLanguage(const QString &locale)
368367
{
369368
static QTranslator translator;
370369
QCoreApplication::removeTranslator(&translator);
371370
const QString qmFile = QString("%1/network-service-plugin_%2.qm").arg(QM_FILES_DIR).arg(locale);
372-
translator.load(qmFile);
373-
QCoreApplication::installTranslator(&translator);
374-
qCDebug(DSM) << "install translation file" << qmFile;
371+
if (translator.load(qmFile)) {
372+
QCoreApplication::installTranslator(&translator);
373+
qCDebug(DSM) << "install translation file" << qmFile;
374+
}
375+
}
376+
377+
static QString getLocaleValue(const QString &filePath, const QStringList &keys, const QString &splitKey = "=", const QString &keywords = QString())
378+
{
379+
QFile file(filePath);
380+
if (!file.open(QFile::ReadOnly | QFile::Text)) {
381+
qCWarning(DSM) << "Failed to open locale file:" << filePath << "-" << file.errorString();
382+
return QString();
383+
}
384+
385+
QMap<QString, QString> localeMap;
386+
QTextStream in(&file);
387+
while (!in.atEnd()) {
388+
QString line = in.readLine();
389+
if (!keywords.isEmpty() && !line.contains(keywords))
390+
continue;
391+
QStringList pair = line.split(splitKey, Qt::SkipEmptyParts);
392+
if (pair.size() == 2)
393+
localeMap.insert(pair.at(0).trimmed(), pair.at(1).trimmed());
394+
}
395+
for (const auto &key : keys) {
396+
if (localeMap.contains(key))
397+
return localeMap.value(key).section('.', 0, 0);
398+
}
399+
return QString();
400+
}
401+
402+
bool NetworkInitialization::installSystemTranslator()
403+
{
404+
QString locale = getLocaleValue("/etc/locale.conf", { "LANGUAGE", "LANG" }, "=", "LANG");
405+
if (locale.isEmpty())
406+
locale = getLocaleValue("/etc/deepin-installer/deepin-installer.conf", { "DI_LOCALE", "LIVE_LOCALES" }, "=", "LOCALE");
407+
if (!locale.isEmpty()) {
408+
qCInfo(DSM) << "Install system language:" << locale;
409+
installLanguage(locale);
410+
return true;
411+
}
412+
return false;
413+
}
414+
415+
void NetworkInitialization::ensureTranslatorInstalled()
416+
{
417+
if (!m_initialized) {
418+
qCDebug(DSM) << "check connection status";
419+
checkAccountStatus();
420+
if (!m_initialized) {
421+
qCWarning(DSM) << "can not found current user, used default language to create connection";
422+
m_initialized = installSystemTranslator();
423+
}
424+
}
375425
}
376426

377427
void NetworkInitialization::hideWirelessDevice(const QSharedPointer<NetworkManager::Device> &device, bool disableNetwork)
@@ -408,30 +458,30 @@ void NetworkInitialization::initDeviceConnection(const QSharedPointer<NetworkMan
408458

409459
void NetworkInitialization::checkAccountStatus()
410460
{
411-
QDBusInterface dbusInter(LOCKERVICE, LOCKPATH, LOCKINTERFACE, QDBusConnection::systemBus());
461+
QDBusInterface dbusInter(LOCKSERVICE, LOCKPATH, LOCKINTERFACE, QDBusConnection::systemBus());
412462
QDBusPendingCall reply = dbusInter.asyncCall("CurrentUser");
413463
reply.waitForFinished();
414464
QDBusPendingReply<QString> replyResult = reply.reply();
415-
m_initilized = installUserTranslator(replyResult.value());
465+
m_initialized = installUserTranslator(replyResult.value());
416466
}
417467

418-
void NetworkInitialization::updateConnectionLaunguage(const QString &accountPath)
468+
void NetworkInitialization::updateConnectionLanguage(const QString &accountPath)
419469
{
420470
QVariant localeVariant = accountInterface(accountPath, "Locale");
421471
QString locale = localeVariant.toString().split(".").first();
422-
installLaunguage(locale);
423-
m_initilized = true;
472+
installLanguage(locale);
473+
m_initialized = true;
424474

425475
if (m_untranslactionConnections.isEmpty()) {
426476
qDebug() << "can't found untranslation connections";
427477
return;
428478
}
429479
qDebug() << "update connection launguage";
430480

431-
updateConnectionLaunguage();
481+
updateConnectionLanguage();
432482
}
433483

434-
void NetworkInitialization::updateConnectionLaunguage()
484+
void NetworkInitialization::updateConnectionLanguage()
435485
{
436486
qCWarning(DSM) << "cache connection count" << m_untranslactionConnections.size();
437487
for (auto it = m_untranslactionConnections.begin(); it != m_untranslactionConnections.end(); it++) {
@@ -471,10 +521,10 @@ void NetworkInitialization::onInitDeviceConnection()
471521
wirelessDevices << device.staticCast<NetworkManager::WirelessDevice>();
472522
} else if (device->type() == NetworkManager::Device::Type::Ethernet) {
473523
checkAccountStatus();
474-
qCDebug(DSM) << "Wired device" << device->interfaceName() << "initilized" << m_initilized << ",add first connection";
524+
qCDebug(DSM) << "Wired device" << device->interfaceName() << "initilized" << m_initialized << ",add first connection";
475525
NetworkManager::WiredDevice::Ptr wiredDevice = device.staticCast<NetworkManager::WiredDevice>();
476526
initDeviceConnection(wiredDevice);
477-
if (m_initilized) {
527+
if (m_initialized) {
478528
addFirstConnection(wiredDevice.data());
479529
}
480530
}
@@ -512,10 +562,10 @@ void NetworkInitialization::onDeviceAdded(const QString &uni)
512562
break;
513563
case NetworkManager::Device::Type::Ethernet: {
514564
checkAccountStatus();
515-
qCDebug(DSM) << "new Wired device" << device->interfaceName() << "initilized" << m_initilized << ",add first connection";
565+
qCDebug(DSM) << "new Wired device" << device->interfaceName() << "initilized" << m_initialized << ",add first connection";
516566
NetworkManager::WiredDevice::Ptr wiredDevice = device.staticCast<NetworkManager::WiredDevice>();
517567
initDeviceConnection(wiredDevice);
518-
if (m_initilized) {
568+
if (m_initialized) {
519569
addFirstConnection(wiredDevice.data());
520570
}
521571
break;
@@ -533,28 +583,28 @@ void NetworkInitialization::onAvailableConnectionDisappeared(const QString &conn
533583

534584
void NetworkInitialization::onUserChanged(const QString &json)
535585
{
536-
qCDebug(DSM) << "onUserChanged:" << json << "initilized =" << m_initilized;
537-
m_initilized = installUserTranslator(json);
586+
qCDebug(DSM) << "onUserChanged:" << json << "initilized =" << m_initialized;
587+
m_initialized = installUserTranslator(json);
538588

539-
if (!m_initilized)
589+
if (!m_initialized)
540590
return;
541591

542592
addFirstConnection();
543593
}
544594

545595
void NetworkInitialization::onUserAdded(const QString &user)
546596
{
547-
qCDebug(DSM) << "onUserAdded:" << user << "initilized =" << m_initilized;
548-
updateConnectionLaunguage(user);
597+
qCDebug(DSM) << "onUserAdded:" << user << "initilized =" << m_initialized;
598+
updateConnectionLanguage(user);
549599
if (m_hasAddFirstConnection) {
550600
qDebug() << "has add connection";
551601
return;
552602
}
553603

554604
// 取第一个用户的locale
555-
m_initilized = installUserTranslator(user);
605+
m_initialized = installUserTranslator(user);
556606

557-
if (!m_initilized)
607+
if (!m_initialized)
558608
return;
559609

560610
addFirstConnection();

network-service-plugin/src/system/networkinitialization.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@ class NetworkInitialization : public QObject
3838
QPair<int, QString> connectionMatchName(NetworkManager::WiredDevice *device) const;
3939
QVariant accountInterface(const QString &path, const QString &key, bool isUser = true) const;
4040
bool installUserTranslator(const QString &json);
41-
void installLaunguage(const QString &locale);
41+
void installLanguage(const QString &locale);
42+
bool installSystemTranslator();
43+
void ensureTranslatorInstalled();
4244
void hideWirelessDevice(const QSharedPointer<NetworkManager::Device> &device, bool disableNetwork);
4345
void initDeviceConnection(const QSharedPointer<NetworkManager::WiredDevice> &device);
4446
void checkAccountStatus();
45-
void updateConnectionLaunguage(const QString &account);
46-
void updateConnectionLaunguage();
47+
void updateConnectionLanguage(const QString &account);
48+
void updateConnectionLanguage();
4749
bool isServerSystem() const;
4850

4951
private slots:
@@ -57,7 +59,7 @@ private slots:
5759

5860
private:
5961
QMap<QString, QString> m_newConnectionNames;
60-
bool m_initilized;
62+
bool m_initialized;
6163
bool m_accountServiceRegister;
6264
bool m_hasAddFirstConnection;
6365
QMap<QString, QDateTime> m_lastCreateTime;

0 commit comments

Comments
 (0)