Compare commits

..

24 Commits

Author SHA1 Message Date
Philip Okugbe 76858a040b New translations translation.json (Portuguese, Brazilian)
[ci skip]
2026-06-09 22:53:02 +01:00
Philip Okugbe 16c2ff145c New translations translation.json (English)
[ci skip]
2026-06-09 22:53:00 +01:00
Philip Okugbe a75ac2b2bb New translations translation.json (Chinese Simplified)
[ci skip]
2026-06-09 22:52:59 +01:00
Philip Okugbe c5fdebd837 New translations translation.json (Ukrainian)
[ci skip]
2026-06-09 22:52:57 +01:00
Philip Okugbe a63559cace New translations translation.json (Russian)
[ci skip]
2026-06-09 22:52:56 +01:00
Philip Okugbe 57366b2356 New translations translation.json (Dutch)
[ci skip]
2026-06-09 22:52:54 +01:00
Philip Okugbe 8bd7f5e305 New translations translation.json (Korean)
[ci skip]
2026-06-09 22:52:53 +01:00
Philip Okugbe aa372a6bc5 New translations translation.json (Japanese)
[ci skip]
2026-06-09 22:52:51 +01:00
Philip Okugbe 13f8027592 New translations translation.json (Italian)
[ci skip]
2026-06-09 22:52:50 +01:00
Philip Okugbe 2e3e14dca4 New translations translation.json (Spanish)
[ci skip]
2026-06-09 22:52:48 +01:00
Philip Okugbe 0fd9505df2 New translations translation.json (French)
[ci skip]
2026-06-09 22:52:47 +01:00
Philip Okugbe 57a2ff5afb New translations translation.json (German)
[ci skip]
2026-06-09 22:52:45 +01:00
Philip Okugbe 743eaddc21 New translations translation.json (Russian)
[ci skip]
2026-06-05 15:40:34 +01:00
Philip Okugbe 042c3e2bac New translations translation.json (Portuguese, Brazilian)
[ci skip]
2026-05-28 17:16:56 +01:00
Philip Okugbe 7ca9156481 New translations translation.json (Chinese Simplified)
[ci skip]
2026-05-28 17:16:53 +01:00
Philip Okugbe 75ae997b3d New translations translation.json (Ukrainian)
[ci skip]
2026-05-28 17:16:52 +01:00
Philip Okugbe df960f659e New translations translation.json (Russian)
[ci skip]
2026-05-28 17:16:50 +01:00
Philip Okugbe d41e454e10 New translations translation.json (Dutch)
[ci skip]
2026-05-28 17:16:48 +01:00
Philip Okugbe a31009ae91 New translations translation.json (Korean)
[ci skip]
2026-05-28 17:16:46 +01:00
Philip Okugbe 12c18be6d0 New translations translation.json (Japanese)
[ci skip]
2026-05-28 17:16:44 +01:00
Philip Okugbe bb15e9c5eb New translations translation.json (Italian)
[ci skip]
2026-05-28 17:16:43 +01:00
Philip Okugbe 2f9cb9aced New translations translation.json (Spanish)
[ci skip]
2026-05-28 17:16:41 +01:00
Philip Okugbe b489ce41ea New translations translation.json (French)
[ci skip]
2026-05-28 17:16:39 +01:00
Philip Okugbe c924fe0a2d New translations translation.json (German)
[ci skip]
2026-05-28 17:16:37 +01:00
28 changed files with 71 additions and 104 deletions
@@ -424,6 +424,7 @@
"Names do not match": "Namen stimmen nicht überein", "Names do not match": "Namen stimmen nicht überein",
"Today, {{time}}": "Heute, {{time}}", "Today, {{time}}": "Heute, {{time}}",
"Yesterday, {{time}}": "Gestern, {{time}}", "Yesterday, {{time}}": "Gestern, {{time}}",
"now": "now",
"Space created successfully": "Bereich erfolgreich erstellt", "Space created successfully": "Bereich erfolgreich erstellt",
"Space updated successfully": "Bereich erfolgreich aktualisiert", "Space updated successfully": "Bereich erfolgreich aktualisiert",
"Space deleted successfully": "Bereich erfolgreich gelöscht", "Space deleted successfully": "Bereich erfolgreich gelöscht",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Seiten und Bereiche suchen...", "Search pages and spaces...": "Seiten und Bereiche suchen...",
"No results found": "Keine Ergebnisse gefunden", "No results found": "Keine Ergebnisse gefunden",
"You don't have permission to create pages here": "Sie haben hier keine Berechtigung, Seiten zu erstellen", "You don't have permission to create pages here": "Sie haben hier keine Berechtigung, Seiten zu erstellen",
"Chat menu": "Chatmenü", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "API-Schlüssel-Menü", "API key menu": "API-Schlüssel-Menü",
"Jump to comment selection": "Zur Kommentarauswahl springen", "Jump to comment selection": "Zur Kommentarauswahl springen",
"Slash commands": "Slash-Befehle", "Slash commands": "Slash-Befehle",
@@ -1063,7 +1064,7 @@
"Filter": "Filter", "Filter": "Filter",
"Page title": "Seitentitel", "Page title": "Seitentitel",
"Page content": "Seiteninhalt", "Page content": "Seiteninhalt",
"Member actions": "Mitgliederaktionen", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Passwortsichtbarkeit umschalten", "Toggle password visibility": "Passwortsichtbarkeit umschalten",
"Send comment": "Kommentar senden", "Send comment": "Kommentar senden",
"Token actions": "Token-Aktionen", "Token actions": "Token-Aktionen",
@@ -424,6 +424,7 @@
"Names do not match": "Los nombres no coinciden", "Names do not match": "Los nombres no coinciden",
"Today, {{time}}": "Hoy, {{time}}", "Today, {{time}}": "Hoy, {{time}}",
"Yesterday, {{time}}": "Ayer, {{time}}", "Yesterday, {{time}}": "Ayer, {{time}}",
"now": "now",
"Space created successfully": "Espacio creado correctamente", "Space created successfully": "Espacio creado correctamente",
"Space updated successfully": "Espacio actualizado correctamente", "Space updated successfully": "Espacio actualizado correctamente",
"Space deleted successfully": "Espacio eliminado correctamente", "Space deleted successfully": "Espacio eliminado correctamente",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Buscar páginas y espacios...", "Search pages and spaces...": "Buscar páginas y espacios...",
"No results found": "No se encontraron resultados", "No results found": "No se encontraron resultados",
"You don't have permission to create pages here": "No tienes permiso para crear páginas aquí", "You don't have permission to create pages here": "No tienes permiso para crear páginas aquí",
"Chat menu": "Menú del chat", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "Menú de la clave API", "API key menu": "Menú de la clave API",
"Jump to comment selection": "Ir a la selección de comentarios", "Jump to comment selection": "Ir a la selección de comentarios",
"Slash commands": "Comandos de barra", "Slash commands": "Comandos de barra",
@@ -1063,7 +1064,7 @@
"Filter": "Filtrar", "Filter": "Filtrar",
"Page title": "Título de la página", "Page title": "Título de la página",
"Page content": "Contenido de la página", "Page content": "Contenido de la página",
"Member actions": "Acciones de miembro", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Alternar visibilidad de la contraseña", "Toggle password visibility": "Alternar visibilidad de la contraseña",
"Send comment": "Enviar comentario", "Send comment": "Enviar comentario",
"Token actions": "Acciones de token", "Token actions": "Acciones de token",
@@ -424,6 +424,7 @@
"Names do not match": "Les noms ne correspondent pas", "Names do not match": "Les noms ne correspondent pas",
"Today, {{time}}": "Aujourdhui, {{time}}", "Today, {{time}}": "Aujourdhui, {{time}}",
"Yesterday, {{time}}": "Hier, {{time}}", "Yesterday, {{time}}": "Hier, {{time}}",
"now": "now",
"Space created successfully": "Espace créé avec succès", "Space created successfully": "Espace créé avec succès",
"Space updated successfully": "Espace mis à jour avec succès", "Space updated successfully": "Espace mis à jour avec succès",
"Space deleted successfully": "Espace supprimé avec succès", "Space deleted successfully": "Espace supprimé avec succès",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Rechercher des pages et des espaces...", "Search pages and spaces...": "Rechercher des pages et des espaces...",
"No results found": "Aucun résultat trouvé", "No results found": "Aucun résultat trouvé",
"You don't have permission to create pages here": "Vous navez pas lautorisation de créer des pages ici", "You don't have permission to create pages here": "Vous navez pas lautorisation de créer des pages ici",
"Chat menu": "Menu du chat", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "Menu de la clé API", "API key menu": "Menu de la clé API",
"Jump to comment selection": "Aller à la sélection de commentaires", "Jump to comment selection": "Aller à la sélection de commentaires",
"Slash commands": "Commandes slash", "Slash commands": "Commandes slash",
@@ -1063,7 +1064,7 @@
"Filter": "Filtrer", "Filter": "Filtrer",
"Page title": "Titre de la page", "Page title": "Titre de la page",
"Page content": "Contenu de la page", "Page content": "Contenu de la page",
"Member actions": "Actions des membres", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Afficher/masquer le mot de passe", "Toggle password visibility": "Afficher/masquer le mot de passe",
"Send comment": "Envoyer le commentaire", "Send comment": "Envoyer le commentaire",
"Token actions": "Actions du jeton", "Token actions": "Actions du jeton",
@@ -424,6 +424,7 @@
"Names do not match": "I nomi non corrispondono", "Names do not match": "I nomi non corrispondono",
"Today, {{time}}": "Oggi, {{time}}", "Today, {{time}}": "Oggi, {{time}}",
"Yesterday, {{time}}": "Ieri, {{time}}", "Yesterday, {{time}}": "Ieri, {{time}}",
"now": "now",
"Space created successfully": "Spazio creato con successo", "Space created successfully": "Spazio creato con successo",
"Space updated successfully": "Spazio aggiornato con successo", "Space updated successfully": "Spazio aggiornato con successo",
"Space deleted successfully": "Spazio eliminato con successo", "Space deleted successfully": "Spazio eliminato con successo",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Cerca pagine e spazi...", "Search pages and spaces...": "Cerca pagine e spazi...",
"No results found": "Nessun risultato trovato", "No results found": "Nessun risultato trovato",
"You don't have permission to create pages here": "Non hai l'autorizzazione per creare pagine qui", "You don't have permission to create pages here": "Non hai l'autorizzazione per creare pagine qui",
"Chat menu": "Menu della chat", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "Menu della chiave API", "API key menu": "Menu della chiave API",
"Jump to comment selection": "Vai alla selezione dei commenti", "Jump to comment selection": "Vai alla selezione dei commenti",
"Slash commands": "Comandi slash", "Slash commands": "Comandi slash",
@@ -1063,7 +1064,7 @@
"Filter": "Filtro", "Filter": "Filtro",
"Page title": "Titolo pagina", "Page title": "Titolo pagina",
"Page content": "Contenuto della pagina", "Page content": "Contenuto della pagina",
"Member actions": "Azioni membro", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Attiva/disattiva visibilità password", "Toggle password visibility": "Attiva/disattiva visibilità password",
"Send comment": "Invia commento", "Send comment": "Invia commento",
"Token actions": "Azioni token", "Token actions": "Azioni token",
@@ -424,6 +424,7 @@
"Names do not match": "名前が一致しません", "Names do not match": "名前が一致しません",
"Today, {{time}}": "今日 {{time}}", "Today, {{time}}": "今日 {{time}}",
"Yesterday, {{time}}": "昨日 {{time}}", "Yesterday, {{time}}": "昨日 {{time}}",
"now": "now",
"Space created successfully": "スペースが正常に作成されました", "Space created successfully": "スペースが正常に作成されました",
"Space updated successfully": "スペースが正常に更新されました", "Space updated successfully": "スペースが正常に更新されました",
"Space deleted successfully": "スペースが正常に削除されました", "Space deleted successfully": "スペースが正常に削除されました",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "ページとスペースを検索…", "Search pages and spaces...": "ページとスペースを検索…",
"No results found": "結果が見つかりません", "No results found": "結果が見つかりません",
"You don't have permission to create pages here": "ここにページを作成する権限がありません", "You don't have permission to create pages here": "ここにページを作成する権限がありません",
"Chat menu": "チャットメニュー", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "API キーメニュー", "API key menu": "API キーメニュー",
"Jump to comment selection": "コメント選択に移動", "Jump to comment selection": "コメント選択に移動",
"Slash commands": "スラッシュコマンド", "Slash commands": "スラッシュコマンド",
@@ -1063,7 +1064,7 @@
"Filter": "フィルター", "Filter": "フィルター",
"Page title": "ページタイトル", "Page title": "ページタイトル",
"Page content": "ページ内容", "Page content": "ページ内容",
"Member actions": "メンバーの操作", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "パスワードの表示を切り替え", "Toggle password visibility": "パスワードの表示を切り替え",
"Send comment": "コメントを送信", "Send comment": "コメントを送信",
"Token actions": "トークンの操作", "Token actions": "トークンの操作",
@@ -424,6 +424,7 @@
"Names do not match": "이름이 일치하지 않습니다", "Names do not match": "이름이 일치하지 않습니다",
"Today, {{time}}": "오늘, {{time}}", "Today, {{time}}": "오늘, {{time}}",
"Yesterday, {{time}}": "어제, {{time}}", "Yesterday, {{time}}": "어제, {{time}}",
"now": "now",
"Space created successfully": "스페이스가 성공적으로 생성되었습니다", "Space created successfully": "스페이스가 성공적으로 생성되었습니다",
"Space updated successfully": "스페이스가 성공적으로 업데이트되었습니다", "Space updated successfully": "스페이스가 성공적으로 업데이트되었습니다",
"Space deleted successfully": "스페이스가 성공적으로 삭제되었습니다", "Space deleted successfully": "스페이스가 성공적으로 삭제되었습니다",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "페이지와 스페이스 검색...", "Search pages and spaces...": "페이지와 스페이스 검색...",
"No results found": "결과를 찾을 수 없습니다", "No results found": "결과를 찾을 수 없습니다",
"You don't have permission to create pages here": "여기에서 페이지를 만들 권한이 없습니다", "You don't have permission to create pages here": "여기에서 페이지를 만들 권한이 없습니다",
"Chat menu": "채팅 메뉴", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "API 키 메뉴", "API key menu": "API 키 메뉴",
"Jump to comment selection": "댓글 선택으로 이동", "Jump to comment selection": "댓글 선택으로 이동",
"Slash commands": "슬래시 명령어", "Slash commands": "슬래시 명령어",
@@ -1063,7 +1064,7 @@
"Filter": "필터", "Filter": "필터",
"Page title": "페이지 제목", "Page title": "페이지 제목",
"Page content": "페이지 내용", "Page content": "페이지 내용",
"Member actions": "멤버 작업", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "비밀번호 표시 전환", "Toggle password visibility": "비밀번호 표시 전환",
"Send comment": "댓글 보내기", "Send comment": "댓글 보내기",
"Token actions": "토큰 작업", "Token actions": "토큰 작업",
@@ -424,6 +424,7 @@
"Names do not match": "Namen komen niet overeen", "Names do not match": "Namen komen niet overeen",
"Today, {{time}}": "Vandaag, {{time}}", "Today, {{time}}": "Vandaag, {{time}}",
"Yesterday, {{time}}": "Gisteren, {{time}}", "Yesterday, {{time}}": "Gisteren, {{time}}",
"now": "now",
"Space created successfully": "Ruimte succesvol aangemaakt", "Space created successfully": "Ruimte succesvol aangemaakt",
"Space updated successfully": "Ruimte succesvol bijgewerkt", "Space updated successfully": "Ruimte succesvol bijgewerkt",
"Space deleted successfully": "Ruimte succesvol verwijderd", "Space deleted successfully": "Ruimte succesvol verwijderd",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Pagina's en werkruimtes zoeken...", "Search pages and spaces...": "Pagina's en werkruimtes zoeken...",
"No results found": "Geen resultaten gevonden", "No results found": "Geen resultaten gevonden",
"You don't have permission to create pages here": "Je hebt geen toestemming om hier pagina's te maken", "You don't have permission to create pages here": "Je hebt geen toestemming om hier pagina's te maken",
"Chat menu": "Chatmenu", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "API-sleutelmenu", "API key menu": "API-sleutelmenu",
"Jump to comment selection": "Naar reactieselectie springen", "Jump to comment selection": "Naar reactieselectie springen",
"Slash commands": "Slash-opdrachten", "Slash commands": "Slash-opdrachten",
@@ -1063,7 +1064,7 @@
"Filter": "Filter", "Filter": "Filter",
"Page title": "Paginatitel", "Page title": "Paginatitel",
"Page content": "Pagina-inhoud", "Page content": "Pagina-inhoud",
"Member actions": "Lidacties", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Wachtwoordzichtbaarheid in-/uitschakelen", "Toggle password visibility": "Wachtwoordzichtbaarheid in-/uitschakelen",
"Send comment": "Reactie verzenden", "Send comment": "Reactie verzenden",
"Token actions": "Tokenacties", "Token actions": "Tokenacties",
@@ -424,6 +424,7 @@
"Names do not match": "Os nomes não correspondem", "Names do not match": "Os nomes não correspondem",
"Today, {{time}}": "Hoje, {{time}}", "Today, {{time}}": "Hoje, {{time}}",
"Yesterday, {{time}}": "Ontem, {{time}}", "Yesterday, {{time}}": "Ontem, {{time}}",
"now": "now",
"Space created successfully": "Espaço criado com sucesso", "Space created successfully": "Espaço criado com sucesso",
"Space updated successfully": "Espaço atualizado com sucesso", "Space updated successfully": "Espaço atualizado com sucesso",
"Space deleted successfully": "Espaço excluído com sucesso", "Space deleted successfully": "Espaço excluído com sucesso",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Pesquisar páginas e espaços...", "Search pages and spaces...": "Pesquisar páginas e espaços...",
"No results found": "Nenhum resultado encontrado", "No results found": "Nenhum resultado encontrado",
"You don't have permission to create pages here": "Você não tem permissão para criar páginas aqui", "You don't have permission to create pages here": "Você não tem permissão para criar páginas aqui",
"Chat menu": "Menu do chat", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "Menu da chave de API", "API key menu": "Menu da chave de API",
"Jump to comment selection": "Ir para a seleção de comentários", "Jump to comment selection": "Ir para a seleção de comentários",
"Slash commands": "Comandos de barra", "Slash commands": "Comandos de barra",
@@ -1063,7 +1064,7 @@
"Filter": "Filtrar", "Filter": "Filtrar",
"Page title": "Título da página", "Page title": "Título da página",
"Page content": "Conteúdo da página", "Page content": "Conteúdo da página",
"Member actions": "Ações do membro", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Alternar visibilidade da senha", "Toggle password visibility": "Alternar visibilidade da senha",
"Send comment": "Enviar comentário", "Send comment": "Enviar comentário",
"Token actions": "Ações do token", "Token actions": "Ações do token",
@@ -424,6 +424,7 @@
"Names do not match": "Названия не совпадают", "Names do not match": "Названия не совпадают",
"Today, {{time}}": "Сегодня, {{time}}", "Today, {{time}}": "Сегодня, {{time}}",
"Yesterday, {{time}}": "Вчера, {{time}}", "Yesterday, {{time}}": "Вчера, {{time}}",
"now": "сейчас",
"Space created successfully": "Пространство успешно создано", "Space created successfully": "Пространство успешно создано",
"Space updated successfully": "Пространство успешно обновлено", "Space updated successfully": "Пространство успешно обновлено",
"Space deleted successfully": "Пространство успешно удалено", "Space deleted successfully": "Пространство успешно удалено",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Поиск страниц и пространств...", "Search pages and spaces...": "Поиск страниц и пространств...",
"No results found": "Результаты не найдены", "No results found": "Результаты не найдены",
"You don't have permission to create pages here": "У вас нет прав на создание страниц здесь", "You don't have permission to create pages here": "У вас нет прав на создание страниц здесь",
"Chat menu": "Меню чата", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "Меню API-ключа", "API key menu": "Меню API-ключа",
"Jump to comment selection": "Перейти к выбору комментария", "Jump to comment selection": "Перейти к выбору комментария",
"Slash commands": "Команды со слешем", "Slash commands": "Команды со слешем",
@@ -1063,7 +1064,7 @@
"Filter": "Фильтр", "Filter": "Фильтр",
"Page title": "Заголовок страницы", "Page title": "Заголовок страницы",
"Page content": "Содержимое страницы", "Page content": "Содержимое страницы",
"Member actions": "Действия с участником", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Переключить видимость пароля", "Toggle password visibility": "Переключить видимость пароля",
"Send comment": "Отправить комментарий", "Send comment": "Отправить комментарий",
"Token actions": "Действия с токеном", "Token actions": "Действия с токеном",
@@ -424,6 +424,7 @@
"Names do not match": "Назви не збігаються", "Names do not match": "Назви не збігаються",
"Today, {{time}}": "Сьогодні, {{time}}", "Today, {{time}}": "Сьогодні, {{time}}",
"Yesterday, {{time}}": "Вчора, {{time}}", "Yesterday, {{time}}": "Вчора, {{time}}",
"now": "now",
"Space created successfully": "Простір успішно створено", "Space created successfully": "Простір успішно створено",
"Space updated successfully": "Простір успішно оновлено", "Space updated successfully": "Простір успішно оновлено",
"Space deleted successfully": "Простір успішно видалено", "Space deleted successfully": "Простір успішно видалено",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "Шукати сторінки та простори...", "Search pages and spaces...": "Шукати сторінки та простори...",
"No results found": "Результати не знайдено", "No results found": "Результати не знайдено",
"You don't have permission to create pages here": "У вас немає дозволу на створення сторінок тут", "You don't have permission to create pages here": "У вас немає дозволу на створення сторінок тут",
"Chat menu": "Меню чату", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "Меню ключа API", "API key menu": "Меню ключа API",
"Jump to comment selection": "Перейти до вибору коментаря", "Jump to comment selection": "Перейти до вибору коментаря",
"Slash commands": "Слеш-команди", "Slash commands": "Слеш-команди",
@@ -1063,7 +1064,7 @@
"Filter": "Фільтр", "Filter": "Фільтр",
"Page title": "Назва сторінки", "Page title": "Назва сторінки",
"Page content": "Вміст сторінки", "Page content": "Вміст сторінки",
"Member actions": "Дії з учасником", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "Перемкнути видимість пароля", "Toggle password visibility": "Перемкнути видимість пароля",
"Send comment": "Надіслати коментар", "Send comment": "Надіслати коментар",
"Token actions": "Дії з токеном", "Token actions": "Дії з токеном",
@@ -424,6 +424,7 @@
"Names do not match": "名称不匹配", "Names do not match": "名称不匹配",
"Today, {{time}}": "今天,{{time}}", "Today, {{time}}": "今天,{{time}}",
"Yesterday, {{time}}": "昨天,{{time}}", "Yesterday, {{time}}": "昨天,{{time}}",
"now": "now",
"Space created successfully": "空间创建成功", "Space created successfully": "空间创建成功",
"Space updated successfully": "空间更新成功", "Space updated successfully": "空间更新成功",
"Space deleted successfully": "空间删除成功", "Space deleted successfully": "空间删除成功",
@@ -977,7 +978,7 @@
"Search pages and spaces...": "搜索页面和空间……", "Search pages and spaces...": "搜索页面和空间……",
"No results found": "未找到结果", "No results found": "未找到结果",
"You don't have permission to create pages here": "你无权在此处创建页面", "You don't have permission to create pages here": "你无权在此处创建页面",
"Chat menu": "聊天菜单", "Chat menu for {{title}}": "Chat menu for {{title}}",
"API key menu": "API 密钥菜单", "API key menu": "API 密钥菜单",
"Jump to comment selection": "跳转到评论选择", "Jump to comment selection": "跳转到评论选择",
"Slash commands": "斜杠命令", "Slash commands": "斜杠命令",
@@ -1063,7 +1064,7 @@
"Filter": "筛选", "Filter": "筛选",
"Page title": "页面标题", "Page title": "页面标题",
"Page content": "页面内容", "Page content": "页面内容",
"Member actions": "成员操作", "Member actions for {{name}}": "Member actions for {{name}}",
"Toggle password visibility": "切换密码可见性", "Toggle password visibility": "切换密码可见性",
"Send comment": "发送评论", "Send comment": "发送评论",
"Token actions": "令牌操作", "Token actions": "令牌操作",
@@ -105,7 +105,7 @@ export default function GlobalSidebar() {
<Divider my="xs" /> <Divider my="xs" />
<div className={classes.section}> <div className={classes.section}>
<Text component="h2" className={classes.sectionHeader}>{t("Favorite spaces")}</Text> <Text className={classes.sectionHeader}>{t("Favorite spaces")}</Text>
{!isFavoritesPending && sortedFavoriteSpaces.length === 0 ? ( {!isFavoritesPending && sortedFavoriteSpaces.length === 0 ? (
<Text size="xs" c="dimmed" pl="xs" py={4}> <Text size="xs" c="dimmed" pl="xs" py={4}>
{t("Favorite spaces appear here")} {t("Favorite spaces appear here")}
+10 -18
View File
@@ -16,10 +16,13 @@ interface CustomAvatarProps {
mt?: string | number; mt?: string | number;
} }
// color.shade picks whose FILLED variant (white text on the shade) meets WCAG AA 4.5:1. // `color.shade` pairs whose contrast meets WCAG AA (4.5:1) in BOTH variants:
// Avoids lime/yellow/green/orange, too light even at dark shades. // - filled: white text on the shade as bg
// For non-filled variants, initials text is forced to the .9 shade at render time: // - light: shade as text on the color's light-bg (10% color.6 over white)
// Mantine otherwise caps light-variant placeholder text at .6, dropping contrast to ~3:1. // Avoids lime/yellow/green/orange — even their dark shades have weak
// contrast. grape and indigo were bumped from .7 to darker shades because
// the original picks failed: grape.7 was 4.02/3.61 (both fail) and
// indigo.7 was 4.98/4.39 (light fails by a hair).
const SAFE_INITIALS_COLORS: MantineColor[] = [ const SAFE_INITIALS_COLORS: MantineColor[] = [
"blue.8", "blue.8",
"cyan.9", "cyan.9",
@@ -51,21 +54,12 @@ function sanitizeInitialsSource(name: string) {
export const CustomAvatar = React.forwardRef< export const CustomAvatar = React.forwardRef<
HTMLInputElement, HTMLInputElement,
CustomAvatarProps CustomAvatarProps
>(({ avatarUrl, name, type, color, variant, ...props }: CustomAvatarProps, ref) => { >(({ avatarUrl, name, type, color, ...props }: CustomAvatarProps, ref) => {
const avatarLink = getAvatarUrl(avatarUrl, type); const avatarLink = getAvatarUrl(avatarUrl, type);
const isInitials = !color || color === "initials"; const resolvedColor =
const resolvedColor = isInitials ? pickInitialsColor(name ?? "") : color; !color || color === "initials" ? pickInitialsColor(name ?? "") : color;
const initialsSource = sanitizeInitialsSource(name ?? ""); const initialsSource = sanitizeInitialsSource(name ?? "");
const placeholderStyles =
isInitials && variant !== "filled"
? {
placeholder: {
color: `var(--mantine-color-${resolvedColor.split(".")[0]}-9)`,
},
}
: undefined;
return ( return (
<Avatar <Avatar
ref={ref} ref={ref}
@@ -73,8 +67,6 @@ export const CustomAvatar = React.forwardRef<
name={initialsSource} name={initialsSource}
alt={name} alt={name}
color={resolvedColor} color={resolvedColor}
variant={variant}
styles={placeholderStyles}
{...props} {...props}
/> />
); );
@@ -1,12 +0,0 @@
import { UnstyledButton } from "@mantine/core";
import { type ComponentPropsWithoutRef, forwardRef } from "react";
// Menu.Item hard-codes role="menuitem"; use as its `component` to restore role="menuitemradio" so aria-checked works.
export const RadioMenuItem = forwardRef<
HTMLButtonElement,
ComponentPropsWithoutRef<"button">
>((props, ref) => (
<UnstyledButton ref={ref} {...props} role="menuitemradio" />
));
RadioMenuItem.displayName = "RadioMenuItem";
@@ -66,8 +66,6 @@ export default function AiChatSidebarItem({
[chat.updatedAt, i18n.language], [chat.updatedAt, i18n.language],
); );
const chatTitle = chat.title || t("Untitled chat");
useEffect(() => { useEffect(() => {
if (renaming) { if (renaming) {
// Wait for the input to be mounted before selecting. // Wait for the input to be mounted before selecting.
@@ -122,7 +120,9 @@ export default function AiChatSidebarItem({
className={classes.chatItem} className={classes.chatItem}
data-active={isActive || undefined} data-active={isActive || undefined}
> >
<span className={classes.chatItemTitle}>{chatTitle}</span> <span className={classes.chatItemTitle}>
{chat.title || t("Untitled chat")}
</span>
<span className={classes.chatItemDate}>{formattedDate}</span> <span className={classes.chatItemDate}>{formattedDate}</span>
<div className={classes.chatItemActions}> <div className={classes.chatItemActions}>
<Menu position="bottom-end" withinPortal> <Menu position="bottom-end" withinPortal>
@@ -132,7 +132,7 @@ export default function AiChatSidebarItem({
size="xs" size="xs"
color="gray" color="gray"
onClick={(e) => e.preventDefault()} onClick={(e) => e.preventDefault()}
aria-label={t("Chat menu for {{title}}", { title: chatTitle })} aria-label={t("Chat menu")}
> >
<IconDots size={14} /> <IconDots size={14} />
</ActionIcon> </ActionIcon>
@@ -1,4 +1,4 @@
import { useCallback, useId, useRef, useEffect, useState } from "react"; import { useCallback, useRef, useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { IconArrowUp, IconPaperclip, IconPlayerStopFilled, IconX, IconFile, IconPhoto, IconPlus, IconAt, IconFileText } from "@tabler/icons-react"; import { IconArrowUp, IconPaperclip, IconPlayerStopFilled, IconX, IconFile, IconPhoto, IconPlus, IconAt, IconFileText } from "@tabler/icons-react";
import { Popover } from "@mantine/core"; import { Popover } from "@mantine/core";
@@ -107,7 +107,6 @@ export default function ChatInput({
const [isEmpty, setIsEmpty] = useState(true); const [isEmpty, setIsEmpty] = useState(true);
const [pendingAttachments, setPendingAttachments] = useState<PendingAttachment[]>([]); const [pendingAttachments, setPendingAttachments] = useState<PendingAttachment[]>([]);
const [plusMenuOpen, setPlusMenuOpen] = useState(false); const [plusMenuOpen, setPlusMenuOpen] = useState(false);
const plusMenuId = useId();
const fileInputRef = useRef<HTMLInputElement>(null); const fileInputRef = useRef<HTMLInputElement>(null);
const onSendRef = useRef(onSend); const onSendRef = useRef(onSend);
onSendRef.current = onSend; onSendRef.current = onSend;
@@ -343,7 +342,6 @@ export default function ChatInput({
position="top-start" position="top-start"
width={220} width={220}
shadow="md" shadow="md"
withRoles={false}
trapFocus trapFocus
returnFocus returnFocus
> >
@@ -353,17 +351,13 @@ export default function ChatInput({
className={classes.plusButton} className={classes.plusButton}
onClick={() => setPlusMenuOpen((o) => !o)} onClick={() => setPlusMenuOpen((o) => !o)}
aria-label="Add content" aria-label="Add content"
aria-haspopup="menu"
aria-expanded={plusMenuOpen}
aria-controls={plusMenuOpen ? plusMenuId : undefined}
> >
<IconPlus size={14} /> <IconPlus size={14} />
</button> </button>
</Popover.Target> </Popover.Target>
<Popover.Dropdown id={plusMenuId} role="menu" p={4}> <Popover.Dropdown p={4}>
<button <button
type="button" type="button"
role="menuitem"
className={classes.plusMenuItem} className={classes.plusMenuItem}
onClick={() => { onClick={() => {
fileInputRef.current?.click(); fileInputRef.current?.click();
@@ -383,7 +377,6 @@ export default function ChatInput({
</button> </button>
<button <button
type="button" type="button"
role="menuitem"
className={classes.plusMenuItem} className={classes.plusMenuItem}
onClick={() => { onClick={() => {
editor?.commands.insertContent("@"); editor?.commands.insertContent("@");
@@ -392,7 +385,7 @@ export default function ChatInput({
}} }}
> >
<IconAt size={16} className={classes.plusMenuIcon} /> <IconAt size={16} className={classes.plusMenuIcon} />
{t("Mention a page")} Mention a page
</button> </button>
</Popover.Dropdown> </Popover.Dropdown>
</Popover> </Popover>
@@ -76,6 +76,7 @@
padding: var(--mantine-spacing-xs) var(--mantine-spacing-lg) var(--mantine-spacing-lg); padding: var(--mantine-spacing-xs) var(--mantine-spacing-lg) var(--mantine-spacing-lg);
} }
/* Empty state - Notion AI style centered layout */
.emptyState { .emptyState {
flex: 1; flex: 1;
display: flex; display: flex;
@@ -204,6 +204,10 @@
opacity: 1; opacity: 1;
} }
.ProseMirror table th:has(.tableReadonlySortChevron) {
padding-right: 30px;
}
.tableReadonlySortChevron:hover { .tableReadonlySortChevron:hover {
background: light-dark( background: light-dark(
rgba(55, 53, 47, 0.16), rgba(55, 53, 47, 0.16),
@@ -91,9 +91,7 @@ export default function GroupMembersList() {
<ActionIcon <ActionIcon
variant="subtle" variant="subtle"
c="gray" c="gray"
aria-label={t("Member actions for {{name}}", { aria-label={t("Member actions")}
name: user.name,
})}
> >
<IconDots size={20} stroke={2} /> <IconDots size={20} stroke={2} />
</ActionIcon> </ActionIcon>
@@ -1,4 +1,4 @@
import { useId, useState } from "react"; import { useState } from "react";
import { import {
ActionIcon, ActionIcon,
Group, Group,
@@ -31,7 +31,6 @@ import classes from "../notification.module.css";
export function NotificationPopover() { export function NotificationPopover() {
const { t } = useTranslation(); const { t } = useTranslation();
const titleId = useId();
const [opened, setOpened] = useState(false); const [opened, setOpened] = useState(false);
const [tab, setTab] = useState<NotificationTab>("direct"); const [tab, setTab] = useState<NotificationTab>("direct");
const [filter, setFilter] = useState<NotificationFilter>("all"); const [filter, setFilter] = useState<NotificationFilter>("all");
@@ -84,11 +83,10 @@ export function NotificationPopover() {
<Popover.Dropdown <Popover.Dropdown
p={0} p={0}
aria-labelledby={titleId}
style={{ width: "min(420px, calc(100vw - 24px))" }} style={{ width: "min(420px, calc(100vw - 24px))" }}
> >
<Group justify="space-between" px="md" py="sm"> <Group justify="space-between" px="md" py="sm">
<Title id={titleId} order={2} fz="sm" fw={600}> <Title order={2} fz="sm" fw={600}>
{t("Notifications")} {t("Notifications")}
</Title> </Title>
<Group gap={4}> <Group gap={4}>
@@ -34,7 +34,6 @@ import { treeDataAtom } from "@/features/page/tree/atoms/tree-data-atom.ts";
import { treeModel } from "@/features/page/tree/model/tree-model"; import { treeModel } from "@/features/page/tree/model/tree-model";
import { useTreeMutation } from "@/features/page/tree/hooks/use-tree-mutation.ts"; import { useTreeMutation } from "@/features/page/tree/hooks/use-tree-mutation.ts";
import type { SpaceTreeNode } from "@/features/page/tree/types.ts"; import type { SpaceTreeNode } from "@/features/page/tree/types.ts";
import classes from "@/features/page/tree/styles/tree.module.css";
export interface NodeMenuProps { export interface NodeMenuProps {
node: SpaceTreeNode; node: SpaceTreeNode;
@@ -124,9 +123,8 @@ export function NodeMenu({ node, canEdit }: NodeMenuProps) {
<Menu shadow="md" width={200}> <Menu shadow="md" width={200}>
<Menu.Target> <Menu.Target>
<ActionIcon <ActionIcon
variant="subtle" variant="transparent"
color="gray" c="gray"
className={classes.actionIcon}
aria-label={t("Page menu for {{name}}", { name: node.name || t("untitled") })} aria-label={t("Page menu for {{name}}", { name: node.name || t("untitled") })}
tabIndex={-1} tabIndex={-1}
onClick={(e) => { onClick={(e) => {
@@ -201,13 +201,13 @@ function PageArrow({ isOpen, hasChildren, onToggle }: PageArrowProps) {
return ( return (
<span <span
aria-hidden aria-hidden
className={classes.actionIcon}
style={{ style={{
width: 20, width: 20,
height: 20, height: 20,
display: "inline-flex", display: "inline-flex",
alignItems: "center", alignItems: "center",
justifyContent: "center", justifyContent: "center",
color: "var(--mantine-color-gray-6)",
flexShrink: 0, flexShrink: 0,
}} }}
> >
@@ -220,8 +220,7 @@ function PageArrow({ isOpen, hasChildren, onToggle }: PageArrowProps) {
<ActionIcon <ActionIcon
size={20} size={20}
variant="subtle" variant="subtle"
color="gray" c="gray"
className={classes.actionIcon}
aria-label={isOpen ? t("Collapse") : t("Expand")} aria-label={isOpen ? t("Collapse") : t("Expand")}
aria-expanded={isOpen} aria-expanded={isOpen}
tabIndex={-1} tabIndex={-1}
@@ -273,9 +272,8 @@ function CreateNode({
return ( return (
<ActionIcon <ActionIcon
variant="subtle" variant="transparent"
color="gray" c="gray"
className={classes.actionIcon}
aria-label={t("Create subpage of {{name}}", { name: node.name || t("untitled") })} aria-label={t("Create subpage of {{name}}", { name: node.name || t("untitled") })}
tabIndex={-1} tabIndex={-1}
onClick={(e) => { onClick={(e) => {
@@ -57,10 +57,6 @@
flex-shrink: 0; flex-shrink: 0;
} }
.actionIcon {
color: light-dark(var(--mantine-color-dark-3), var(--mantine-color-gray-4));
}
.text { .text {
flex: 1; flex: 1;
/* min-width: 0 lets a flex child shrink below its content size — required /* min-width: 0 lets a flex child shrink below its content size — required
@@ -17,7 +17,6 @@ import {
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useGetSpacesQuery } from "@/features/space/queries/space-query"; import { useGetSpacesQuery } from "@/features/space/queries/space-query";
import { SpaceFilterMenu } from "@/features/space/components/space-filter-menu"; import { SpaceFilterMenu } from "@/features/space/components/space-filter-menu";
import { RadioMenuItem } from "@/components/ui/radio-menu-item";
import { useHasFeature } from "@/ee/hooks/use-feature"; import { useHasFeature } from "@/ee/hooks/use-feature";
import { Feature } from "@/ee/features"; import { Feature } from "@/ee/features";
import classes from "./search-spotlight-filters.module.css"; import classes from "./search-spotlight-filters.module.css";
@@ -176,7 +175,7 @@ export function SearchSpotlightFilters({
{contentTypeOptions.map((option) => ( {contentTypeOptions.map((option) => (
<Menu.Item <Menu.Item
key={option.value} key={option.value}
component={RadioMenuItem} role="menuitemradio"
aria-checked={contentType === option.value} aria-checked={contentType === option.value}
onClick={() => onClick={() =>
!option.disabled && !option.disabled &&
@@ -13,7 +13,6 @@ import { useDebouncedValue } from "@mantine/hooks";
import { IconCheck, IconSearch } from "@tabler/icons-react"; import { IconCheck, IconSearch } from "@tabler/icons-react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useGetSpacesQuery } from "@/features/space/queries/space-query"; import { useGetSpacesQuery } from "@/features/space/queries/space-query";
import { RadioMenuItem } from "@/components/ui/radio-menu-item";
type SpaceFilterMenuProps = { type SpaceFilterMenuProps = {
value: string | null; value: string | null;
@@ -76,7 +75,7 @@ export function SpaceFilterMenu({
<ScrollArea.Autosize mah={280}> <ScrollArea.Autosize mah={280}>
<Menu.Item <Menu.Item
component={RadioMenuItem} role="menuitemradio"
aria-checked={!value} aria-checked={!value}
onClick={() => onChange(null)} onClick={() => onChange(null)}
> >
@@ -104,7 +103,7 @@ export function SpaceFilterMenu({
{orderedSpaces.map((space) => ( {orderedSpaces.map((space) => (
<Menu.Item <Menu.Item
key={space.id} key={space.id}
component={RadioMenuItem} role="menuitemradio"
aria-checked={value === space.id} aria-checked={value === space.id}
onClick={() => onChange(space.id)} onClick={() => onChange(space.id)}
> >
@@ -210,9 +210,7 @@ export default function SpaceMembersList({
<ActionIcon <ActionIcon
variant="subtle" variant="subtle"
c="gray" c="gray"
aria-label={t("Member actions for {{name}}", { aria-label={t("Member actions")}
name: member.name,
})}
> >
<IconDots size={20} stroke={2} /> <IconDots size={20} stroke={2} />
</ActionIcon> </ActionIcon>
@@ -12,14 +12,9 @@ import useUserRole from "@/hooks/use-user-role.tsx";
interface Props { interface Props {
userId: string; userId: string;
name: string;
deactivatedAt: Date | null; deactivatedAt: Date | null;
} }
export default function MemberActionMenu({ export default function MemberActionMenu({ userId, deactivatedAt }: Props) {
userId,
name,
deactivatedAt,
}: Props) {
const { t } = useTranslation(); const { t } = useTranslation();
const deleteWorkspaceMemberMutation = useDeleteWorkspaceMemberMutation(); const deleteWorkspaceMemberMutation = useDeleteWorkspaceMemberMutation();
const deactivateMutation = useDeactivateWorkspaceMemberMutation(); const deactivateMutation = useDeactivateWorkspaceMemberMutation();
@@ -91,7 +86,7 @@ export default function MemberActionMenu({
<ActionIcon <ActionIcon
variant="subtle" variant="subtle"
c="gray" c="gray"
aria-label={t("Member actions for {{name}}", { name })} aria-label={t("Member actions")}
> >
<IconDots size={20} stroke={2} /> <IconDots size={20} stroke={2} />
</ActionIcon> </ActionIcon>
@@ -111,7 +111,6 @@ export default function WorkspaceMembersTable() {
{isAdmin && ( {isAdmin && (
<MemberActionMenu <MemberActionMenu
userId={user.id} userId={user.id}
name={user.name}
deactivatedAt={user.deactivatedAt} deactivatedAt={user.deactivatedAt}
/> />
)} )}