Fix: Decode GBK dialog/toolbar text on non-Chinese systems
MBCS dialog templates are decoded with the system ANSI code page, so on
non-Chinese systems the GBK template strings turn into "?" before
TranslateDialog can read them. Set those strings explicitly in OnInitDialog
(PluginSettings save/close, the three Advanced dialogs, the file-manager
search buttons/checkboxes, and Trigger Settings) so they are re-decoded
with the thread locale. Also fix the language-selection dialog and the
toolbar "Lang/语言" button: the language dialog's template is built as
WCHAR strings but created through the ANSI path, so its title, label, and
buttons are set explicitly in OnInitDialog (AppendString stays on CP_ACP),
with the title looked up via _TR("切换语言") and set through SetWindowTextW
after an explicit GBK conversion; new en_US ("Switch Language") and zh_TW
("切換語言") translations accompany it. The toolbar button is set through
the Unicode TB_SETBUTTONINFOW message after an explicit GBK conversion. Add
en_US/zh_TW translations for the experimental-features context menu items.
Co-Authored-By: deepseek-v4-pro
This commit is contained in:
1 parent
c7f7b7b29b
commit
6220335f63
12 files changed
+136
-9
No files matched your search
Binary file not shown.
@@ -1427,7 +1427,17 @@ VOID CMy2015RemoteDlg::CreateToolBar()
|
|||||||
m_ToolBar.SetButtonText(11, _TR("生成服务端"));
|
m_ToolBar.SetButtonText(11, _TR("生成服务端"));
|
||||||
m_ToolBar.SetButtonText(12, _TR("搜索"));
|
m_ToolBar.SetButtonText(12, _TR("搜索"));
|
||||||
m_ToolBar.SetButtonText(13, _TR("帮助"));
|
m_ToolBar.SetButtonText(13, _TR("帮助"));
|
||||||
m_ToolBar.SetButtonText(14, _T("Lang/语言"));
|
// 按钮 14 "Lang/语言" 含 GBK 中文:comctl32 的 ANSI 消息按系统 ACP 解码,非中文系统会乱码,
|
||||||
|
// 故改用 Unicode 消息 + 显式 GBK(936)→Unicode 转换设置(与 TranslateListHeader 同法)。
|
||||||
|
{
|
||||||
|
WCHAR wLabel[64] = { 0 };
|
||||||
|
MultiByteToWideChar(936, 0, _T("Lang/语言"), -1, wLabel, 64);
|
||||||
|
TBBUTTONINFOW tbi = { 0 };
|
||||||
|
tbi.cbSize = sizeof(tbi);
|
||||||
|
tbi.dwMask = TBIF_TEXT | TBIF_BYINDEX; // wParam 为按钮下标(与 SetButtonText(14,...) 同义)
|
||||||
|
tbi.pszText = wLabel;
|
||||||
|
::SendMessageW(m_ToolBar.GetSafeHwnd(), TB_SETBUTTONINFOW, 14, (LPARAM)&tbi);
|
||||||
|
}
|
||||||
m_ToolBar.SetButtonText(15, _T("MCP"));
|
m_ToolBar.SetButtonText(15, _T("MCP"));
|
||||||
m_ToolBar.SetButtonText(16, _TR("连接管理"));
|
m_ToolBar.SetButtonText(16, _TR("连接管理"));
|
||||||
m_ToolBar.SetButtonText(17, _TR("远程交谈"));
|
m_ToolBar.SetButtonText(17, _TR("远程交谈"));
|
||||||
|
|||||||
@@ -79,6 +79,18 @@ protected:
|
|||||||
{
|
{
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
|
|
||||||
|
// 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog
|
||||||
|
// 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。
|
||||||
|
// 均经 _TR 支持多语言翻译。
|
||||||
|
SetWindowText(_TR("文件传输速度"));
|
||||||
|
SetDlgItemText(IDC_FSPEED_HINT, _TR("拖动滑块设置文件传输速度:"));
|
||||||
|
SetDlgItemText(IDC_FSPEED_LABEL_SLOWEST, _TR("最慢"));
|
||||||
|
SetDlgItemText(IDC_FSPEED_LABEL_DEFAULT, _TR("默认"));
|
||||||
|
SetDlgItemText(IDC_FSPEED_LABEL_UNLIMITED, _TR("不限速"));
|
||||||
|
SetDlgItemText(IDC_FSPEED_RESET, _TR("恢复默认"));
|
||||||
|
SetDlgItemText(IDOK, _TR("确定"));
|
||||||
|
SetDlgItemText(IDCANCEL, _TR("取消"));
|
||||||
|
|
||||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETRANGE, TRUE,
|
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETRANGE, TRUE,
|
||||||
MAKELONG(0, FILE_SPEED_TIER_COUNT - 1));
|
MAKELONG(0, FILE_SPEED_TIER_COUNT - 1));
|
||||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPAGESIZE, 0, 1);
|
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPAGESIZE, 0, 1);
|
||||||
@@ -86,7 +98,6 @@ protected:
|
|||||||
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPOS, TRUE, TierIndexFor(m_chunkKb, m_durMs));
|
SendDlgItemMessage(IDC_FSPEED_SLIDER, TBM_SETPOS, TRUE, TierIndexFor(m_chunkKb, m_durMs));
|
||||||
|
|
||||||
UpdateLabel();
|
UpdateLabel();
|
||||||
TranslateDialog(this);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,11 +89,29 @@ protected:
|
|||||||
{
|
{
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
|
|
||||||
|
// 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog
|
||||||
|
// 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。
|
||||||
|
// 均经 _TR/_L 支持多语言翻译。
|
||||||
|
SetWindowText(_TR("屏幕预览质量等级"));
|
||||||
|
SetDlgItemText(IDC_PLEVEL_LABEL_LEVEL, _TR("等级"));
|
||||||
|
SetDlgItemText(IDC_PLEVEL_LABEL_WIDTH, _TR("最大宽度"));
|
||||||
|
SetDlgItemText(IDC_PLEVEL_LABEL_QUALITY, _TR("JPEG质量"));
|
||||||
|
static const TCHAR* kLevelNames[QUALITY_COUNT] = {
|
||||||
|
_T("Ultra 极佳"), _T("High 优秀"), _T("Good 良好"),
|
||||||
|
_T("Medium 一般"), _T("Low 较差"), _T("Minimal 最低")
|
||||||
|
};
|
||||||
|
for (int i = 0; i < QUALITY_COUNT; i++)
|
||||||
|
SetDlgItemText(IDC_PLEVEL_LABEL_LEVEL0 + i, _L(kLevelNames[i]));
|
||||||
|
SetDlgItemText(IDC_PLEVEL_LABEL_HINT,
|
||||||
|
_TR("最大宽度为期望编码宽度;JPEG 质量 1~100"));
|
||||||
|
SetDlgItemText(IDC_PLEVEL_RESET, _TR("恢复默认"));
|
||||||
|
SetDlgItemText(IDOK, _TR("确定"));
|
||||||
|
SetDlgItemText(IDCANCEL, _TR("取消"));
|
||||||
|
|
||||||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||||||
m_working[i] = m_profiles[i];
|
m_working[i] = m_profiles[i];
|
||||||
}
|
}
|
||||||
LoadToControls();
|
LoadToControls();
|
||||||
TranslateDialog(this);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -723,11 +723,11 @@ protected:
|
|||||||
AppendData(&dlgTemplate, sizeof(DLGTEMPLATE));
|
AppendData(&dlgTemplate, sizeof(DLGTEMPLATE));
|
||||||
AppendWord(0); // 菜单
|
AppendWord(0); // 菜单
|
||||||
AppendWord(0); // 窗口类
|
AppendWord(0); // 窗口类
|
||||||
AppendString(_T("切换语言 / Switch Language"));
|
AppendString(_T("切换语言"));
|
||||||
AlignToDword();
|
AlignToDword();
|
||||||
|
|
||||||
// 静态文本
|
// 静态文本
|
||||||
AddControl(0x0082, 15, 15, 50, 12, (WORD)-1,
|
AddControl(0x0082, 15, 15, 50, 12, 1002,
|
||||||
SS_LEFT | WS_CHILD | WS_VISIBLE, _T("语言:"));
|
SS_LEFT | WS_CHILD | WS_VISIBLE, _T("语言:"));
|
||||||
|
|
||||||
// ComboBox
|
// ComboBox
|
||||||
@@ -796,8 +796,17 @@ protected:
|
|||||||
{
|
{
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
|
|
||||||
// 翻译对话框控件(标题、标签、按钮)
|
// 模板为动态构造的 Unicode 模板,MBCS 下被 ANSI 创建路径误读,标题/标签/按钮文字会乱码,
|
||||||
TranslateDialog(this);
|
// 故在此显式设置(走线程 locale GBK,与其它对话框同法),不再对已乱码文本调用 TranslateDialog。
|
||||||
|
// 标题含中文:非中文系统上 ANSI 消息按系统 ACP 解码会乱码,用 _TR 取翻译(中文→切换语言,
|
||||||
|
// 英语→Switch Language)后,显式 GBK(936)→Unicode 转换再用 Unicode 消息设置(与工具栏同法)。
|
||||||
|
CString strTitle = _TR("切换语言");
|
||||||
|
WCHAR wTitle[64] = { 0 };
|
||||||
|
MultiByteToWideChar(936, 0, strTitle, -1, wTitle, 64);
|
||||||
|
::SetWindowTextW(m_hWnd, wTitle);
|
||||||
|
SetDlgItemText(1002, _TR("语言:"));
|
||||||
|
SetDlgItemText(IDOK, _TR("确定"));
|
||||||
|
SetDlgItemText(IDCANCEL, _TR("取消"));
|
||||||
|
|
||||||
m_comboLang.SubclassDlgItem(1001, this);
|
m_comboLang.SubclassDlgItem(1001, this);
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,10 @@ void CPluginSettingsDlg::InitListCtrl()
|
|||||||
GetDlgItem(IDC_STATIC_PLUGIN_INTERVAL)->SetWindowText(_TR("间隔(秒):"));
|
GetDlgItem(IDC_STATIC_PLUGIN_INTERVAL)->SetWindowText(_TR("间隔(秒):"));
|
||||||
GetDlgItem(IDC_STATIC_PLUGIN_COUNTER)->SetWindowText(_TR("最大次数:"));
|
GetDlgItem(IDC_STATIC_PLUGIN_COUNTER)->SetWindowText(_TR("最大次数:"));
|
||||||
SetWindowText(_TR("插件设置"));
|
SetWindowText(_TR("插件设置"));
|
||||||
|
|
||||||
|
// 按钮文字来自对话框模板,非中文系统上会被系统 ACP 转成 "??",须显式设置(参照 NotifySettingsDlg)
|
||||||
|
SetDlgItemText(IDC_BTN_SAVE, _TR("保存"));
|
||||||
|
SetDlgItemText(IDOK, _TR("关闭"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPluginSettingsDlg::LoadPluginsToList()
|
void CPluginSettingsDlg::LoadPluginsToList()
|
||||||
|
|||||||
@@ -124,11 +124,31 @@ protected:
|
|||||||
{
|
{
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
|
|
||||||
|
// 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog
|
||||||
|
// 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。
|
||||||
|
// 均经 _TR/_L 支持多语言翻译。
|
||||||
|
SetWindowText(_TR("远程桌面质量等级"));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_LEVEL, _TR("等级"));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_FPS, _TR("帧率(FPS)"));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_WIDTH, _TR("最大宽度"));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_ALGO, _TR("编码算法"));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_BITRATE, _TR("码率(kbps)"));
|
||||||
|
static const TCHAR* kLevelNames[QUALITY_COUNT] = {
|
||||||
|
_T("Ultra 极佳"), _T("High 优秀"), _T("Good 良好"),
|
||||||
|
_T("Medium 一般"), _T("Low 较差"), _T("Minimal 最低")
|
||||||
|
};
|
||||||
|
for (int i = 0; i < QUALITY_COUNT; i++)
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_LEVEL0 + i, _L(kLevelNames[i]));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_LABEL_HINT,
|
||||||
|
_TR("最大宽度 0 表示原始分辨率;DIFF/RGB565 适合局域网,H264 适合跨网"));
|
||||||
|
SetDlgItemText(IDC_QLEVEL_RESET, _TR("恢复默认"));
|
||||||
|
SetDlgItemText(IDOK, _TR("确定"));
|
||||||
|
SetDlgItemText(IDCANCEL, _TR("取消"));
|
||||||
|
|
||||||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||||||
m_working[i] = m_profiles[i];
|
m_working[i] = m_profiles[i];
|
||||||
}
|
}
|
||||||
LoadToControls();
|
LoadToControls();
|
||||||
TranslateDialog(this);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,13 @@ void CTriggerSettingsDlg::InitControls()
|
|||||||
SetWindowText(_TR("触发器设置"));
|
SetWindowText(_TR("触发器设置"));
|
||||||
GetDlgItem(IDC_STATIC_TRIGGER_TYPE)->SetWindowText(_TR("触发类型:"));
|
GetDlgItem(IDC_STATIC_TRIGGER_TYPE)->SetWindowText(_TR("触发类型:"));
|
||||||
GetDlgItem(IDC_STATIC_TRIGGER_ACTION)->SetWindowText(_TR("执行动作:"));
|
GetDlgItem(IDC_STATIC_TRIGGER_ACTION)->SetWindowText(_TR("执行动作:"));
|
||||||
|
|
||||||
|
// 按钮/分组框文字来自对话框模板,非中文系统上会被系统 ACP 转成 "?",须显式设置
|
||||||
|
SetDlgItemText(IDC_STATIC_TRIGGER_LIST, _TR("已配置的触发器"));
|
||||||
|
SetDlgItemText(IDC_BTN_TRIGGER_ADD, _TR("添加 >>"));
|
||||||
|
SetDlgItemText(IDC_BTN_TRIGGER_REMOVE, _TR("<< 移除"));
|
||||||
|
SetDlgItemText(IDC_BTN_SAVE, _TR("保存(&S)"));
|
||||||
|
SetDlgItemText(IDOK, _TR("关闭"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTriggerSettingsDlg::LoadPluginsToList()
|
void CTriggerSettingsDlg::LoadPluginsToList()
|
||||||
|
|||||||
@@ -157,6 +157,15 @@ BOOL CFileManagerDlg::OnInitDialog()
|
|||||||
SetDlgItemText(IDC_STATIC_FILE_WINOS_SEARCH, _TR("搜索文件名:"));
|
SetDlgItemText(IDC_STATIC_FILE_WINOS_SEARCH, _TR("搜索文件名:"));
|
||||||
SetDlgItemText(IDC_STATIC_FILE_WINOS_PATH, _TR("路径:"));
|
SetDlgItemText(IDC_STATIC_FILE_WINOS_PATH, _TR("路径:"));
|
||||||
|
|
||||||
|
// 多语言翻译 - 按钮/复选框(模板文字在非中文系统会被系统 ACP 转成 "?",须显式设置)
|
||||||
|
SetDlgItemText(IDC_CK_SUBFORDLE, _TR("包含子文件夹"));
|
||||||
|
SetDlgItemText(IDC_BTN_SEARCH, _TR("开始搜索"));
|
||||||
|
SetDlgItemText(ID_SEARCH_STOP, _TR("停止搜索"));
|
||||||
|
SetDlgItemText(ID_SEARCH_RESULT, _TR("搜索栏"));
|
||||||
|
SetDlgItemText(IDT_REMOTE_PREV, _TR("上一层"));
|
||||||
|
SetDlgItemText(IDT_REMOTE_VIEW, _TR("切换显示"));
|
||||||
|
SetDlgItemText(IDT_REMOTE_STOP, _TR("取消"));
|
||||||
|
|
||||||
RECT rect;
|
RECT rect;
|
||||||
GetClientRect(&rect);
|
GetClientRect(&rect);
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,8 @@ RTT=RTT
|
|||||||
即时消息=Message
|
即时消息=Message
|
||||||
虚拟屏幕=Virtual Screen
|
虚拟屏幕=Virtual Screen
|
||||||
隐私屏幕=Privacy Screen
|
隐私屏幕=Privacy Screen
|
||||||
|
实验功能=Experimental Features
|
||||||
|
远程画板=Remote Drawing Board
|
||||||
代理服务=Proxy Service
|
代理服务=Proxy Service
|
||||||
注入设置=Inject Config
|
注入设置=Inject Config
|
||||||
创建计划任务=Scheduled Task
|
创建计划任务=Scheduled Task
|
||||||
@@ -121,6 +123,7 @@ RTT=RTT
|
|||||||
|
|
||||||
; ============================================
|
; ============================================
|
||||||
; Language Selection Dialog
|
; Language Selection Dialog
|
||||||
|
切换语言=Switch Language
|
||||||
; ============================================
|
; ============================================
|
||||||
选择语言 / Select Language=Select Language
|
选择语言 / Select Language=Select Language
|
||||||
语言:=Language:
|
语言:=Language:
|
||||||
|
|||||||
@@ -99,6 +99,8 @@ RTT=RTT
|
|||||||
即时消息=即時訊息
|
即时消息=即時訊息
|
||||||
虚拟屏幕=虛擬桌面
|
虚拟屏幕=虛擬桌面
|
||||||
隐私屏幕=隱私螢幕
|
隐私屏幕=隱私螢幕
|
||||||
|
实验功能=實驗功能
|
||||||
|
远程画板=遠端繪圖板
|
||||||
代理服务=代理服務
|
代理服务=代理服務
|
||||||
注入设置=注入設定
|
注入设置=注入設定
|
||||||
创建计划任务=建立排程工作
|
创建计划任务=建立排程工作
|
||||||
@@ -121,6 +123,7 @@ RTT=RTT
|
|||||||
|
|
||||||
; ============================================
|
; ============================================
|
||||||
; Language Selection Dialog
|
; Language Selection Dialog
|
||||||
|
切換語言=切換語言
|
||||||
; ============================================
|
; ============================================
|
||||||
选择语言 / Select Language=選擇語言
|
选择语言 / Select Language=選擇語言
|
||||||
语言:=語言:
|
语言:=語言:
|
||||||
|
|||||||
@@ -1077,13 +1077,46 @@
|
|||||||
#define IDC_FSPEED_LABEL 2591
|
#define IDC_FSPEED_LABEL 2591
|
||||||
#define IDC_FSPEED_RESET 2592
|
#define IDC_FSPEED_RESET 2592
|
||||||
|
|
||||||
|
// 高级菜单三个对话框的静态文本(显式在 OnInitDialog 设置中文,修复非中文系统乱码)
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL 2593
|
||||||
|
#define IDC_QLEVEL_LABEL_FPS 2594
|
||||||
|
#define IDC_QLEVEL_LABEL_WIDTH 2595
|
||||||
|
#define IDC_QLEVEL_LABEL_ALGO 2596
|
||||||
|
#define IDC_QLEVEL_LABEL_BITRATE 2597
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL0 2598 // 2598~2603:Ultra..Minimal 六档
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL1 2599
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL2 2600
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL3 2601
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL4 2602
|
||||||
|
#define IDC_QLEVEL_LABEL_LEVEL5 2603
|
||||||
|
#define IDC_QLEVEL_LABEL_HINT 2604
|
||||||
|
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL 2605
|
||||||
|
#define IDC_PLEVEL_LABEL_WIDTH 2606
|
||||||
|
#define IDC_PLEVEL_LABEL_QUALITY 2607
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL0 2608 // 2608~2613:Ultra..Minimal 六档
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL1 2609
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL2 2610
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL3 2611
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL4 2612
|
||||||
|
#define IDC_PLEVEL_LABEL_LEVEL5 2613
|
||||||
|
#define IDC_PLEVEL_LABEL_HINT 2614
|
||||||
|
|
||||||
|
#define IDC_FSPEED_HINT 2615
|
||||||
|
#define IDC_FSPEED_LABEL_SLOWEST 2616
|
||||||
|
#define IDC_FSPEED_LABEL_DEFAULT 2617
|
||||||
|
#define IDC_FSPEED_LABEL_UNLIMITED 2618
|
||||||
|
|
||||||
|
// 触发器设置对话框的分组框(显式在 OnInitDialog 设置中文,修复非中文系统乱码)
|
||||||
|
#define IDC_STATIC_TRIGGER_LIST 2619
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 410
|
#define _APS_NEXT_RESOURCE_VALUE 410
|
||||||
#define _APS_NEXT_COMMAND_VALUE 33093
|
#define _APS_NEXT_COMMAND_VALUE 33093
|
||||||
#define _APS_NEXT_CONTROL_VALUE 2593
|
#define _APS_NEXT_CONTROL_VALUE 2620
|
||||||
#define _APS_NEXT_SYMED_VALUE 105
|
#define _APS_NEXT_SYMED_VALUE 105
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
Reference in new issue
Block a user