发布前的调整
This commit is contained in:
1 parent
394c2f16ef
commit
854a73b0e9
8 files changed
+76
-33
No files matched your search
@@ -16,7 +16,7 @@
|
||||
.input-group input:focus + .floating-label,
|
||||
.input-group input:not(:placeholder-shown) + .floating-label {
|
||||
color: #30a8f7;
|
||||
transform: translateY(-35px);
|
||||
transform: translateY(-40px);
|
||||
}
|
||||
|
||||
.input-group .floating-label span {
|
||||
|
||||
+17
-1
@@ -365,4 +365,20 @@ export function exitRoom() {
|
||||
return false
|
||||
}
|
||||
|
||||
export { roomsData, activeRoomIndex };
|
||||
export { roomsData, activeRoomIndex };
|
||||
|
||||
// Listen for sidebar username update event
|
||||
// 监听侧边栏用户名更新事件
|
||||
window.addEventListener('updateSidebarUsername', () => {
|
||||
if (activeRoomIndex >= 0 && roomsData[activeRoomIndex]) {
|
||||
const rd = roomsData[activeRoomIndex];
|
||||
const sidebarUsername = document.getElementById('sidebar-username');
|
||||
if (sidebarUsername && rd.myUserName) {
|
||||
sidebarUsername.textContent = rd.myUserName;
|
||||
}
|
||||
// Also update the avatar to ensure consistency
|
||||
if (rd.myUserName) {
|
||||
setSidebarAvatar(rd.myUserName);
|
||||
}
|
||||
}
|
||||
});
|
||||
+10
-1
@@ -70,7 +70,7 @@ function validateRoomData(roomData) {
|
||||
|
||||
// Copy text to clipboard with fallback
|
||||
// 复制文本到剪贴板(含降级处理)
|
||||
function copyToClipboard(text, successMessage = t('action.copied', 'Copied to clipboard!'), errorPrefix = t('action.copy_failed', 'Copy failed, text:')) {
|
||||
function copyToClipboard(text, successMessage = t('action.copied', 'Copied to clipboard!'), errorPrefix = t('action.copy_failed', 'Copy failed, url:')) {
|
||||
if (!text) {
|
||||
window.addSystemMsg && window.addSystemMsg(t('action.nothing_to_copy', 'Nothing to copy'));
|
||||
return;
|
||||
@@ -568,4 +568,13 @@ window.addEventListener('languageChange', () => {
|
||||
|
||||
// Refresh chat input placeholder
|
||||
updateChatInputStyle();
|
||||
});
|
||||
|
||||
// Listen for regenerate login form event
|
||||
// 监听重新生成登录表单事件
|
||||
window.addEventListener('regenerateLoginForm', () => {
|
||||
const loginFormContainer = document.getElementById('login-form');
|
||||
if (loginFormContainer) {
|
||||
loginFormContainer.innerHTML = generateLoginForm(false);
|
||||
}
|
||||
});
|
||||
@@ -66,10 +66,9 @@ export function setupEmojiPicker({
|
||||
// 点击外部隐藏选择器
|
||||
on(document, 'click', (ev) => {
|
||||
if (!picker.contains(ev.target) && ev.target !== btn) {
|
||||
hidePickerWithAnimation();
|
||||
hidePickerWithAnimation();
|
||||
}
|
||||
});
|
||||
console.log('Emoji picker initialized successfully')
|
||||
} catch (error) {
|
||||
console.error('Failed to initialize emoji picker:', error)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
import { deflate, inflate } from 'fflate';
|
||||
import { showFileUploadModal } from './util.fileUpload.js';
|
||||
|
||||
// 分卷大小统一配置
|
||||
const DEFAULT_VOLUME_SIZE = 512 * 1024; // 512KB
|
||||
|
||||
// File transfer state management
|
||||
// 文件传输状态管理
|
||||
window.fileTransfers = new Map();
|
||||
@@ -49,9 +52,11 @@ async function calculateHash(data) {
|
||||
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Compress file into volumes with optimized compression
|
||||
// 将文件压缩为分卷,优化压缩算法
|
||||
async function compressFileToVolumes(file, volumeSize = 96 * 1024) { // 96KB原始数据,base64后约128KB
|
||||
async function compressFileToVolumes(file, volumeSize = DEFAULT_VOLUME_SIZE) { // 96KB原始数据,base64后约128KB
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = async function(e) {
|
||||
@@ -97,7 +102,7 @@ async function compressFileToVolumes(file, volumeSize = 96 * 1024) { // 96KB原
|
||||
|
||||
// Compress multiple files into a single archive with volumes
|
||||
// 将多个文件压缩为单个分卷归档
|
||||
async function compressFilesToArchive(files, volumeSize = 96 * 1024) { try {
|
||||
async function compressFilesToArchive(files, volumeSize = DEFAULT_VOLUME_SIZE) { try {
|
||||
// Create a simple archive format: [file1_size][file1_name_length][file1_name][file1_data][file2_size]...
|
||||
// 创建简单的归档格式
|
||||
const archiveData = [];
|
||||
|
||||
+36
-21
@@ -41,9 +41,9 @@ const LANGUAGES = {
|
||||
'file.selected_files': 'Selected Files',
|
||||
'file.clear_all': 'Clear All',
|
||||
'file.cancel': 'Cancel',
|
||||
'file.send_files': 'Send Files',
|
||||
'file.sending': 'Sending',
|
||||
'file.receiving': 'Receiving', 'file.files': 'files',
|
||||
'file.send_files': 'Send Files', 'file.sending': 'Sending',
|
||||
'file.receiving': 'Receiving',
|
||||
'file.files': 'files',
|
||||
'file.total': 'Total',
|
||||
'file.files_selected': '{count} files selected, {size} total',
|
||||
'file.upload_files': 'Upload Files',
|
||||
@@ -124,9 +124,9 @@ const LANGUAGES = {
|
||||
'file.selected_files': '已选择的文件',
|
||||
'file.clear_all': '清空所有',
|
||||
'file.cancel': '取消',
|
||||
'file.send_files': '发送文件',
|
||||
'file.sending': '发送中',
|
||||
'file.receiving': '接收中', 'file.files': '个文件',
|
||||
'file.send_files': '发送文件', 'file.sending': '发送中',
|
||||
'file.receiving': '接收中',
|
||||
'file.files': '个文件',
|
||||
'file.total': '总计',
|
||||
'file.files_selected': '选中 {count} 个文件,总计 {size}',
|
||||
'file.upload_files': '上传文件',
|
||||
@@ -164,7 +164,7 @@ const LANGUAGES = {
|
||||
'system.file_send_failed': '文件发送失败:',
|
||||
'system.joined': '加入了对话',
|
||||
'system.left': '离开了对话',
|
||||
'system.secured': '连接已安全',
|
||||
'system.secured': '已建立端到端安全连接',
|
||||
'system.private_message_failed': '无法发送私信给',
|
||||
'system.private_file_failed': '无法发送私密文件给',
|
||||
'system.user_not_connected': '用户可能未完全连接。',
|
||||
@@ -228,9 +228,31 @@ export function getAvailableLanguages() {
|
||||
export function initI18n(settings) {
|
||||
if (settings && settings.language) {
|
||||
setLanguage(settings.language);
|
||||
} else {
|
||||
// Auto-detect browser language
|
||||
// 自动检测浏览器语言
|
||||
const browserLang = detectBrowserLanguage();
|
||||
setLanguage(browserLang);
|
||||
}
|
||||
}
|
||||
|
||||
// Detect browser language and return supported language code
|
||||
// 检测浏览器语言并返回支持的语言代码
|
||||
function detectBrowserLanguage() {
|
||||
const navigatorLang = navigator.language || navigator.userLanguage || 'en';
|
||||
|
||||
// Extract language code (e.g., 'zh-CN' -> 'zh', 'en-US' -> 'en')
|
||||
const langCode = navigatorLang.split('-')[0].toLowerCase();
|
||||
|
||||
// Check if we support this language
|
||||
if (LANGUAGES[langCode]) {
|
||||
return langCode;
|
||||
}
|
||||
|
||||
// Default fallback to English
|
||||
return 'en';
|
||||
}
|
||||
|
||||
// Update static HTML text elements
|
||||
// 更新HTML中的静态文本元素
|
||||
export function updateStaticTexts() {
|
||||
@@ -245,27 +267,20 @@ export function updateStaticTexts() {
|
||||
if (loginTitle) {
|
||||
loginTitle.textContent = t('ui.enter_node', 'Enter a Node');
|
||||
}
|
||||
|
||||
// Update login form content with new translations
|
||||
// Update login form content with new translations
|
||||
const loginFormContainer = document.getElementById('login-form');
|
||||
if (loginFormContainer) {
|
||||
// Import and regenerate login form with current language
|
||||
import('./ui.js').then(({ generateLoginForm }) => {
|
||||
loginFormContainer.innerHTML = generateLoginForm(false);
|
||||
});
|
||||
// Use a custom event to trigger form regeneration instead of dynamic import
|
||||
// 使用自定义事件触发表单重新生成,而不是动态导入
|
||||
window.dispatchEvent(new CustomEvent('regenerateLoginForm'));
|
||||
}
|
||||
|
||||
// Update sidebar username label
|
||||
const sidebarUsername = document.getElementById('sidebar-username');
|
||||
if (sidebarUsername) {
|
||||
import('./room.js').then(roomMod => {
|
||||
const roomsData = roomMod.roomsData;
|
||||
const activeRoomIndex = roomMod.activeRoomIndex;
|
||||
const rd = roomsData && roomsData.length > 0 && activeRoomIndex >= 0 ? roomsData[activeRoomIndex] : null;
|
||||
sidebarUsername.textContent = rd && rd.myUserName ? rd.myUserName : t('ui.my_name', 'My Name');
|
||||
}).catch(() => {
|
||||
sidebarUsername.textContent = t('ui.my_name', 'My Name');
|
||||
});
|
||||
// Use a custom event to update sidebar username instead of dynamic import
|
||||
// 使用自定义事件更新侧边栏用户名,而不是动态导入
|
||||
window.dispatchEvent(new CustomEvent('updateSidebarUsername'));
|
||||
}
|
||||
// Update "Enter a Node" text in sidebar
|
||||
const joinRoomText = document.getElementById('join-room-text');
|
||||
|
||||
@@ -23,8 +23,9 @@ import { t, setLanguage, getCurrentLanguage, initI18n } from './util.i18n.js';
|
||||
const DEFAULT_SETTINGS = {
|
||||
notify: false,
|
||||
sound: false,
|
||||
theme: 'theme1',
|
||||
language: 'en' // 'en' for English, 'zh' for Chinese
|
||||
theme: 'theme1'
|
||||
// 注意:我们不设置默认语言,让系统自动检测浏览器语言
|
||||
// Note: We don't set a default language, let the system auto-detect browser language
|
||||
};
|
||||
|
||||
// Load settings from localStorage
|
||||
|
||||
@@ -82,11 +82,9 @@ export function applyTheme(themeId) {
|
||||
} else {
|
||||
mainElement.style.background = theme.background;
|
||||
}
|
||||
// Add transition effect for smooth theme switching
|
||||
// 添加过渡效果,实现平滑的主题切换
|
||||
// Add transition effect for smooth theme switching // 添加过渡效果,实现平滑的主题切换
|
||||
mainElement.style.transition = 'background 0.5s ease-in-out, background-image 0.5s ease-in-out';
|
||||
|
||||
console.log(`Applied theme: ${themeId}`);
|
||||
return true;
|
||||
} else {
|
||||
console.warn('Main element not found');
|
||||
|
||||
Reference in new issue
Block a user