changed hex_metadata.config
 
@@ -4,7 +4,7 @@
4
4
{<<"ejabberd Docs">>,<<"https://docs.ejabberd.im">>},
5
5
{<<"ejabberd.im">>,<<"https://www.ejabberd.im">>}]}.
6
6
{<<"name">>,<<"ejabberd">>}.
7
- {<<"version">>,<<"25.3.0">>}.
7
+ {<<"version">>,<<"25.4.0">>}.
8
8
{<<"description">>,
9
9
<<"Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP, MQTT, SIP Server)">>}.
10
10
{<<"elixir">>,<<"~> 1.4">>}.
 
@@ -290,11 +290,6 @@
290
290
{<<"optional">>,false},
291
291
{<<"requirement">>,<<">= 1.0.18">>},
292
292
{<<"repository">>,<<"hexpm">>}],
293
- [{<<"name">>,<<"exsync">>},
294
- {<<"app">>,<<"exsync">>},
295
- {<<"optional">>,true},
296
- {<<"requirement">>,<<"~> 0.2">>},
297
- {<<"repository">>,<<"hexpm">>}],
298
293
[{<<"name">>,<<"ezlib">>},
299
294
{<<"app">>,<<"ezlib">>},
300
295
{<<"optional">>,false},
changed mix.exs
 
@@ -119,7 +119,7 @@ defmodule Ejabberd.MixProject do
119
119
[{:cache_tab, "~> 1.0"},
120
120
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
121
121
{:eimp, "~> 1.0"},
122
- {:ex_doc, ">= 0.0.0", only: :dev, runtime: false},
122
+ {:ex_doc, "~> 0.31", only: [:edoc], runtime: false},
123
123
{:fast_tls, "~> 1.1.22"},
124
124
{:fast_xml, "~> 1.1.53"},
125
125
{:fast_yaml, "~> 1.0"},
changed priv/msgs/ca.msg
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualsevol amb una subscripció de presencia de 'both' o 'from' pot subscriure's i publicar elements"}.
47
47
{"Anyone with Voice","Qualsevol amb Veu"}.
48
48
{"Anyone","Qualsevol"}.
49
+ {"API Commands","Comandaments API"}.
49
50
{"April","Abril"}.
51
+ {"Arguments","Arguments"}.
50
52
{"Attribute 'channel' is required for this request","L'atribut 'channel' és necessari per a aquesta petició"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","L'atribut 'id' es necessari per a missatges MIX"}.
52
54
{"Attribute 'jid' is not allowed here","L'atribut 'jid' no està permès ací"}.
 
@@ -86,6 +88,7 @@
86
88
{"Choose whether to approve this entity's subscription.","Tria si aproves aquesta entitat de subscripció."}.
87
89
{"City","Ciutat"}.
88
90
{"Client acknowledged more stanzas than sent by server","El client ha reconegut més paquets dels que ha enviat el servidor"}.
91
+ {"Clustering","Clustering"}.
89
92
{"Commands","Comandaments"}.
90
93
{"Conference room does not exist","La sala de conferències no existeix"}.
91
94
{"Configuration of room ~s","Configuració de la sala ~s"}.
 
@@ -408,6 +411,7 @@
408
411
{"Restore binary backup immediately:","Restaurar una còpia de seguretat binària ara mateix:"}.
409
412
{"Restore plain text backup immediately:","Restaurar una còpia de seguretat en format de text pla ara mateix:"}.
410
413
{"Restore","Restaurar"}.
414
+ {"Result","Resultat"}.
411
415
{"Roles and Affiliations that May Retrieve Member List","Rols i Afiliacions que poden recuperar la llista de membres"}.
412
416
{"Roles for which Presence is Broadcasted","Rols per als que sí se difon la seua presencia"}.
413
417
{"Roles that May Send Private Messages","Rols que poden enviar missatges privats"}.
 
@@ -584,6 +588,7 @@
584
588
{"Visitor","Visitant"}.
585
589
{"Voice request","Petició de veu"}.
586
590
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
591
+ {"Web client which allows to join the room anonymously","Client web que permet entrar a la sala anonimament"}.
587
592
{"Wednesday","Dimecres"}.
588
593
{"When a new subscription is processed and whenever a subscriber comes online","Quan es processa una nova subscripció i un subscriptor es connecta"}.
589
594
{"When a new subscription is processed","Quan es processa una nova subscripció"}.
changed priv/msgs/de.msg
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Jeder mit einem Präsenzabonnement von beiden oder davon darf Items abonnieren oder abrufen"}.
47
47
{"Anyone with Voice","Jeder mit Stimme"}.
48
48
{"Anyone","Jeder"}.
49
+ {"API Commands","API Befehle"}.
49
50
{"April","April"}.
51
+ {"Arguments","Argumente"}.
50
52
{"Attribute 'channel' is required for this request","Attribut 'channel' ist für diese Anforderung erforderlich"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","Attribut 'id' ist verpflichtend für MIX-Nachrichten"}.
52
54
{"Attribute 'jid' is not allowed here","Attribut 'jid' ist hier nicht erlaubt"}.
 
@@ -168,6 +170,7 @@
168
170
{"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}.
169
171
{"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}.
170
172
{"has been kicked","wurde hinausgeworfen"}.
173
+ {"Hash of the vCard-temp avatar of this room","Hash des vCard-temp Avatars dieses Raums"}.
171
174
{"Hat title","Funktionstitel"}.
172
175
{"Hat URI","Funktions-URI"}.
173
176
{"Hats limit exceeded","Funktionslimit wurde überschritten"}.
 
@@ -406,6 +409,7 @@
406
409
{"Restore binary backup immediately:","Stelle binäres Backup sofort wieder her:"}.
407
410
{"Restore plain text backup immediately:","Stelle Klartext-Backup sofort wieder her:"}.
408
411
{"Restore","Wiederherstellung"}.
412
+ {"Result","Ergebnis"}.
409
413
{"Roles and Affiliations that May Retrieve Member List","Rollen und Zugehörigkeiten die Mitgliederliste abrufen dürfen"}.
410
414
{"Roles for which Presence is Broadcasted","Rollen für welche die Präsenz übertragen wird"}.
411
415
{"Roles that May Send Private Messages","Rollen die Privatnachrichten senden dürfen"}.
 
@@ -550,6 +554,7 @@
550
554
{"Update message of the day on all hosts (don't send)","Aktualisiere Nachricht des Tages auf allen Hosts (nicht senden)"}.
551
555
{"Update specs to get modules source, then install desired ones.","Aktualisieren Sie die Spezifikationen, um den Quellcode der Module zu erhalten und installieren Sie dann die gewünschten Module."}.
552
556
{"Update Specs","Spezifikationen aktualisieren"}.
557
+ {"Updating the vCard is not supported by the vCard storage backend","Aktualisierung der vCard wird vom vCard-Speicher-Backend nicht unterstützt"}.
553
558
{"Upgrade","Upgrade"}.
554
559
{"URL for Archived Discussion Logs","URL für archivierte Diskussionsprotokolle"}.
555
560
{"User already exists","Benutzer existiert bereits"}.
 
@@ -578,6 +583,7 @@
578
583
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten versenden"}.
579
584
{"Voice requests are disabled in this conference","Sprachrecht-Anforderungen sind in diesem Raum deaktiviert"}.
580
585
{"Voice request","Sprachrecht-Anforderung"}.
586
+ {"Web client which allows to join the room anonymously","Web-Client, der es ermöglicht, dem Raum anonym beizutreten"}.
581
587
{"Wednesday","Mittwoch"}.
582
588
{"When a new subscription is processed and whenever a subscriber comes online","Sobald ein neues Abonnement verarbeitet wird und wann immer ein Abonnent sich anmeldet"}.
583
589
{"When a new subscription is processed","Sobald ein neues Abonnement verarbeitet wird"}.
changed priv/msgs/es.msg
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Cualquiera con una suscripción a la presencia de 'ambos' o 'de' puede suscribirse y recibir elementos"}.
47
47
{"Anyone with Voice","Cualquiera con Voz"}.
48
48
{"Anyone","Cualquiera"}.
49
+ {"API Commands","Comandos API"}.
49
50
{"April","Abril"}.
51
+ {"Arguments","Argumentos"}.
50
52
{"Attribute 'channel' is required for this request","El atributo 'channel' es necesario para esta petición"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","El atributo 'id' es necesario para mensajes MIX"}.
52
54
{"Attribute 'jid' is not allowed here","El atributo 'jid' no está permitido aqui"}.
 
@@ -86,6 +88,7 @@
86
88
{"Choose whether to approve this entity's subscription.","Decidir si aprobar la subscripción de esta entidad."}.
87
89
{"City","Ciudad"}.
88
90
{"Client acknowledged more stanzas than sent by server","El cliente ha reconocido más paquetes de los que el servidor ha enviado"}.
91
+ {"Clustering","Clustering"}.
89
92
{"Commands","Comandos"}.
90
93
{"Conference room does not exist","La sala de conferencias no existe"}.
91
94
{"Configuration of room ~s","Configuración para la sala ~s"}.
 
@@ -161,7 +164,7 @@
161
164
{"Get Pending","Obtener pendientes"}.
162
165
{"Get User Last Login Time","Ver fecha de la última conexión de usuario"}.
163
166
{"Get User Statistics","Ver estadísticas de usuario"}.
164
- {"Given Name","Nombre"}.
167
+ {"Given Name","Nombre de pila"}.
165
168
{"Grant voice to this person?","¿Conceder voz a esta persona?"}.
166
169
{"has been banned","ha sido bloqueado"}.
167
170
{"has been kicked because of a system shutdown","ha sido expulsado porque el sistema se va a detener"}.
 
@@ -408,6 +411,7 @@
408
411
{"Restore binary backup immediately:","Restaurar inmediatamente copia de seguridad binaria:"}.
409
412
{"Restore plain text backup immediately:","Restaurar copias de seguridad de texto plano inmediatamente:"}.
410
413
{"Restore","Restaurar"}.
414
+ {"Result","Resultado"}.
411
415
{"Roles and Affiliations that May Retrieve Member List","Roles y Afiliaciones que pueden obtener la lista de miembros"}.
412
416
{"Roles for which Presence is Broadcasted","Roles para los que sí se difunde su Presencia"}.
413
417
{"Roles that May Send Private Messages","Roles que pueden enviar mensajes privados"}.
 
@@ -584,6 +588,7 @@
584
588
{"Visitor","Visitante"}.
585
589
{"Voice request","Petición de voz"}.
586
590
{"Voice requests are disabled in this conference","Las peticiones de voz están desactivadas en esta sala"}.
591
+ {"Web client which allows to join the room anonymously","Cliente web que permite entrar en la sala anonimamente"}.
587
592
{"Wednesday","Miércoles"}.
588
593
{"When a new subscription is processed and whenever a subscriber comes online","Cuando se procesa una nueva suscripción y cuando un suscriptor se conecta"}.
589
594
{"When a new subscription is processed","Cuando se procesa una nueva suscripción"}.
changed priv/msgs/pt-br.msg
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualquer pessoa com uma assinatura presente dos dois ou de ambos pode se inscrever e recuperar os itens"}.
47
47
{"Anyone with Voice","Qualquer pessoa com voz"}.
48
48
{"Anyone","Qualquer pessoa"}.
49
+ {"API Commands","Comandos API"}.
49
50
{"April","Abril"}.
51
+ {"Arguments","Argumentos"}.
50
52
{"Attribute 'channel' is required for this request","O atributo 'canal' é necessário para esta solicitação"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","O atributo 'id' é obrigatório para mensagens MIX"}.
52
54
{"Attribute 'jid' is not allowed here","O atributo 'jid' não é permitido aqui"}.
 
@@ -86,6 +88,7 @@
86
88
{"Choose whether to approve this entity's subscription.","Aprovar esta assinatura."}.
87
89
{"City","Cidade"}.
88
90
{"Client acknowledged more stanzas than sent by server","O cliente reconheceu mais estrofes do que as enviadas pelo servidor"}.
91
+ {"Clustering","Agrupamento"}.
89
92
{"Commands","Comandos"}.
90
93
{"Conference room does not exist","A sala de conferência não existe"}.
91
94
{"Configuration of room ~s","Configuração para ~s"}.
 
@@ -408,6 +411,7 @@
408
411
{"Restore binary backup immediately:","Restaurar imediatamente o backup binário:"}.
409
412
{"Restore plain text backup immediately:","Restaurar backup formato texto imediatamente:"}.
410
413
{"Restore","Restaurar"}.
414
+ {"Result","Resultado"}.
411
415
{"Roles and Affiliations that May Retrieve Member List","As funções e as afiliações que podem recuperar a lista dos membros"}.
412
416
{"Roles for which Presence is Broadcasted","Para quem a presença será notificada"}.
413
417
{"Roles that May Send Private Messages","Atribuições que talvez possam enviar mensagens privadas"}.
 
@@ -584,6 +588,7 @@
584
588
{"Visitor","Visitante"}.
585
589
{"Voice request","Requisição de voz"}.
586
590
{"Voice requests are disabled in this conference","Requisições de voz estão desabilitadas nesta sala de conferência"}.
591
+ {"Web client which allows to join the room anonymously","Cliente da web que permite entrar na sala de forma anônima"}.
587
592
{"Wednesday","Quarta"}.
588
593
{"When a new subscription is processed and whenever a subscriber comes online","Quando uma nova assinatura é processada e sempre que um assinante fica online"}.
589
594
{"When a new subscription is processed","Quando uma nova assinatura é processada"}.
changed priv/msgs/pt.msg
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualquer pessoa com uma assinatura presente dos dois ou de ambos pode se inscrever e recuperar os itens"}.
47
47
{"Anyone with Voice","Qualquer pessoa com voz"}.
48
48
{"Anyone","Qualquer pessoa"}.
49
+ {"API Commands","Comandos API"}.
49
50
{"April","Abril"}.
51
+ {"Arguments","Argumentos"}.
50
52
{"Attribute 'channel' is required for this request","O atributo 'canal' é necessário para esta solicitação"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","O atributo 'id' é obrigatório para mensagens MIX"}.
52
54
{"Attribute 'jid' is not allowed here","O atributo 'jid' não é permitido aqui"}.
 
@@ -86,6 +88,7 @@
86
88
{"Choose whether to approve this entity's subscription.","Aprovar esta assinatura."}.
87
89
{"City","Cidade"}.
88
90
{"Client acknowledged more stanzas than sent by server","O cliente reconheceu mais estrofes do que as enviadas pelo servidor"}.
91
+ {"Clustering","Agrupamento"}.
89
92
{"Commands","Comandos"}.
90
93
{"Conference room does not exist","A sala não existe"}.
91
94
{"Configuration of room ~s","Configuração para ~s"}.
 
@@ -168,6 +171,7 @@
168
171
{"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}.
169
172
{"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}.
170
173
{"has been kicked","foi removido"}.
174
+ {"Hash of the vCard-temp avatar of this room","Hash do avatar do vCard-temp desta sala"}.
171
175
{"Hat title","Título do chapéu"}.
172
176
{"Hat URI","URI do chapéu"}.
173
177
{"Hats limit exceeded","O limite dos chapéus foi excedido"}.
 
@@ -223,6 +227,7 @@
223
227
{"leaves the room","Sair da sala"}.
224
228
{"List of users with hats","Lista os utilizadores com chapéus"}.
225
229
{"List users with hats","Lista os utilizadores com chapéus"}.
230
+ {"Logged Out","Desconectado"}.
226
231
{"Logging","Registando no log"}.
227
232
{"Make participants list public","Tornar pública a lista de participantes"}.
228
233
{"Make room CAPTCHA protected","Tornar protegida a palavra-passe da sala"}.
 
@@ -406,6 +411,7 @@
406
411
{"Restore binary backup immediately:","Restaurar imediatamente o backup binário:"}.
407
412
{"Restore plain text backup immediately:","Restaurar backup formato texto imediatamente:"}.
408
413
{"Restore","Restaurar"}.
414
+ {"Result","Resultado"}.
409
415
{"Roles and Affiliations that May Retrieve Member List","As funções e as afiliações que podem recuperar a lista dos membros"}.
410
416
{"Roles for which Presence is Broadcasted","Para quem a presença será notificada"}.
411
417
{"Roles that May Send Private Messages","Atribuições que talvez possam enviar mensagens privadas"}.
 
@@ -437,6 +443,7 @@
437
443
{"Set message of the day on all hosts and send to online users","Definir mensagem do dia em todos os hosts e enviar para os utilizadores online"}.
438
444
{"Shared Roster Groups","Grupos Shared Roster"}.
439
445
{"Show Integral Table","Mostrar Tabela Integral"}.
446
+ {"Show Occupants Join/Leave","Mostrar a entrada e a saída de ocupantes"}.
440
447
{"Show Ordinary Table","Mostrar Tabela Ordinária"}.
441
448
{"Shut Down Service","Parar Serviço"}.
442
449
{"SOCKS5 Bytestreams","Bytestreams SOCKS5"}.
 
@@ -534,6 +541,7 @@
534
541
{"Too many unacked stanzas","Quantidade excessiva de instâncias sem confirmação"}.
535
542
{"Too many users in this conference","Há uma quantidade excessiva de utilizadores nesta conferência"}.
536
543
{"Traffic rate limit is exceeded","Limite de banda excedido"}.
544
+ {"~ts's MAM Archive","Arquivo ~ts's MAM"}.
537
545
{"~ts's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
538
546
{"Tuesday","Terça"}.
539
547
{"Unable to generate a CAPTCHA","Impossível gerar um CAPTCHA"}.
 
@@ -550,12 +558,14 @@
550
558
{"Update message of the day on all hosts (don't send)","Atualizar a mensagem do dia em todos os host (não enviar)"}.
551
559
{"Update specs to get modules source, then install desired ones.","Atualize as especificações para obter a fonte dos módulos e instale os que desejar."}.
552
560
{"Update Specs","Atualizar as especificações"}.
561
+ {"Updating the vCard is not supported by the vCard storage backend","A atualização do vCard não é compatível com o back-end de armazenamento do vCard"}.
553
562
{"Upgrade","Atualização"}.
554
563
{"URL for Archived Discussion Logs","A URL para o arquivamento dos registos da discussão"}.
555
564
{"User already exists","Utilizador já existe"}.
556
565
{"User (jid)","Utilizador (jid)"}.
557
566
{"User JID","Utilizador JID"}.
558
567
{"User Management","Gestão de utilizadores"}.
568
+ {"User not allowed to perform an IQ set on another user's vCard.","O utilizador não tem permissão para executar um conjunto de QI no vCard de outro utilizador."}.
559
569
{"User removed","O utilizador foi removido"}.
560
570
{"User session not found","A sessão do utilizador não foi encontrada"}.
561
571
{"User session terminated","Sessão de utilizador terminada"}.
 
@@ -578,6 +588,7 @@
578
588
{"Visitor","Visitante"}.
579
589
{"Voice request","Requisição de voz"}.
580
590
{"Voice requests are disabled in this conference","Requisições de voz estão desativadas nesta sala de conferência"}.
591
+ {"Web client which allows to join the room anonymously","Cliente da web que permite entrar na sala de forma anônima"}.
581
592
{"Wednesday","Quarta"}.
582
593
{"When a new subscription is processed and whenever a subscriber comes online","Quando uma nova assinatura é processada e sempre que um assinante fica online"}.
583
594
{"When a new subscription is processed","Quando uma nova assinatura é processada"}.
changed priv/msgs/sq.msg
 
@@ -28,7 +28,9 @@
28
28
{"Anyone may publish","Gjithkush mund të publikojë"}.
29
29
{"Anyone with Voice","Cilido me Zë"}.
30
30
{"Anyone","Cilido"}.
31
+ {"API Commands","Urdhra API"}.
31
32
{"April","Prill"}.
33
+ {"Arguments","Argumente"}.
32
34
{"Attribute 'channel' is required for this request","Atributi 'channel' është i domosdoshëm për këtë kërkesë"}.
33
35
{"Attribute 'jid' is not allowed here","Atributi 'jid' s’lejohet këtu"}.
34
36
{"Attribute 'node' is not allowed here","Atributi 'node' s’lejohet këtu"}.
changed priv/msgs/sv.msg
 
@@ -34,7 +34,6 @@
34
34
{"Chatrooms","Chattrum"}.
35
35
{"Choose a username and password to register with this server","Välj ett användarnamn och lösenord för att registrera mot denna server"}.
36
36
{"Choose storage type of tables","Välj lagringstyp för tabeller"}.
37
- {"Choose whether to approve this entity's subscription.","Välj om du vill godkänna hela denna prenumertion."}.
38
37
{"City","Stad"}.
39
38
{"Commands","Kommandon"}.
40
39
{"Conference room does not exist","Rummet finns inte"}.
 
@@ -196,7 +195,6 @@
196
195
{"Search users in ","Sök efter användare på "}.
197
196
{"Send announcement to all online users on all hosts","Sänd meddelanden till alla inloggade användare på alla värdar"}.
198
197
{"Send announcement to all online users","Sänd meddelanden till alla inloggade användare"}.
199
- {"Send announcement to all users on all hosts","Sänd meddelanden till alla användare på alla värdar"}.
200
198
{"Send announcement to all users","Sänd meddelanden till alla användare"}.
201
199
{"September","September"}.
202
200
{"Set message of the day and send to online users","Sätt dagens status meddelande och skicka till alla användare"}.
changed priv/msgs/uk.msg
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Будь-хто, хто має підписку на отримання інформації про присутність в обох випадках або може підписуватись та отримувати матеріали"}.
47
47
{"Anyone with Voice","Будь-хто, хто має голос"}.
48
48
{"Anyone","Будь-хто"}.
49
+ {"API Commands","Команди API"}.
49
50
{"April","Квітень"}.
51
+ {"Arguments","Аргументи"}.
50
52
{"Attribute 'channel' is required for this request","Атрибут \"канал\" є обов'язковим для цього запиту"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","Атрибут 'id' обов'язковий для MIX повідомлень"}.
52
54
{"Attribute 'jid' is not allowed here","Атрибут 'jid' заборонений"}.
 
@@ -86,6 +88,7 @@
86
88
{"Choose whether to approve this entity's subscription.","Виберіть, чи підтверджувати підписку."}.
87
89
{"City","Місто"}.
88
90
{"Client acknowledged more stanzas than sent by server","Клієнт підтвердив більше повідомлень, ніж було відправлено сервером"}.
91
+ {"Clustering","Кластеризація"}.
89
92
{"Commands","Команди"}.
90
93
{"Conference room does not exist","Кімната для переговорів відсутня"}.
91
94
{"Configuration of room ~s","Конфігурація кімнати ~s"}.
 
@@ -408,6 +411,7 @@
408
411
{"Restore binary backup immediately:","Відновити з бінарної резервної копії негайно:"}.
409
412
{"Restore plain text backup immediately:","Відновити з текстово�� резервної копії негайно:"}.
410
413
{"Restore","Відновлення з резервної копії"}.
414
+ {"Result","Результат"}.
411
415
{"Roles and Affiliations that May Retrieve Member List","Ролі та зв’язки, які можуть отримати список учасників"}.
412
416
{"Roles for which Presence is Broadcasted","Ролі для яких поширюється наявність"}.
413
417
{"Roles that May Send Private Messages","Ролі, що можуть надсилати приватні повідомлення"}.
 
@@ -584,6 +588,7 @@
584
588
{"Visitor","Відвідувач"}.
585
589
{"Voice requests are disabled in this conference","Голосові запити відключені в цій конференції"}.
586
590
{"Voice request","Голосовий запит"}.
591
+ {"Web client which allows to join the room anonymously","Веб-клієнт, який дозволяє анонімно приєднатися до кімнати"}.
587
592
{"Wednesday","Середа"}.
588
593
{"When a new subscription is processed and whenever a subscriber comes online","Коли обробляється нова підписка та щоразу, коли абонент виходить в Інтернет"}.
589
594
{"When a new subscription is processed","Під час обробки нової підписки"}.
changed priv/msgs/zh.msg
 
@@ -4,10 +4,10 @@
4
4
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
5
5
6
6
{" (Add * to the end of field to match substring)"," (在字段末尾添加 * 以匹配子字符串)"}.
7
- {" has set the subject to: "," 已将话题设置为: "}.
7
+ {" has set the subject to: "," 已将主题设置为: "}.
8
8
{"# participants","# 参与者"}.
9
9
{"A description of the node","节点的描述"}.
10
- {"A friendly name for the node","节点的易记名称"}.
10
+ {"A friendly name for the node","节点的友好名称"}.
11
11
{"A password is required to enter this room","需要密码才能进入此房间"}.
12
12
{"A Web Page","网页"}.
13
13
{"Accept","接受"}.
 
@@ -25,7 +25,7 @@
25
25
{"Allow subscription","允许订阅"}.
26
26
{"Allow this Jabber ID to subscribe to this pubsub node?","是否允许此 Jabber ID 订阅此 pubsub 节点?"}.
27
27
{"Allow this person to register with the room?","是否允许此用户在房间注册?"}.
28
- {"Allow users to change the subject","允许用户更改话题"}.
28
+ {"Allow users to change the subject","允许用户更改主题"}.
29
29
{"Allow users to query other users","允许用户查询其他用户"}.
30
30
{"Allow users to send invites","允许用户发送邀请"}.
31
31
{"Allow users to send private messages","允许用户发送私信"}.
 
@@ -46,7 +46,9 @@
46
46
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","任何拥有 both 或 from 的在线状态订阅的用户都可以订阅和检索项目"}.
47
47
{"Anyone with Voice","任何有发言权的人"}.
48
48
{"Anyone","任何人"}.
49
+ {"API Commands","API 命令"}.
49
50
{"April","四���"}.
51
+ {"Arguments","������"}.
50
52
{"Attribute 'channel' is required for this request","此请求要求“channel”属性"}.
51
53
{"Attribute 'id' is mandatory for MIX messages","对于 MIX 消息,“id”属性是必需的"}.
52
54
{"Attribute 'jid' is not allowed here","此处不允许“jid”属性"}.
 
@@ -86,6 +88,7 @@
86
88
{"Choose whether to approve this entity's subscription.","选择是否批准此实体的订阅。"}.
87
89
{"City","城市"}.
88
90
{"Client acknowledged more stanzas than sent by server","客户端确认的节数多于服务器发送的节数"}.
91
+ {"Clustering","集群"}.
89
92
{"Commands","命令"}.
90
93
{"Conference room does not exist","会议室不存在"}.
91
94
{"Configuration of room ~s","房间 ~s 的配置"}.
 
@@ -227,12 +230,12 @@
227
230
{"Logged Out","已登出"}.
228
231
{"Logging","日志记录"}.
229
232
{"Make participants list public","公开参与者列表"}.
230
- {"Make room CAPTCHA protected","开启房间验证码保护"}.
233
+ {"Make room CAPTCHA protected","启用房间验证码保护"}.
231
234
{"Make room members-only","将房间设为仅成员"}.
232
- {"Make room moderated","开启房间发言审核"}.
233
- {"Make room password protected","开启房间密码保护"}.
235
+ {"Make room moderated","启用房间发言审核"}.
236
+ {"Make room password protected","启用房间密码保护"}.
234
237
{"Make room persistent","将房间设为持久"}.
235
- {"Make room public searchable","将房间设为公开可搜索"}.
238
+ {"Make room public searchable","将房间设为可公开搜索"}.
236
239
{"Malformed username","用户名格式不正确"}.
237
240
{"MAM preference modification denied by service policy","服务策略拒绝修改 MAM 首选项"}.
238
241
{"March","三月"}.
 
@@ -324,7 +327,7 @@
324
327
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","自动清除项目前的秒��,`max` 表示除服务器强制规定的最大值外无其他特定限制"}.
325
328
{"Occupants are allowed to invite others","允许使用者邀请他人"}.
326
329
{"Occupants are allowed to query others","允许使用者查询他人"}.
327
- {"Occupants May Change the Subject","使用者可以更改话题"}.
330
+ {"Occupants May Change the Subject","使用者可以更改主题"}.
328
331
{"October","十月"}.
329
332
{"OK","确定"}.
330
333
{"Old Password:","旧密码:"}.
 
@@ -335,8 +338,8 @@
335
338
{"Only <enable/> or <disable/> tags are allowed","仅允许 <enable/> 或 <disable/> 标签"}.
336
339
{"Only <list/> element is allowed in this query","此查询中只允许 <list/> 元素"}.
337
340
{"Only members may query archives of this room","只有成员才能查询此房间的归档"}.
338
- {"Only moderators and participants are allowed to change the subject in this room","只允许主持人和参与者更改此房间的话题"}.
339
- {"Only moderators are allowed to change the subject in this room","只允许主持人更改此房间的话题"}.
341
+ {"Only moderators and participants are allowed to change the subject in this room","只允许主持人和参与者更改此房间的主题"}.
342
+ {"Only moderators are allowed to change the subject in this room","只允许主持人更改此房间的主题"}.
340
343
{"Only moderators are allowed to retract messages","只允许主持人撤回消息"}.
341
344
{"Only moderators can approve voice requests","只有主持人可以批准发言权请求"}.
342
345
{"Only occupants are allowed to send messages to the conference","只允许使用者向会议发送消息"}.
 
@@ -408,6 +411,7 @@
408
411
{"Restore binary backup immediately:","立即恢复二进制备份:"}.
409
412
{"Restore plain text backup immediately:","立即恢复纯文本备份:"}.
410
413
{"Restore","恢复"}.
414
+ {"Result","结果"}.
411
415
{"Roles and Affiliations that May Retrieve Member List","可以检索成员列表的角色和从属关系"}.
412
416
{"Roles for which Presence is Broadcasted","广播在线状态的角色"}.
413
417
{"Roles that May Send Private Messages","可以发送私信的角色"}.
 
@@ -456,7 +460,7 @@
456
460
{"Store plain text backup:","存储纯文本备份:"}.
457
461
{"Stream management is already enabled","已启用流管理"}.
458
462
{"Stream management is not enabled","未启用流管理"}.
459
- {"Subject","话题"}.
463
+ {"Subject","主题"}.
460
464
{"Submitted","已提交"}.
461
465
{"Subscriber Address","订阅者地址"}.
462
466
{"Subscribers may publish","订阅者可以发布"}.
 
@@ -506,7 +510,7 @@
506
510
{"The presence states for which an entity wants to receive notifications","实体要接收通知的在线状态"}.
507
511
{"The query is only allowed from local users","仅允许来自本地用户的查询"}.
508
512
{"The query must not contain <item/> elements","查询不能包含 <item/> 元素"}.
509
- {"The room subject can be modified by participants","参与者可以修改房间话题"}.
513
+ {"The room subject can be modified by participants","参与者可以修改房间主题"}.
510
514
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","节点中数据的语义类型信息,通常由有效负载的命名空间指定(如果有)"}.
511
515
{"The sender of the last received message","最后收到的消息的发送者"}.
512
516
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","节必须仅包含一个 <active/> 元素、一个 <default/> 元素或一个 <list/> 元素"}.
 
@@ -584,6 +588,7 @@
584
588
{"Visitor","参观者"}.
585
589
{"Voice requests are disabled in this conference","此会议中禁用了发言权请求"}.
586
590
{"Voice request","发言权请求"}.
591
+ {"Web client which allows to join the room anonymously","允许匿名加入房间的 Web 客户端"}.
587
592
{"Wednesday","周三"}.
588
593
{"When a new subscription is processed and whenever a subscriber comes online","处理新订阅时和订阅者上线时"}.
589
594
{"When a new subscription is processed","处理新订阅时"}.
changed src/ejabberd_config.erl
 
@@ -305,14 +305,21 @@ beams(external) ->
305
305
end
306
306
end, ExtMods),
307
307
case application:get_env(ejabberd, external_beams) of
308
- {ok, Path} ->
309
- case lists:member(Path, code:get_path()) of
310
- true -> ok;
311
- false -> code:add_patha(Path)
312
- end,
313
- Beams = filelib:wildcard(filename:join(Path, "*\.beam")),
314
- CustMods = [list_to_atom(filename:rootname(filename:basename(Beam)))
315
- || Beam <- Beams],
308
+ {ok, Path0} ->
309
+ Paths = case Path0 of
310
+ [L|_] = V when is_list(L) -> V;
311
+ L -> [L]
312
+ end,
313
+ CustMods = lists:foldl(
314
+ fun(Path, CM) ->
315
+ case lists:member(Path, code:get_path()) of
316
+ true -> ok;
317
+ false -> code:add_patha(Path)
318
+ end,
319
+ Beams = filelib:wildcard(filename:join(Path, "*\.beam")),
320
+ CM ++ [list_to_atom(filename:rootname(filename:basename(Beam)))
321
+ || Beam <- Beams]
322
+ end, [], Paths),
316
323
CustMods ++ ExtMods;
317
324
_ ->
318
325
ExtMods
changed src/ejabberd_sm.erl
 
@@ -63,6 +63,7 @@
63
63
kick_user/2,
64
64
kick_user/3,
65
65
kick_user_restuple/2,
66
+ kick_users/1,
66
67
get_session_pid/3,
67
68
get_session_sid/3,
68
69
get_session_sids/2,
 
@@ -1072,7 +1073,18 @@ get_commands_spec() ->
1072
1073
args_example = [<<"user1">>, <<"example.com">>],
1073
1074
result_desc = "The result text indicates the number of sessions that were kicked",
1074
1075
result_example = {ok, <<"Kicked sessions: 2">>},
1075
- result = {res, restuple}}].
1076
+ result = {res, restuple}},
1077
+
1078
+ #ejabberd_commands{name = kick_users, tags = [session],
1079
+ desc = "Disconnect all given host users' active sessions",
1080
+ module = ?MODULE, function = kick_users,
1081
+ note = "added in 25.04",
1082
+ args = [{host, binary}],
1083
+ args_desc = ["Server name"],
1084
+ args_example = [<<"example.com">>],
1085
+ result_desc = "Number of sessions that were kicked",
1086
+ result_example = 3,
1087
+ result = {num_sessions, integer}}].
1076
1088
1077
1089
-spec connected_users() -> [binary()].
1078
1090
 
@@ -1111,5 +1123,10 @@ kick_user_restuple(User, Server) ->
1111
1123
NumberBin = integer_to_binary(kick_user(User, Server)),
1112
1124
{ok, <<"Kicked sessions: ", NumberBin/binary>>}.
1113
1125
1126
+ -spec kick_users(binary()) -> non_neg_integer().
1127
+ kick_users(Server) ->
1128
+ length([kick_user(U, S, R) || {U, S, R} <-get_vh_session_list(Server)]).
1129
+
1130
+
1114
1131
make_sid() ->
1115
1132
{misc:unique_timestamp(), self()}.
changed src/ejabberd_sql_schema.erl
 
@@ -410,18 +410,21 @@ sqlite_table_copy_t(SchemaInfo, Table) ->
410
410
NewTableName = <<"new_", TableName/binary>>,
411
411
NewTable = Table#sql_table{name = NewTableName},
412
412
create_table_t(SchemaInfo, NewTable),
413
- SQL2 = <<"INSERT INTO ", NewTableName/binary,
414
- " SELECT * FROM ", TableName/binary>>,
413
+ Columns = lists:join(<<",">>,
414
+ lists:map(fun(C) -> escape_name(SchemaInfo, C#sql_column.name) end,
415
+ Table#sql_table.columns)),
416
+ SQL2 = [<<"INSERT INTO ">>, NewTableName,
417
+ <<" SELECT ">>, Columns, <<" FROM ">>, TableName],
415
418
?INFO_MSG("Copying table ~s to ~s:~n~s~n",
416
419
[TableName, NewTableName, SQL2]),
417
420
ejabberd_sql:sql_query_t(SQL2),
418
421
SQL3 = <<"DROP TABLE ", TableName/binary>>,
419
422
?INFO_MSG("Droping old table ~s:~n~s~n",
420
- [TableName, SQL2]),
423
+ [TableName, SQL3]),
421
424
ejabberd_sql:sql_query_t(SQL3),
422
425
SQL4 = <<"ALTER TABLE ", NewTableName/binary,
423
426
" RENAME TO ", TableName/binary>>,
424
- ?INFO_MSG("Renameing table ~s to ~s:~n~s~n",
427
+ ?INFO_MSG("Renaming table ~s to ~s:~n~s~n",
425
428
[NewTableName, TableName, SQL4]),
426
429
ejabberd_sql:sql_query_t(SQL4).
changed src/ejabberd_web_admin.erl
 
@@ -584,12 +584,17 @@ process_admin(Host, #request{path = [<<"users">> | RPath], lang = Lang} = R, AJI
584
584
process_admin(Host, #request{path = [<<"online-users">> | RPath], lang = Lang} = R, AJID)
585
585
when is_binary(Host) ->
586
586
Level = 3 + length(RPath),
587
- Res = [make_command(connected_users_vhost,
587
+ Set = [make_command(kick_users,
588
+ R,
589
+ [{<<"host">>, Host}],
590
+ [{style, danger}, {force_execution, false}])],
591
+ timer:sleep(200), % small delay after kicking users before getting the updated list
592
+ Get = [make_command(connected_users_vhost,
588
593
R,
589
594
[{<<"host">>, Host}],
590
595
[{table_options, {100, RPath}},
591
596
{result_links, [{sessions, user, Level, <<"">>}]}])],
592
- make_xhtml([?XCT(<<"h1">>, ?T("Online Users"))] ++ Res, Host, R, AJID, Level);
597
+ make_xhtml([?XCT(<<"h1">>, ?T("Online Users"))] ++ Set ++ Get, Host, R, AJID, Level);
593
598
process_admin(Host,
594
599
#request{path = [<<"last-activity">>],
595
600
q = Query,
changed src/mod_admin_extra.erl
 
@@ -1899,16 +1899,20 @@ srg_create2(Group, Host, Label, Description, DisplayList) ->
1899
1899
Opts = [{label, Label},
1900
1900
{displayed_groups, DisplayList},
1901
1901
{description, Description}],
1902
- {atomic, _} = mod_shared_roster:create_group(Host, Group, Opts),
1903
- ok.
1902
+ case mod_shared_roster:create_group(Host, Group, Opts) of
1903
+ {atomic, _} -> ok;
1904
+ {error, Err} -> Err
1905
+ end.
1904
1906
1905
1907
srg_add(Group, Host) ->
1906
1908
Opts = [{label, <<"">>},
1907
1909
{description, <<"">>},
1908
1910
{displayed_groups, []}
1909
1911
],
1910
- {atomic, _} = mod_shared_roster:create_group(Host, Group, Opts),
1911
- ok.
1912
+ case mod_shared_roster:create_group(Host, Group, Opts) of
1913
+ {atomic, _} -> ok;
1914
+ {error, Err} -> Err
1915
+ end.
1912
1916
1913
1917
srg_delete(Group, Host) ->
1914
1918
{atomic, _} = mod_shared_roster:delete_group(Host, Group),
changed src/mod_muc_occupantid.erl
 
@@ -71,7 +71,7 @@ add_occupantid_packet(Packet, RoomJid) ->
71
71
From = xmpp:get_from(Packet),
72
72
OccupantId = calculate_occupantid(From, RoomJid),
73
73
OccupantElement = #occupant_id{id = OccupantId},
74
- xmpp:set_subtag(Packet, OccupantElement).
74
+ xmpp:append_subtags(xmpp:remove_subtag(Packet, OccupantElement), [OccupantElement]).
75
75
76
76
calculate_occupantid(From, RoomJid) ->
77
77
Term = {jid:remove_resource(From), get_salt(RoomJid)},
changed src/mod_shared_roster.erl
 
@@ -381,7 +381,7 @@ create_group(Host, Group) ->
381
381
create_group(Host, Group, []).
382
382
383
383
create_group(Host, Group, Opts) ->
384
- case jid:nodeprep(Group) of
384
+ case jid:nameprep(Group) of
385
385
error ->
386
386
{error, invalid_group_name};
387
387
LGroup ->
changed vars.config
 
@@ -41,7 +41,7 @@
41
41
{lua, false}.
42
42
43
43
%% Version
44
- {vsn, "25.03"}.
44
+ {vsn, "25.04"}.
45
45
46
46
%% Variables for overlay template files
47
47
{description, "ejabberd"}.