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"}.
|