Compare commits
657 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 27b87d4a8a | |||
| 6e90f5e681 | |||
| 9a82a28c8d | |||
| c44c259180 | |||
| 13c89279a2 | |||
| fcf685a4dc | |||
| 07580e6787 | |||
| 6ce687262e | |||
| 2c8156dcd0 | |||
| bb8d65b68a | |||
| c43b15b3cd | |||
| acc6beb3f3 | |||
| bf2692a710 | |||
| 42e5a443ed | |||
| c5221f9350 | |||
| 16739180f5 | |||
| 181465ea3e | |||
| 23a32cae1a | |||
| b2e2bd7ca8 | |||
| efdc90b7b8 | |||
| 010a6901b3 | |||
| 8fb6257388 | |||
| 2832c4f513 | |||
| 6022105f39 | |||
| 3a78d6cf2a | |||
| 975dcc1128 | |||
| 00e61dd816 | |||
| c0134fe820 | |||
| ab59302204 | |||
| 89b11829ce | |||
| 267d8ca124 | |||
| 427f68daa6 | |||
| b15bae267d | |||
| 6bbed5854a | |||
| 15661f16c4 | |||
| 54b30cf0c4 | |||
| b7940ba360 | |||
| ee2fd8446a | |||
| b41a8b0925 | |||
| 8603cd85db | |||
| 3a2d1bd12b | |||
| a04ed90e25 | |||
| 383b498fbb | |||
| af3987fc0a | |||
| 9fd1ed34ee | |||
| a9ae72ba9f | |||
| aa704c0d75 | |||
| bc48fa4c55 | |||
| 2251cb7547 | |||
| 15b51d7a7b | |||
| 5721f77d5a | |||
| fa32fecd97 | |||
| e291d84cf8 | |||
| 934fdcdc5d | |||
| eba6868a3f | |||
| 5bb989d998 | |||
| e9645ffec0 | |||
| 179c5c4cbb | |||
| f210803202 | |||
| 793855ad91 | |||
| 1a423743af | |||
| b8f20fb663 | |||
| 7b4338e7df | |||
| e6b1e55705 | |||
| eb784b4026 | |||
| 07d363ed0c | |||
| 8a7cf45d0b | |||
| d93ece6540 | |||
| 2a65a5001d | |||
| 1ffcd1ce6e | |||
| d5c14406db | |||
| 67b87ac892 | |||
| a44f865432 | |||
| a4ff3f3a65 | |||
| ca56f11dc6 | |||
| 1695385912 | |||
| b9e3841186 | |||
| 0680f6ac5e | |||
| ff15018b24 | |||
| 635054007d | |||
| f1527ba21e | |||
| 3b1a8a6c00 | |||
| c862f58c78 | |||
| 6e938dcc84 | |||
| ecb88d9ebc | |||
| b7464e19ff | |||
| 1bcd52300f | |||
| 0c55beff6e | |||
| 3adb30c859 | |||
| 5378d177e2 | |||
| 160cd976b4 | |||
| 95d8f6c531 | |||
| cdcf3ef1b9 | |||
| afd49b9847 | |||
| 5b89ee0fe8 | |||
| 4ce63d9a6c | |||
| 29ac776a98 | |||
| 8cf9a0b79b | |||
| d0d9b2f968 | |||
| 785412be5c | |||
| 3b05cb0700 | |||
| 1fc1626d3f | |||
| 56f47dbec7 | |||
| 05cd172b77 | |||
| 0876662a20 | |||
| 9402dbb16f | |||
| 99f9443ec8 | |||
| 84f698c489 | |||
| 274a5dfbc8 | |||
| 641aa88bbc | |||
| 029aa67ccf | |||
| 120973074a | |||
| 8138b48cad | |||
| 7de0afb613 | |||
| c407e87da3 | |||
| 2681f3b5d8 | |||
| f9a187c3aa | |||
| 40fffe6cf4 | |||
| 903943362e | |||
| e6120641f9 | |||
| 43f0b811f5 | |||
| bd61571ce5 | |||
| e06bdd6b30 | |||
| 75c66cba9c | |||
| 531d17ddb9 | |||
| 1aa2e75a21 | |||
| 416bee969f | |||
| fa75800ee1 | |||
| 5426358959 | |||
| 8e01c04e96 | |||
| 809d9d2d0f | |||
| 7c2db2aebb | |||
| 4f930cb94d | |||
| 9a48088d84 | |||
| 2e9b538c27 | |||
| 1a6d22615d | |||
| 97fc89bc7f | |||
| fbc3349e04 | |||
| 42122b7aa7 | |||
| ee05a863f7 | |||
| 44fa357534 | |||
| 354e4920b3 | |||
| 9bfdb2b8d4 | |||
| e31fced208 | |||
| f65903a181 | |||
| f21bd9b96e | |||
| 0647a23ea7 | |||
| 9b5ea84ee5 | |||
| 7732984133 | |||
| 6f59b7e63d | |||
| 40d6ef6156 | |||
| b5f8bc7c15 | |||
| 97e0530be1 | |||
| 3ab3c71cf6 | |||
| 7bc96ee464 | |||
| ca07b182c6 | |||
| 3ffe6383b2 | |||
| 47d898bb8b | |||
| 3a5f7e6cfe | |||
| c8ba793851 | |||
| d0646e8009 | |||
| d89da2d3eb | |||
| 99b54916f4 | |||
| d0437ab19a | |||
| 12910ed023 | |||
| ae5356b2a6 | |||
| f417b9f7c3 | |||
| bd3c805e67 | |||
| 0375cea2ce | |||
| 1d67918b8d | |||
| 3da3ced880 | |||
| 85ca3cbd1b | |||
| cef212145f | |||
| cf40d73f95 | |||
| 7df7c7664d | |||
| d0a91cc9de | |||
| a7a11ef287 | |||
| db924b488c | |||
| a213f6862d | |||
| b70337513c | |||
| 0a0bb72501 | |||
| 5cbe7ebf54 | |||
| 9f165996b7 | |||
| 56589d491f | |||
| 35d082da8c | |||
| 343f462ca5 | |||
| 87a6ab7aee | |||
| 6e4a8ae015 | |||
| b2c7929d23 | |||
| 956c0488c9 | |||
| 5f0a26cf08 | |||
| 5de8d8619f | |||
| eb46646eb1 | |||
| 6ce338e8e2 | |||
| 0bb0dcc6b1 | |||
| a315046af8 | |||
| 04946dbf74 | |||
| bb900099a7 | |||
| 903c48f3a5 | |||
| 41c8dbb135 | |||
| 47b419dd98 | |||
| 41e57f89c9 | |||
| 480c6e0995 | |||
| ca364541e7 | |||
| b71fcfc82f | |||
| 19a5edd63a | |||
| 330d513fe8 | |||
| f07e16a597 | |||
| 3c950fe65c | |||
| a7aa52fc9f | |||
| dd7f3033fc | |||
| cc7e50782e | |||
| 5fddf889e7 | |||
| bce68d52e7 | |||
| 2fac416520 | |||
| 1d2b0fc910 | |||
| 8ac3661bcf | |||
| bbcf0fa4f3 | |||
| c531936f83 | |||
| 6d74bef73b | |||
| 96a1b16099 | |||
| 40d86edbc2 | |||
| be56e1305b | |||
| a76a9fa6e6 | |||
| 75e9294033 | |||
| a864d89970 | |||
| 7bbea9e186 | |||
| 5f94b5252b | |||
| 2d16c7d1f4 | |||
| 8fddc9665f | |||
| 0d24869274 | |||
| d2fb995753 | |||
| 6c751b03c9 | |||
| 0e8e4579a6 | |||
| 937239e329 | |||
| 37f34924f5 | |||
| e66e495c22 | |||
| 124d3f3ab0 | |||
| ff31ef7f3d | |||
| 141dba70e5 | |||
| d532705d52 | |||
| d45c7e94ca | |||
| bea87c9f05 | |||
| 9101d7edf0 | |||
| d88da5717d | |||
| cf2962a359 | |||
| 0f5b61b096 | |||
| 5260597717 | |||
| 0a2a486c77 | |||
| 4944f77159 | |||
| e77bdf6e35 | |||
| 5d3b8010cd | |||
| 6f424ecd1a | |||
| 08b47e62ec | |||
| 6c20273ad1 | |||
| f9ed405118 | |||
| acd077c728 | |||
| c589cf68c2 | |||
| a824385424 | |||
| 46737b115d | |||
| b1ab2808bb | |||
| 849d239a79 | |||
| 96a8fc516d | |||
| a22c88a5c0 | |||
| c35605ecce | |||
| 6a598ee3cb | |||
| daab203ec0 | |||
| 7a5319251e | |||
| 6263a93f8f | |||
| 15fd7dc900 | |||
| 3758128e83 | |||
| cfd54fa9a2 | |||
| 538766bacf | |||
| e8eab55d4f | |||
| 525f8bac22 | |||
| 220eb98f2e | |||
| 7be6580b65 | |||
| 0d0b39c89f | |||
| 091e7e27d4 | |||
| 06a8994f24 | |||
| 905a433950 | |||
| b72b92cc46 | |||
| c9e3f0bcf6 | |||
| 434b0423e4 | |||
| e946d20bda | |||
| 3de7cceadc | |||
| 5b83603d51 | |||
| 03e535eac0 | |||
| c0de565d2c | |||
| 3e847f3302 | |||
| 23a3180862 | |||
| 12d85aef48 | |||
| 86fe0ff355 | |||
| dced4f4dac | |||
| bf46082c82 | |||
| e9b653e6da | |||
| 71dccedfc6 | |||
| b24230fe0a | |||
| edb9aa053d | |||
| b1bf769e59 | |||
| b315fe4770 | |||
| 026bd24a56 | |||
| ce500fa30e | |||
| 51081276c2 | |||
| 9b1c81829a | |||
| 7e1237bb0f | |||
| 80fd0e4b6d | |||
| 26875762b5 | |||
| ebfcf3b5db | |||
| c472aad566 | |||
| 59138d810c | |||
| 489b3fdfb5 | |||
| 4a225c0f4b | |||
| 997b32b46a | |||
| 5c1566ddb7 | |||
| 3f10994574 | |||
| 2dbd0795b9 | |||
| 55e1c5ef78 | |||
| c51d5e0416 | |||
| 2e41f64243 | |||
| 1b2a166693 | |||
| be30990d7f | |||
| 5219bf36a9 | |||
| 3182a3100c | |||
| 59f5621ffa | |||
| c4d9e536b6 | |||
| a97d8ab046 | |||
| f7e8d8f1c1 | |||
| 97aac8a446 | |||
| 3f391be8f0 | |||
| e86362bb2b | |||
| f17c5a3350 | |||
| b9a161bb1a | |||
| 18110f240b | |||
| 92c329912c | |||
| d97366fe74 | |||
| 0258195682 | |||
| 7805241296 | |||
| 33ea1823de | |||
| 038444773b | |||
| 85b614e77b | |||
| 02aa256c59 | |||
| 21c6cc8fd1 | |||
| 5728db746d | |||
| 5083217fce | |||
| 527c000441 | |||
| 48af6467ea | |||
| b051bcd983 | |||
| 11a6d3659e | |||
| 412489d31b | |||
| b75e08edf7 | |||
| ff83eb960a | |||
| 67208fad9d | |||
| e02864bf6c | |||
| 45abd38d09 | |||
| e7cf1d0b87 | |||
| b7aa7dc64c | |||
| d10d7aa8cc | |||
| 6b3333c3ff | |||
| 3ba6a8e039 | |||
| c27a3a02fe | |||
| ca05bbd652 | |||
| 357988b662 | |||
| c40df92263 | |||
| cbe30c1fcb | |||
| f77b55c073 | |||
| f9ab175a79 | |||
| fb0097a6e0 | |||
| d247003038 | |||
| 0f2d64c10d | |||
| d49ccbf031 | |||
| 6d5065ae3a | |||
| 803e6d743a | |||
| 2bf4a5970a | |||
| 9e985e3e79 | |||
| 72661acb43 | |||
| eace76b16e | |||
| ca03a97ca2 | |||
| 95d54f9568 | |||
| 62185c8d30 | |||
| ef94ee66fd | |||
| f666cd4643 | |||
| 12989ba5eb | |||
| 63f3b4f7af | |||
| 7a4ea0eba2 | |||
| ad4876821b | |||
| cf2b2d5e85 | |||
| a0c5df0c5b | |||
| ae36405466 | |||
| e7eb116d93 | |||
| 10a82afd46 | |||
| bba9563525 | |||
| 558cabd860 | |||
| 2118c3028f | |||
| 4a7238afea | |||
| 127c909f0f | |||
| 1a7c1c5c06 | |||
| dd5d2aeee0 | |||
| 1d99c5cb60 | |||
| b9e4bbc070 | |||
| 41fab88ee5 | |||
| 0ca877f925 | |||
| b480f125ee | |||
| 7ee5f81923 | |||
| 3d43b98d42 | |||
| 1636c202a7 | |||
| 060992bafa | |||
| c0c69394b9 | |||
| 2b7285e0b2 | |||
| c3a24ffdf8 | |||
| 48fb446f8c | |||
| 0283a501fa | |||
| fb572bf901 | |||
| 7eb09295a3 | |||
| e0eae52eae | |||
| dd270f99fc | |||
| 1472caab50 | |||
| ef2e62a01c | |||
| 4e909fc50d | |||
| 19b7106124 | |||
| ccd9fa6561 | |||
| 1ddd72ffe7 | |||
| b759acdcea | |||
| 4eee6d7cec | |||
| 5575d4e78e | |||
| 4dea2f1eb6 | |||
| 1d5b9bba15 | |||
| 2951281115 | |||
| fd8aba6d41 | |||
| 066e0a8101 | |||
| bf262a6051 | |||
| 7840924b17 | |||
| 60bdab4e52 | |||
| 3a36a722c5 | |||
| 00c75c3dc9 | |||
| cae7850a70 | |||
| ce668bef14 | |||
| 3887b6d930 | |||
| b7bd0e196d | |||
| 6d63842ad3 | |||
| 2f3b9015e9 | |||
| 6ae48eb991 | |||
| c508795ad4 | |||
| 4a053807e0 | |||
| dd5bbda2dc | |||
| 98469678a0 | |||
| b8550e087e | |||
| 644d468b4f | |||
| 74c810eeaa | |||
| a46325166a | |||
| 654d4b81b1 | |||
| ff3d33dde4 | |||
| 3183e2f733 | |||
| e1dc686ae7 | |||
| 38b203feb1 | |||
| 8b61cf0742 | |||
| a02c75aa08 | |||
| 51af393baa | |||
| 41318e45a5 | |||
| a94f227103 | |||
| 517776acd4 | |||
| 212a5ded6e | |||
| fd9c929e37 | |||
| ce828163af | |||
| 97e1b419a0 | |||
| d70ac7f7c5 | |||
| 7065cb69f1 | |||
| 7815463ba0 | |||
| 48e6631751 | |||
| 903e6b70b4 | |||
| 5edba59b24 | |||
| 31cb4b06e4 | |||
| 5de3bacf35 | |||
| 8aae7424e9 | |||
| 10f6723f00 | |||
| f594620c68 | |||
| dacfad61d8 | |||
| 7c1da7e0cf | |||
| e709f99b47 | |||
| f150419891 | |||
| 053fd26994 | |||
| bba1a1e3ca | |||
| e5da1efea4 | |||
| fbfd41c16e | |||
| 4391921727 | |||
| 4cd3c657e2 | |||
| 7647b77225 | |||
| fe8710fe00 | |||
| 1a9b147baf | |||
| 6214e0385d | |||
| f7002c31f0 | |||
| 99b75396ad | |||
| b1c3baa7bd | |||
| 355eb5dfde | |||
| d269e32c3a | |||
| 214b76f763 | |||
| 73a8fbdfb5 | |||
| 9b6f0aeb3c | |||
| 45a6aed57f | |||
| 9d17a160b6 | |||
| 850d097660 | |||
| 8ce8f67c06 | |||
| a17c2c166d | |||
| a64aa9e280 | |||
| 3834a47a39 | |||
| 9f6ff515ff | |||
| 64a210842e | |||
| c0de52c967 | |||
| 67c3df05b3 | |||
| 4a66616756 | |||
| e4d424bf56 | |||
| c0fc6091b1 | |||
| ef35d19ff1 | |||
| cfa787c4b6 | |||
| 611ebce0d2 | |||
| 1e0b8cb547 | |||
| 99d323b1dd | |||
| 72bc9b6c7f | |||
| 4694a482f4 | |||
| 443f39bfdb | |||
| b118dd8fc6 | |||
| bf39da7b8b | |||
| ad3eee059e | |||
| e94ccabcf0 | |||
| 427a29c74e | |||
| 1d79edbae0 | |||
| 9e4a6d09df | |||
| 7b08289799 | |||
| bc937546ec | |||
| 3b972fe4a3 | |||
| 5e93725044 | |||
| 500af47b79 | |||
| d862e04186 | |||
| 5f293cb1e0 | |||
| c93ea2c22f | |||
| c567005241 | |||
| a6823d157c | |||
| bf54cc59e1 | |||
| 740b0c7dd7 | |||
| c3f5083f15 | |||
| b65c11daf6 | |||
| 263e1f59f7 | |||
| 3d89c9199c | |||
| 4a51bf90ab | |||
| a77c7e36b0 | |||
| 88ae3fddf3 | |||
| bddcf0624e | |||
| 6b47d3eb0d | |||
| a0c97b33e0 | |||
| 5def9cef9f | |||
| c20d745028 | |||
| e099435cd6 | |||
| d6a00f5151 | |||
| 653413e912 | |||
| 288eecc23d | |||
| b55b6f3d26 | |||
| d00561b58c | |||
| 432810db89 | |||
| f3b1b5d419 | |||
| d9a7b67f0e | |||
| 85f05192c8 | |||
| 149b715b4f | |||
| bae345b92b | |||
| 10ec128b94 | |||
| 7a6e409879 | |||
| ea19e4bc7f | |||
| 6122a525d2 | |||
| b607d95a93 | |||
| ee46333def | |||
| 34b40aec66 | |||
| 639147be41 | |||
| c48aa38c39 | |||
| 70bec7b714 | |||
| a7c15eaccf | |||
| c78e99dd54 | |||
| 3196779308 | |||
| 064b005ec5 | |||
| 2d2b98e525 | |||
| 71f623ddbf | |||
| f03b5f4c44 | |||
| aff8b47b6c | |||
| 6c1452435d | |||
| 38f365ffeb | |||
| ed846c4a88 | |||
| 8855a304cc | |||
| 95a083a6f4 | |||
| 0bb99bb371 | |||
| 38cc3ccb1e | |||
| c51b044b3f | |||
| 363351b18c | |||
| 167bbc768a | |||
| 591e15f0f6 | |||
| b4a917db09 | |||
| 7755fcc846 | |||
| 250af8f06a | |||
| 9569e407b5 | |||
| 573d5525ec | |||
| f1de7b008b | |||
| c10e6ded78 | |||
| 9bc991cb7d | |||
| ffa7c32d80 | |||
| 038491d2ec | |||
| 9d1d57cd82 | |||
| c38b2bfc21 | |||
| 18e7805ef5 | |||
| 010eab6e30 | |||
| 30c8088d73 | |||
| 354009033a | |||
| bf3f904fe9 | |||
| d65cafae64 | |||
| cda1d4ce7f | |||
| 128103b7b2 | |||
| cbb88638d2 | |||
| f046aeeaa2 | |||
| bd5f9537c5 | |||
| 838bbd70ef | |||
| e7997244af | |||
| 3874e71971 | |||
| 67cc0c5286 | |||
| 826123db56 | |||
| 05b0037462 | |||
| 54796f888e | |||
| 82ec0a4837 | |||
| 7167df7979 | |||
| 45e7d8426d | |||
| ef754939c4 | |||
| ee3a0b8b1a | |||
| 2182cb60ae | |||
| 4da8278e66 | |||
| 629db496b5 | |||
| f79b8e166a | |||
| fae4ab97fd | |||
| da8d04a654 | |||
| ce02fc485f | |||
| 69695ffe27 | |||
| 6fdb467484 | |||
| d8016a6477 | |||
| e43d864184 | |||
| 4d3681aba1 | |||
| d791f6ceaa | |||
| 602a42f5ce | |||
| c98739d5b5 | |||
| 425504454c | |||
| 780031847c | |||
| c3af613db1 | |||
| babd01a87f | |||
| 17b605a32b | |||
| fc813acd7b | |||
| d842d6772d | |||
| 67aaf93157 | |||
| 9154275431 | |||
| c343ef7aad | |||
| 78093735b7 | |||
| ed6a111982 | |||
| a8a5be7a34 | |||
| 5008947e32 | |||
| 0827a5116f |
@@ -0,0 +1,155 @@
|
||||
name: 'Manage Database'
|
||||
|
||||
inputs:
|
||||
for:
|
||||
default: ""
|
||||
description: 'One or more databases to manage:
|
||||
mysql, pgsql, redis, mssql'
|
||||
|
||||
do:
|
||||
default: ""
|
||||
description: 'One or more tasks to do:
|
||||
install, start, user, create, drop, dump'
|
||||
|
||||
dump-suffix:
|
||||
default: ""
|
||||
description: 'Suffix to append to the dump file name'
|
||||
|
||||
mssql-schema:
|
||||
default: ""
|
||||
description: 'SQL schema for the MSSQL database:
|
||||
singlehost or multihost'
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
|
||||
############################################################# Install #####
|
||||
|
||||
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'install')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf
|
||||
sudo rm -f /var/lib/man-db/auto-update || echo ok
|
||||
sudo apt-get -q update
|
||||
sudo apt-get -q -y install postgresql
|
||||
|
||||
- if: contains(inputs.for, 'redis') && contains(inputs.do, 'install')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf
|
||||
sudo rm -f /var/lib/man-db/auto-update || echo ok
|
||||
sudo apt-get -q update
|
||||
sudo apt-get -q -y install redis-server
|
||||
|
||||
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: tdsodbc
|
||||
|
||||
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
|
||||
shell: sh
|
||||
run: |
|
||||
docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=ejabberd_Test1" \
|
||||
-v $(pwd)/test/docker/db/mssql/initdb/initdb_mssql.sql:/initdb_mssql.sql:ro \
|
||||
-v $(pwd)/sql/mssql.sql:/mssql.sql:ro \
|
||||
-v $(pwd)/sql/mssql.new.sql:/mssql.new.sql:ro \
|
||||
-p 1433:1433 --name ejabberd-mssql \
|
||||
"mcr.microsoft.com/mssql/server:2019-latest"
|
||||
sleep 10
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \
|
||||
-C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||
|
||||
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
|
||||
&& inputs.mssql-schema == 'singlehost'
|
||||
shell: sh
|
||||
run: |
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \
|
||||
-C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test \
|
||||
-i /mssql.sql
|
||||
|
||||
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
|
||||
&& inputs.mssql-schema == 'multihost'
|
||||
shell: sh
|
||||
run: |
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \
|
||||
-C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test \
|
||||
-i /mssql.new.sql
|
||||
|
||||
############################################################### Start #####
|
||||
|
||||
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'start')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo systemctl start mysql.service
|
||||
|
||||
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'start')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo systemctl start postgresql.service
|
||||
pg_isready
|
||||
|
||||
################################################################ User #####
|
||||
|
||||
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'user')
|
||||
shell: sh
|
||||
run: |
|
||||
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
||||
IDENTIFIED BY 'ejabberd_test';"
|
||||
|
||||
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'user')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
||||
WITH PASSWORD 'ejabberd_test';"
|
||||
|
||||
################################################################ Dump #####
|
||||
|
||||
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'dump')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo mysqldump -u root -proot ejabberd_test \
|
||||
> mysql-${{ inputs.dump-suffix }}.sql
|
||||
|
||||
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'dump')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo -u postgres pg_dump ejabberd_test \
|
||||
> pgsql-${{ inputs.dump-suffix }}.sql
|
||||
|
||||
################################################################ Drop #####
|
||||
|
||||
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'drop')
|
||||
shell: sh
|
||||
run: |
|
||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
||||
|
||||
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'drop')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
||||
|
||||
############################################################## Create #####
|
||||
|
||||
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'create')
|
||||
shell: sh
|
||||
run: |
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
|
||||
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'create')
|
||||
shell: sh
|
||||
run: |
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;"
|
||||
sudo -u postgres psql -c "ALTER DATABASE ejabberd_test
|
||||
OWNER TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
@@ -0,0 +1,195 @@
|
||||
name: 'Manage ejabberd'
|
||||
|
||||
inputs:
|
||||
for:
|
||||
default: ""
|
||||
description: 'Release method, one of:
|
||||
prod, dev, install, run, deb'
|
||||
do:
|
||||
default: ""
|
||||
description: 'One or more tasks to perform:
|
||||
deploy, no_acme, no_tls,
|
||||
start, register, update_sql, stop,
|
||||
check, logs'
|
||||
username:
|
||||
default: "user1"
|
||||
description: 'Username part of the account JID'
|
||||
host:
|
||||
default: "localhost"
|
||||
description: 'Host part of the account JID'
|
||||
tool:
|
||||
default: "rebar3"
|
||||
description: 'Build tool to use:
|
||||
rebar or rebar3 (only relevant to make rebar2)'
|
||||
rel_name_vsn:
|
||||
default: ""
|
||||
description: 'Base name of installer files'
|
||||
configure:
|
||||
default: ""
|
||||
description: 'Options to append to ./configure'
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
|
||||
- name: Path Definitions
|
||||
id: path
|
||||
shell: bash
|
||||
run: |
|
||||
case ${{ inputs.for }} in
|
||||
'prod')
|
||||
BASE="_build/prod/rel/ejabberd"
|
||||
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
|
||||
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
|
||||
echo "ectl=$BASE/bin/ejabberdctl" >> $GITHUB_OUTPUT
|
||||
;;
|
||||
'dev')
|
||||
BASE="_build/dev/rel/ejabberd"
|
||||
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
|
||||
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
|
||||
echo "ectl=$BASE/bin/ejabberdctl" >> $GITHUB_OUTPUT
|
||||
;;
|
||||
'install')
|
||||
BASE="/tmp/ejabberd"
|
||||
echo "conf=$BASE/etc/ejabberd" >> $GITHUB_OUTPUT
|
||||
echo "logs=$BASE/var/log/ejabberd" >> $GITHUB_OUTPUT
|
||||
echo "ectl=$BASE/sbin/ejabberdctl" >> $GITHUB_OUTPUT
|
||||
;;
|
||||
'deb')
|
||||
BASE="/opt/ejabberd"
|
||||
echo "base=$BASE" >> $GITHUB_OUTPUT
|
||||
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
|
||||
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
|
||||
echo "ectl=sudo /opt/${{ inputs.rel_name_vsn }}/bin/ejabberdctl" >> $GITHUB_OUTPUT
|
||||
;;
|
||||
'run')
|
||||
BASE="$HOME/opt/ejabberd"
|
||||
echo "base=$BASE" >> $GITHUB_OUTPUT
|
||||
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
|
||||
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
|
||||
echo "ectl=$HOME/opt/${{ inputs.rel_name_vsn }}/bin/ejabberdctl" >> $GITHUB_OUTPUT
|
||||
;;
|
||||
esac
|
||||
|
||||
############################################################# Compile #####
|
||||
|
||||
- if: contains(inputs.do, 'compile')
|
||||
shell: sh
|
||||
run: |
|
||||
TOOL=${{ inputs.tool }}
|
||||
[ "${TOOL%3}" = "rebar" ] && TOOL="./$TOOL"
|
||||
./autogen.sh
|
||||
./configure --with-rebar=$TOOL \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all ${{ inputs.configure }}
|
||||
sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
||||
REBAR_PROFILE=test make
|
||||
|
||||
############################################################## Deploy #####
|
||||
|
||||
- if: contains(inputs.do, 'deploy') &&
|
||||
inputs.for == 'prod' && inputs.tool == 'rebar'
|
||||
shell: sh
|
||||
run: |
|
||||
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
|
||||
|
||||
- if: contains(inputs.do, 'deploy') &&
|
||||
inputs.for == 'dev' && inputs.tool == 'rebar'
|
||||
shell: sh
|
||||
run: |
|
||||
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
|
||||
|
||||
- if: contains(inputs.do, 'deploy') &&
|
||||
(inputs.for == 'prod' ||
|
||||
inputs.for == 'dev' ||
|
||||
inputs.for == 'install')
|
||||
shell: sh
|
||||
run: |
|
||||
make ${{ inputs.for }}
|
||||
|
||||
- if: contains(inputs.do, 'deploy') &&
|
||||
inputs.for == 'deb'
|
||||
shell: sh
|
||||
run: |
|
||||
sudo dpkg -i $(ls -1 *.deb)
|
||||
|
||||
- if: contains(inputs.do, 'deploy') &&
|
||||
inputs.for == 'run'
|
||||
shell: sh
|
||||
run: |
|
||||
./$(ls -1 *.run)
|
||||
|
||||
################################################################ ACME #####
|
||||
|
||||
- if: contains(inputs.do, 'no_acme')
|
||||
shell: sh
|
||||
run: |
|
||||
sed -i 's/loglevel/acme:\n auto: false\nloglevel/g' \
|
||||
${{ steps.path.outputs.conf }}/ejabberd.yml
|
||||
|
||||
################################################################# TLS #####
|
||||
|
||||
- if: contains(inputs.do, 'no_tls') &&
|
||||
inputs.for == 'dev'
|
||||
shell: sh
|
||||
run: |
|
||||
sed -i 's/starttls_required: true/starttls_required: false/g' \
|
||||
${{ steps.path.outputs.conf }}/ejabberd.yml
|
||||
|
||||
############################################################### Start #####
|
||||
|
||||
- if: contains(inputs.do, 'start')
|
||||
shell: sh
|
||||
run: |
|
||||
${{ steps.path.outputs.ectl }} start
|
||||
${{ steps.path.outputs.ectl }} started
|
||||
|
||||
############################################################ Register #####
|
||||
|
||||
- if: contains(inputs.do, 'register')
|
||||
shell: sh
|
||||
run: |
|
||||
${{ steps.path.outputs.ectl }} \
|
||||
register ${{ inputs.username }} ${{ inputs.host }} s0mePass
|
||||
${{ steps.path.outputs.ectl }} \
|
||||
registered_users ${{ inputs.host }} >> registered.log
|
||||
grep -q '${{ inputs.username }}' registered.log
|
||||
|
||||
########################################################### UpdateSQL #####
|
||||
|
||||
- if: contains(inputs.do, 'update_sql')
|
||||
shell: sh
|
||||
run: |
|
||||
${{ steps.path.outputs.ectl }} \
|
||||
update_sql
|
||||
|
||||
################################################################ Stop #####
|
||||
|
||||
- if: contains(inputs.do, 'stop')
|
||||
shell: sh
|
||||
run: |
|
||||
${{ steps.path.outputs.ectl }} stop
|
||||
${{ steps.path.outputs.ectl }} stopped
|
||||
|
||||
############################################################### Check #####
|
||||
|
||||
- if: contains(inputs.do, 'check')
|
||||
shell: sh
|
||||
run: |
|
||||
grep -q 'is started' ${{ steps.path.outputs.logs }}/ejabberd.log
|
||||
grep -q 'is stopped' ${{ steps.path.outputs.logs }}/ejabberd.log
|
||||
test $(find ${{ steps.path.outputs.logs }}/ -empty -name error.log)
|
||||
|
||||
################################################################ Logs #####
|
||||
|
||||
- if: contains(inputs.do, 'logs') || failure()
|
||||
shell: sh
|
||||
run: |
|
||||
SUDO=sudo
|
||||
[ "${{ inputs.for }}" = "deb" ] || SUDO=""
|
||||
echo "::group::View ejabberd.log"
|
||||
$SUDO cat ${{ steps.path.outputs.logs }}/ejabberd.log
|
||||
echo "::endgroup::"
|
||||
echo "::group::View error.log"
|
||||
$SUDO cat ${{ steps.path.outputs.logs }}/error.log
|
||||
echo "::endgroup::"
|
||||
@@ -1,6 +1,6 @@
|
||||
#' Define default build variables
|
||||
ARG OTP_VSN='27.3'
|
||||
ARG ELIXIR_VSN='1.18.3'
|
||||
ARG OTP_VSN='28.4.1.0'
|
||||
ARG ELIXIR_VSN='1.19.5'
|
||||
ARG UID='9000'
|
||||
ARG USER='ejabberd'
|
||||
ARG HOME="opt/$USER"
|
||||
@@ -9,7 +9,7 @@ ARG VERSION='master'
|
||||
|
||||
################################################################################
|
||||
#' Compile ejabberdapi
|
||||
FROM docker.io/golang:1.24-alpine AS api
|
||||
FROM docker.io/golang:1.25-alpine AS api
|
||||
RUN go install -v \
|
||||
github.com/processone/ejabberd-api/cmd/ejabberd@master \
|
||||
&& mv bin/ejabberd bin/ejabberdapi
|
||||
@@ -19,6 +19,7 @@ RUN go install -v \
|
||||
FROM docker.io/erlang:${OTP_VSN}-alpine AS ejabberd
|
||||
|
||||
RUN apk -U add --no-cache \
|
||||
ca-certificates \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
@@ -32,6 +33,7 @@ RUN apk -U add --no-cache \
|
||||
libpng-dev \
|
||||
libwebp-dev \
|
||||
linux-pam-dev \
|
||||
npm \
|
||||
openssl-dev \
|
||||
sqlite-dev \
|
||||
yaml-dev \
|
||||
@@ -52,12 +54,13 @@ ARG BUILD_DIR
|
||||
COPY / $BUILD_DIR/
|
||||
|
||||
WORKDIR $BUILD_DIR
|
||||
|
||||
RUN mv .github/container/ejabberdctl.template . \
|
||||
&& mv .github/container/ejabberd.yml.example . \
|
||||
&& ./autogen.sh \
|
||||
&& ./configure --with-rebar=mix --enable-all \
|
||||
&& make deps \
|
||||
&& make rel
|
||||
&& make prod
|
||||
|
||||
WORKDIR /rootfs
|
||||
ARG VERSION
|
||||
@@ -165,11 +168,10 @@ RUN apk -U upgrade --available --no-cache \
|
||||
&& apk add --no-cache \
|
||||
$(cat /tmp/runDeps) \
|
||||
so:libcap.so.2 \
|
||||
so:libtdsodbc.so.0 \
|
||||
so:libtdsodbc.so \
|
||||
curl \
|
||||
tini \
|
||||
&& rm /tmp/runDeps \
|
||||
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
|
||||
&& rm /tmp/runDeps
|
||||
|
||||
ARG USER
|
||||
ARG UID
|
||||
@@ -200,7 +202,7 @@ HEALTHCHECK \
|
||||
WORKDIR /$HOME
|
||||
USER $USER
|
||||
VOLUME ["/$HOME"]
|
||||
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443
|
||||
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443 5478 7777 50000-50099
|
||||
|
||||
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
|
||||
CMD ["foreground"]
|
||||
|
||||
@@ -24,8 +24,11 @@ define_macro:
|
||||
PORT_HTTP: 5280
|
||||
PORT_BROWSER: 1880
|
||||
PORT_STUN: 5478
|
||||
PORT_TURN_MIN: 50000
|
||||
PORT_TURN_MAX: 50099
|
||||
PORT_MQTT: 1883
|
||||
PORT_PROXY65: 7777
|
||||
STARTTLS_REQUIRED: true
|
||||
|
||||
hosts:
|
||||
- HOST
|
||||
@@ -49,7 +52,7 @@ listen:
|
||||
max_stanza_size: 262144
|
||||
shaper: c2s_shaper
|
||||
access: c2s
|
||||
starttls_required: true
|
||||
starttls_required: STARTTLS_REQUIRED
|
||||
-
|
||||
port: PORT_C2S_TLS
|
||||
ip: "::"
|
||||
@@ -75,7 +78,7 @@ listen:
|
||||
/bosh: mod_bosh
|
||||
/captcha: ejabberd_captcha
|
||||
/upload: mod_http_upload
|
||||
/ws: ejabberd_http_ws
|
||||
/websocket: ejabberd_http_ws
|
||||
-
|
||||
port: PORT_HTTP
|
||||
ip: "::"
|
||||
@@ -102,6 +105,8 @@ listen:
|
||||
transport: udp
|
||||
module: ejabberd_stun
|
||||
use_turn: true
|
||||
turn_min_port: PORT_TURN_MIN
|
||||
turn_max_port: PORT_TURN_MAX
|
||||
## The server's public IPv4 address:
|
||||
# turn_ipv4_address: "203.0.113.3"
|
||||
## The server's public IPv6 address:
|
||||
@@ -151,7 +156,12 @@ api_permissions:
|
||||
from: ejabberd_web_admin
|
||||
who: admin
|
||||
what: "*"
|
||||
"admin access":
|
||||
"adhoc commands":
|
||||
from: mod_adhoc_api
|
||||
who: admin
|
||||
what: "*"
|
||||
"http access":
|
||||
from: mod_http_api
|
||||
who:
|
||||
access:
|
||||
allow:
|
||||
@@ -192,6 +202,7 @@ shaper_rules:
|
||||
|
||||
modules:
|
||||
mod_adhoc: {}
|
||||
mod_adhoc_api: {}
|
||||
mod_admin_extra: {}
|
||||
mod_announce:
|
||||
access: announce
|
||||
@@ -206,7 +217,7 @@ modules:
|
||||
mod_fail2ban: {}
|
||||
mod_http_api: {}
|
||||
mod_http_upload:
|
||||
put_url: https://@HOST@:5443/upload
|
||||
put_url: https://@HOST_URL_ENCODE@:5443/upload
|
||||
custom_headers:
|
||||
"Access-Control-Allow-Origin": "https://@HOST@"
|
||||
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
|
||||
|
||||
@@ -67,10 +67,15 @@ done
|
||||
# shellcheck source=ejabberdctl.cfg.example
|
||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%@*}" ] && ERLANG_NODE="$ERLANG_NODE@$(hostname -s)"
|
||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||
|
||||
# backward support for old mnesia spool dir path
|
||||
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
|
||||
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
|
||||
|
||||
# define erl parameters
|
||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||
@@ -117,6 +122,9 @@ export CONTRIB_MODULES_CONF_DIR
|
||||
export ERL_LIBS
|
||||
export SCRIPT_DIR
|
||||
|
||||
# Only required for Erlang/OTP 25:
|
||||
export ERL_FLAGS="$ERL_FLAGS -enable-feature maybe_expr"
|
||||
|
||||
set_dist_client()
|
||||
{
|
||||
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false"
|
||||
@@ -132,9 +140,19 @@ run_cmd()
|
||||
}
|
||||
exec_cmd()
|
||||
{
|
||||
case $EXEC_CMD in
|
||||
as_current_user) exec "$@" ;;
|
||||
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
case $EXEC_CMD,$(uname -s) in
|
||||
as_install_user,OpenBSD)
|
||||
su -s /bin/sh "$INSTALLUSER" -c 'exec "$0" "$@"' "$@"
|
||||
;;
|
||||
as_install_user,NetBSD)
|
||||
su "$INSTALLUSER" -c 'exec "$0" "$@"' -- "$@"
|
||||
;;
|
||||
as_install_user,*)
|
||||
su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@"
|
||||
;;
|
||||
as_current_user,*)
|
||||
"$@"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
run_erl()
|
||||
@@ -191,7 +209,9 @@ livewarning()
|
||||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To exit and detach this shell from ejabberd, press:"
|
||||
echo "To stop ejabberd gracefully:"
|
||||
echo " ejabberd:stop()."
|
||||
echo "To quit erlang immediately, press:"
|
||||
echo " control+g and then q"
|
||||
echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
@@ -307,7 +327,17 @@ check_start()
|
||||
{
|
||||
ECSIMAGE_DBPATH=$HOME/database/$ERLANG_NODE
|
||||
[ ! -d "$ECSIMAGE_DBPATH" ] && ln -s $HOME/database $HOME/database/$ERLANG_NODE
|
||||
[ -n "$ERL_DIST_PORT" ] && return
|
||||
[ -n "$ERL_DIST_PORT" ] && {
|
||||
netstat -nl | grep ":5210" >/dev/null && {
|
||||
echo "Error: The file ejabberdctl.cfg has configured ERL_DIST_PORT=$ERL_DIST_PORT"
|
||||
echo " but the port 5210 is already in use."
|
||||
echo " Stop that program or configure a different ERL_DIST_PORT"
|
||||
echo ""
|
||||
netstat -nlp | grep ":5210"
|
||||
echo ""
|
||||
}
|
||||
return
|
||||
}
|
||||
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
||||
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
||||
@@ -359,6 +389,13 @@ post_waiter_loop()
|
||||
# allow sync calls
|
||||
wait_status()
|
||||
{
|
||||
wait_status_node "$ERLANG_NODE" $1 $2 $3
|
||||
}
|
||||
|
||||
wait_status_node()
|
||||
{
|
||||
CONNECT_NODE=$1
|
||||
shift
|
||||
# args: status try delay
|
||||
# return: 0 OK, 1 KO
|
||||
timeout="$2"
|
||||
@@ -370,9 +407,9 @@ wait_status()
|
||||
status="$1"
|
||||
else
|
||||
run_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
||||
-extra "$CONNECT_NODE" $NO_TIMEOUT status > /dev/null
|
||||
status="$?"
|
||||
fi
|
||||
done
|
||||
@@ -381,19 +418,26 @@ wait_status()
|
||||
|
||||
exec_other_command()
|
||||
{
|
||||
exec_other_command_node $ERLANG_NODE "$@"
|
||||
}
|
||||
|
||||
exec_other_command_node()
|
||||
{
|
||||
CONNECT_NODE=$1
|
||||
shift
|
||||
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|
||||
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|
||||
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
|
||||
run_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
||||
-extra "$CONNECT_NODE" $NO_TIMEOUT "$@"
|
||||
result=$?
|
||||
case $result in
|
||||
3) help;;
|
||||
*) :;;
|
||||
esac
|
||||
exit $result
|
||||
return $result
|
||||
else
|
||||
exec_ctl_over_http_socket "$@"
|
||||
fi
|
||||
@@ -435,6 +479,103 @@ cd "$SPOOL_DIR" || {
|
||||
exit 6
|
||||
}
|
||||
|
||||
printe()
|
||||
{
|
||||
printf "\n"
|
||||
printf "\e[1;40;32m==> %s\e[0m\n" "$1"
|
||||
}
|
||||
|
||||
## Function copied from tools/make-installers
|
||||
user_agrees()
|
||||
{
|
||||
question="$*"
|
||||
|
||||
if [ -t 0 ]
|
||||
then
|
||||
printe "$question (y/n) [n]"
|
||||
read -r response
|
||||
case "$response" in
|
||||
[Yy]|[Yy][Ee][Ss])
|
||||
return 0
|
||||
;;
|
||||
[Nn]|[Nn][Oo]|'')
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
echo 'Please respond with "yes" or "no".'
|
||||
user_agrees "$question"
|
||||
;;
|
||||
esac
|
||||
else # Assume 'yes' if not running interactively.
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
mnesia_change()
|
||||
{
|
||||
ERLANG_NODE_OLD="$1"
|
||||
[ "$ERLANG_NODE_OLD" = "" ] \
|
||||
&& echo "Error: Please provide the old erlang node name, for example:" \
|
||||
&& echo " ejabberdctl mnesia_change ejabberd@oldmachine" \
|
||||
&& exit 1
|
||||
|
||||
SPOOL_DIR_BACKUP=$SPOOL_DIR/$ERLANG_NODE_OLD-backup/
|
||||
OLDFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE_OLD.backup
|
||||
NEWFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE.backup
|
||||
|
||||
printe "This changes your mnesia database from node name '$ERLANG_NODE_OLD' to '$ERLANG_NODE'"
|
||||
|
||||
[ -d "$SPOOL_DIR_BACKUP" ] && printe "WARNING! A backup of old node already exists in $SPOOL_DIR_BACKUP"
|
||||
|
||||
if ! user_agrees "Do you want to proceed?"
|
||||
then
|
||||
echo 'Operation aborted.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printe "Starting ejabberd with old node name $ERLANG_NODE_OLD ..."
|
||||
exec_erl "$ERLANG_NODE_OLD" $EJABBERD_OPTS -detached
|
||||
wait_status_node $ERLANG_NODE_OLD 0 30 2
|
||||
result=$?
|
||||
case $result in
|
||||
1) echo "There was a problem starting ejabberd with the old erlang node name. " \
|
||||
&& echo "Check for log errors in $EJABBERD_LOG_PATH" \
|
||||
&& exit $result;;
|
||||
*) :;;
|
||||
esac
|
||||
exec_other_command_node $ERLANG_NODE_OLD "status"
|
||||
|
||||
printe "Making backup of old database to file $OLDFILE ..."
|
||||
mkdir $SPOOL_DIR_BACKUP
|
||||
exec_other_command_node $ERLANG_NODE_OLD backup "$OLDFILE"
|
||||
|
||||
printe "Changing node name in new backup file $NEWFILE ..."
|
||||
exec_other_command_node $ERLANG_NODE_OLD mnesia_change_nodename "$ERLANG_NODE_OLD" "$ERLANG_NODE" "$OLDFILE" "$NEWFILE"
|
||||
|
||||
printe "Stopping old ejabberd..."
|
||||
exec_other_command_node $ERLANG_NODE_OLD "stop"
|
||||
wait_status_node $ERLANG_NODE_OLD 3 30 2 && stop_epmd
|
||||
|
||||
printe "Moving old mnesia spool files to backup subdirectory $SPOOL_DIR_BACKUP ..."
|
||||
mv $SPOOL_DIR/*.DAT $SPOOL_DIR_BACKUP
|
||||
mv $SPOOL_DIR/*.DCD $SPOOL_DIR_BACKUP
|
||||
mv $SPOOL_DIR/*.LOG $SPOOL_DIR_BACKUP
|
||||
|
||||
printe "Starting ejabberd with new node name $ERLANG_NODE ..."
|
||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
|
||||
wait_status 0 30 2
|
||||
exec_other_command "status"
|
||||
|
||||
printe "Installing fallback of new mnesia..."
|
||||
exec_other_command install_fallback "$NEWFILE"
|
||||
|
||||
printe "Stopping new ejabberd..."
|
||||
exec_other_command "stop"
|
||||
wait_status 3 30 2 && stop_epmd
|
||||
|
||||
printe "Finished, now you can start ejabberd normally"
|
||||
}
|
||||
|
||||
# main
|
||||
case $1 in
|
||||
start)
|
||||
@@ -487,7 +628,8 @@ case $1 in
|
||||
-noinput -hidden \
|
||||
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
||||
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-s erlang halt -output text
|
||||
-eval 'halt(case net_adm:ping('"'$PEER'"') of pong -> 0; pang -> 1 end).' \
|
||||
-output text
|
||||
;;
|
||||
started)
|
||||
set_dist_client
|
||||
@@ -497,6 +639,9 @@ case $1 in
|
||||
set_dist_client
|
||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
||||
;;
|
||||
mnesia_change)
|
||||
mnesia_change $2
|
||||
;;
|
||||
post_waiter)
|
||||
post_waiter_waiting
|
||||
;;
|
||||
|
||||
@@ -4,7 +4,6 @@ on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
@@ -12,177 +11,234 @@ on:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
|
||||
env:
|
||||
DEV: _build/dev/rel/ejabberd
|
||||
|
||||
jobs:
|
||||
|
||||
tests:
|
||||
name: Tests
|
||||
############################################################### Compile #####
|
||||
|
||||
compile:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['20.0', '25', '26', '27']
|
||||
runs-on: ubuntu-20.04
|
||||
services:
|
||||
redis:
|
||||
image: redis
|
||||
ports:
|
||||
- 6379:6379
|
||||
otp: ['28']
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Test shell scripts
|
||||
if: matrix.otp == '27'
|
||||
run: |
|
||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
||||
shellcheck tools/captcha.sh
|
||||
shellcheck ejabberd.init.template
|
||||
shellcheck -x ejabberdctl.template
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: erlef/setup-beam@v1
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- name: Get a compatible Rebar3
|
||||
if: matrix.otp < 24
|
||||
run: |
|
||||
rm rebar3
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
||||
chmod +x rebar3
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libexpat1-dev libgd-dev libpam0g-dev
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Install MS SQL Server
|
||||
run: |
|
||||
docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=ejabberd_Test1" \
|
||||
-v $(pwd)/test/docker/db/mssql/initdb/initdb_mssql.sql:/initdb_mssql.sql:ro \
|
||||
-v $(pwd)/sql/mssql.sql:/mssql.sql:ro \
|
||||
-v $(pwd)/sql/mssql.new.sql:/mssql.new.sql:ro \
|
||||
-p 1433:1433 --name ejabberd-mssql "mcr.microsoft.com/mssql/server:2019-latest"
|
||||
sleep 10
|
||||
|
||||
- name: Prepare databases
|
||||
run: |
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
|
||||
sudo systemctl start mysql.service
|
||||
sudo systemctl start postgresql.service
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
||||
IDENTIFIED BY 'ejabberd_test';"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
pg_isready
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
||||
WITH PASSWORD 'ejabberd_test';"
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -y purge libgd3 nginx
|
||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Remove syntax_tools from release
|
||||
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
||||
|
||||
- name: Cache Hex.pm
|
||||
uses: actions/cache@v4
|
||||
- name: Cache rebar3
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.cache/rebar3/
|
||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
||||
|
||||
- name: Get old eredis for old Erlang
|
||||
if: matrix.otp < 21
|
||||
run: ./rebar3 unlock eredis
|
||||
_build/default/lib/
|
||||
key: ci-${{ matrix.otp }}-${{hashFiles('rebar.*')}}
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=./rebar3 \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-mssql \
|
||||
--disable-odbc
|
||||
make
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: compile
|
||||
tool: rebar3
|
||||
configure: --disable-elixir
|
||||
|
||||
- name: Compress compiled.tar
|
||||
run: |
|
||||
tar -cvf /tmp/compiled.tar .
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: compiled-${{ matrix.otp }}
|
||||
path: /tmp/compiled.tar
|
||||
retention-days: 1
|
||||
|
||||
########################################################## Static Tests #####
|
||||
|
||||
static:
|
||||
needs: compile
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
matrix:
|
||||
otp: ['28']
|
||||
|
||||
steps:
|
||||
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: compiled-${{ matrix.otp }}
|
||||
- run: tar -xf compiled.tar
|
||||
|
||||
- name: Test shell scripts
|
||||
run: |
|
||||
shellcheck ejabberd.init.template
|
||||
shellcheck -x ejabberdctl.template
|
||||
shellcheck .vscode/relive.sh
|
||||
shellcheck rel/setup-dev.sh
|
||||
shellcheck rel/setup-relive.sh
|
||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
||||
shellcheck tools/captcha.sh
|
||||
shellcheck tools/emacs-indent.sh
|
||||
shellcheck tools/generate-doap.sh
|
||||
shellcheck tools/prepare-tr.sh
|
||||
shellcheck tools/rebar3-format.sh
|
||||
|
||||
- run: make install -s
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
- run: make dialyzer
|
||||
- run: make test-eunit
|
||||
- run: make testeunit
|
||||
- run: make elvis
|
||||
if: matrix.otp >= 23
|
||||
if: matrix.otp > '25'
|
||||
|
||||
- name: Check Production Release
|
||||
run: |
|
||||
make rel
|
||||
RE=_build/prod/rel/ejabberd
|
||||
$RE/bin/ejabberdctl start
|
||||
$RE/bin/ejabberdctl started
|
||||
$RE/bin/ejabberdctl stop
|
||||
$RE/bin/ejabberdctl stopped
|
||||
cat $RE/logs/ejabberd.log
|
||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||
- run: make install -s
|
||||
|
||||
- name: Start Development Release
|
||||
run: |
|
||||
make dev
|
||||
RE=_build/dev/rel/ejabberd
|
||||
sed -i 's/starttls_required: true/starttls_required: false/g' $RE/conf/ejabberd.yml
|
||||
$RE/bin/ejabberdctl start
|
||||
$RE/bin/ejabberdctl started
|
||||
$RE/bin/ejabberdctl register admin localhost admin
|
||||
grep -q "is started in" $RE/logs/ejabberd.log
|
||||
######################################################### Dynamic Tests #####
|
||||
|
||||
- name: Run XMPP Interoperability Tests against CI server.
|
||||
if: matrix.otp == '27'
|
||||
dynamic:
|
||||
needs: compile
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
matrix:
|
||||
otp: ['28']
|
||||
|
||||
steps:
|
||||
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
if: matrix.otp < '28'
|
||||
with:
|
||||
packages: libexpat1-dev libgd-dev libpam0g-dev
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: compiled-${{ matrix.otp }}
|
||||
- run: tar -xf compiled.tar
|
||||
|
||||
- name: Check production release
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: deploy, start, stop, check
|
||||
|
||||
- name: Start development release
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: deploy, no_tls, start, register
|
||||
username: user123
|
||||
|
||||
- name: Run XMPP Interoperability Tests against CI server
|
||||
if: matrix.otp == '28'
|
||||
continue-on-error: true
|
||||
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.4.0
|
||||
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.7.2
|
||||
with:
|
||||
domain: 'localhost'
|
||||
adminAccountUsername: 'admin'
|
||||
adminAccountPassword: 'admin'
|
||||
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,XEP-0363,XEP-0384
|
||||
adminAccountUsername: 'user123'
|
||||
adminAccountPassword: 's0mePass'
|
||||
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,
|
||||
XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,
|
||||
XEP-0363,XEP-0384,XEP-0421
|
||||
|
||||
- name: Stop Development Release
|
||||
- name: Stop development release
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: stop, check
|
||||
|
||||
- name: View production logs
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: logs
|
||||
|
||||
- name: View development logs
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: logs
|
||||
|
||||
##################################################### Common Test Suite #####
|
||||
|
||||
ct:
|
||||
needs: compile
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
matrix:
|
||||
otp: ['28']
|
||||
backend: [agnostic, extauth, ldap, mnesia, mysql, pgsql, redis, sqlite]
|
||||
schema: [single, multi]
|
||||
exclude:
|
||||
- backend: agnostic
|
||||
schema: single
|
||||
- backend: extauth
|
||||
schema: single
|
||||
- backend: ldap
|
||||
schema: single
|
||||
- backend: mnesia
|
||||
schema: single
|
||||
- backend: redis
|
||||
schema: single
|
||||
|
||||
steps:
|
||||
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: compiled-${{ matrix.otp }}
|
||||
- run: tar -xf compiled.tar
|
||||
|
||||
- name: Prepare database
|
||||
uses: ./.github/actions/manage-database
|
||||
with:
|
||||
for: ${{ matrix.backend }}
|
||||
do: install, start, user, create
|
||||
|
||||
- name: Setup multihost SQL schema
|
||||
if: matrix.schema == 'multi'
|
||||
run: |
|
||||
RE=_build/dev/rel/ejabberd
|
||||
$RE/bin/ejabberdctl stop
|
||||
$RE/bin/ejabberdctl stopped
|
||||
cat $RE/logs/ejabberd.log
|
||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||
sed -i 's|multihost_schema, false|multihost_schema, true|g' \
|
||||
test/suite.erl
|
||||
|
||||
- name: Run tests
|
||||
id: ct
|
||||
run: CT_BACKENDS=${{ matrix.backend }} make test
|
||||
|
||||
- name: Send to coveralls
|
||||
continue-on-error: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
(cd priv && ln -sf ../sql)
|
||||
sed -i -e 's/ct:pal/ct:log/' test/suite.erl
|
||||
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
||||
DATE=`date +%s`
|
||||
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
||||
NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT
|
||||
LABEL=`git show -s --format=%s | cut -c 1-30`
|
||||
./rebar3 ct --name $NODENAME --label "$LABEL"
|
||||
./rebar3 cover
|
||||
DIAGNOSTIC=1 ./rebar3 as test coveralls send
|
||||
|
||||
- name: Check results
|
||||
if: always() && (steps.ct.outcome != 'skipped')
|
||||
@@ -194,20 +250,44 @@ jobs:
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctresults.outcome == 'failure'
|
||||
- name: View logs
|
||||
if: always()
|
||||
run: |
|
||||
echo "::group::ejabberd.log"
|
||||
find logs/ -name ejabberd.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::error.log"
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::exunit.log"
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::suite.log (only failures)"
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::suite.log (complete)"
|
||||
cat logs/suite.log
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Send to coveralls
|
||||
if: matrix.otp == '27'
|
||||
- name: Upload CT logs
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ct-logs-${{ matrix.otp }}-${{ matrix.backend }}-${{ matrix.schema }}
|
||||
path: _build/test/logs
|
||||
retention-days: 14
|
||||
|
||||
############################################################# Coveralls #####
|
||||
|
||||
cover:
|
||||
needs: ct
|
||||
runs-on: ubuntu-24.04-arm
|
||||
steps:
|
||||
- name: Finish parallel upload to coveralls
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
DIAGNOSTIC=1 ./rebar3 as test coveralls send
|
||||
curl -v -k https://coveralls.io/webhook \
|
||||
--header "Content-Type: application/json" \
|
||||
--data '{"repo_name":"$GITHUB_REPOSITORY",
|
||||
@@ -215,94 +295,123 @@ jobs:
|
||||
"payload":{"build_num":$GITHUB_RUN_ID,
|
||||
"status":"done"}}'
|
||||
|
||||
- name: Check for changes to trigger schema upgrade test
|
||||
uses: dorny/paths-filter@v3
|
||||
id: filter
|
||||
################################################################ Schema #####
|
||||
|
||||
schema:
|
||||
needs: compile
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
matrix:
|
||||
otp: ['28']
|
||||
|
||||
steps:
|
||||
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
filters: |
|
||||
sql:
|
||||
- 'sql/**'
|
||||
- 'src/mod_admin_update_sql.erl'
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- name: Prepare for schema upgrade test
|
||||
id: prepupgradetest
|
||||
if: ${{ steps.filter.outputs.sql == 'true' }}
|
||||
run: |
|
||||
[[ -d logs ]] && rm -rf logs
|
||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||
sed -i 's|update_sql, false|update_sql, true|g' test/suite.erl
|
||||
- name: Run DB tests on upgraded schema (mssql, mysql, pgsql)
|
||||
run: CT_BACKENDS=mssql,mysql,pgsql make test
|
||||
if: always() && steps.prepupgradetest.outcome != 'skipped'
|
||||
id: ctupgradedschema
|
||||
- name: Check results
|
||||
if: always() && steps.ctupgradedschema.outcome != 'skipped'
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctupgradedschema.outcome != 'skipped'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Prepare new schema
|
||||
run: |
|
||||
[[ -d logs ]] && rm -rf logs
|
||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
|
||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.new.sql
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
||||
- name: Run DB tests on new schema (mssql, mysql, pgsql)
|
||||
run: CT_BACKENDS=mssql,mysql,pgsql make test
|
||||
id: ctnewschema
|
||||
- name: Check results
|
||||
if: always() && steps.ctnewschema.outcome != 'skipped'
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctnewschema.outcome != 'skipped'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Upload CT logs
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: ejabberd-ct-logs-${{matrix.otp}}
|
||||
#
|
||||
# Appending the wildcard character ("*") is a trick to make
|
||||
# "ejabberd-packages" the root directory of the uploaded ZIP file:
|
||||
#
|
||||
# https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions
|
||||
#
|
||||
path: _build/test/logs
|
||||
retention-days: 14
|
||||
name: compiled-${{ matrix.otp }}
|
||||
- run: tar -xf compiled.tar
|
||||
|
||||
###################################### multi-changed ##
|
||||
|
||||
- name: Prepare databases
|
||||
uses: ./.github/actions/manage-database
|
||||
with:
|
||||
for: mysql, pgsql
|
||||
do: install, start, user, create
|
||||
|
||||
- name: Prepare configuration
|
||||
run: |
|
||||
CT_BACKENDS=mysql,pgsql ./rebar3 ct \
|
||||
--suite=test/ejabberd_SUITE --group=configtest_single
|
||||
make dev
|
||||
cp test/ejabberd_SUITE_data/ejabberd.yml ${{ env.DEV }}/conf/
|
||||
cp _build/test/logs/last/*.yml ${{ env.DEV }}/database/
|
||||
echo "define_macro: [CONFIGTEST_CONFIG: {modules: {mod_muc: {}}}]" \
|
||||
> ${{ env.DEV }}/database/configtest.yml
|
||||
cp _build/test/logs/last/*.pem ${{ env.DEV }}/conf/
|
||||
cp _build/test/logs/last/*.pem ${{ env.DEV }}/database/
|
||||
|
||||
- name: Run ejabberd
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: start, update_sql, stop, check, logs
|
||||
username: user2
|
||||
|
||||
- name: Dump multihost databases
|
||||
uses: ./.github/actions/manage-database
|
||||
with:
|
||||
for: mysql, pgsql
|
||||
do: dump
|
||||
dump-suffix: multi-changed
|
||||
|
||||
######################################### multi-auto ##
|
||||
|
||||
- name: Prepare databases
|
||||
uses: ./.github/actions/manage-database
|
||||
with:
|
||||
for: mysql, pgsql
|
||||
do: drop, create
|
||||
|
||||
- name: Configure multihost schema
|
||||
run: |
|
||||
sed -i 's|MULTIHOST_SCHEMA|true|g' ${{ env.DEV }}/conf/ejabberd.yml
|
||||
|
||||
- name: Run ejabberd for multihost
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: start, stop, check, logs
|
||||
username: user2
|
||||
|
||||
- name: Dump multihost databases
|
||||
uses: ./.github/actions/manage-database
|
||||
with:
|
||||
for: mysql, pgsql
|
||||
do: dump
|
||||
dump-suffix: multi-auto
|
||||
|
||||
############################################ compare ##
|
||||
|
||||
- name: View SQL schemas (mysql)
|
||||
run: |
|
||||
perl test/ejabberd_SUITE_data/sql_sort.pl \
|
||||
<mysql-multi-auto.sql >mysql-multi2.sql
|
||||
perl test/ejabberd_SUITE_data/sql_sort.pl \
|
||||
<mysql-multi-changed.sql >mysql-changed2.sql
|
||||
echo "::group::differences multi-auto > multi-changed"
|
||||
diff -u mysql-multi2.sql mysql-changed2.sql || echo ok
|
||||
echo "::endgroup::"
|
||||
echo "::group::multi-auto.sql"
|
||||
cat mysql-multi-auto.sql
|
||||
echo "::endgroup::"
|
||||
echo "::group::multi-changed.sql"
|
||||
cat mysql-multi-changed.sql
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: View SQL schemas (pgsql)
|
||||
run: |
|
||||
perl test/ejabberd_SUITE_data/sql_sort.pl \
|
||||
<pgsql-multi-auto.sql >pgsql-multi2.sql
|
||||
perl test/ejabberd_SUITE_data/sql_sort.pl \
|
||||
<pgsql-multi-changed.sql >pgsql-changed2.sql
|
||||
echo "::group::differences (multi-auto > multi-changed)"
|
||||
diff -u pgsql-multi2.sql pgsql-changed2.sql || echo ok
|
||||
echo "::endgroup::"
|
||||
echo "::group::multi-auto.sql"
|
||||
cat pgsql-multi-auto.sql
|
||||
echo "::endgroup::"
|
||||
echo "::group::multi-changed.sql"
|
||||
cat pgsql-multi-changed.sql
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: View ejabberd logs
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: logs
|
||||
|
||||
@@ -4,7 +4,6 @@ on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
@@ -15,25 +14,32 @@ env:
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
container:
|
||||
name: Container
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-24.04${{ matrix.suffix }}
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [amd64, arm64]
|
||||
include:
|
||||
- platform: amd64
|
||||
suffix:
|
||||
- platform: arm64
|
||||
suffix: -arm
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Checkout ejabberd-contrib
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
repository: processone/ejabberd-contrib
|
||||
path: .ejabberd-modules/sources/ejabberd-contrib
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
- uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -43,24 +49,19 @@ jobs:
|
||||
id: gitdescribe
|
||||
run: echo "ver=$(git describe --tags)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
- uses: docker/metadata-action@v5
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
flavor: suffix=--${{ matrix.platform }}
|
||||
labels: |
|
||||
org.opencontainers.image.revision=${{ steps.gitdescribe.outputs.ver }}
|
||||
org.opencontainers.image.licenses=GPL-2.0
|
||||
org.opencontainers.image.vendor=ProcessOne
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v6
|
||||
- uses: docker/build-push-action@v6
|
||||
with:
|
||||
build-args: |
|
||||
VERSION=${{ steps.gitdescribe.outputs.ver }}
|
||||
@@ -69,6 +70,50 @@ jobs:
|
||||
context: .
|
||||
file: .github/container/Dockerfile
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
platforms: linux/${{ matrix.platform }}
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
|
||||
merge:
|
||||
needs: [build]
|
||||
runs-on: ubuntu-24.04
|
||||
outputs:
|
||||
image-uri: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@${{ steps.merge.outputs.digest }}
|
||||
steps:
|
||||
- uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- uses: docker/metadata-action@v5
|
||||
id: meta-amd
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
flavor: suffix=--amd64
|
||||
- uses: docker/metadata-action@v5
|
||||
id: meta-arm
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
flavor: suffix=--arm64
|
||||
- uses: docker/metadata-action@v5
|
||||
id: meta-result
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
|
||||
- uses: int128/docker-manifest-create-action@v2
|
||||
id: merge
|
||||
with:
|
||||
index-annotations: ${{ steps.metadata.outputs.labels }}
|
||||
tags: ${{ steps.meta-result.outputs.tags }}
|
||||
sources: |
|
||||
${{ steps.meta-amd.outputs.tags }}
|
||||
${{ steps.meta-arm.outputs.tags }}
|
||||
#- uses: dataaxiom/ghcr-cleanup-action@v1
|
||||
# with:
|
||||
# dry-run: true
|
||||
# delete-tags: '*--a??64'
|
||||
# delete-untagged: true
|
||||
# delete-ghost-images: true
|
||||
# delete-partial-images: true
|
||||
# delete-orphaned-images: true
|
||||
|
||||
@@ -4,7 +4,6 @@ on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
@@ -12,7 +11,6 @@ on:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
@@ -20,14 +18,25 @@ on:
|
||||
|
||||
jobs:
|
||||
binaries:
|
||||
name: Binaries
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-22.04${{ matrix.suffix }}
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [amd64, arm64]
|
||||
include:
|
||||
- platform: amd64
|
||||
suffix:
|
||||
- platform: arm64
|
||||
suffix: -arm
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Cache build directory
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ~/build/
|
||||
key: ${{runner.os}}-ct-ng-1.27.0
|
||||
key: installers-ubuntu-22.04-${{runner.arch}}-${{hashFiles('tools/make-binaries')}}
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
@@ -40,24 +49,40 @@ jobs:
|
||||
run: |
|
||||
gem install --no-document --user-install fpm
|
||||
echo $HOME/.local/share/gem/ruby/*/bin >> $GITHUB_PATH
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build binary archives
|
||||
run: CHECK_DEPS=false tools/make-binaries
|
||||
- name: Build DEB and RPM packages
|
||||
run: tools/make-packages
|
||||
- name: Build installers
|
||||
run: tools/make-installers
|
||||
|
||||
- run: echo "rel_name_vsn=$(ls *.run | sed 's/-1-linux.*//g')" >> $GITHUB_OUTPUT
|
||||
id: vsn
|
||||
- name: Test RUN
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: run
|
||||
do: deploy, no_acme, start, register, stop, check, logs
|
||||
username: user1
|
||||
host: $(hostname --fqdn)
|
||||
rel_name_vsn: ${{ steps.vsn.outputs.rel_name_vsn }}
|
||||
- name: Test DEB
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: deb
|
||||
do: deploy, register, stop, logs
|
||||
username: user1
|
||||
host: $(hostname --fqdn)
|
||||
rel_name_vsn: ${{ steps.vsn.outputs.rel_name_vsn }}
|
||||
|
||||
- name: Collect packages
|
||||
run: |
|
||||
mkdir ejabberd-packages
|
||||
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
|
||||
- name: Upload packages
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ejabberd-packages
|
||||
name: ejabberd-packages-${{ matrix.platform }}
|
||||
#
|
||||
# Appending the wildcard character ("*") is a trick to make
|
||||
# "ejabberd-packages" the root directory of the uploaded ZIP file:
|
||||
@@ -74,9 +99,9 @@ jobs:
|
||||
if: github.ref_type == 'tag'
|
||||
steps:
|
||||
- name: Download packages
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: ejabberd-packages
|
||||
merge-multiple: true
|
||||
- name: Draft Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
|
||||
@@ -26,284 +26,184 @@ on:
|
||||
|
||||
jobs:
|
||||
|
||||
################################################################ Rebars #####
|
||||
|
||||
rebars:
|
||||
name: Rebars
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['20', '25', '26', '27']
|
||||
otp: ['25', '26', '27', '28', '29']
|
||||
rebar: ['rebar', 'rebar3']
|
||||
exclude:
|
||||
- otp: '27'
|
||||
rebar: 'rebar'
|
||||
runs-on: ubuntu-24.04
|
||||
- otp: '28'
|
||||
rebar: 'rebar'
|
||||
- otp: '29'
|
||||
rebar: 'rebar'
|
||||
container:
|
||||
image: erlang:${{ matrix.otp }}
|
||||
image: public.ecr.aws/docker/library/erlang:${{ matrix.otp }}
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Get compatible Rebar binaries
|
||||
if: matrix.otp < 24
|
||||
run: |
|
||||
rm rebar
|
||||
rm rebar3
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
||||
chmod +x rebar
|
||||
chmod +x rebar3
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
apt-get -qq update
|
||||
apt-get purge -y libgd3 nginx
|
||||
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
apt-get -q -y install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Cache Hex.pm
|
||||
uses: actions/cache@v4
|
||||
- name: Cache rebar3
|
||||
if: matrix.rebar == 'rebar3'
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.cache/rebar3/
|
||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
||||
|
||||
- name: Get compatible Rebar binaries
|
||||
if: matrix.rebar == 'rebar3' && matrix.otp < 21
|
||||
run: rebar3 unlock eredis
|
||||
_build/default/lib/
|
||||
key: runtime-${{ matrix.otp }}-${{matrix.rebar}}-${{hashFiles('rebar.*')}}
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=./${{ matrix.rebar }} \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-tools \
|
||||
--disable-odbc
|
||||
make
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: compile
|
||||
tool: ${{ matrix.rebar }}
|
||||
configure: --disable-elixir
|
||||
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
|
||||
- run: make dialyzer
|
||||
- run: make elvis
|
||||
if: matrix.otp > '25' && matrix.rebar == 'rebar3'
|
||||
|
||||
- name: Prepare rel (rebar2)
|
||||
if: matrix.rebar == 'rebar'
|
||||
run: |
|
||||
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
|
||||
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
|
||||
- name: Production
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: deploy, start, register, stop, check, logs
|
||||
tool: ${{ matrix.rebar }}
|
||||
username: user1
|
||||
|
||||
- name: Run rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
- name: Development
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: deploy, start, register, stop, check, logs
|
||||
tool: ${{ matrix.rebar }}
|
||||
username: user2
|
||||
|
||||
- name: Run dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
- name: Installed
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: install
|
||||
do: deploy, start, register, stop, check, logs
|
||||
tool: ${{ matrix.rebar }}
|
||||
username: user3
|
||||
|
||||
- name: Run install
|
||||
run: |
|
||||
make install
|
||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
||||
|
||||
- name: View logs
|
||||
run: |
|
||||
echo "===> Registered:"
|
||||
cat registered.log
|
||||
echo "===> Prod:"
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
echo "===> Dev:"
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
echo "===> Install:"
|
||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
||||
|
||||
- name: Check logs
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q '^user3$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/rel/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/rel/ -empty -name error.log)
|
||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: always()
|
||||
run: |
|
||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
||||
####################################################### Rebar3 + Elixir #####
|
||||
|
||||
rebar3-elixir:
|
||||
name: Rebar3+Elixir
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
elixir: ['1.13', '1.14', '1.15', '1.16', '1.17', '1.18']
|
||||
runs-on: ubuntu-24.04
|
||||
elixir: ['1.14', '1.18', '1.19']
|
||||
container:
|
||||
image: elixir:${{ matrix.elixir }}
|
||||
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
apt-get -qq update
|
||||
apt-get -y purge libgd3 nginx
|
||||
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
apt-get -q -y install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Enable Module.Example and an Elixir dependency
|
||||
run: |
|
||||
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
|
||||
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" \
|
||||
ejabberd.yml.example
|
||||
cat ejabberd.yml.example
|
||||
sed -i 's|^{deps, \[\(.*\)|{deps, [{decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}},\n \1|g' rebar.config
|
||||
cat rebar.config
|
||||
|
||||
- name: Cache Hex.pm
|
||||
uses: actions/cache@v4
|
||||
- name: Cache hex.pm
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.cache/rebar3/
|
||||
key: ${{matrix.elixir}}-${{hashFiles('rebar.config')}}
|
||||
key: runtime-${{matrix.elixir}}-${{hashFiles('rebar.*')}}
|
||||
|
||||
- name: Install Hex and Rebar3 manually on older Elixir
|
||||
if: matrix.elixir <= '1.14'
|
||||
if: matrix.elixir < '1.15'
|
||||
run: |
|
||||
mix local.hex --force
|
||||
mix local.rebar --force
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=./rebar3 \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-odbc
|
||||
make
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: compile
|
||||
tool: ./rebar3
|
||||
|
||||
- name: Test scripts, deps, eunit
|
||||
run: |
|
||||
make scripts deps
|
||||
./rebar3 eunit --verbose
|
||||
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
#- run: make dialyzer
|
||||
- run: make elvis
|
||||
if: matrix.otp > '25'
|
||||
|
||||
- name: Run rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
- name: Production
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: deploy, start, register, stop, check, logs
|
||||
username: user1
|
||||
|
||||
- name: Run dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
- name: Release
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: deploy, start, register, stop, check, logs
|
||||
username: user2
|
||||
|
||||
- name: Run install
|
||||
run: |
|
||||
make install
|
||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
||||
- name: Installed
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: install
|
||||
do: deploy, start, register, stop, check, logs
|
||||
username: user3
|
||||
|
||||
- name: View logs
|
||||
if: always()
|
||||
run: |
|
||||
echo "===> Registered:"
|
||||
cat registered.log
|
||||
echo "===> Prod:"
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
echo "===> Dev:"
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
echo "===> Install:"
|
||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
||||
|
||||
- name: Check logs
|
||||
if: always()
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q '^user3$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/ -empty -name error.log)
|
||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure()
|
||||
run: |
|
||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
||||
################################################################### Mix #####
|
||||
|
||||
mix:
|
||||
name: Mix
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
elixir: ['1.13', '1.14', '1.15', '1.16', '1.17', '1.18']
|
||||
runs-on: ubuntu-24.04
|
||||
elixir: ['1.14', '1.18', '1.19']
|
||||
container:
|
||||
image: elixir:${{ matrix.elixir }}
|
||||
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
apt-get -qq update
|
||||
apt-get -y purge libgd3 nginx
|
||||
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
apt-get -q -y install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Remove Elixir Matchers
|
||||
- name: Remove Elixir matchers
|
||||
run: |
|
||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
||||
@@ -313,106 +213,58 @@ jobs:
|
||||
|
||||
- name: Enable Module.Example and an Elixir dependency
|
||||
run: |
|
||||
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
|
||||
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" \
|
||||
ejabberd.yml.example
|
||||
cat ejabberd.yml.example
|
||||
sed -i 's|^{deps, \(.*\)|{deps, \1\n {decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}}, |g' rebar.config
|
||||
cat rebar.config
|
||||
|
||||
- name: Cache Hex.pm
|
||||
uses: actions/cache@v4
|
||||
- name: Cache hex.pm
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.hex/
|
||||
key: ${{matrix.elixir}}-${{hashFiles('mix.exs')}}
|
||||
key: runtime-${{matrix.elixir}}-${{hashFiles('mix.*')}}
|
||||
|
||||
- name: Install Hex and Rebar3 manually on older Elixir
|
||||
if: matrix.elixir <= '1.14'
|
||||
if: matrix.elixir < '1.15'
|
||||
run: |
|
||||
mix local.hex --force
|
||||
mix local.rebar --force
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=mix \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all
|
||||
make
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: compile
|
||||
tool: mix
|
||||
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
|
||||
- run: make dialyzer
|
||||
- run: make elvis
|
||||
if: matrix.otp > '25'
|
||||
|
||||
- run: make edoc
|
||||
if: matrix.elixir >= '1.14'
|
||||
|
||||
- name: Run rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
- name: Production
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: deploy, start, register, stop, check, logs
|
||||
username: user1
|
||||
|
||||
- name: Run dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
- name: Development
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: deploy, start, register, stop, check, logs
|
||||
username: user2
|
||||
|
||||
- name: Run install
|
||||
run: |
|
||||
make install
|
||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
||||
|
||||
- name: View logs
|
||||
if: always()
|
||||
run: |
|
||||
echo "===> Registered:"
|
||||
cat registered.log
|
||||
echo "===> Prod:"
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
echo "===> Dev:"
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
echo "===> Install:"
|
||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
||||
|
||||
- name: Check logs
|
||||
if: always()
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q '^user3$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/ -empty -name error.log)
|
||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure()
|
||||
run: |
|
||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
||||
- name: Installed
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: install
|
||||
do: deploy, start, register, stop, check, logs
|
||||
username: user3
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
name: Weekly
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 9 * * 0'
|
||||
|
||||
jobs:
|
||||
|
||||
############################################################### Compile #####
|
||||
|
||||
test:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
strategy:
|
||||
matrix:
|
||||
otp: ['25', '26', '27', '28', '29.0-rc1']
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libexpat1-dev libgd-dev libpam0g-dev
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Compile
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: compile
|
||||
tool: rebar3
|
||||
configure: --disable-elixir --disable-mssql
|
||||
|
||||
########################################################## Static Tests #####
|
||||
|
||||
- name: Test shell scripts
|
||||
run: |
|
||||
shellcheck ejabberd.init.template
|
||||
shellcheck -x ejabberdctl.template
|
||||
shellcheck .vscode/relive.sh
|
||||
shellcheck rel/setup-dev.sh
|
||||
shellcheck rel/setup-relive.sh
|
||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
||||
shellcheck tools/captcha.sh
|
||||
shellcheck tools/emacs-indent.sh
|
||||
shellcheck tools/generate-doap.sh
|
||||
shellcheck tools/prepare-tr.sh
|
||||
shellcheck tools/rebar3-format.sh
|
||||
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
- run: make dialyzer
|
||||
- run: make testeunit
|
||||
- run: make elvis
|
||||
if: matrix.otp > '25'
|
||||
|
||||
- run: make install -s
|
||||
|
||||
######################################################### Dynamic Tests #####
|
||||
|
||||
- name: Check production release
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: deploy, start, stop, check
|
||||
|
||||
- name: Start development release
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: deploy, no_tls, start, register
|
||||
username: user123
|
||||
|
||||
- name: Stop development release
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: stop, check
|
||||
|
||||
- name: View production logs
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: prod
|
||||
do: logs
|
||||
|
||||
- name: View development logs
|
||||
if: always()
|
||||
uses: ./.github/actions/manage-ejabberd
|
||||
with:
|
||||
for: dev
|
||||
do: logs
|
||||
|
||||
##################################################### Common Test Suite #####
|
||||
|
||||
- name: Prepare database
|
||||
uses: ./.github/actions/manage-database
|
||||
with:
|
||||
for: mysql, pgsql, redis
|
||||
do: install, start, user, create
|
||||
|
||||
- name: Setup multihost SQL schema
|
||||
run: |
|
||||
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
||||
|
||||
- name: Run tests
|
||||
id: ct
|
||||
run: make test
|
||||
|
||||
- name: Send to coveralls
|
||||
continue-on-error: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
DIAGNOSTIC=1 ./rebar3 as test coveralls send
|
||||
|
||||
- name: Check results
|
||||
if: always() && (steps.ct.outcome != 'skipped')
|
||||
id: ctresults
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
|
||||
- name: View logs
|
||||
if: always()
|
||||
run: |
|
||||
echo "::group::ejabberd.log"
|
||||
find logs/ -name ejabberd.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::error.log"
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::exunit.log"
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
echo "::endgroup::"
|
||||
echo "::group::suite.log (only failures)"
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
echo "::endgroup::"
|
||||
echo "::group::suite.log (complete)"
|
||||
cat logs/suite.log
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Upload CT logs
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ct-logs-${{ matrix.otp }}
|
||||
path: _build/test/logs
|
||||
retention-days: 14
|
||||
|
||||
############################################################# Coveralls #####
|
||||
|
||||
cover:
|
||||
needs: test
|
||||
if: always()
|
||||
runs-on: ubuntu-24.04-arm
|
||||
steps:
|
||||
- name: Finish parallel upload to coveralls
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
curl -v -k https://coveralls.io/webhook \
|
||||
--header "Content-Type: application/json" \
|
||||
--data '{"repo_name":"$GITHUB_REPOSITORY",
|
||||
"repo_token":"$GITHUB_TOKEN",
|
||||
"payload":{"build_num":$GITHUB_RUN_ID,
|
||||
"status":"done"}}'
|
||||
@@ -47,3 +47,6 @@ Mnesia.nonode@nohost/
|
||||
/ejabberd-*.rpm
|
||||
/ejabberd-*.run
|
||||
/ejabberd-*.tar.gz
|
||||
/priv/mod_invites/static/bootstrap/
|
||||
/priv/mod_invites/static/jquery/
|
||||
/node_modules/
|
||||
|
||||
@@ -1,3 +1,395 @@
|
||||
## Version 26.03
|
||||
|
||||
#### Core
|
||||
|
||||
- Fix mysql authentication for tls connections that required auth plugin switch
|
||||
- Improve handling of scram "wanted to use channel-bindings but was not offered one" flag
|
||||
- Add ability for mod_options values to depend on other options
|
||||
- Don't fail to classify stand-alone chat states
|
||||
- Fix some warnings compiling with Erlang/OTP 29 ([#4527](https://github.com/processone/ejabberd/issues/4527))
|
||||
- `ejabberd_ctl`: Document how to set empty lists in ejabberdctl and WebAdmin
|
||||
- `ejabberd_http`: Add handling of `Etag` and `If-Modified-Since` headers to files served by `mod_http_upload`
|
||||
- `ejabberd_http`: Ignore whitespaces at end of host header
|
||||
- SQL: Add ability to mark that column can be null in e_sql_schema
|
||||
- Tests: Add tests for sasl2
|
||||
- Tests: Make table cleanup in test more robust
|
||||
|
||||
#### Modules
|
||||
|
||||
- `mod_fast_auth`: Offered methods are based on available channel bindings
|
||||
- `mod_http_api`: Always hide password in log entries
|
||||
- `mod_mam`: Call `store_mam_message` hook for messages that `user_mucsub_from_muc_archive` was filtering out
|
||||
- `mod_mam_sql`: Only provide the new XEP-0431 `fulltext` field, not old custom `withtext`
|
||||
- `mod_muc_room`: Fix duplicate stanza-id in muc mam responses generated from local history ([#4544](https://github.com/processone/ejabberd/issues/4544))
|
||||
- `mod_muc_room`: Fix hook name in commit 7732984 ([#4526](https://github.com/processone/ejabberd/issues/4526))
|
||||
- `mod_pubsub_serverinfo`: Don't use `gen_server:call` for resolving pubsub host
|
||||
- `mod_roster`: Add support for roster pre-approval ([#4512](https://github.com/processone/ejabberd/issues/4512))
|
||||
- `mod_roster`: Fix display of groups in WebAdmin when it's a list
|
||||
- `mod_roster`: in WebAdmin page, first execute SET actions, later GET
|
||||
- `mod_roster_mnesia`: Improve transformation code
|
||||
|
||||
#### mod_invites
|
||||
|
||||
- Makefile: Run invites-deps only when files are missing
|
||||
- Fix path to bootstrap files
|
||||
- Check at start time the syntax of landing_page option ([#4525](https://github.com/processone/ejabberd/issues/4525))
|
||||
- Send 'Link' http header ([#4531](https://github.com/processone/ejabberd/issues/4531))
|
||||
- Set meta.pre-auth to skip redirect_url if token validated ([#4535](https://github.com/processone/ejabberd/issues/4535))
|
||||
- Many security fixes ([#4539](https://github.com/processone/ejabberd/issues/4539))
|
||||
- Add favicon and change color to match ejabberd branding
|
||||
- Enable dark mode
|
||||
- Add support for webchat_url
|
||||
- Migrate to bootstrap5 and update jquery
|
||||
- No inline scripts
|
||||
- Make format csrf token
|
||||
- Add csrf token to failed post
|
||||
- Include js/css deps in static dir
|
||||
- Correct hashes for bootstrap 4.6.2
|
||||
- Hint at type for landing_page opt
|
||||
- Many more security fixes ([#4538](https://github.com/processone/ejabberd/issues/4538))
|
||||
- Check CSRF token in register form
|
||||
- Add integrity hashes to scripts and css
|
||||
- Comment unused resources
|
||||
- Add security headers
|
||||
- Remove debug log of whole query parameters (including pw)
|
||||
- Don't crash on unknown host from http host header
|
||||
- Make creating invite transactional
|
||||
- Set overuse limits ([#4540](https://github.com/processone/ejabberd/issues/4540))
|
||||
- Fix broken path when behind proxy with prefix ([#4547](https://github.com/processone/ejabberd/issues/4547))
|
||||
|
||||
#### Container and Installers
|
||||
|
||||
- Bump Erlang/OTP 28.4.1
|
||||
- `make-binaries`: Bump libexpat to 2.7.5
|
||||
- `make-binaries`: Bump zlib to 1.3.2
|
||||
- `make-binaries`: Enable missing crypto features ([#4542](https://github.com/processone/ejabberd/issues/4542))
|
||||
|
||||
#### Translations
|
||||
|
||||
- Update Bulgarian translation
|
||||
- Update Catalan and Spanish translations
|
||||
- Update Chinese Simplified translation
|
||||
- Update Czech translation
|
||||
- Update French translation
|
||||
- Update German translation
|
||||
|
||||
## Version 26.02
|
||||
|
||||
- Fixes issue with adding hats data in presences send by group chats ([#4516](https://github.com/processone/ejabberd/issues/4516))
|
||||
- Removes `mod_muc_occupantid` modules, and integrates its functionality directly into `mod_muc` ([#4521](https://github.com/processone/ejabberd/issues/4521))
|
||||
- Fixes issue with reset occupant-id values after restart of ejabberd ([#4521](https://github.com/processone/ejabberd/issues/4521))
|
||||
- Improves handling of mediated group chat invitations in `mod_block_stranger` ([#4523](https://github.com/processone/ejabberd/issues/4523))
|
||||
- Properly install `mod_invites` templates in `make install` call ([#4514](https://github.com/processone/ejabberd/issues/4514))
|
||||
- Better errors in `mod_invites` ([#4515](https://github.com/processone/ejabberd/issues/4515))
|
||||
- Accessibility improvements in `mod_invites` ([#4524](https://github.com/processone/ejabberd/issues/4524))
|
||||
- Improves handling of request with invalid url encoded values in request handled by `ejabberd_http`
|
||||
- Improves handling of invalid responses to disco queries in `mod_pubsub_serverinfo`
|
||||
- Fixes conversion of MUC room configs from ejabberd older than 21.12
|
||||
- Fixes to autologin in WebAdmin
|
||||
|
||||
## Version 26.01
|
||||
|
||||
#### Compile and Start
|
||||
|
||||
- Remove dependencies, macros and code for Erlang/OTP older than 25
|
||||
- Require Elixir 1.14 or higher, that's the lowest we can test automatically
|
||||
- `ejabberdctl`: Support NetBSD and OpenBSD `su` ([#4320](https://github.com/processone/ejabberd/issues/4320))
|
||||
- `ejabberdctl.template`: Show meaningful error when `ERL_DIST_PORT` is in use
|
||||
- `ejabberd_app`: Print address and port where listens for erlang node connections
|
||||
- `Makefile.in`: Add `make relivectl` similar to `relive` but using `ejabberdctl`
|
||||
|
||||
#### Databases
|
||||
|
||||
- Add db_serialize support in mnesia modules
|
||||
- Add db serialization to `mod_muc_sql`
|
||||
- New database export/import infrastructure
|
||||
- Add commands for new database export/import
|
||||
- Apply timestamp pass in `?SQL_INSERT` queries
|
||||
- Update p1_mysql to bring fix for timestamp decoding
|
||||
- Extend timestamp type handling in sql macros
|
||||
- Revert changes to conversion of pgsql `int` types
|
||||
|
||||
#### Installer and Container
|
||||
|
||||
- `make-binaries`: Bump Erlang/OTP 28.3.1 and Elixir 1.19.5
|
||||
- `Dockerfile`: Bump Erlang/OTP 28.3.1 and Elixir 1.19.5
|
||||
- `Dockerfile`: Expose also port 7777 for SOCKS5
|
||||
- `Dockerfile`: Configure TURN ports and expose 5478 50000-50099
|
||||
- `Dockerfile`: Try to fix error with recent `freetds` Alpine package
|
||||
- Container: Setup new macro `STARTTLS_REQUIRED` to allow easy disabling
|
||||
|
||||
#### MUC
|
||||
|
||||
- Add `muc_online_rooms_count` API command
|
||||
- Set `enable_hats` room option `true` by default
|
||||
- Allow vcard queries even when IQ queries are disabled ([#4489](https://github.com/processone/ejabberd/issues/4489))
|
||||
- Announce `stable-id` feature from XEP-0045 1.31, supported since long ago
|
||||
- Fix `preload_rooms` in case of SQL database ([#4476](https://github.com/processone/ejabberd/issues/4476))
|
||||
- Run new hooks: `registering_nickmuc` and `registered_nickmuc` ([#4478](https://github.com/processone/ejabberd/issues/4478))
|
||||
- When deleting account, unregister account's nicks in all MUC hosts ([#4478](https://github.com/processone/ejabberd/issues/4478))
|
||||
- `mod_muc_log`: Crash in `terminate/2` when stopping module ([#4486](https://github.com/processone/ejabberd/issues/4486))
|
||||
- `mod_muc_occupantid`: Keep salt per MUC service, not individual rooms
|
||||
- `mod_muc_room`: Rewrite hats code that gets xdata values
|
||||
- `mod_muc_room`: Handle hats without definition ([#4503](https://github.com/processone/ejabberd/issues/4503))
|
||||
- `mod_muc_room`: When user has no hats, don't store in hats_users
|
||||
|
||||
#### WebAdmin
|
||||
|
||||
- `ejabberd_http`: Run new `http_request_handlers_init` fold hook
|
||||
- `ejabberd_http`: Add helper `get_auto_urls/2` that returns all URLs and TLS
|
||||
- `ejabberd_web_admin`: Add helper functions `make_menu_system`
|
||||
- `ejabberd_web_admin`: Show menu system only when can view vhosts
|
||||
- `ejabberd_web_admin`: Pass Level in `webadmin_menu_system_post` and `inside` hooks
|
||||
- `mod_conversejs`: Improve link to conversejs in WebAdmin ([#4495](https://github.com/processone/ejabberd/issues/4495))
|
||||
- When epmd isn't running show explanation in Clustering WebAdmin page
|
||||
- Use improved WebAdmin menu system in more modules
|
||||
- When building WebAdmin menu system, `{URLPATH}` in link text is substituted
|
||||
|
||||
#### Web Services
|
||||
|
||||
- `rest`: Use separate `httpc` profile
|
||||
- `ejabberd_captcha`: Use `mod_host_meta:get_auto_url/2`
|
||||
- `ejabberd_http`: Support repeated module in request_handlers
|
||||
- `ejabberd_http`: Get back handling when BOSH or WS are disabled
|
||||
- `mod_host_meta`: Move `get_url` functions from `mod_host_meta` to `ejabberd_http`
|
||||
- `mod_host_meta`: Allow calling `get_url/2` for other modules, not only WebSocket
|
||||
- `mod_host_meta`: Cosmetic rename Module to Handler
|
||||
- `mod_http_upload`: New `content_type` option similar to `mod_http_fileserver` ([#4488](https://github.com/processone/ejabberd/issues/4488))
|
||||
- `mod_http_upload`: Pass ServerHost, not Host which may be `"upload.HOST"`
|
||||
- `mod_http_upload`: Amend the fix for #4450 to support IDNA correctly ([#3519](https://github.com/processone/ejabberd/issues/3519))
|
||||
- `mod_http_fileserver`: Support map of paths in `docroot` option
|
||||
- `mod_conversejs`: Add new Conversejs Paths and ContentTypes ([#4511](https://github.com/processone/ejabberd/issues/4511))
|
||||
- `mod_conversejs`: Use ContentType functions from `mod_http_fileserver` ([#4511](https://github.com/processone/ejabberd/issues/4511))
|
||||
- Use `/websocket` URL in default configuration like `mod_conversejs`, it's more meaningful
|
||||
|
||||
#### Core and Modules
|
||||
|
||||
- Add `replaced_connection_timeout` toplevel option
|
||||
- Fix nasty SSL warnings ([#4475](https://github.com/processon4475e/ejabberd/issues/))
|
||||
- `ejabberd_commands`: Show meaningul error message when problem executing command ([#4506](https://github.com/processone/ejabberd/issues/4506))
|
||||
- `ejabberd_logger`: Append "color clean" only in console template, not file
|
||||
- `ejabberd_oauth`: Log error if `oauth_list_tokens` executed with unsupported DB ([#4506](https://github.com/processone/ejabberd/issues/4506))
|
||||
- `misc`: Get back functions and mark them as deprecated
|
||||
- `mod_adhoc_api`: Show nice command name, as WebAdmin already does
|
||||
- `mod_pubsub`: Deliver pubsub notifications to remote servers for nodes with presence based delivery
|
||||
- `mod_scram_update`: Don't hard-code iteration count
|
||||
- Bump many XEPs versions that are already supported
|
||||
- Improve documentation of `install_contrib_modules` ([#4487](https://github.com/processone/ejabberd/issues/4487))
|
||||
|
||||
## Version 25.10
|
||||
|
||||
#### Ad-hoc Commands
|
||||
|
||||
- `mod_configure`: New ad-hoc commands that were missing from XEP-0133
|
||||
- `mod_adhoc_api`: Add support for asynchronous command calling
|
||||
- `mod_adhoc_api`: If argument is a list of jids, type is `jid-multi`
|
||||
- `mod_adhoc_api`: If field has several values, type is `text-multi`
|
||||
|
||||
#### API Commands
|
||||
|
||||
- Add commands argument type `binary_or_list`
|
||||
- `mod_http_api`: Format sub elements for tuples from maps
|
||||
- `mod_admin_extra`: Improve roster API commands documentation
|
||||
- `mod_announce`: New API commands, reusing existing ad-hoc functions
|
||||
- `ejabberd_admin`: New API command `restart_kindly`, improve `stop_kindly`
|
||||
- `mod_admin_extra`: New API commands `list_banned` and `count_banned`
|
||||
- `mod_admin_extra`: Improve API command `status_list`: support for status to be a list
|
||||
- `mod_muc_admin`: New API commands `muc_get_registered_nick` and nicks ([#4468](https://github.com/processone/ejabberd/issues/4468))
|
||||
- Use `mod_private:del_data` in `unban_account` API command
|
||||
|
||||
#### Configuration
|
||||
|
||||
- Rename `New` SQL schema to `Multihost`, and `Default` to `Singlehost` ([#4456](https://github.com/processone/ejabberd/issues/4456))
|
||||
- Add config transformer from `use_new_schema` -> `sql_multihost_schema`
|
||||
- `mod_sip`: Fix problem parsing `via` in `yconf` library ([#4444](https://github.com/processone/ejabberd/issues/4444))
|
||||
|
||||
#### Erlang/OTP support
|
||||
|
||||
- Enable feature `maybe_expr` in the compiler for Erlang/OTP 26 ([#4459](https://github.com/processone/ejabberd/issues/4459))
|
||||
- Enable feature `maybe_expr` also in the runtime for Erlang/OTP 25
|
||||
- Runtime: Remove Erlang 24 which won't work anymore with `maybe_expr`
|
||||
- Remove `EX_RULE` and `EX_STACK` macros only used with ancient erlang
|
||||
|
||||
#### GitHub Workflows
|
||||
|
||||
- CI: Bump XMPP-Interop-Testing/xmpp-interop-tests-action ([#4469](https://github.com/processone/ejabberd/issues/4469))
|
||||
- CI: Don't care to include commit details in the CT logs HTML page
|
||||
- CI and Runtime: Reorganize steps to run in parallel, and ARM runner ([#4460](https://github.com/processone/ejabberd/issues/4460))
|
||||
- Add local composite actions to manage ejabberd and databases
|
||||
- Container: Build ARM in native runner instead of QEMU, merge and clean
|
||||
- Installers: Generate ARM installers in native runner
|
||||
- Tests: Run agnostic-database tests only once, not for every backend
|
||||
- Tests: The odbc backend is not actually used in Commont Tests
|
||||
- Weekly: New workflow that condenses CI, test all erlang without caching
|
||||
|
||||
#### Installers and Container
|
||||
|
||||
- Bump Erlang/OTP version to 27.3.4.3 in installers and container
|
||||
- Bump Expat 2.7.3, OpenSSL 3.5.4, unixODBC 2.3.14 in installers
|
||||
|
||||
#### MUC
|
||||
|
||||
- `mod_mam`: New option `archive_muc_as_mucsub`
|
||||
- `mod_muc`: Check if room is hibernated before calling mod_muc process
|
||||
- `mod_muc`: Update implementation of XEP-0317 Hats to version 0.3.1 ([#4380](https://github.com/processone/ejabberd/issues/4380))
|
||||
- `mod_muc`: Make mod_muc_sql properly handle new hats data ([#4380](https://github.com/processone/ejabberd/issues/4380))
|
||||
- `mod_muc_room`: Don't require password if user is owner of room
|
||||
- `mod_muc_admin`: Use in WebAdmin the new API commands that get nick registers
|
||||
|
||||
#### Core and Modules
|
||||
|
||||
- `ejabberd_http_ws`: Pass HTTP headers from WS to C2S connection ([#4471](https://github.com/processone/ejabberd/issues/4471))
|
||||
- `ejabberd_listener`: Properly pass `send_timeout` option to listener sockets
|
||||
- `ejabberdctl`: When ping returns pang, return also status code 1 ([#4327](https://github.com/processone/ejabberd/issues/4327))
|
||||
- `ext_mod`: Print module status message after installation
|
||||
- `misc`: json_encode should always call json with our filter
|
||||
- `mod_admin_update_sql`: Use same index name than when creating database
|
||||
- `mod_block_strangers`: Clarify `access` and `captcha` documentation ([#4221](https://github.com/processone/ejabberd/issues/4221))
|
||||
- `mod_http_upload`: Encode URL before parsing, as done before `bba1a1e3c` ([#4450](https://github.com/processone/ejabberd/issues/4450))
|
||||
- `mod_private`: Add `del_data/3`, `get_users_with_data/2`, `count_users_with_data/2`
|
||||
- `mod_pubsub`: Don't catch `exit:{aborted, _}` inside mnesia transactions
|
||||
- `mod_push`: Run new hook `push_send_notification` ([#4383](https://github.com/processone/ejabberd/issues/4383))
|
||||
- WebAdmin: Respect newline and whitespace characters in results
|
||||
|
||||
## Version 25.08
|
||||
|
||||
#### API Commands
|
||||
|
||||
- `ban_account`: Run `sm_kick_user` event when kicking account ([#4415](https://github.com/processone/ejabberd/issues/4415))
|
||||
- `ban_account`: No need to change password ([#4415](https://github.com/processone/ejabberd/issues/4415))
|
||||
- `mnesia_change`: New command in `ejabberdctl` script that helps changing the mnesia node name
|
||||
|
||||
#### Configuration
|
||||
|
||||
- Rename `auth_password_types_hidden_in_scram1` option to `auth_password_types_hidden_in_sasl1`
|
||||
- `econf`: If a host in configuration is encoded IDNA, decode it ([#3519](https://github.com/processone/ejabberd/issues/3519))
|
||||
- `ejabberd_config`: New predefined keyword `HOST_URL_ENCODE`
|
||||
- `ejabberd.yml.example`: Use `HOST_URL_ENCODE` to handle case when vhost is non-latin1
|
||||
- `mod_conversejs`: Add option `conversejs_plugins` ([#4413](https://github.com/processone/ejabberd/issues/4413))
|
||||
- `mod_matrix_gw`: Add `leave_timeout` option ([#4386](https://github.com/processone/ejabberd/issues/4386))
|
||||
|
||||
#### Documentation and Tests
|
||||
|
||||
- `COMPILE.md`: Mention dependencies and add link to Docs ([#4431](https://github.com/processone/ejabberd/issues/4431))
|
||||
- `ejabberd_doc`: Document commands tags for modules
|
||||
- CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action ([#4425](https://github.com/processone/ejabberd/issues/4425))
|
||||
- Runtime: Raise the minimum Erlang tested to Erlang/OTP 24
|
||||
|
||||
#### Installers and Container
|
||||
|
||||
- Bump Erlang/OTP version to 27.3.4.2
|
||||
- Bump OpenSSL version to 3.5.2
|
||||
- `make-binaries`: Disable Linux-PAM's `logind` support
|
||||
|
||||
#### Core and Modules
|
||||
|
||||
- Bump `p1_acme` to fix `'AttributePKCS-10'` and OTP 28 ([processone/p1_acme#4](https://github.com/processone/p1_acme/issues/4))
|
||||
- Prevent loops in `xml_compress:decode` with corrupted data
|
||||
- `ejabberd_auth_mnesia`: Fix issue with filtering duplicates in `get_users()`
|
||||
- `ejabberd_listener`: Add secret in temporary unix domain socket path ([#4422](https://github.com/processone/ejabberd/issues/4422))
|
||||
- `ejabberd_listener`: Log error when cannot set definitive unix socket ([#4422](https://github.com/processone/ejabberd/issues/4422))
|
||||
- `ejabberd_listener`: Try to create provisional socket in final directory ([#4422](https://github.com/processone/ejabberd/issues/4422))
|
||||
- `ejabberd_logger`: Print log lines colorized in console when using rebar3
|
||||
- `mod_conversejs`: Ensure assets_path ends in `/` as required by Converse ([#4414](https://github.com/processone/ejabberd/issues/4414))
|
||||
- `mod_conversejs`: Ensure plugins URL is separated with `/` ([#4413](https://github.com/processone/ejabberd/issues/4413))
|
||||
- `mod_http_upload`: Encode URLs into IDNA when showing to XMPP client ([#3519](https://github.com/processone/ejabberd/issues/3519))
|
||||
- `mod_matrix_gw`: Add support for null values in `is_canonical_json` ([#4421](https://github.com/processone/ejabberd/issues/4421))
|
||||
- `mod_matrix_gw`: Don't send empty direct Matrix messages ([#4420](https://github.com/processone/ejabberd/issues/4420))
|
||||
- `mod_matrix_gw`: Matrix gateway updates
|
||||
- `mod_muc`: Report db failures when restoring rooms
|
||||
- `mod_muc`: Unsubscribe users from members-only rooms when expelled ([#4412](https://github.com/processone/ejabberd/issues/4412))
|
||||
- `mod_providers`: New module to serve easily XMPP Providers files
|
||||
- `mod_register`: Don't duplicate welcome subject and message
|
||||
- `mod_scram_upgrade`: Fix format of passwords updates
|
||||
- `mod_scram_upgrade`: Only offer upgrades to methods that aren't already stored
|
||||
|
||||
## Version 25.07
|
||||
|
||||
#### Security fix
|
||||
|
||||
- `ext_mod`: Add temporary workaround for zip including absolute path
|
||||
|
||||
#### Compilation
|
||||
|
||||
- Raise the minimum Elixir tested version to 1.14.0 ([#4281](https://github.com/processone/ejabberd/issues/4281))
|
||||
- Raise Erlang/OTP minimum requirement to 25.0 ([#4281](https://github.com/processone/ejabberd/issues/4281))
|
||||
- `configure.ac`: Allow to specify minimal erlang version using `--with-min-erlang`
|
||||
- `Makefile.in`: Add target `test-<group>`
|
||||
- `rebar3-format.sh`: Replace csplit with perl
|
||||
- Container: Bump Erlang/OTP 27.3.4.1, Elixir 1.18.4
|
||||
- Installers: Bump Erlang/OTP 27.3.4.1, Elixir 1.18.4, libexpat 2.7.1, OpenSSL 3.5.1
|
||||
|
||||
#### Configuration and Tests
|
||||
|
||||
- Add `rest_proxy*` options to configure proxy used by rest module
|
||||
- `ejabberd_c2s`: Add `auth_password_types_hidden_in_scram1` option
|
||||
- `ejabberd_http`: Remove unused `default_host` option and state element
|
||||
- `ejabberd_http`: New option `hosts_alias` and function `resolve_host_alias/1` ([#4400](https://github.com/processone/ejabberd/issues/4400))
|
||||
- New predefined keywords: `CONFIG_PATH` and `LOG_PATH`
|
||||
- Fix macro used in string options when defined in env var
|
||||
- Use auxiliary function to get `$HOME`, use Mnesia directory when not set ([#4402](https://github.com/processone/ejabberd/issues/4402))
|
||||
- `ejabberd_config`: Better `lists:uniq` substitute
|
||||
- Tests: update readme and compose to work with current sw versions
|
||||
- Update Elvis to 4.1.1, fix some warnings and enable their tests
|
||||
|
||||
#### Erlang/OTP 28 support
|
||||
|
||||
- Add workaround in `p1_acme` for Jose 1.11.10 not supporting OTP 28 `ecPrivkeyVer1` ([#4393](https://github.com/processone/ejabberd/issues/4393))
|
||||
- Bump `fast_xml` and `xmpp` for improved Erlang/OTP 28 support
|
||||
- Bump `xmpp` and `p1_acme` patched with Erlang/OTP 28 support
|
||||
- Fix `make options` in Erlang/OTP 28 ([#4352](https://github.com/processone/ejabberd/issues/4352))
|
||||
- Fix crash in `rebar3 cover` with Erlang/OTP 28 ([#4353](https://github.com/processone/ejabberd/issues/4353))
|
||||
- Rebar/Rebar3: Update binaries to work with Erlang/OTP 25-28 ([#4354](https://github.com/processone/ejabberd/issues/4354))
|
||||
- CI and Runtime: Add Erlang/OTP 28 to the versions matrix
|
||||
|
||||
#### SQL
|
||||
|
||||
- Fix mnesia to sql exporter after changes to auth tables
|
||||
- Update code for switching to new schema type to users table changes
|
||||
- Add mssql specific implementation of `delete_old_mam_messages`
|
||||
- Make `delete_old_mam_messages_batch` work with sqlite
|
||||
- `ejabberd_sm_sql`: Use misc:encode_pid/1
|
||||
- `mysql.sql`: Fix typo in commit 7862c6a when creating users table
|
||||
- `pg.sql`: Fix missing comma in postgres schema ([#4409](https://github.com/processone/ejabberd/issues/4409))
|
||||
|
||||
#### Core and Modules
|
||||
|
||||
- `ejabberd_s2s_in`: Allow S2S connections to accept client certificates that have only server purpose ([#4392](https://github.com/processone/ejabberd/issues/4392))
|
||||
- `ext_mod`: Recommend to write README.md instead txt (processone/ejabberd-contrib#363)
|
||||
- `ext_mod`: Support library path installed from Debian (processone/ejabberd-contrib#363)
|
||||
- `ext_mod`: When upgrading module, clean also the compiled directories
|
||||
- `gen_mod`: Add support to prepare module stopping before actually stopping any module
|
||||
- `mod_antispam`: Imported from ejabberd-contrib and improved ([#4373](https://github.com/processone/ejabberd/issues/4373))
|
||||
- `mod_auth_fast`: Clear tokens on kick, change pass and unregister ([#4397](https://github.com/processone/ejabberd/issues/4397))([#4398](https://github.com/processone/ejabberd/issues/4398))([#4399](https://github.com/processone/ejabberd/issues/4399))
|
||||
- `mod_conversejs`: Add link in WebAdmin to local Converse if configured
|
||||
- `mod_mam`: Present mam full text search in xep-431 compatible way
|
||||
- `mod_mam_mnesia`: Handle objects that don't need conversion in `transform/0`
|
||||
- `mod_matrix_gw`: Don't send empty messages in Matrix rooms ([#4385](https://github.com/processone/ejabberd/issues/4385))
|
||||
- `mod_matrix_gw`: Support older Matrix rooms versions starting from version 4
|
||||
- `mod_matrix_gw`: When encoding JSON, handle term that is key-value list ([#4379](https://github.com/processone/ejabberd/issues/4379))
|
||||
- `mod_matrix_gw_s2s`: Fix key validation in `check_signature`
|
||||
- `mod_mix` and `mod_muc_rtbl`: Support list of IDs in `pubsub-items-retract` (processone/xmpp#100)
|
||||
- `mod_pubsub_serverinfo`: Imported module from ejabberd-contrib ([#4408](https://github.com/processone/ejabberd/issues/4408))
|
||||
- `mod_register`: Normalize username when determining if user want to change pass
|
||||
- `mod_register`: Strip query data when returning errors
|
||||
- WebAdmin: New hooks `webadmin_menu_system` to add items to system menu
|
||||
|
||||
## Version 25.04
|
||||
|
||||
#### Security fixes
|
||||
- Fixes issue with handling of user provided occupant-id in messages and presences sent to muc room. Server was replacing
|
||||
just first instance of occupant-id with its own version, leaving other ones untouched. That would mean that depending
|
||||
on order in which clients send occupant-id, they could see value provided by sender, and that could be used to spoof
|
||||
as different sender.
|
||||
|
||||
#### Commands API
|
||||
- `kick_users`: New command to kick all logged users for a given host
|
||||
|
||||
#### Bugfixes
|
||||
- Fix issue with sql schema auto upgrade when using `sqlite` database
|
||||
- Fix problem with container update, that could ignore previous data stored in `mnesia` database
|
||||
- Revert limit of allowed characters in shared roster group names, that will again allow using symbols like `:`
|
||||
|
||||
## Version 25.03
|
||||
|
||||
#### Commands API
|
||||
|
||||
@@ -19,7 +19,7 @@ To compile ejabberd you need:
|
||||
- GCC
|
||||
- Libexpat ≥ 1.95
|
||||
- Libyaml ≥ 0.1.4
|
||||
- Erlang/OTP ≥ 20.0
|
||||
- Erlang/OTP ≥ 25.0
|
||||
- OpenSSL ≥ 1.0.0
|
||||
|
||||
Other optional libraries are:
|
||||
@@ -28,8 +28,7 @@ Other optional libraries are:
|
||||
- PAM library, for Pluggable Authentication Modules (PAM)
|
||||
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
|
||||
challenges
|
||||
- Elixir ≥ 1.10.3, for Elixir support. It is recommended Elixir 1.13.4 or higher
|
||||
and Erlang/OTP 23.0 or higher.
|
||||
- Elixir ≥ 1.14.0, for Elixir support
|
||||
|
||||
If your system splits packages in libraries and development headers,
|
||||
install the development packages too.
|
||||
@@ -66,6 +65,11 @@ To configure the compilation, features, install paths...
|
||||
|
||||
./configure --help
|
||||
|
||||
The build tool automatically downloads and compiles the
|
||||
erlang libraries that [ejabberd depends on][docs-repo].
|
||||
|
||||
[docs-repo]: https://docs.ejabberd.im/developer/repositories/
|
||||
|
||||
|
||||
Install in the System
|
||||
---------------------
|
||||
|
||||
@@ -105,7 +105,7 @@ Next steps
|
||||
|
||||
### Register admin account
|
||||
|
||||
#### [](https://github.com/processone/ejabberd/pkgs/container/ejabberd) [:orange_circle:](#images-comparison)
|
||||
#### [](https://github.com/processone/ejabberd/pkgs/container/ejabberd) [🔅](#images-comparison)
|
||||
|
||||
If you set the `REGISTER_ADMIN_PASSWORD` environment variable,
|
||||
an account is automatically registered with that password,
|
||||
@@ -118,10 +118,19 @@ The account created depends on what variables you have set:
|
||||
|
||||
The account registration is shown in the container log:
|
||||
|
||||
```bash
|
||||
$ podman run -it \
|
||||
--env EJABBERD_MACRO_HOST=example.org \
|
||||
--env EJABBERD_MACRO_ADMIN=juliet@example.org \
|
||||
--env REGISTER_ADMIN_PASSWORD=somePassw0rd \
|
||||
ghcr.io/processone/ejabberd
|
||||
|
||||
:> ejabberdctl register juliet example.org somePassw0rd
|
||||
User juliet@example.org successfully registered
|
||||
```
|
||||
:> ejabberdctl register admin example.org somePassw0rd
|
||||
User admin@example.org successfully registered
|
||||
```
|
||||
|
||||
This is implemented internally by using
|
||||
[Commands on start](#commands-on-start).
|
||||
|
||||
Alternatively, you can register the account manually yourself
|
||||
and edit `conf/ejabberd.yml` and add the ACL as explained in
|
||||
@@ -207,20 +216,21 @@ documentation section.
|
||||
Advanced
|
||||
--------
|
||||
|
||||
### Ports
|
||||
|
||||
### Ports 🟠
|
||||
The container image exposes several ports
|
||||
(check also [Docs: Firewall Settings](https://docs.ejabberd.im/admin/guide/security/#firewall-settings)):
|
||||
|
||||
- `5222`: The default port for XMPP clients.
|
||||
- `5269`: For XMPP federation. Only needed if you want to communicate with users on other servers.
|
||||
- `5280`: For admin interface (URL is `admin/`).
|
||||
- `1880`: For admin interface (URL is `/`, useful for [podman-desktop](https://podman-desktop.io/) and [docker-desktop](https://www.docker.com/products/docker-desktop/)) [:orange_circle:](#images-comparison)
|
||||
- `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH.
|
||||
- `1880`: For admin interface (URL is `/`, useful for [podman-desktop](https://podman-desktop.io/) and [docker-desktop](https://www.docker.com/products/docker-desktop/)) [🔅](#images-comparison)
|
||||
- `1883`: Used for MQTT
|
||||
- `5478` UDP: STUN service 🟠
|
||||
- `50000-50099` UDP: TURN service 🟠
|
||||
- `7777`: SOCKS5 file transfer proxy 🟠
|
||||
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD [🔅](#images-comparison)
|
||||
- `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering
|
||||
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD [:orange_circle:](#images-comparison)
|
||||
|
||||
|
||||
### Volumes
|
||||
|
||||
@@ -266,20 +276,58 @@ and reads `CTL_ON_START` every time the container is started.
|
||||
Those variables can contain one ejabberdctl command,
|
||||
or several commands separated with the blankspace and `;` characters.
|
||||
|
||||
By default failure of any of commands executed that way would
|
||||
abort start, this can be disabled by prefixing commands with `!`
|
||||
If any of those commands returns a failure, the container starting gets aborted.
|
||||
If there is a command with a result that can be ignored,
|
||||
prefix that command with `!`
|
||||
|
||||
Example usage (or check the [full example](#customized-example)):
|
||||
All this works when starting ejabberd with the default method `foreground`,
|
||||
not when using `live`, `iexlive`, ...
|
||||
|
||||
This example registers an `admin@localhost` account when the container is first created.
|
||||
Everytime the container starts, it shows the list of registered accounts,
|
||||
checks that the admin account exists and password is valid,
|
||||
changes the password of an account if it exists (ignoring any failure),
|
||||
and shows the ejabberd starts (check also the [full example](#customized-example)):
|
||||
```yaml
|
||||
environment:
|
||||
- CTL_ON_CREATE=! register admin localhost asd
|
||||
- CTL_ON_CREATE=register admin localhost asd
|
||||
- CTL_ON_START=stats registeredusers ;
|
||||
check_password admin localhost asd ;
|
||||
! change_password bot123 localhost qqq ;
|
||||
status
|
||||
```
|
||||
|
||||
Same example using Podman:
|
||||
```bash
|
||||
$ podman run -it \
|
||||
--env CTL_ON_CREATE="register admin localhost asd" \
|
||||
--env CTL_ON_START="stats registeredusers ; \
|
||||
check_password admin localhost asd ; \
|
||||
! change_password bot123 localhost qqq ; \
|
||||
status" \
|
||||
ghcr.io/processone/ejabberd
|
||||
|
||||
### Macros in environment [:high_brightness:](#images-comparison)
|
||||
...
|
||||
|
||||
:> ejabberdctl register admin localhost asd
|
||||
User admin@localhost successfully registered
|
||||
|
||||
:> ejabberdctl stats registeredusers
|
||||
1
|
||||
|
||||
:> ejabberdctl check_password admin localhost asd
|
||||
|
||||
:> ejabberdctl change_password bot123 localhost qqq
|
||||
{not_found,"unknown_user"}
|
||||
:> FAILURE in command 'change_password bot123 localhost qqq' !!! Ignoring result
|
||||
|
||||
:> ejabberdctl status
|
||||
The node ejabberd@localhost is started. Status: started
|
||||
ejabberd 25.10.0 is running in that node
|
||||
```
|
||||
|
||||
|
||||
### Macros in environment
|
||||
|
||||
ejabberd reads `EJABBERD_MACRO_*` environment variables
|
||||
and uses them to define the corresponding
|
||||
@@ -304,6 +352,152 @@ now you can define the admin account JID using an environment variable:
|
||||
Check the [full example](#customized-example) for other example.
|
||||
|
||||
|
||||
### ejabberd-contrib
|
||||
|
||||
This section addresses those topics related to
|
||||
[ejabberd-contrib](https://docs.ejabberd.im/admin/guide/modules/#ejabberd-contrib):
|
||||
|
||||
- [Download source code](#download-source-code)
|
||||
- [Install a module](#install-a-module)
|
||||
- [Install git for dependencies](#install-git-for-dependencies)
|
||||
- [Install your module](#install-your-module)
|
||||
|
||||
---
|
||||
|
||||
#### Download source code
|
||||
|
||||
The `ejabberd` container image includes the ejabberd-contrib git repository source code,
|
||||
but `ecs` does not, so first download it:
|
||||
```bash
|
||||
$ docker exec ejabberd ejabberdctl modules_update_specs
|
||||
```
|
||||
|
||||
#### Install a module
|
||||
|
||||
Compile and install any of the contributed modules, for example:
|
||||
```bash
|
||||
docker exec ejabberd ejabberdctl module_install mod_statsdx
|
||||
|
||||
Module mod_statsdx has been installed and started.
|
||||
It's configured in the file:
|
||||
/opt/ejabberd/.ejabberd-modules/mod_statsdx/conf/mod_statsdx.yml
|
||||
Configure the module in that file, or remove it
|
||||
and configure in your main ejabberd.yml
|
||||
```
|
||||
|
||||
#### Install git for dependencies
|
||||
|
||||
Some modules depend on erlang libraries,
|
||||
but the container images do not include `git` or `mix` to download them.
|
||||
Consequently, when you attempt to install such a module,
|
||||
there will be error messages like:
|
||||
|
||||
```bash
|
||||
docker exec ejabberd ejabberdctl module_install ejabberd_observer_cli
|
||||
|
||||
I'll download "recon" using git because I can't use Mix to fetch from hex.pm:
|
||||
/bin/sh: mix: not found
|
||||
Fetching dependency observer_cli:
|
||||
/bin/sh: git: not found
|
||||
...
|
||||
```
|
||||
|
||||
the solution is to install `git` in the container image:
|
||||
|
||||
```bash
|
||||
docker exec --user root ejabberd apk add git
|
||||
|
||||
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
|
||||
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
|
||||
(1/3) Installing pcre2 (10.43-r0)
|
||||
(2/3) Installing git (2.47.2-r0)
|
||||
(3/3) Installing git-init-template (2.47.2-r0)
|
||||
Executing busybox-1.37.0-r12.trigger
|
||||
OK: 27 MiB in 42 packages
|
||||
```
|
||||
|
||||
and now you can upgrade the module:
|
||||
|
||||
```bash
|
||||
docker exec ejabberd ejabberdctl module_upgrade ejabberd_observer_cli
|
||||
|
||||
I'll download "recon" using git because I can't use Mix to fetch from hex.pm:
|
||||
/bin/sh: mix: not found
|
||||
Fetching dependency observer_cli: Cloning into 'observer_cli'...
|
||||
Fetching dependency os_stats: Cloning into 'os_stats'...
|
||||
Fetching dependency recon: Cloning into 'recon'...
|
||||
Inlining: inline_size=24 inline_effort=150
|
||||
Old inliner: threshold=0 functions=[{insert,2},{merge,2}]
|
||||
Module ejabberd_observer_cli has been installed.
|
||||
Now you can configure it in your ejabberd.yml
|
||||
I'll download "recon" using git because I can't use Mix to fetch from hex.pm:
|
||||
/bin/sh: mix: not found
|
||||
```
|
||||
|
||||
#### Install your module
|
||||
|
||||
If you [developed an ejabberd module](https://docs.ejabberd.im/developer/extending-ejabberd/modules/),
|
||||
you can install it in your container image:
|
||||
|
||||
1. Create a local directory for `ejabberd-modules`:
|
||||
|
||||
``` sh
|
||||
mkdir docker-modules
|
||||
```
|
||||
|
||||
2. Then create the directory structure for your custom module:
|
||||
|
||||
``` sh
|
||||
cd docker-modules
|
||||
|
||||
mkdir -p sources/mod_hello_world/
|
||||
touch sources/mod_hello_world/mod_hello_world.spec
|
||||
|
||||
mkdir sources/mod_hello_world/src/
|
||||
mv mod_hello_world.erl sources/mod_hello_world/src/
|
||||
|
||||
mkdir sources/mod_hello_world/conf/
|
||||
echo -e "modules:\n mod_hello_world: {}" > sources/mod_hello_world/conf/mod_hello_world.yml
|
||||
|
||||
cd ..
|
||||
```
|
||||
|
||||
3. Grant ownership of that directory to the UID that ejabberd will use inside the Docker image:
|
||||
|
||||
``` sh
|
||||
sudo chown 9000 -R docker-modules/
|
||||
```
|
||||
|
||||
4. Start ejabberd in the container:
|
||||
|
||||
``` sh
|
||||
sudo docker run \
|
||||
--name hellotest \
|
||||
-d \
|
||||
--volume "$(pwd)/docker-modules:/home/ejabberd/.ejabberd-modules/" \
|
||||
-p 5222:5222 \
|
||||
-p 5280:5280 \
|
||||
ejabberd/ecs
|
||||
```
|
||||
|
||||
5. Check the module is available for installing, and then install it:
|
||||
|
||||
``` sh
|
||||
sudo docker exec -it hellotest ejabberdctl modules_available
|
||||
mod_hello_world []
|
||||
|
||||
sudo docker exec -it hellotest ejabberdctl module_install mod_hello_world
|
||||
```
|
||||
|
||||
6. If the module works correctly, you will see `Hello` in the ejabberd logs when it starts:
|
||||
|
||||
``` sh
|
||||
sudo docker exec -it hellotest grep Hello logs/ejabberd.log
|
||||
2020-10-06 13:40:13.154335+00:00 [info]
|
||||
<0.492.0>@mod_hello_world:start/2:15 Hello, ejabberd world!
|
||||
```
|
||||
|
||||
|
||||
### ejabberdapi
|
||||
|
||||
When the container is running (and thus ejabberd), you can exec commands inside the container
|
||||
@@ -412,12 +606,12 @@ it is necessary to change the old hostname stored in Mnesia.
|
||||
This section is equivalent to the ejabberd Documentation
|
||||
[Change Computer Hostname](https://docs.ejabberd.im/admin/guide/managing/#change-computer-hostname),
|
||||
but particularized to containers that use this
|
||||
ecs container image from ejabberd 23.01 or older.
|
||||
`ecs` container image from ejabberd 23.01 or older.
|
||||
|
||||
#### Setup Old Container
|
||||
|
||||
Let's assume a container running ejabberd 23.01 (or older) from
|
||||
this ecs container image, with the database directory binded
|
||||
this `ecs` container image, with the database directory binded
|
||||
and one registered account.
|
||||
This can be produced with:
|
||||
```bash
|
||||
@@ -569,11 +763,10 @@ docker buildx build \
|
||||
|
||||
#### Podman build
|
||||
|
||||
To build the image using Podman, please notice:
|
||||
Some minor remarks:
|
||||
|
||||
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
|
||||
- It mentions that `healthcheck` is not supported by the Open Container Initiative image format
|
||||
- to start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
|
||||
- When building, it mentions that `healthcheck` is not supported by the Open Container Initiative image format
|
||||
- To start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
|
||||
|
||||
```bash
|
||||
podman build \
|
||||
@@ -909,10 +1102,10 @@ Images Comparison
|
||||
|
||||
Let's summarize the differences between both container images. Legend:
|
||||
|
||||
- :sparkle: is the recommended alternative
|
||||
- :orange_circle: added in the latest release (ejabberd 25.03)
|
||||
- :high_brightness: added in the previous release (ejabberd 24.12)
|
||||
- :low_brightness: added in the pre-previous release (ejabberd 24.10)
|
||||
- ❇️: is the recommended alternative
|
||||
- 🟠: changed in ejabberd 26.01
|
||||
- 🔆: changed in ...
|
||||
- 🔅: changed in ejabberd 25.03
|
||||
|
||||
| | [](https://github.com/processone/ejabberd/pkgs/container/ejabberd) | [](https://hub.docker.com/r/ejabberd/ecs/) |
|
||||
|:----------------------|:------------------|:-----------------------|
|
||||
@@ -920,24 +1113,24 @@ Let's summarize the differences between both container images. Legend:
|
||||
| Generated by | [container.yml](https://github.com/processone/ejabberd/blob/master/.github/workflows/container.yml) | [tests.yml](https://github.com/processone/docker-ejabberd/blob/master/.github/workflows/tests.yml) |
|
||||
| Built for | stable releases <br /> `master` branch | stable releases <br /> [`master` branch zip](https://github.com/processone/docker-ejabberd/actions/workflows/tests.yml) |
|
||||
| Architectures | `linux/amd64` <br /> `linux/arm64` | `linux/amd64` |
|
||||
| Software | Erlang/OTP 27.3-alpine <br /> Elixir 1.18.3 | Alpine 3.19 <br /> Erlang/OTP 26.2 <br /> Elixir 1.15.7 |
|
||||
| Software | Erlang/OTP 28.4.1.0-alpine 🟠 <br /> Elixir 1.19.5 🟠 | Alpine 3.22 <br /> Erlang/OTP 26.2 <br /> Elixir 1.18.3 |
|
||||
| Published in | [ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd) | [docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/) <br /> [ghcr.io/processone/ecs](https://github.com/processone/docker-ejabberd/pkgs/container/ecs) |
|
||||
| :black_square_button: **Additional content** |
|
||||
| [ejabberd-contrib](https://docs.ejabberd.im/admin/guide/modules/#ejabberd-contrib) | included | not included |
|
||||
| [ejabberdapi](#ejabberdapi) | included :orange_circle: | included |
|
||||
| [ejabberd-contrib](#ejabberd-contrib) | included | not included |
|
||||
| [ejabberdapi](#ejabberdapi) | included 🔅 | included |
|
||||
| :black_square_button: **Ports** |
|
||||
| [1880](#ports) for WebAdmin | yes :orange_circle: | yes :orange_circle: |
|
||||
| [5210](#ports) for `ERL_DIST_PORT` | supported | supported :orange_circle: |
|
||||
| [1880](#ports) for WebAdmin | yes 🔅 | yes 🔅 |
|
||||
| [5210](#ports) for `ERL_DIST_PORT` | supported | supported 🔅 |
|
||||
| :black_square_button: **Paths** |
|
||||
| `$HOME` | `/opt/ejabberd/` | `/home/ejabberd/` |
|
||||
| User data | `$HOME` :sparkle: <br /> `/home/ejabberd/` :orange_circle: | `$HOME` <br /> `/opt/ejabberd/` :sparkle: :low_brightness: |
|
||||
| `ejabberdctl` | `ejabberdctl` :sparkle: <br /> `bin/ejabberdctl` :orange_circle: | `bin/ejabberdctl` <br /> `ejabberdctl` :sparkle: :low_brightness: |
|
||||
| [`captcha.sh`](#captcha) | `$HOME/bin/captcha.sh` :orange_circle: | `$HOME/bin/captcha.sh` :orange_circle: |
|
||||
| `*.sql` files | `$HOME/sql/*.sql` :sparkle: :orange_circle: <br /> `$HOME/database/*.sql` :orange_circle: | `$HOME/database/*.sql` <br /> `$HOME/sql/*.sql` :sparkle: :orange_circle: |
|
||||
| Mnesia spool files | `$HOME/database/` :sparkle: <br /> `$HOME/database/NODENAME/` :orange_circle: | `$HOME/database/NODENAME/` <br /> `$HOME/database/` :sparkle: :orange_circle: |
|
||||
| User data | `$HOME` ❇️ <br /> `/home/ejabberd/` 🔅 | `$HOME` <br /> `/opt/ejabberd/` ❇️ |
|
||||
| `ejabberdctl` | `ejabberdctl` ❇️ <br /> `bin/ejabberdctl` 🔅 | `bin/ejabberdctl` <br /> `ejabberdctl` ❇️ |
|
||||
| [`captcha.sh`](#captcha) | `$HOME/bin/captcha.sh` 🔅 | `$HOME/bin/captcha.sh` 🔅 |
|
||||
| `*.sql` files | `$HOME/sql/*.sql` ❇️ 🔅 <br /> `$HOME/database/*.sql` 🔅 | `$HOME/database/*.sql` <br /> `$HOME/sql/*.sql` ❇️ 🔅 |
|
||||
| Mnesia spool files | `$HOME/database/` ❇️ <br /> `$HOME/database/NODENAME/` 🔅 | `$HOME/database/NODENAME/` <br /> `$HOME/database/` ❇️ 🔅 |
|
||||
| :black_square_button: **Variables** |
|
||||
| [`EJABBERD_MACRO_*`](#macros-in-environment) | supported :high_brightness: | supported :high_brightness: |
|
||||
| Macros used in `ejabberd.yml` | yes :orange_circle: | yes :orange_circle: |
|
||||
| [`EJABBERD_MACRO_ADMIN`](#register-admin-account) | Grant admin rights :orange_circle: <br /> (default `admin@localhost`) <br /> | Hardcoded `admin@localhost` |
|
||||
| [`REGISTER_ADMIN_PASSWORD`](#register-admin-account) | Register admin account :orange_circle: | unsupported |
|
||||
| `CTL_OVER_HTTP` | enabled :orange_circle: | unsupported |
|
||||
| [`EJABBERD_MACRO_*`](#macros-in-environment) | supported | supported |
|
||||
| Macros used in `ejabberd.yml` | yes 🔅 | yes 🔅 |
|
||||
| [`EJABBERD_MACRO_ADMIN`](#register-admin-account) | Grant admin rights 🔅 <br /> (default `admin@localhost`) <br /> | Hardcoded `admin@localhost` |
|
||||
| [`REGISTER_ADMIN_PASSWORD`](#register-admin-account) | Register admin account 🔅 | unsupported |
|
||||
| `CTL_OVER_HTTP` | enabled 🔅 | unsupported |
|
||||
|
||||
@@ -26,6 +26,7 @@ We would like to thanks official ejabberd source code contributors:
|
||||
- Sonny Scroggin
|
||||
- Alexey Shchepin
|
||||
- Shelley Shyan
|
||||
- Stefan Strigler
|
||||
- Radoslaw Szymczyszyn
|
||||
- Stu Tomlinson
|
||||
- Christian Ulrich
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
#' definitions
|
||||
#
|
||||
|
||||
# Only required for Erlang/OTP 25
|
||||
MAYBE=ERL_FLAGS="-enable-feature maybe_expr"
|
||||
|
||||
ESCRIPT = @ESCRIPT@
|
||||
REBAR = @rebar@ # rebar|rebar3|mix binary (or path to binary)
|
||||
REBAR = $(MAYBE) @rebar@ # rebar|rebar3|mix binary (or path to binary)
|
||||
REBAR3 = @REBAR3@ # path to rebar3 binary
|
||||
MIX = @rebar@
|
||||
AWK = @AWK@
|
||||
@@ -123,7 +126,7 @@ REBAR_VER_318:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print ($
|
||||
endif
|
||||
|
||||
ifeq "$(REBAR_VER)" "6"
|
||||
REBAR=$(MIX)
|
||||
REBAR=$(MAYBE) $(MIX)
|
||||
SKIPDEPS=
|
||||
LISTDEPS=deps.tree
|
||||
UPDATEDEPS=deps.update
|
||||
@@ -141,7 +144,8 @@ ifeq "$(REBAR_VER)" "6"
|
||||
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
|
||||
REBARREL=MIX_ENV=prod $(REBAR) release --overwrite
|
||||
REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite
|
||||
RELIVECMD=$(ESCRIPT) rel/relive.escript && MIX_ENV=dev RELIVE=true $(IEX) --name ejabberd@localhost -S mix run
|
||||
RELIVECMD=$(ESCRIPT) rel/relive.escript && MIX_ENV=dev RELIVE=true $(MAYBE) $(IEX) --name ejabberd@localhost -S mix run
|
||||
RELIVECTLCMD=$(ESCRIPT) rel/relive.escript ctl && _build/relivectl/ejabberdctl live
|
||||
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
|
||||
COPY_REL_TARGET = dev
|
||||
GET_DEPS_TRANSLATIONS=MIX_ENV=translations $(REBAR) $(GET_DEPS)
|
||||
@@ -173,6 +177,7 @@ endif
|
||||
REBARREL=$(REBAR) as prod tar
|
||||
REBARDEV=$(REBAR) as dev release
|
||||
RELIVECMD=$(REBAR) as dev relive
|
||||
RELIVECTLCMD=$(ESCRIPT) rel/relive.escript ctl && _build/relivectl/ejabberdctl live
|
||||
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
|
||||
COPY_REL_TARGET = dev
|
||||
GET_DEPS_TRANSLATIONS=$(REBAR) as translations $(GET_DEPS)
|
||||
@@ -190,9 +195,12 @@ else
|
||||
XREFOPTIONS=
|
||||
CLEANARG=
|
||||
REBARREL=$(REBAR) generate
|
||||
REBARDEV=
|
||||
REBARDEV=@echo "Rebar2 detected... dev not supported.\
|
||||
\nTry: make prod, or: ./configure --with-rebar=rebar3 ; make dev"
|
||||
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
|
||||
\nTry: ./configure --with-rebar=rebar3 ; make relive"
|
||||
\nTry: ./configure --with-rebar=rebar3 ; make relive"
|
||||
RELIVECTLCMD=@echo "Rebar2 detected... relivectl not supported.\
|
||||
\nTry: ./configure --with-rebar=rebar3 ; make relivectl"
|
||||
REL_LIB_DIR = rel/ejabberd/lib
|
||||
COPY_REL_TARGET = rel
|
||||
endif
|
||||
@@ -204,7 +212,7 @@ endif
|
||||
|
||||
all: scripts deps src
|
||||
|
||||
deps: $(DEPSDIR)/.got
|
||||
deps: $(DEPSDIR)/.got invites-deps
|
||||
|
||||
$(DEPSDIR)/.got:
|
||||
rm -rf $(DEPSDIR)/.got
|
||||
@@ -216,6 +224,19 @@ $(DEPSDIR)/.got:
|
||||
$(DEPSDIR)/.built: $(DEPSDIR)/.got
|
||||
$(REBAR) compile && :> $(DEPSDIR)/.built
|
||||
|
||||
ifeq (, $(shell which npm))
|
||||
INSTALL_INVITES_DEPS=tools/dl_invites_page_deps.sh priv/mod_invites/static
|
||||
else
|
||||
INSTALL_INVITES_DEPS=npm install
|
||||
endif
|
||||
|
||||
invites-deps: priv/mod_invites/static/bootstrap/ priv/mod_invites/static/jquery/
|
||||
|
||||
priv/mod_invites/static/bootstrap/:
|
||||
$(INSTALL_INVITES_DEPS)
|
||||
priv/mod_invites/static/jquery/:
|
||||
$(INSTALL_INVITES_DEPS)
|
||||
|
||||
src: $(DEPSDIR)/.built
|
||||
$(REBAR) $(SKIPDEPS) compile
|
||||
$(EXPLICIT_ELIXIR_COMPILE)
|
||||
@@ -226,13 +247,13 @@ update:
|
||||
$(REBAR) $(UPDATEDEPS) && :> $(DEPSDIR)/.got
|
||||
$(CONFIGURE_DEPS)
|
||||
|
||||
xref: all
|
||||
xref: src
|
||||
$(REBAR) $(SKIPDEPS) xref $(XREFOPTIONS)
|
||||
|
||||
hooks: all
|
||||
hooks: src
|
||||
tools/hook_deps.sh $(EBINDIR)
|
||||
|
||||
options: all
|
||||
options: src
|
||||
tools/opt_types.sh ejabberd_option $(EBINDIR)
|
||||
|
||||
translations:
|
||||
@@ -303,8 +324,9 @@ BINARIES=$(DEPSDIR)/epam/priv/bin/epam $(DEPSDIR)/eimp/priv/bin/eimp $(DEPSDIR)/
|
||||
DEPS_FILES_FILTERED=$(filter-out $(BINARIES) $(DEPSDIR)/elixir/ebin/elixir.app,$(DEPS_FILES))
|
||||
DEPS_DIRS=$(sort $(DEPSDIR)/ $(foreach DEP,$(DEPS),$(DEPSDIR)/$(DEP)/) $(dir $(DEPS_FILES)))
|
||||
|
||||
MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,$(EBINDIR)/*.beam $(EBINDIR)/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* include/*.hrl COPYING))
|
||||
MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua)
|
||||
MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,$(EBINDIR)/*.beam $(EBINDIR)/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* priv/mod_invites/* priv/mod_invites/static/* priv/mod_invites/static/bootstrap/css/bootstrap.min.css priv/mod_invites/static/bootstrap/js/bootstrap.min.js priv/mod_invites/static/jquery/jquery.min.js \
|
||||
priv/mod_invites/static/logos/* include/*.hrl COPYING))
|
||||
MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua priv/mod_invites)
|
||||
|
||||
define DEP_VERSION_template
|
||||
DEP_$(1)_VERSION:=$(shell $(SED) -e '/vsn/!d;s/.*, *"/$(1)-/;s/".*//' $(2) 2>/dev/null)
|
||||
@@ -392,28 +414,30 @@ relive:
|
||||
$(EXPLICIT_ELIXIR_COMPILE_DEV)
|
||||
$(RELIVECMD)
|
||||
|
||||
relivectl:
|
||||
$(EXPLICIT_ELIXIR_COMPILE_DEV)
|
||||
$(RELIVECTLCMD)
|
||||
|
||||
relivelibdir=$(shell pwd)/$(DEPSDIR)
|
||||
relivedir=$(shell pwd)/_build/relive
|
||||
CONFIG_DIR = ${relivedir}/conf
|
||||
SPOOL_DIR = ${relivedir}/database
|
||||
LOGS_DIR = ${relivedir}/logs
|
||||
relivebase=$(shell pwd)/$(DEPSBASE)
|
||||
|
||||
#.
|
||||
#' scripts
|
||||
#
|
||||
|
||||
ejabberdctl.relive:
|
||||
# Used for ejabberdctl.relive and ejabberdctl.relivectl
|
||||
ejabberdctl.re%:
|
||||
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
||||
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
|
||||
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
|
||||
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
|
||||
-e "s*{{config_dir}}*${relivebase}/re${*}/conf*g" \
|
||||
-e "s*{{logs_dir}}*${relivebase}/re${*}/logs*g" \
|
||||
-e "s*{{spool_dir}}*${relivebase}/re${*}/database*g" \
|
||||
-e "s*{{bindir}}*${BINDIR}*g" \
|
||||
-e "s*{{libdir}}*${relivelibdir}${ELIXIR_LIBDIR}*g" \
|
||||
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
||||
-e "s*{{iexpath}}*${IEX}*g" \
|
||||
-e "s*{{erl}}*${ERL}*g" \
|
||||
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
||||
> ejabberdctl.relive
|
||||
> ejabberdctl.re${*}
|
||||
|
||||
ejabberd.init:
|
||||
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
|
||||
@@ -543,6 +567,7 @@ clean:
|
||||
rm -rf test/*.beam
|
||||
rm -f rebar.lock
|
||||
rm -f ejabberdctl.example ejabberd.init ejabberd.service
|
||||
rm -rf priv/mod_invites/static/{jquery,bootstrap4}
|
||||
$(REBAR) clean $(CLEANARG)
|
||||
|
||||
clean-rel:
|
||||
@@ -661,7 +686,18 @@ test:
|
||||
@cd priv && ln -sf ../sql
|
||||
$(REBAR) $(SKIPDEPS) ct
|
||||
|
||||
test-eunit:
|
||||
.PHONY: test-%
|
||||
define test-group-target
|
||||
test-$1:
|
||||
$(REBAR) $(SKIPDEPS) ct --suite=test/ejabberd_SUITE --group=$1
|
||||
endef
|
||||
|
||||
ifneq ($(filter test-%,$(MAKECMDGOALS)),)
|
||||
group_to_test := $(patsubst test-%,%,$(filter test-%,$(MAKECMDGOALS)))
|
||||
$(eval $(call test-group-target,$(group_to_test)))
|
||||
endif
|
||||
|
||||
testeunit:
|
||||
$(REBAR) $(SKIPDEPS) eunit --verbose
|
||||
|
||||
#.
|
||||
@@ -669,7 +705,7 @@ test-eunit:
|
||||
#
|
||||
|
||||
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean prod rel \
|
||||
install uninstall uninstall-binary uninstall-all translations deps test test-eunit \
|
||||
install uninstall uninstall-binary uninstall-all translations deps test testeunit \
|
||||
all dev doap help install-rel relive scripts uninstall-rel update \
|
||||
erlang_plt deps_plt ejabberd_plt xref hooks options format indent
|
||||
|
||||
@@ -695,7 +731,8 @@ help:
|
||||
@echo ""
|
||||
@echo " prod Build a production release"
|
||||
@echo " dev Build a development release"
|
||||
@echo " relive Start a live ejabberd in _build/relive/"
|
||||
@echo " relive Start live using rebar3/mix tools"
|
||||
@echo " relivectl Start live using ejabberdctl script"
|
||||
@echo ""
|
||||
@echo " doap Generate DOAP file"
|
||||
@echo " edoc Generate EDoc documentation [mix]"
|
||||
@@ -710,7 +747,8 @@ help:
|
||||
@echo " elvis Run Elvis source code style reviewer [rebar3]"
|
||||
@echo " hooks Run hooks validator"
|
||||
@echo " test Run Common Tests suite [rebar3]"
|
||||
@echo " test-eunit Run EUnit suite [rebar3]"
|
||||
@echo " testeunit Run EUnit suite [rebar3]"
|
||||
@echo " test-<group> Run Common Test suite for specific group only [rebar3]"
|
||||
@echo " xref Run cross reference analysis [rebar3]"
|
||||
|
||||
#.
|
||||
|
||||
@@ -2,8 +2,17 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 25.03` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||
REQUIRE_ERLANG_MIN="9.0.5 (Erlang/OTP 20.0)"
|
||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 26.03` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||
|
||||
AC_ARG_WITH(min-erlang,
|
||||
AS_HELP_STRING([--with-min-erlang=version],[set minimal required erlang version, default to OTP25]),
|
||||
[if test "X$withval" = "X"; then
|
||||
REQUIRE_ERLANG_MIN="13.0 (Erlang/OTP 25.0)"
|
||||
else
|
||||
REQUIRE_ERLANG_MIN="$withval"
|
||||
fi
|
||||
], [REQUIRE_ERLANG_MIN="13.0 (Erlang/OTP 25.0)"])
|
||||
|
||||
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
@@ -183,12 +192,20 @@ AC_ARG_ENABLE(mysql,
|
||||
esac],[if test "x$mysql" = "x"; then mysql=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(new_sql_schema,
|
||||
[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema by default (default: no)])],
|
||||
[AS_HELP_STRING([--enable-new-sql-schema],[obsolete, use --enable-multihost-sql-schema instead (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) new_sql_schema=true ;;
|
||||
no) new_sql_schema=false ;;
|
||||
yes) multihost_sql_schema=true ;;
|
||||
no) multihost_sql_schema=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-new-sql-schema) ;;
|
||||
esac],[new_sql_schema=false])
|
||||
esac],[multihost_sql_schema=false])
|
||||
|
||||
AC_ARG_ENABLE(multihost_sql_schema,
|
||||
[AS_HELP_STRING([--enable-multihost-sql-schema],[use multihost SQL schema by default (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) multihost_sql_schema=true ;;
|
||||
no) multihost_sql_schema=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-multihost-sql-schema) ;;
|
||||
esac],[multihost_sql_schema=false])
|
||||
|
||||
AC_ARG_ENABLE(odbc,
|
||||
[AS_HELP_STRING([--enable-odbc],[enable pure ODBC support (default: no)])],
|
||||
@@ -309,7 +326,7 @@ esac
|
||||
AC_MSG_RESULT([build tool to use (change using --with-rebar): $rebar])
|
||||
|
||||
AC_SUBST(roster_gateway_workaround)
|
||||
AC_SUBST(new_sql_schema)
|
||||
AC_SUBST(multihost_sql_schema)
|
||||
AC_SUBST(full_xml)
|
||||
AC_SUBST(odbc)
|
||||
AC_SUBST(mssql)
|
||||
@@ -350,9 +367,7 @@ AS_CASE([$rebar],
|
||||
$rebar unlock "$deps"])
|
||||
deps=""
|
||||
ERLANG_VERSION=m4_esyscmd([erl -noinput -noshell -eval 'erlang:display(list_to_integer(erlang:system_info(otp_release))), halt().'])
|
||||
AS_IF([test "$ERLANG_VERSION" -lt "21"], [deps="luerl,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -lt "22"], [deps="lager,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -le "23"], [deps="jose,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -le "26"], [deps="jose,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -ge "27"], [deps="jiffy,$deps"])
|
||||
AS_IF([test "x$deps" = "x"], [],
|
||||
[AC_MSG_NOTICE([unlocking rebar3 dependencies for old Erlang/OTP: $deps])
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
|
||||
<xmpp:version>2.9</xmpp:version>
|
||||
<xmpp:version>2.13.2</xmpp:version>
|
||||
<xmpp:since>0.5.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
@@ -65,7 +65,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0013.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:version>1.3</xmpp:version>
|
||||
<xmpp:since>16.02</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
@@ -74,7 +74,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0016.html"/>
|
||||
<xmpp:version>1.6</xmpp:version>
|
||||
<xmpp:version>1.7</xmpp:version>
|
||||
<xmpp:since>0.5.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_privacy</xmpp:note>
|
||||
@@ -101,7 +101,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0030.html"/>
|
||||
<xmpp:version>2.4</xmpp:version>
|
||||
<xmpp:version>2.5.0</xmpp:version>
|
||||
<xmpp:since>0.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_disco</xmpp:note>
|
||||
@@ -128,7 +128,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0045.html"/>
|
||||
<xmpp:version>1.25</xmpp:version>
|
||||
<xmpp:version>1.35.3</xmpp:version>
|
||||
<xmpp:since>0.5.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_muc</xmpp:note>
|
||||
@@ -155,7 +155,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0050.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:version>1.3.0</xmpp:version>
|
||||
<xmpp:since>1.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_adhoc</xmpp:note>
|
||||
@@ -164,7 +164,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0054.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:version>1.3.0</xmpp:version>
|
||||
<xmpp:since>0.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_vcard</xmpp:note>
|
||||
@@ -200,7 +200,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0065.html"/>
|
||||
<xmpp:version>1.8</xmpp:version>
|
||||
<xmpp:version>1.8.2</xmpp:version>
|
||||
<xmpp:since>2.0.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_proxy65</xmpp:note>
|
||||
@@ -263,7 +263,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0106.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:version>1.1.1</xmpp:version>
|
||||
<xmpp:since>0.5.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
@@ -281,7 +281,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0115.html"/>
|
||||
<xmpp:version>1.5</xmpp:version>
|
||||
<xmpp:version>1.6.0</xmpp:version>
|
||||
<xmpp:since>2.1.4</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_caps</xmpp:note>
|
||||
@@ -290,7 +290,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0124.html"/>
|
||||
<xmpp:version>1.11</xmpp:version>
|
||||
<xmpp:version>1.11.2</xmpp:version>
|
||||
<xmpp:since>16.12</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>ejabberd_bosh</xmpp:note>
|
||||
@@ -299,7 +299,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0133.html"/>
|
||||
<xmpp:version>1.3.0</xmpp:version>
|
||||
<xmpp:version>1.3.1</xmpp:version>
|
||||
<xmpp:since>13.10</xmpp:since>
|
||||
<xmpp:status>partial</xmpp:status>
|
||||
<xmpp:note>mod_configure</xmpp:note>
|
||||
@@ -317,7 +317,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0153.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:version>1.1.1</xmpp:version>
|
||||
<xmpp:since>17.09</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_vcard</xmpp:note>
|
||||
@@ -335,7 +335,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0157.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:version>1.1.1</xmpp:version>
|
||||
<xmpp:since>2.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_disco</xmpp:note>
|
||||
@@ -344,7 +344,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0158.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:version>1.0.1</xmpp:version>
|
||||
<xmpp:since>2.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>ejabberd_captcha</xmpp:note>
|
||||
@@ -353,7 +353,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0160.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:version>1.0.1</xmpp:version>
|
||||
<xmpp:since>16.01</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
@@ -362,7 +362,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0163.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:version>1.2.2</xmpp:version>
|
||||
<xmpp:since>2.0.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_pubsub</xmpp:note>
|
||||
@@ -389,7 +389,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0178.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since>17.03</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
@@ -407,7 +407,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0191.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:version>1.3</xmpp:version>
|
||||
<xmpp:since>2.1.7</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_blocking</xmpp:note>
|
||||
@@ -425,7 +425,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0199.html"/>
|
||||
<xmpp:version>2.0</xmpp:version>
|
||||
<xmpp:version>2.0.1</xmpp:version>
|
||||
<xmpp:since>2.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_ping</xmpp:note>
|
||||
@@ -452,7 +452,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0205.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:version>1.0.2</xmpp:version>
|
||||
<xmpp:since>1.1.2</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
@@ -470,7 +470,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0215.html"/>
|
||||
<xmpp:version>0.7</xmpp:version>
|
||||
<xmpp:version>1.0.0</xmpp:version>
|
||||
<xmpp:since>20.04</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_stun_disco</xmpp:note>
|
||||
@@ -506,7 +506,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0231.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since>2.1.0</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>ejabberd_captcha</xmpp:note>
|
||||
@@ -578,10 +578,10 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0317.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:version>0.3.1</xmpp:version>
|
||||
<xmpp:since>21.12</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_muc_room, 0.2.0 since 25.03</xmpp:note>
|
||||
<xmpp:note>mod_muc_room, 0.3.1 since 25.10</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
@@ -596,7 +596,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0334.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:version>1.0.0</xmpp:version>
|
||||
<xmpp:since>16.01</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_mam, mod_muc_log, mod_offline</xmpp:note>
|
||||
@@ -632,7 +632,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0357.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:version>0.4.1</xmpp:version>
|
||||
<xmpp:since>17.08</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_push</xmpp:note>
|
||||
@@ -641,7 +641,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0359.html"/>
|
||||
<xmpp:version>0.5.0</xmpp:version>
|
||||
<xmpp:version>0.7.0</xmpp:version>
|
||||
<xmpp:since>15.09</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
@@ -674,10 +674,19 @@
|
||||
<xmpp:note>mod_mix</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0379.html"/>
|
||||
<xmpp:version>0.3.3</xmpp:version>
|
||||
<xmpp:since>26.01</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_invites</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0384.html"/>
|
||||
<xmpp:version>0.8.3</xmpp:version>
|
||||
<xmpp:version>0.9.0</xmpp:version>
|
||||
<xmpp:since>21.12</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>node_pep</xmpp:note>
|
||||
@@ -695,7 +704,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0388.html"/>
|
||||
<xmpp:version>0.4.0</xmpp:version>
|
||||
<xmpp:version>1.0.4</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
@@ -704,16 +713,25 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0398.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:version>1.0.0</xmpp:version>
|
||||
<xmpp:since>18.03</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_avatar</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0401.html"/>
|
||||
<xmpp:version>0.5.0</xmpp:version>
|
||||
<xmpp:since>26.01</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_invites</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0402.html"/>
|
||||
<xmpp:version>1.1.3</xmpp:version>
|
||||
<xmpp:version>1.2.0</xmpp:version>
|
||||
<xmpp:since>23.10</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_private</xmpp:note>
|
||||
@@ -740,7 +758,7 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0411.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:version>1.1.0</xmpp:version>
|
||||
<xmpp:since>18.12</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_private</xmpp:note>
|
||||
@@ -749,10 +767,10 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0421.html"/>
|
||||
<xmpp:version>0.1.0</xmpp:version>
|
||||
<xmpp:version>1.0.1</xmpp:version>
|
||||
<xmpp:since>23.10</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_muc_occupantid</xmpp:note>
|
||||
<xmpp:note>mod_muc</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
@@ -773,10 +791,19 @@
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0431.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:since>24.12</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0440.html"/>
|
||||
<xmpp:version>0.4.0</xmpp:version>
|
||||
<xmpp:version>1.0.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
@@ -791,10 +818,19 @@
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0445.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:since>26.01</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_invites</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0474.html"/>
|
||||
<xmpp:version>0.4.0</xmpp:version>
|
||||
<xmpp:version>0.5.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>, 0.4.0 since 25.03</xmpp:note>
|
||||
@@ -821,10 +857,19 @@
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0485.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:version>1.0.0</xmpp:version>
|
||||
<xmpp:since>25.07</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>, mod_pubsub_serverinfo in ejabberd-contrib.git</xmpp:note>
|
||||
<xmpp:note>mod_pubsub_serverinfo</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0486.html"/>
|
||||
<xmpp:version>0.1.0</xmpp:version>
|
||||
<xmpp:since>24.07</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_muc</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
</Project>
|
||||
|
||||
@@ -179,7 +179,7 @@ modules:
|
||||
mod_fail2ban: {}
|
||||
mod_http_api: {}
|
||||
mod_http_upload:
|
||||
put_url: https://@HOST@:5443/upload
|
||||
put_url: https://@HOST_URL_ENCODE@:5443/upload
|
||||
custom_headers:
|
||||
"Access-Control-Allow-Origin": "https://@HOST@"
|
||||
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
|
||||
@@ -205,7 +205,6 @@ modules:
|
||||
default_room_options:
|
||||
mam: true
|
||||
mod_muc_admin: {}
|
||||
mod_muc_occupantid: {}
|
||||
mod_offline:
|
||||
access_max_user_messages: max_user_offline_messages
|
||||
mod_ping: {}
|
||||
|
||||
@@ -24,18 +24,6 @@
|
||||
#
|
||||
#ERL_MAX_PORTS=65536
|
||||
|
||||
#.
|
||||
#' FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
|
||||
#
|
||||
# If ejabberd is configured to run in cluster, and a firewall is blocking ports,
|
||||
# it's possible to make Erlang use a defined range of port (instead of dynamic
|
||||
# ports) for node communication.
|
||||
#
|
||||
# Default: not defined
|
||||
# Example: 4200-4210
|
||||
#
|
||||
#FIREWALL_WINDOW=
|
||||
|
||||
#.
|
||||
#' INET_DIST_INTERFACE: IP address where this Erlang node listens other nodes
|
||||
#
|
||||
@@ -64,6 +52,18 @@
|
||||
#
|
||||
#ERL_DIST_PORT=5210
|
||||
|
||||
#.
|
||||
#' FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
|
||||
#
|
||||
# If ejabberd is configured to run in cluster, and a firewall is blocking ports,
|
||||
# it's possible to make Erlang use a defined range of port (instead of dynamic
|
||||
# ports) for node communication.
|
||||
#
|
||||
# Default: not defined
|
||||
# Example: 4200-4210
|
||||
#
|
||||
#FIREWALL_WINDOW=
|
||||
|
||||
#.
|
||||
#' ERL_EPMD_ADDRESS: IP addresses where EPMD listens for connections
|
||||
#
|
||||
|
||||
@@ -71,6 +71,10 @@ done
|
||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||
|
||||
# backward support for old mnesia spool dir path
|
||||
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
|
||||
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
|
||||
|
||||
# define erl parameters
|
||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||
@@ -117,6 +121,9 @@ export CONTRIB_MODULES_CONF_DIR
|
||||
export ERL_LIBS
|
||||
export SCRIPT_DIR
|
||||
|
||||
# Only required for Erlang/OTP 25:
|
||||
export ERL_FLAGS="$ERL_FLAGS -enable-feature maybe_expr"
|
||||
|
||||
set_dist_client()
|
||||
{
|
||||
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false"
|
||||
@@ -125,9 +132,19 @@ set_dist_client()
|
||||
# run command either directly or via su $INSTALLUSER
|
||||
exec_cmd()
|
||||
{
|
||||
case $EXEC_CMD in
|
||||
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
as_current_user) "$@" ;;
|
||||
case $EXEC_CMD,$(uname -s) in
|
||||
as_install_user,OpenBSD)
|
||||
su -s /bin/sh "$INSTALLUSER" -c 'exec "$0" "$@"' "$@"
|
||||
;;
|
||||
as_install_user,NetBSD)
|
||||
su "$INSTALLUSER" -c 'exec "$0" "$@"' -- "$@"
|
||||
;;
|
||||
as_install_user,*)
|
||||
su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@"
|
||||
;;
|
||||
as_current_user,*)
|
||||
"$@"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
exec_erl()
|
||||
@@ -295,7 +312,20 @@ stop_epmd()
|
||||
# if all ok, ensure runtime directory exists and make it current directory
|
||||
check_start()
|
||||
{
|
||||
[ -n "$ERL_DIST_PORT" ] && return
|
||||
[ -n "$ERL_DIST_PORT" ] && {
|
||||
netstat -nl | grep ":$ERL_DIST_PORT" >/dev/null && {
|
||||
echo ""
|
||||
echo "NOTE: The file ejabberdctl.cfg has configured ERL_DIST_PORT=$ERL_DIST_PORT"
|
||||
echo " and the port 5210 is already in use."
|
||||
echo " If ejabberd fails to start with listen error eaddrinsuse,"
|
||||
echo " try configuring in ejabberdctl.cfg a different"
|
||||
echo " INET_DIST_INTERFACE, or different ERL_DIST_PORT"
|
||||
echo ""
|
||||
netstat -nlp 2>/dev/null | grep ":5210"
|
||||
echo ""
|
||||
}
|
||||
return
|
||||
}
|
||||
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
||||
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
||||
@@ -314,6 +344,13 @@ check_start()
|
||||
# allow sync calls
|
||||
wait_status()
|
||||
{
|
||||
wait_status_node "$ERLANG_NODE" $1 $2 $3
|
||||
}
|
||||
|
||||
wait_status_node()
|
||||
{
|
||||
CONNECT_NODE=$1
|
||||
shift
|
||||
# args: status try delay
|
||||
# return: 0 OK, 1 KO
|
||||
timeout="$2"
|
||||
@@ -325,9 +362,9 @@ wait_status()
|
||||
status="$1"
|
||||
else
|
||||
exec_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
||||
-extra "$CONNECT_NODE" $NO_TIMEOUT status > /dev/null
|
||||
status="$?"
|
||||
fi
|
||||
done
|
||||
@@ -336,19 +373,26 @@ wait_status()
|
||||
|
||||
exec_other_command()
|
||||
{
|
||||
exec_other_command_node $ERLANG_NODE "$@"
|
||||
}
|
||||
|
||||
exec_other_command_node()
|
||||
{
|
||||
CONNECT_NODE=$1
|
||||
shift
|
||||
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|
||||
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|
||||
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
|
||||
exec_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
||||
-extra "$CONNECT_NODE" $NO_TIMEOUT "$@"
|
||||
result=$?
|
||||
case $result in
|
||||
3) help;;
|
||||
*) :;;
|
||||
esac
|
||||
exit $result
|
||||
return $result
|
||||
else
|
||||
exec_ctl_over_http_socket "$@"
|
||||
fi
|
||||
@@ -389,6 +433,103 @@ cd "$SPOOL_DIR" || {
|
||||
exit 6
|
||||
}
|
||||
|
||||
printe()
|
||||
{
|
||||
printf "\n"
|
||||
printf "\e[1;40;32m==> %s\e[0m\n" "$1"
|
||||
}
|
||||
|
||||
## Function copied from tools/make-installers
|
||||
user_agrees()
|
||||
{
|
||||
question="$*"
|
||||
|
||||
if [ -t 0 ]
|
||||
then
|
||||
printe "$question (y/n) [n]"
|
||||
read -r response
|
||||
case "$response" in
|
||||
[Yy]|[Yy][Ee][Ss])
|
||||
return 0
|
||||
;;
|
||||
[Nn]|[Nn][Oo]|'')
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
echo 'Please respond with "yes" or "no".'
|
||||
user_agrees "$question"
|
||||
;;
|
||||
esac
|
||||
else # Assume 'yes' if not running interactively.
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
mnesia_change()
|
||||
{
|
||||
ERLANG_NODE_OLD="$1"
|
||||
[ "$ERLANG_NODE_OLD" = "" ] \
|
||||
&& echo "Error: Please provide the old erlang node name, for example:" \
|
||||
&& echo " ejabberdctl mnesia_change ejabberd@oldmachine" \
|
||||
&& exit 1
|
||||
|
||||
SPOOL_DIR_BACKUP=$SPOOL_DIR/$ERLANG_NODE_OLD-backup/
|
||||
OLDFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE_OLD.backup
|
||||
NEWFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE.backup
|
||||
|
||||
printe "This changes your mnesia database from node name '$ERLANG_NODE_OLD' to '$ERLANG_NODE'"
|
||||
|
||||
[ -d "$SPOOL_DIR_BACKUP" ] && printe "WARNING! A backup of old node already exists in $SPOOL_DIR_BACKUP"
|
||||
|
||||
if ! user_agrees "Do you want to proceed?"
|
||||
then
|
||||
echo 'Operation aborted.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printe "Starting ejabberd with old node name $ERLANG_NODE_OLD ..."
|
||||
exec_erl "$ERLANG_NODE_OLD" $EJABBERD_OPTS -detached
|
||||
wait_status_node $ERLANG_NODE_OLD 0 30 2
|
||||
result=$?
|
||||
case $result in
|
||||
1) echo "There was a problem starting ejabberd with the old erlang node name. " \
|
||||
&& echo "Check for log errors in $EJABBERD_LOG_PATH" \
|
||||
&& exit $result;;
|
||||
*) :;;
|
||||
esac
|
||||
exec_other_command_node $ERLANG_NODE_OLD "status"
|
||||
|
||||
printe "Making backup of old database to file $OLDFILE ..."
|
||||
mkdir $SPOOL_DIR_BACKUP
|
||||
exec_other_command_node $ERLANG_NODE_OLD backup "$OLDFILE"
|
||||
|
||||
printe "Changing node name in new backup file $NEWFILE ..."
|
||||
exec_other_command_node $ERLANG_NODE_OLD mnesia_change_nodename "$ERLANG_NODE_OLD" "$ERLANG_NODE" "$OLDFILE" "$NEWFILE"
|
||||
|
||||
printe "Stopping old ejabberd..."
|
||||
exec_other_command_node $ERLANG_NODE_OLD "stop"
|
||||
wait_status_node $ERLANG_NODE_OLD 3 30 2 && stop_epmd
|
||||
|
||||
printe "Moving old mnesia spool files to backup subdirectory $SPOOL_DIR_BACKUP ..."
|
||||
mv $SPOOL_DIR/*.DAT $SPOOL_DIR_BACKUP
|
||||
mv $SPOOL_DIR/*.DCD $SPOOL_DIR_BACKUP
|
||||
mv $SPOOL_DIR/*.LOG $SPOOL_DIR_BACKUP
|
||||
|
||||
printe "Starting ejabberd with new node name $ERLANG_NODE ..."
|
||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
|
||||
wait_status 0 30 2
|
||||
exec_other_command "status"
|
||||
|
||||
printe "Installing fallback of new mnesia..."
|
||||
exec_other_command install_fallback "$NEWFILE"
|
||||
|
||||
printe "Stopping new ejabberd..."
|
||||
exec_other_command "stop"
|
||||
wait_status 3 30 2 && stop_epmd
|
||||
|
||||
printe "Finished, now you can start ejabberd normally"
|
||||
}
|
||||
|
||||
# main
|
||||
case $1 in
|
||||
start)
|
||||
@@ -438,7 +579,8 @@ case $1 in
|
||||
-noinput -hidden \
|
||||
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
||||
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-s erlang halt -output text
|
||||
-eval 'halt(case net_adm:ping('"'$PEER'"') of pong -> 0; pang -> 1 end).' \
|
||||
-output text
|
||||
;;
|
||||
started)
|
||||
set_dist_client
|
||||
@@ -448,6 +590,9 @@ case $1 in
|
||||
set_dist_client
|
||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
||||
;;
|
||||
mnesia_change)
|
||||
mnesia_change $2
|
||||
;;
|
||||
*)
|
||||
set_dist_client
|
||||
exec_other_command "$@"
|
||||
|
||||
@@ -16,17 +16,18 @@
|
||||
{elvis_style, function_naming_convention, disable},
|
||||
{elvis_style, god_modules, #{limit => 300}},
|
||||
{elvis_style, invalid_dynamic_call, disable},
|
||||
{elvis_style, macro_module_names, disable},
|
||||
{elvis_style, macro_names, disable},
|
||||
{elvis_style, max_function_arity, disable}, % #{max_arity => 15}},
|
||||
{elvis_style, nesting_level, disable},
|
||||
{elvis_style, no_author, disable},
|
||||
{elvis_style, no_boolean_in_comparison, disable},
|
||||
{elvis_style, no_catch_expressions, disable},
|
||||
{elvis_style, no_debug_call, disable},
|
||||
{elvis_style, no_if_expression, disable},
|
||||
{elvis_style, no_import, disable},
|
||||
{elvis_style, no_match_in_condition, disable},
|
||||
{elvis_style, no_nested_try_catch, disable},
|
||||
{elvis_style, no_operation_on_same_value, disable},
|
||||
{elvis_style, no_receive_without_timeout, disable},
|
||||
{elvis_style, no_single_clause_case, disable},
|
||||
{elvis_style, no_spec_with_records, disable},
|
||||
{elvis_style, no_throw, disable},
|
||||
|
||||
@@ -11,9 +11,6 @@ include_dirs:
|
||||
- "_build/default/lib/*/include"
|
||||
- "include"
|
||||
macros:
|
||||
- name: DEPRECATED_GET_STACKTRACE
|
||||
- name: HAVE_ERL_ERROR
|
||||
- name: HAVE_URI_STRING
|
||||
- name: OTP_BELOW_27
|
||||
- name: SIP
|
||||
- name: STUN
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -27,10 +27,14 @@
|
||||
rescode | restuple.
|
||||
|
||||
%% The 'any' and 'atom' argument types and 'any' result type
|
||||
%% should only be used %% by commands with tag 'internal',
|
||||
%% should only be used by commands with tag 'internal',
|
||||
%% which are meant to be used only internally in ejabberd,
|
||||
%% and not called using external frontends.
|
||||
|
||||
%% When a command with tag 'async' is called by mod_adhoc_api,
|
||||
%% it is spawned in a new process for the command execution,
|
||||
%% and the command immediately returns success.
|
||||
|
||||
%% The purpose of a command can either be:
|
||||
%% - informative: its purpose is to obtain information
|
||||
%% - modifier: its purpose is to produce some change in the server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License along
|
||||
%%% with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-record(serialize_mam_v1, {
|
||||
serverhost :: binary(),
|
||||
username :: binary(),
|
||||
timestamp :: integer(),
|
||||
peer :: binary(),
|
||||
type :: chat | groupchat,
|
||||
nick :: binary(),
|
||||
origin_id :: binary(),
|
||||
packet :: binary()
|
||||
}).
|
||||
-record(serialize_mam_prefs_v1, {
|
||||
serverhost :: binary(),
|
||||
username :: binary(),
|
||||
default :: atom(),
|
||||
always :: term(),
|
||||
never :: term()
|
||||
}).
|
||||
|
||||
-record(serialize_roster_v1, {
|
||||
serverhost :: binary(),
|
||||
username :: binary(),
|
||||
version :: binary() | undefined,
|
||||
entries :: [{binary(),
|
||||
binary(),
|
||||
[binary()],
|
||||
both | from | to | none,
|
||||
boolean(),
|
||||
subscribe | unsubscribe | both | in | out | none,
|
||||
binary()}]
|
||||
}).
|
||||
|
||||
-record(serialize_auth_v1, {
|
||||
serverhost :: binary(),
|
||||
username :: binary(),
|
||||
passwords :: [binary() | {sha | sha256 | sha512, binary(), binary(), binary(), integer()}]
|
||||
}).
|
||||
|
||||
-record(serialize_muc_room_v1, {
|
||||
serverhost :: binary(),
|
||||
name :: binary(),
|
||||
host :: binary(),
|
||||
options:: [{atom(), term()}]
|
||||
}).
|
||||
|
||||
-record(serialize_muc_registrations_v1, {
|
||||
serverhost :: binary(),
|
||||
host :: binary(),
|
||||
jid :: binary(),
|
||||
nick :: binary()
|
||||
}).
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -29,27 +29,21 @@
|
||||
-define(SQL_INSERT_MARK, sql_insert__mark_).
|
||||
-define(SQL_INSERT(Table, Fields), ?SQL_INSERT_MARK(Table, Fields)).
|
||||
|
||||
-ifdef(COMPILER_REPORTS_ONLY_LINES).
|
||||
-record(sql_query, {hash :: binary(),
|
||||
format_query :: fun(),
|
||||
format_res :: fun(),
|
||||
args :: fun(),
|
||||
flags :: non_neg_integer(),
|
||||
loc :: {module(), pos_integer()}}).
|
||||
-else.
|
||||
-record(sql_query, {hash :: binary(),
|
||||
format_query :: fun(),
|
||||
format_res :: fun(),
|
||||
args :: fun(),
|
||||
flags :: non_neg_integer(),
|
||||
loc :: {module(), {pos_integer(), pos_integer()}}}).
|
||||
-endif.
|
||||
|
||||
-record(sql_escape, {string :: fun((binary()) -> binary()),
|
||||
integer :: fun((integer()) -> binary()),
|
||||
boolean :: fun((boolean()) -> binary()),
|
||||
in_array_string :: fun((binary()) -> binary()),
|
||||
like_escape :: fun(() -> binary())}).
|
||||
-record(sql_escape, {
|
||||
string :: fun((binary()) -> binary() | atom()),
|
||||
integer :: fun((integer()) -> binary() | atom()),
|
||||
boolean :: fun((boolean()) -> binary() | atom()),
|
||||
timestamp :: fun((calendar:datetime()) -> binary() | atom()),
|
||||
in_array_string :: fun((binary()) -> binary() | atom()),
|
||||
like_escape :: fun(() -> binary() | atom())
|
||||
}).
|
||||
|
||||
|
||||
-record(sql_index, {columns,
|
||||
@@ -57,6 +51,7 @@
|
||||
meta = #{}}).
|
||||
-record(sql_column, {name :: binary(),
|
||||
type,
|
||||
nullable = false,
|
||||
default = false,
|
||||
opts = []}).
|
||||
-record(sql_table, {name :: binary(),
|
||||
@@ -72,4 +67,4 @@
|
||||
-record(sql_schema_info,
|
||||
{db_type :: pgsql | mysql | sqlite,
|
||||
db_version :: any(),
|
||||
new_schema = true :: boolean()}).
|
||||
multihost_schema = true :: boolean()}).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -19,41 +19,48 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
-define(PRINT(Format, Args), io:format(Format, Args)).
|
||||
|
||||
-ifdef(LAGER).
|
||||
-compile([{parse_transform, lager_transform}]).
|
||||
|
||||
-define(DEBUG(Format, Args),
|
||||
begin lager:debug(Format, Args), ok end).
|
||||
|
||||
-define(INFO_MSG(Format, Args),
|
||||
begin lager:info(Format, Args), ok end).
|
||||
|
||||
-define(WARNING_MSG(Format, Args),
|
||||
begin lager:warning(Format, Args), ok end).
|
||||
|
||||
-define(ERROR_MSG(Format, Args),
|
||||
begin lager:error(Format, Args), ok end).
|
||||
|
||||
-define(CRITICAL_MSG(Format, Args),
|
||||
begin lager:critical(Format, Args), ok end).
|
||||
-else.
|
||||
-include_lib("kernel/include/logger.hrl").
|
||||
|
||||
-define(CLEAD, "\e[1"). % bold
|
||||
-define(CMID, "\e[0"). % normal
|
||||
-define(CCLEAN, "\e[0m"). % clean
|
||||
|
||||
-define(CDEFAULT, ";49;95m"). % light magenta
|
||||
-define(CDEBUG, ";49;90m"). % dark gray
|
||||
-define(CINFO, ";49;92m"). % green
|
||||
-define(CWARNING, ";49;93m"). % light yellow
|
||||
-define(CERROR, ";49;91m"). % light magenta
|
||||
-define(CCRITICAL,";49;31m"). % light red
|
||||
|
||||
-define(DEBUG(Format, Args),
|
||||
begin ?LOG_DEBUG(Format, Args), ok end).
|
||||
begin ?LOG_DEBUG(Format, Args,
|
||||
#{clevel => ?CLEAD ++ ?CDEBUG,
|
||||
ctext => ?CMID ++ ?CDEBUG}),
|
||||
ok end).
|
||||
|
||||
-define(INFO_MSG(Format, Args),
|
||||
begin ?LOG_INFO(Format, Args), ok end).
|
||||
begin ?LOG_INFO(Format, Args,
|
||||
#{clevel => ?CLEAD ++ ?CINFO,
|
||||
ctext => ?CCLEAN}),
|
||||
ok end).
|
||||
|
||||
-define(WARNING_MSG(Format, Args),
|
||||
begin ?LOG_WARNING(Format, Args), ok end).
|
||||
begin ?LOG_WARNING(Format, Args,
|
||||
#{clevel => ?CLEAD ++ ?CWARNING,
|
||||
ctext => ?CMID ++ ?CWARNING}),
|
||||
ok end).
|
||||
|
||||
-define(ERROR_MSG(Format, Args),
|
||||
begin ?LOG_ERROR(Format, Args), ok end).
|
||||
begin ?LOG_ERROR(Format, Args,
|
||||
#{clevel => ?CLEAD ++ ?CERROR,
|
||||
ctext => ?CMID ++ ?CERROR}),
|
||||
ok end).
|
||||
|
||||
-define(CRITICAL_MSG(Format, Args),
|
||||
begin ?LOG_CRITICAL(Format, Args), ok end).
|
||||
-endif.
|
||||
begin ?LOG_CRITICAL(Format, Args,
|
||||
#{clevel => ?CLEAD++ ?CCRITICAL,
|
||||
ctext => ?CMID ++ ?CCRITICAL}),
|
||||
ok end).
|
||||
|
||||
%% Use only when trying to troubleshoot test problem with ExUnit
|
||||
-define(EXUNIT_LOG(Format, Args),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -18,10 +18,19 @@
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-ifdef(DEPRECATED_GET_STACKTRACE).
|
||||
-define(EX_RULE(Class, Reason, Stack), Class:Reason:Stack).
|
||||
-define(EX_STACK(Stack), Stack).
|
||||
-else.
|
||||
-define(EX_RULE(Class, Reason, _), Class:Reason).
|
||||
-define(EX_STACK(_), erlang:get_stacktrace()).
|
||||
-endif.
|
||||
-define(MODULE_ANTISPAM, mod_antispam).
|
||||
|
||||
-type url() :: binary().
|
||||
-type filename() :: binary() | none | false.
|
||||
-type jid_set() :: sets:set(ljid()).
|
||||
-type url_set() :: sets:set(url()).
|
||||
|
||||
-define(DEFAULT_RTBL_DOMAINS_NODE, <<"spam_source_domains">>).
|
||||
|
||||
-record(rtbl_service,
|
||||
{host = none :: binary() | none,
|
||||
node = ?DEFAULT_RTBL_DOMAINS_NODE :: binary(),
|
||||
subscribed = false :: boolean(),
|
||||
retry_timer = undefined :: reference() | undefined}).
|
||||
|
||||
-type rtbl_service() :: #rtbl_service{}.
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
-define(INVITE_TOKEN_EXPIRE_SECONDS_DEFAULT, 5*86400).
|
||||
-define(INVITE_TOKEN_LENGTH_DEFAULT, 24).
|
||||
|
||||
-define(NS_INVITE_INVITE, <<"urn:xmpp:invite#invite">>).
|
||||
-define(NS_INVITE_CREATE_ACCOUNT, <<"urn:xmpp:invite#create-account">>).
|
||||
|
||||
-define(OVERUSE_LIMIT, 1000).
|
||||
|
||||
-define(SPEEDY_GOAT_LEVELS, 2).
|
||||
-define(SPEEDY_GOAT_SECONDS, 300).
|
||||
|
||||
-record(invite_token, {token :: binary(),
|
||||
inviter :: {binary(), binary()},
|
||||
%% A non-empty value if `invitee` indicates the invite has been used.
|
||||
invitee = <<>> :: binary(),
|
||||
created_at = calendar:now_to_datetime(erlang:timestamp()) :: calendar:datetime(),
|
||||
expires = calendar:gregorian_seconds_to_datetime(calendar:datetime_to_gregorian_seconds(calendar:now_to_datetime(erlang:timestamp())) + ?INVITE_TOKEN_EXPIRE_SECONDS_DEFAULT) :: calendar:datetime(),
|
||||
type = roster_only :: roster_only | account_only | account_subscription,
|
||||
%% If type is 'roster_only' then we indicate a token has been used to create
|
||||
%% an account (if allowed) by setting `account_name` to the name of the user
|
||||
%% (which should match `invitee`).
|
||||
account_name = <<>> :: binary()
|
||||
}).
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -21,8 +21,16 @@
|
||||
-record(room_version,
|
||||
{id :: binary(),
|
||||
%% use the same field names as in Synapse
|
||||
enforce_key_validity :: boolean(),
|
||||
special_case_aliases_auth :: boolean(),
|
||||
strict_canonicaljson :: boolean(),
|
||||
limit_notifications_power_levels :: boolean(),
|
||||
knock_join_rule :: boolean(),
|
||||
restricted_join_rule :: boolean(),
|
||||
restricted_join_rule_fix :: boolean(),
|
||||
knock_restricted_join_rule :: boolean(),
|
||||
enforce_int_power_levels :: boolean(),
|
||||
implicit_room_creator :: boolean(),
|
||||
updated_redaction_rules :: boolean()
|
||||
updated_redaction_rules :: boolean(),
|
||||
hydra :: boolean()
|
||||
}).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -23,8 +23,9 @@
|
||||
opts = [] :: list() | '_'}).
|
||||
|
||||
-record(muc_registered,
|
||||
{us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary(), binary()}, binary()} | '$1',
|
||||
nick = <<"">> :: binary()}).
|
||||
{us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary() | '$1', binary() | '$2'},
|
||||
binary() | '_'} | '$1',
|
||||
nick = <<"">> :: binary() | '$3'}).
|
||||
|
||||
-record(muc_online_room,
|
||||
{name_host :: {binary(), binary()} | '$1' | {'_', binary()} | '_',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -65,7 +65,7 @@
|
||||
captcha_whitelist = (?SETS):empty() :: gb_sets:set(),
|
||||
mam = false :: boolean(),
|
||||
pubsub = <<"">> :: binary(),
|
||||
enable_hats = false :: boolean(),
|
||||
enable_hats = true :: boolean(),
|
||||
lang = ejabberd_option:language() :: binary()
|
||||
}).
|
||||
|
||||
@@ -81,7 +81,8 @@
|
||||
role :: role(),
|
||||
%%is_subscriber = false :: boolean(),
|
||||
%%subscriptions = [] :: [binary()],
|
||||
last_presence :: presence() | undefined
|
||||
last_presence :: presence() | undefined,
|
||||
occupant_id :: binary()
|
||||
}).
|
||||
|
||||
-record(subscriber, {jid :: jid(),
|
||||
@@ -126,12 +127,14 @@
|
||||
history = #lqueue{} :: lqueue(),
|
||||
subject = [] :: [text()],
|
||||
subject_author = {<<"">>, #jid{}} :: {binary(), jid()},
|
||||
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
|
||||
hats_defs = #{} :: #{binary() => {binary(), binary()}},
|
||||
hats_users = #{} :: #{ljid() => [binary()]},
|
||||
just_created = erlang:system_time(microsecond) :: true | integer(),
|
||||
activity = treap:empty() :: treap:treap(),
|
||||
room_shaper = none :: ejabberd_shaper:shaper(),
|
||||
room_queue :: p1_queue:queue({message | presence, jid()}) | undefined,
|
||||
hibernate_timer = none :: reference() | none | hibernating
|
||||
hibernate_timer = none :: reference() | none | hibernating,
|
||||
salt = <<>> :: binary()
|
||||
}).
|
||||
|
||||
-type users() :: #{ljid() => #user{}}.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -19,6 +19,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-record(private_storage,
|
||||
{usns = {<<"">>, <<"">>, <<"">>} :: {binary(), binary(), binary() |
|
||||
{usns = {<<"">>, <<"">>, <<"">>} :: {binary() | '$1' | '_', binary(), binary() |
|
||||
'$1' | '_'},
|
||||
xml = #xmlel{} :: xmlel() | '_' | '$1'}).
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
%%% RFC 1928 constants.
|
||||
%%%
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%% ejabberd, Copyright (C) 2017-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2017-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -25,6 +25,7 @@
|
||||
jid = {<<>>, <<>>, <<>>} :: jid:ljid(),
|
||||
name = <<>> :: binary() | '_',
|
||||
subscription = none :: subscription() | '_',
|
||||
approved = false :: boolean() | '_',
|
||||
ask = none :: ask() | '_',
|
||||
groups = [] :: [binary()] | '_',
|
||||
askmessage = <<"">> :: binary() | '_',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||
%%% @copyright (C) 2002-2025 ProcessOne, SARL. All Rights Reserved.
|
||||
%%% @copyright (C) 2002-2026 ProcessOne, SARL. All Rights Reserved.
|
||||
%%%
|
||||
%%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||
%%% you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -6,7 +6,7 @@ defmodule Ejabberd.MixProject do
|
||||
source_url: "https://github.com/processone/ejabberd",
|
||||
version: version(),
|
||||
description: description(),
|
||||
elixir: elixir_required_version(),
|
||||
elixir: "~> 1.14",
|
||||
elixirc_paths: ["lib"],
|
||||
compile_path: ".",
|
||||
compilers: [:asn1, :yecc] ++ Mix.compilers(),
|
||||
@@ -84,21 +84,11 @@ defmodule Ejabberd.MixProject do
|
||||
includes = ["include", deps_include()]
|
||||
result = [{:d, :ELIXIR_ENABLED}] ++
|
||||
cond_options() ++
|
||||
if Mix.env == :test do [{:d, :TEST}] else [] end ++
|
||||
Enum.map(includes, fn (path) -> {:i, path} end) ++
|
||||
if_version_above(~c"20", [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
|
||||
if_version_above(~c"20", [{:d, :HAVE_URI_STRING}]) ++
|
||||
if_version_above(~c"20", [{:d, :HAVE_ERL_ERROR}]) ++
|
||||
if_version_below(~c"21", [{:d, :USE_OLD_HTTP_URI}]) ++
|
||||
if_version_below(~c"22", [{:d, :LAGER}]) ++
|
||||
if_version_below(~c"21", [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
|
||||
if_version_below(~c"23", [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
|
||||
if_version_below(~c"23", [{:d, :USE_OLD_PG2}]) ++
|
||||
if_version_below(~c"24", [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
|
||||
if_version_below(~c"24", [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++
|
||||
if_version_below(~c"24", [{:d, :OTP_BELOW_24}]) ++
|
||||
if_version_below(~c"25", [{:d, :OTP_BELOW_25}]) ++
|
||||
if_version_below(~c"26", [{:d, :OTP_BELOW_26}]) ++
|
||||
if_version_below(~c"27", [{:d, :OTP_BELOW_27}]) ++
|
||||
if_version_below(~c"27", [{:feature, :maybe_expr, :enable}]) ++
|
||||
if_version_below(~c"28", [{:d, :OTP_BELOW_28}])
|
||||
defines = for {:d, value} <- result, do: {:d, value}
|
||||
result ++ [{:d, :ALL_DEFS, defines}]
|
||||
@@ -110,7 +100,7 @@ defmodule Ejabberd.MixProject do
|
||||
{config(:debug), :debug_info},
|
||||
{not config(:debug), {:debug_info, false}},
|
||||
{config(:roster_gateway_workaround), {:d, :ROSTER_GATEWAY_WORKAROUND}},
|
||||
{config(:new_sql_schema), {:d, :NEW_SQL_SCHEMA}}
|
||||
{config(:multihost_sql_schema), {:d, :MULTIHOST_SQL_SCHEMA}}
|
||||
], do:
|
||||
option
|
||||
end
|
||||
@@ -119,19 +109,20 @@ defmodule Ejabberd.MixProject do
|
||||
[{:cache_tab, "~> 1.0"},
|
||||
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
|
||||
{:eimp, "~> 1.0"},
|
||||
{:erlydtl, "~> 0.14.0"},
|
||||
{:ex_doc, "~> 0.31", only: [:edoc], runtime: false},
|
||||
{:fast_tls, "~> 1.1.22"},
|
||||
{:fast_xml, "~> 1.1.53"},
|
||||
{:fast_tls, "~> 1.1.24"},
|
||||
{:fast_xml, "~> 1.1.56"},
|
||||
{:fast_yaml, "~> 1.0"},
|
||||
{:idna, "~> 6.0"},
|
||||
{:idna, "~> 7.1"},
|
||||
{:mqtree, "~> 1.0"},
|
||||
{:p1_acme, "~> 1.0"},
|
||||
{:p1_acme, ">= 1.0.28"},
|
||||
{:p1_oauth2, "~> 0.6"},
|
||||
{:p1_utils, "~> 1.0"},
|
||||
{:pkix, "~> 1.0"},
|
||||
{:stringprep, ">= 1.0.26"},
|
||||
{:xmpp, "~> 1.10.0"},
|
||||
{:yconf, ">= 1.0.18"}]
|
||||
{:xmpp, ">= 1.13.1"},
|
||||
{:yconf, ">= 1.0.22"}]
|
||||
++ cond_deps()
|
||||
end
|
||||
|
||||
@@ -155,13 +146,12 @@ defmodule Ejabberd.MixProject do
|
||||
{config(:redis), {:eredis, "~> 1.7.1"}},
|
||||
{config(:sip), {:esip, "~> 1.0"}},
|
||||
{config(:zlib), {:ezlib, "~> 1.0"}},
|
||||
{if_version_above(~c"23", true), {:jose, "~> 1.11.10"}},
|
||||
{if_version_below(~c"24", true), {:jose, "1.11.1", override: true}},
|
||||
{if_version_below(~c"27", true), {:jiffy, "~> 1.1.1"}},
|
||||
{if_version_below(~c"22", true), {:lager, "~> 3.9.1"}},
|
||||
{if_version_below(~c"26", true), {:jose, "1.11.10", override: true}},
|
||||
{if_version_above(~c"25", true), {:jose, "~> 1.11.12"}},
|
||||
{config(:lua), {:luerl, "~> 1.2.0"}},
|
||||
{config(:mysql), {:p1_mysql, ">= 1.0.24"}},
|
||||
{config(:pgsql), {:p1_pgsql, ">= 1.1.32"}},
|
||||
{config(:mysql), {:p1_mysql, ">= 1.0.28"}},
|
||||
{config(:pgsql), {:p1_pgsql, ">= 1.1.38"}},
|
||||
{config(:sqlite), {:sqlite3, "~> 1.1"}},
|
||||
{config(:stun), {:stun, "~> 1.0"}}], do:
|
||||
dep
|
||||
@@ -182,7 +172,6 @@ defmodule Ejabberd.MixProject do
|
||||
{config(:redis), :eredis},
|
||||
{Mix.env() == :edoc, :ex_doc},
|
||||
{Mix.env() == :test, :dialyxir},
|
||||
{if_version_below(~c"22", true), :lager},
|
||||
{config(:mysql), :p1_mysql},
|
||||
{config(:sip), :esip},
|
||||
{config(:odbc), :odbc},
|
||||
@@ -229,35 +218,6 @@ defmodule Ejabberd.MixProject do
|
||||
end
|
||||
end
|
||||
|
||||
defp elixir_required_version do
|
||||
case {Map.get(System.get_env(), "RELIVE", "false"),
|
||||
MapSet.member?(MapSet.new(System.argv()), "release")}
|
||||
do
|
||||
{"true", _} ->
|
||||
case Version.match?(System.version(), "~> 1.11") do
|
||||
false ->
|
||||
IO.puts("ERROR: To use 'make relive', Elixir 1.11.0 or higher is required.")
|
||||
_ -> :ok
|
||||
end
|
||||
"~> 1.11"
|
||||
{_, true} ->
|
||||
case Version.match?(System.version(), "~> 1.10") do
|
||||
false ->
|
||||
IO.puts("ERROR: To build releases, Elixir 1.10.0 or higher is required.")
|
||||
_ -> :ok
|
||||
end
|
||||
case Version.match?(System.version(), "< 1.11.4")
|
||||
and :erlang.system_info(:otp_release) > ~c"23" do
|
||||
true ->
|
||||
IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.")
|
||||
_ -> :ok
|
||||
end
|
||||
"~> 1.10"
|
||||
_ ->
|
||||
"~> 1.4"
|
||||
end
|
||||
end
|
||||
|
||||
defp releases do
|
||||
maybe_tar = case Mix.env() do
|
||||
:prod -> [:tar]
|
||||
@@ -296,22 +256,8 @@ defmodule Ejabberd.MixProject do
|
||||
ro = "rel/overlays"
|
||||
File.rm_rf(ro)
|
||||
|
||||
# Elixir lower than 1.12.0 don't have System.shell
|
||||
execute = fn(command) ->
|
||||
case function_exported?(System, :shell, 1) do
|
||||
true ->
|
||||
System.shell(command, into: IO.stream())
|
||||
false ->
|
||||
:os.cmd(to_charlist(command))
|
||||
end
|
||||
end
|
||||
|
||||
# Mix/Elixir lower than 1.11.0 use config/releases.exs instead of runtime.exs
|
||||
case Version.match?(System.version(), "~> 1.11") do
|
||||
true ->
|
||||
:ok
|
||||
false ->
|
||||
execute.("cp config/runtime.exs config/releases.exs")
|
||||
System.shell(command, into: IO.stream())
|
||||
end
|
||||
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.template > ejabberdctl.example1")
|
||||
@@ -389,6 +335,7 @@ defmodule Ejabberd.MixProject do
|
||||
"CONTRIBUTORS.md": [title: "Contributors"],
|
||||
"CODE_OF_CONDUCT.md": [title: "Code of Conduct"],
|
||||
"CHANGELOG.md": [title: "ChangeLog"],
|
||||
"SECURITY.md": [title: "Security Policy"],
|
||||
"COPYING": [title: "Copying License"],
|
||||
"_build/edoc/docs.md": [title: "⟹ ejabberd Docs"]
|
||||
],
|
||||
|
||||
@@ -1,39 +1,34 @@
|
||||
%{
|
||||
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
|
||||
"cache_tab": {:hex, :cache_tab, "1.0.31", "e4097b50a6f373ab1e0a5f01bab0bef6626771a4cd6c93404ed6d54810e11fbc", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8582b60a4a09b247ef86355ba9e07fce9e11edc0345a775c9171f971c72b6351"},
|
||||
"dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
|
||||
"cache_tab": {:hex, :cache_tab, "1.0.34", "935902ac8300d30f17c24f4d4056175f053ccc0572acab5fb4d1ce503831bee1", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "0db9f317f3941c17c9f8ea8125e25efa27bbed4cbf24a42c426fada74c82b692"},
|
||||
"dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"},
|
||||
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
|
||||
"eimp": {:hex, :eimp, "1.0.24", "853db317ba394d479d2f1181e0b0135a3cd3c2c7eb48ff6cfb035a28dd354b14", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7d61432eb8a45659c0be475f44e75eeb651743aa64a1de8adf785cdad81961ad"},
|
||||
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
|
||||
"eimp": {:hex, :eimp, "1.0.27", "14bf9e6fac791d0c098708cbc5a0928746ed575869f4ce42a266643947790a3a", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3c7e83e293bcfaf50a1bf054fc4b62b7b8c484a6e4218e397709a4d0d857f3fc"},
|
||||
"eredis": {:hex, :eredis, "1.7.1", "39e31aa02adcd651c657f39aafd4d31a9b2f63c6c700dc9cece98d4bc3c897ab", [:mix, :rebar3], [], "hexpm", "7c2b54c566fed55feef3341ca79b0100a6348fd3f162184b7ed5118d258c3cc1"},
|
||||
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
|
||||
"esip": {:hex, :esip, "1.0.57", "4b14e4832d08b9ffc10d855b5d10b3083232b1d53deb4c046679496ce85569c4", [:rebar3], [{:fast_tls, "1.1.22", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.17", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "19c357e1817b1e04792ef359bf900400f3e6d0e5ade929fd72f88ea9b44af2ed"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.37.3", "f7816881a443cd77872b7d6118e8a55f547f49903aef8747dbcb345a75b462f9", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "e6aebca7156e7c29b5da4daa17f6361205b2ae5f26e5c7d8ca0d3f7e18972233"},
|
||||
"erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"},
|
||||
"erlydtl": {:hex, :erlydtl, "0.14.0", "964b2dc84f8c17acfaa69c59ba129ef26ac45d2ba898c3c6ad9b5bdc8ba13ced", [:rebar3], [], "hexpm", "d80ec044cd8f58809c19d29ac5605be09e955040911b644505e31e9dd8143431"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.40.1", "67542e4b6dde74811cfd580e2c0149b78010fd13001fda7cfeb2b2c2ffb1344d", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "bcef0e2d360d93ac19f01a85d58f91752d930c0a30e2681145feea6bd3516e00"},
|
||||
"exsync": {:hex, :exsync, "0.4.1", "0a14fe4bfcb80a509d8a0856be3dd070fffe619b9ba90fec13c58b316c176594", [:mix], [{:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "cefb22aa805ec97ffc5b75a4e1dc54bcaf781e8b32564bf74abbe5803d1b5178"},
|
||||
"ezlib": {:hex, :ezlib, "1.0.13", "3c7f62862850a241159c10b218ecf580bce54d0890601b65144dacc2633be2b0", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "9ee62ab3f8ed55a0fd11a9569fcb8e458683f95575417272192b069f092abfbb"},
|
||||
"fast_tls": {:hex, :fast_tls, "1.1.22", "44356b256afad4399c2fc5059a3066669dafd8bd4e4e796c9c1cf8910ddd265e", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e65779aefb7ab15c4755230fef8077e687d20cc5a3984a5974f9f657e8e2485b"},
|
||||
"fast_xml": {:hex, :fast_xml, "1.1.55", "ace020f2521f2a484ac8467d2822af85534a346e2aae03ffcbc34f29318befaf", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "83f3e23a780ed5f567cdec73953f06c95b838d709dbfa86b59a98a8d23c99f85"},
|
||||
"fast_yaml": {:hex, :fast_yaml, "1.0.37", "f71d472fbf787ccd161b914d1eb486116a0f4f2e835337a378fbd31b59d2e74b", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8de868721bf7e2172414f7d3148ede0f3c922b496455cd625dd5c4429515a769"},
|
||||
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
|
||||
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
||||
"jiffy": {:hex, :jiffy, "1.1.2", "a9b6c9a7ec268e7cf493d028f0a4c9144f59ccb878b1afe42841597800840a1b", [:rebar3], [], "hexpm", "bb61bc42a720bbd33cb09a410e48bb79a61012c74cb8b3e75f26d988485cf381"},
|
||||
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
|
||||
"luerl": {:hex, :luerl, "1.2.3", "df25f41944e57a7c4d9ef09d238bc3e850276c46039cfc12b8bb42eccf36fcb1", [:rebar3], [], "hexpm", "1b4b9d0ca5d7d280d1d2787a6a5ee9f5a212641b62bff91556baa53805df3aed"},
|
||||
"ezlib": {:hex, :ezlib, "1.0.16", "8e0f209cb61db4034a3e7c920f21dd36330ba45884e707746898d5ee0db487c1", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b4819540403d1ecb7eae645fdff142a8db2b476d893288d39babb92922250405"},
|
||||
"fast_tls": {:hex, :fast_tls, "1.1.26", "5e46246020f9338c0661254eee0ff98e8b253a2331b3b51afb4eb8b0b3cf41ff", [:rebar3], [{:p1_utils, "~> 1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6b0d4dd2309037565ebaa9acf39f02808f5f8215a39101a1da33c2a5b1b59b3f"},
|
||||
"fast_xml": {:hex, :fast_xml, "1.1.58", "1fcfdfb58c4278dc1a163e68d1f83ba165553b1a68d48bf7e9954bb4fbf8571e", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a36d6e03a398c53ba189e912bf4c7559a3704ac63c5050f126d47414018b4ca0"},
|
||||
"fast_yaml": {:hex, :fast_yaml, "1.0.40", "053109abed40a80fb1e4a231ebfed39e93a4872d73e462fe9a2128503b6233d8", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "27705c29902c1c6f3268ba9bf387d5fa928b2e655b53110fa47b8e476d32b386"},
|
||||
"file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"},
|
||||
"idna": {:hex, :idna, "7.1.0", "1067a13043538129602d2f2ce6899d8713125c7d19734aa557ce2e3ea55bd4f1", [:rebar3], [], "hexpm", "6ae959a025bf36df61a8cab8508d9654891b5426a84c44d82deaffd6ddf8c71f"},
|
||||
"jose": {:hex, :jose, "1.11.12", "06e62b467b61d3726cbc19e9b5489f7549c37993de846dfb3ee8259f9ed208b3", [:mix, :rebar3], [], "hexpm", "31e92b653e9210b696765cdd885437457de1add2a9011d92f8cf63e4641bab7b"},
|
||||
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
|
||||
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
|
||||
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
|
||||
"mqtree": {:hex, :mqtree, "1.0.17", "82f54b8f2d22b4445db1d6cccb7fe9ead049d61410c29e32475f3ceb3ee62a89", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "5fe8b7cf8fbc4783d0fceb94654ac2bbf3242a58cd0397d249ded8ae021be2a3"},
|
||||
"makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"},
|
||||
"mqtree": {:hex, :mqtree, "1.0.20", "aec4b0299dfe3680014d32fd44069f8273867ce8c7d8f09492d2befdddd98598", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "5ec0e07b9c48a7840649600bf96e140b4fbe9e5017e1ddd3e898e15c0a383ed0"},
|
||||
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
|
||||
"p1_acme": {:hex, :p1_acme, "1.0.25", "db91f0d6c193cd1d5c0b0fa3939a898dbf56a6075db4347cde26e802715de50c", [:rebar3], [{:base64url, "~> 1.0", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "~> 1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.17", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "a7b55b47495ddb4f98a15e65451ec3ad43f4637b955c74cd695d98e6a645d08c"},
|
||||
"p1_mysql": {:hex, :p1_mysql, "1.0.26", "574d07c9936c53b1ec3556db3cf064cc14a6c39039835b3d940471bfa5ac8e2b", [:rebar3], [], "hexpm", "ea138083f2c54719b9cf549dbf5802a288b0019ea3e5449b354c74cc03fafdec"},
|
||||
"p1_acme": {:hex, :p1_acme, "1.0.31", "d504620b4cb3349c9389f169481c5d88a149a44def58f4b52c6f0036cac314d0", [:rebar3], [{:idna, "~> 7.1", [hex: :idna, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.12", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.22", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "9b5922a90ab94da5889e64de5ccad3adc6e68a6d3c3fb708dd503757b232db1c"},
|
||||
"p1_mysql": {:hex, :p1_mysql, "1.0.28", "8cffdfae7b3341dcd808fb723a3fcaeee3e55b9c971b7f75f6b0d7af6a3151e6", [:rebar3], [], "hexpm", "6e4d00e8ece505ba5091c8dab3aefe415cf2d836ff39508344c3527b366d9919"},
|
||||
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
|
||||
"p1_pgsql": {:hex, :p1_pgsql, "1.1.32", "3f95d7e3413fc8f0be80abb4be1a0d7f67066a36905085cd5a423145598b0cb0", [:rebar3], [{:xmpp, "~> 1.10.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "268b01e8f4eb75c211a31495a25c2815c549aecce2f0df1a161c6e0a2cde061e"},
|
||||
"p1_utils": {:hex, :p1_utils, "1.0.26", "67b0c4ac9fa3ba3ef563b31aa111b0a004439a37fac85e027f1c3617e1c7ec6c", [:rebar3], [], "hexpm", "d0379e8c1156b98bd64f8129c1de022fcca4f2fdb7486ce73bf0ed2c3376b04c"},
|
||||
"p1_pgsql": {:hex, :p1_pgsql, "1.1.41", "b67cadb9079f809154d829a5eb5374619a60befd4da112ff59a759ea723548e1", [:rebar3], [{:stringprep, "~> 1.0.33", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "26ee2aba3d450464edd4b3ff9dab2c6a53fc20bbfd330a6973982b906504a172"},
|
||||
"p1_utils": {:hex, :p1_utils, "1.0.29", "e3a8621c2cf5ecde52065b4c6650803e25fdd9462f92dec96f29032a163cbb0d", [:rebar3], [], "hexpm", "2071421cadb5b8fff114e91d4d944f14851c332391f6e93fc5011aad64abe1b9"},
|
||||
"pkix": {:hex, :pkix, "1.0.10", "d3bfadf7b7cfe2a3636f1b256c9cce5f646a07ce31e57ee527668502850765a0", [:rebar3], [], "hexpm", "e02164f83094cb124c41b1ab28988a615d54b9adc38575f00f19a597a3ac5d0e"},
|
||||
"sqlite3": {:hex, :sqlite3, "1.1.15", "e819defd280145c328457d7af897d2e45e8e5270e18812ee30b607c99cdd21af", [:rebar3], [], "hexpm", "3c0ba4e13322c2ad49de4e2ddd28311366adde54beae8dba9d9e3888f69d2857"},
|
||||
"stringprep": {:hex, :stringprep, "1.0.31", "fa1688c156dd271722aa18c423a4163e710d2f4f475ad0bc220910df669b53af", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e9699c88e8db16b3a41f0e45ac6874a4da81a6e4854a77d76ede6d09b08e3530"},
|
||||
"stun": {:hex, :stun, "1.2.17", "c54614a592812ea125a2e6827aac5a438571b591616426ec1419ba9b48252f54", [:rebar3], [{:fast_tls, "1.1.22", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6b318244c21e8524a9aae3ac9a05cd8234ee994c1c2c815de68d306086ad768d"},
|
||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
|
||||
"xmpp": {:hex, :xmpp, "1.10.0", "68a6dff8db8987c4592b2d5dd71d3f947b4ebd15209c9acaca5909a642670630", [:rebar3], [{:ezlib, "~> 1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "~> 1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "~> 1.1.51", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "ceeae43b8fe97649d8f8546b3f7f2b38ecfc931c0cdd5c7445ffb3f80fcb7d85"},
|
||||
"yconf": {:hex, :yconf, "1.0.18", "e565edc8aabb8164c3bebc86969095d296ad315dcbb46af65dccbc6c71eae0f6", [:rebar3], [{:fast_yaml, "1.0.37", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "fa950ec6503f92d6417fb8cc1d982403f041697e8e1bbf4d4588fb919b9562ea"},
|
||||
"stringprep": {:hex, :stringprep, "1.0.34", "b9d592c684e540c4cb867485742635ebc4738925bc28f411302db883baf44a49", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "27e78ea371881764e056fbe845d3ad304740ff5e3131bc1f38a66f0baa8c9b47"},
|
||||
"stun": {:hex, :stun, "1.2.22", "bfacc08bd3724968de6d2a4acfa9761232cebef9ff6bd9ff8b000e4bb4ce92a4", [:rebar3], [{:fast_tls, "1.1.26", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3408b4b11d5237a088f53b260a06940c30b16f4a48094892d6a9204e1643188a"},
|
||||
"xmpp": {:hex, :xmpp, "1.13.1", "b75831a205a286478aa0dc122b91199ab125e14032e452d1aca4276ee4d44c42", [:rebar3], [{:ezlib, "~> 1.0.16", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "~> 1.1.26", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "~> 1.1.58", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "~> 7.1", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "~> 1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.34", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "a024eef7ccb4f78b9fb52e37d6385a57bdd150be75e50d51bbcbaf39a9ab883d"},
|
||||
"yconf": {:hex, :yconf, "1.0.23", "1aa5ac72c007b80818ded5b65f76cfc98694b07b2da18202498ec4a4aefe191f", [:rebar3], [{:fast_yaml, "1.0.40", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "25b4dfb75328026acaa774cf5c6fb87d48b55eebce630ddaa3362441dac31437"},
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"name": "ejabberd",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "ejabberd",
|
||||
"version": "1.0.0",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"bootstrap": "^5.3.8",
|
||||
"jquery": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@popperjs/core": {
|
||||
"version": "2.11.8",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
||||
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/bootstrap": {
|
||||
"version": "5.3.8",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
|
||||
"integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/twbs"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bootstrap"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@popperjs/core": "^2.11.8"
|
||||
}
|
||||
},
|
||||
"node_modules/jquery": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz",
|
||||
"integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==",
|
||||
"license": "MIT"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "ejabberd",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"bootstrap": "^5.3.8",
|
||||
"jquery": "^4.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"postinstall": "npm run -s clean && npm run -s mkdir-jquery && npm run -s cp-jquery && npm run -s cp-bootstrap",
|
||||
"clean": "rm -rf priv/mod_invites/static/{jquery,bootstrap}",
|
||||
"mkdir-jquery": "mkdir -p priv/mod_invites/static/jquery",
|
||||
"cp-jquery": "cp node_modules/jquery/dist/jquery.min.js priv/mod_invites/static/jquery/jquery.min.js",
|
||||
"cp-bootstrap": "cp -r node_modules/bootstrap/dist priv/mod_invites/static/bootstrap"
|
||||
}
|
||||
}
|
||||
@@ -131,9 +131,12 @@ ul li #navhead a, ul li #navheadsub a, ul li #navheadsubsub a {
|
||||
background: #424a55;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#navitemlogin-start {
|
||||
border-top: 0.2em solid #cae7e4;
|
||||
}
|
||||
#navitemlogin {
|
||||
padding: 0.5em;
|
||||
border-top: 0.2em solid #cae7e4;
|
||||
border-bottom: 0.2em solid #cae7e4;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<div class="container mb-0">
|
||||
<div class="row">
|
||||
{% for item in apps %}
|
||||
<div class="card mx-0 mb-3 me-3 client-card {% for platform in item.platforms %}app-platform-{{ platform|lower }} {% endfor %}flex-wrap col-sm-12 col-md-8 col-lg-5">
|
||||
<div class="row no-gutters h-100">
|
||||
<div class="col-md-4 pt-2 mt-1">
|
||||
<img src="{{ static }}/{{ item.image }}" class="p-2 img-fluid" alt="{{ item.alttext }}">
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<div class="card-body d-flex flex-column h-100">
|
||||
<h3 class="card-title text-nowrap mb-1 h5">{{ item.name }}</h3>
|
||||
<div>
|
||||
{% for platform in item.platforms %}<span class="badge text-bg-info client-platform-badge client-platform-badge-{{ platform|lower }} me-1 mb-3">{{ platform }}</span>{% endfor %}
|
||||
</div>
|
||||
<p class="card-text">{{ item.text }}</p>
|
||||
<a href="{{ item.proceed_url }}" class="btn btn-primary mt-md-auto" tabindex="{{ forloop.counter|add:2 }}">{% if item.select_text %}{{ item.select_text }}{% else %}{% trans "Select" %}{% endif %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div id="show-all-clients-button-container" class="d-none alert alert-info mb-0">
|
||||
{% blocktrans with tabidx=apps|length|add:2 %}Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex="{{ tabidx }}">view all apps.</a>{% endblocktrans %}
|
||||
</div>
|
||||
@@ -0,0 +1,196 @@
|
||||
[
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"image": "{{ static }}/logos/google_ps.png",
|
||||
"alttext": "{% trans 'Google Play Store Logo' %}",
|
||||
"url": "https://play.google.com/store/apps/details?id=eu.siacs.conversations",
|
||||
"magic_link_format": "https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer={{ uri }}"
|
||||
},
|
||||
{
|
||||
"image": "{{ static }}/logos/fdroid.png",
|
||||
"alttext": "{% trans 'F-Droid Store Logo' %}",
|
||||
"url": "https://f-droid.org/en/packages/eu.siacs.conversations/",
|
||||
"magic_link_format": "https://f-droid.org/packages/eu.siacs.conversations/"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/conversations.svg",
|
||||
"alttext": "{% trans 'Conversations Logo' %}",
|
||||
"link": "https://play.google.com/store/apps/details?id=eu.siacs.conversations",
|
||||
"magic_link_format": "https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer={{ uri }}",
|
||||
"name": "Conversations",
|
||||
"platforms": [
|
||||
"Android"
|
||||
],
|
||||
"supports_preauth_uri": true,
|
||||
"text": "{% trans 'Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"image": "{{ static }}/logos/apple_as.svg",
|
||||
"alttext": "{% trans 'Apple Store Logo' %}",
|
||||
"target": "_blank",
|
||||
"url": "https://apps.apple.com/app/id317711500"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/monal-tmp.svg",
|
||||
"alttext": "{% trans 'Monal Logo' %}",
|
||||
"link": "https://monal-im.org/",
|
||||
"name": "Monal",
|
||||
"platforms": [
|
||||
"iOS", "iPadOS"
|
||||
],
|
||||
"supports_preauth_uri": true,
|
||||
"text": "{% trans 'A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"image": "{{ static }}/logos/apple_as.svg",
|
||||
"alttext": "{% trans 'Apple Store Logo' %}",
|
||||
"target": "_blank",
|
||||
"url": "https://apps.apple.com/app/id1637078500"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/monal-tmp.svg",
|
||||
"alttext": "{% trans 'Monal Logo' %}",
|
||||
"link": "https://monal-im.org/",
|
||||
"name": "Monal (macOS)",
|
||||
"platforms": [
|
||||
"macOS"
|
||||
],
|
||||
"supports_preauth_uri": true,
|
||||
"text": "{% trans 'A modern open-source chat client for Mac. It is easy to use and has a clean user interface.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"image": "{{ static }}/logos/google_ps.png",
|
||||
"alttext": "{% trans 'Google Play Store Logo' %}",
|
||||
"url": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient",
|
||||
"magic_link_format": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient&referrer={{ uri }}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/yaxim.svg",
|
||||
"link": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient",
|
||||
"magic_link_format": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient&referrer={{ uri }}",
|
||||
"name": "yaxim",
|
||||
"platforms": [
|
||||
"Android"
|
||||
],
|
||||
"supports_preauth_uri": true,
|
||||
"text": "{% trans 'A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"image": "{{ static }}/logos/apple_as.svg",
|
||||
"alttext": "{% trans 'Apple Store Logo' %}",
|
||||
"target": "_blank",
|
||||
"url": "https://apps.apple.com/us/app/siskin-im/id1153516838"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/siskin-im.svg",
|
||||
"alttext": "{% trans 'Siskin IM Logo' %}",
|
||||
"link": "https://apps.apple.com/us/app/siskin-im/id1153516838",
|
||||
"name": "Siskin IM",
|
||||
"platforms": [
|
||||
"iOS", "iPadOS"
|
||||
],
|
||||
"supports_preauth_uri": true,
|
||||
"text": "{% trans 'A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"target": "_blank",
|
||||
"text": "{% trans 'Download from Mac App Store' %}",
|
||||
"url": "https://apps.apple.com/us/app/beagle-im/id1445349494"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/beagle-im.svg",
|
||||
"alttext": "{% trans 'Beagle IM Logo' %}",
|
||||
"link": "https://apps.apple.com/us/app/beagle-im/id1445349494",
|
||||
"name": "Beagle IM",
|
||||
"platforms": [
|
||||
"macOS"
|
||||
],
|
||||
"setup": {
|
||||
"text": "{% trans 'Launch Beagle IM, and select \'Yes\' to add a new account. Click the \'+\' button under the empty account list and then enter your credentials.' %}"
|
||||
},
|
||||
"text": "{% trans 'Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"target": "_blank",
|
||||
"text": "{% trans 'Download Dino for Linux' %}",
|
||||
"url": "https://dino.im/#download"
|
||||
}
|
||||
],
|
||||
"text": "{% trans 'Click the button to open the Dino website where you can download and install it on your PC.' %}"
|
||||
},
|
||||
"image": "logos/dino.svg",
|
||||
"alttext": "{% trans 'Dino Logo' %}",
|
||||
"link": "https://dino.im/",
|
||||
"name": "Dino",
|
||||
"platforms": [
|
||||
"Linux"
|
||||
],
|
||||
"text": "{% trans 'A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"target": "_blank",
|
||||
"text": "{% trans 'Download Gajim' %}",
|
||||
"url": "https://gajim.org/download/"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/gajim.svg",
|
||||
"alttext": "{% trans 'Gajim Logo' %}",
|
||||
"link": "https://gajim.org/",
|
||||
"name": "Gajim",
|
||||
"platforms": [
|
||||
"Windows",
|
||||
"Linux",
|
||||
"macOS"
|
||||
],
|
||||
"text": "{% trans 'A fully-featured desktop chat client for Windows and Linux.' %}"
|
||||
},
|
||||
{
|
||||
"download": {
|
||||
"buttons": [
|
||||
{
|
||||
"target": "_blank",
|
||||
"text": "{% trans 'Download Renga for Haiku' %}",
|
||||
"url": "https://depot.haiku-os.org/#!/pkg/renga?bcguid=bc233-PQIA"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image": "logos/renga.svg",
|
||||
"alttext": "{% trans 'Renga Logo' %}",
|
||||
"link": "https://pulkomandy.tk/projects/renga",
|
||||
"name": "Renga",
|
||||
"platforms": [
|
||||
"Haiku"
|
||||
],
|
||||
"text": "{% trans 'XMPP client for Haiku' %}"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,41 @@
|
||||
{% extends "base_min.html" %}
|
||||
|
||||
{% block rel_alternate %}<link rel="alternate" href="{{ uri }}">{% endblock %}
|
||||
|
||||
{% block qr_button %}
|
||||
<div id="qr-button-container" class="float-end w-25 border border-info p-3 ms-3 d-none">
|
||||
{% trans "<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera." %}
|
||||
<button id="qr-modal-show" class="mt-2 mx-auto d-block btn btn-info" title="{% trans "Send this invite to your device" %}"
|
||||
data-bs-toggle="modal" data-bs-target="#qr-modal" tabindex="1">
|
||||
{% trans "Scan with mobile device" %}
|
||||
</button>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block qr_code %}
|
||||
<div class="modal" tabindex="-1" role="dialog" id="qr-modal">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title h5">{% trans "Scan invite code" %}</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>{% trans "You can transfer this invite to your mobile device by scanning a code with your camera." %}</p>
|
||||
<div id="qr-info-url" class="tab-pane show active">
|
||||
<p>{% trans "Use a <em>QR code</em> scanner on your mobile device to scan the code below:" %}</p>
|
||||
<div id="qr-invite-page" class="bg-light mx-auto"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-bs-dismiss="modal" tabindex="2">{% trans "Close" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_scripts %}
|
||||
<script src="{{ static }}/qrcode.min.js" integrity="sha384-XfbBihCQqSDyejklP5yun2CbVxqR+2eNfx0Fhx5pQAfN5ypWGhSBjXaXr5g6X4DE"></script>
|
||||
<script src="{{ static }}/platform.min.js" integrity="sha384-nziKWRrD67nso9WErLVLhgT7AobHh6aYfNgqgINmJrtZ92V9aNTaOpvDFkcneToL"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ lang }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}{% trans "Invite" %} | {{ site_name }}{% endblock %}</title>
|
||||
{% block rel_alternate %}{% endblock %}
|
||||
<link rel="stylesheet" href="{{ static }}/bootstrap/css/bootstrap.min.css" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="{{ static }}/favicon.png">
|
||||
<meta name="msapplication-TileColor" content="#4acac3">
|
||||
<meta name="theme-color" content="#4acac3">
|
||||
<link rel="stylesheet" href="{{ static }}/invite.css" integrity="sha384-k6usDEL8f5OYugdzmHwAlWjdQA/YkOZre60c604zXvE9fSJpptDg2jzE2PaQ5/c+">
|
||||
</head>
|
||||
<body>
|
||||
<div id="form" class="{% block form_class %}container col-md-10 col-md-offset-1 col-sm-8 col-sm-offset-2 col-lg-10 col-lg-offset-1 my-3 mt-md-5{% endblock %}">
|
||||
<div class="card rounded-2 shadow">
|
||||
<h1 class="card-header">{%block h1 %}{% blocktrans %}Invite to {{ site_name }}{% endblocktrans %}{% endblock %}</h1>
|
||||
<div class="card-body">
|
||||
{% block qr_button %}{% endblock %}
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% block qr_code %}{% endblock %}
|
||||
{% block extra_scripts %}{% endblock %}
|
||||
<script src="{{ static }}/jquery/jquery.min.js" integrity="sha384-fgGyf7Mo7DURSOMnOy7ed+dkq5Job205Gnzu6QIg0BOHKaqt4D76Dt8VlDCzcMHV"></script>
|
||||
<script src="{{ static }}/bootstrap/js/bootstrap.min.js" integrity="sha384-G/EV+4j2dNv+tEPo3++6LCgdCROaejBqfUeNjuKAiuXbjrxilcCdDz6ZAVfHWe1Y"></script>
|
||||
<script src="{{ static }}/invite.js" integrity="sha384-ov8LmXw6nEmT+QvXBRPMol0e90WFX9ZysvQudQ7H+nYDyolH4K/+GKJhq7qmTk4T"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,72 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{% trans "Create Account" %} | {{ app.name }} | {{ site_name }}{% endblock %}
|
||||
{% block h1 %}{% blocktrans with app_name=app.name %}Join {{ site_name }} with {{ app_name }}{% endblocktrans %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<p>{% if invite.inviter|user %}
|
||||
{% blocktrans with inviter=invite.inviter|user %}You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
|
||||
{% else %}
|
||||
{% blocktrans %}You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
|
||||
{% endif %}</p>
|
||||
|
||||
<div class="bd-callout bd-callout-info col-12 col-md-8">
|
||||
<svg class="svg-inline--fa fa-lightbulb fa-w-11 text-warning" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lightbulb" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" data-fa-i2svg=""><path fill="currentColor" d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z"></path></svg>
|
||||
{% blocktrans with app_name=app.name %}You can start chatting right away with {{ app_name }}. Let's get started!{% endblocktrans %}
|
||||
</div>
|
||||
|
||||
<div class="card client-card {% for item in app.platforms %}app-platform-{{ item|lower }} {% endfor %} flex-wrap col-sm-12 col-md-8 col-lg-5 p-3 my-3">
|
||||
<div class="row no-gutters h-100">
|
||||
<div class="col-md-4">
|
||||
<img src="{{ static }}/{{ app.image }}" class="img-fluid" alt="{{ app.alttext }}">
|
||||
</div>
|
||||
<div class="col-md-8 h-100 ps-md-1">
|
||||
<div class="card-body d-flex flex-column h-100 pb-0 p-md-0">
|
||||
<h3 class="card-title text-nowrap mb-1 h5">{{ app.name }}</h3>
|
||||
<div>
|
||||
{% for item in app.platforms %}<span class="badge text-bg-info client-platform-badge client-platform-badge-{{ item|lower }} me-1 mb-3">{{ item }}</span> {% endfor %}
|
||||
</div>
|
||||
<p class="card-text">{{ app.text }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 class="h3 alert alert-info p-2" clear-both">{% blocktrans with app_name=app.name %}Step 1: Install {{ app_name }}{% endblocktrans %}</h2>
|
||||
|
||||
<p>{% if app.download.text %}{{ app.download.text }}{% else %}{% blocktrans with app_name=app.name %}Download and install {{ app_name }} below:{% endblocktrans %}{% endif %}</p>
|
||||
|
||||
<div class="ms-5">
|
||||
{% for button in app.download.buttons %}
|
||||
{% if button.image %}
|
||||
<a href="{% if button.magic_link %}{{ button.magic_link }}{% else %}{{ button.url }}{% endif %}" {% if button.target %}target="{{ button.target }}"{% endif %} rel="noopener" tabindex="3">
|
||||
<img src="{{ button.image }}" {% if button.alttext %}alt="{{ button.alttext }}"{% endif %} class="invite-download-button">
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if button.text %}
|
||||
<a href="{{ button.url }}" {% if button.target %}target="{{ button.target }}"{% endif %} class="btn btn-primary" rel="noopener" tabindex="4">
|
||||
{{ button.text }}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<p class="mt-3">{% blocktrans with app_name=app.name %}After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.{% endblocktrans %}</p>
|
||||
|
||||
<h2 class="h3 alert alert-info p-2">{% trans "Step 2: Activate your account" %}</h2>
|
||||
|
||||
<p>{% trans "Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:" %}</p>
|
||||
|
||||
<div class="w-100 text-center text-md-start">
|
||||
<a href="{{ uri }}" id="uri-cta" class="btn btn-success ms-md-5 mt-1 mb-3" tabindex="5">{% blocktrans with app_name=app.name %}Accept invite using {{ app_name }}{% endblocktrans %}</a><br/>
|
||||
</div>
|
||||
|
||||
<p>{% blocktrans with app_name=app.name %}After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.{% endblocktrans %}</p>
|
||||
<nav aria-label="{% trans 'Page navigation' %}">
|
||||
<ul class="pagination mb-0">
|
||||
<li class="page-item"><a tabindex="6" class="page-link" href="/{{ base }}/{{ token }}" aria-label="{% trans 'Previous' %}">
|
||||
<span aria-hidden="true">«</span>
|
||||
<span>{% trans "Previous" %}</span>
|
||||
</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,19 @@
|
||||
The file static/illus-empty.svg is included under the following
|
||||
license:
|
||||
|
||||
Copyright 2020 Katerina Limpitsouni
|
||||
|
||||
All images, assets and vectors published on unDraw can be used for free.
|
||||
You can use them for noncommercial and commercial purposes. You do not
|
||||
need to ask permission from or provide credit to the creator or unDraw.
|
||||
|
||||
More precisely, unDraw grants you an nonexclusive, worldwide copyright
|
||||
license to download, copy, modify, distribute, perform, and use the
|
||||
assets provided from unDraw for free, including for commercial purposes,
|
||||
without permission from or attributing the creator or unDraw. This
|
||||
license does not include the right to compile assets, vectors or images
|
||||
from unDraw to replicate a similar or competing service, in any form or
|
||||
distribute the assets in packs or otherwise. This extends to automated
|
||||
and non-automated ways to link, embed, scrape, search or download the
|
||||
assets included on the website without our consent.
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{% trans "Create Account" %} | {{ site_name }}{% endblock %}
|
||||
{% block content %}
|
||||
<p>{% if invite.inviter|user %}
|
||||
{% blocktrans with inviter=invite.inviter|user %}You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
|
||||
{% else %}
|
||||
{% blocktrans %}You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
|
||||
{% endif %}</p>
|
||||
<h2 class="card-title h5 clear-both">{% trans "Get started" %}</h2>
|
||||
<p>{% trans "To get started, you need to install an app for your platform:" %}</p>
|
||||
|
||||
{% include "apps.html" %}
|
||||
|
||||
<h2 class="h5 mt-3">{% trans "Other software" %}</h2>
|
||||
<p id="other-software" class="mb-0">{% blocktrans with tabidx=apps|length|add:3 %}You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href="{{ registration_url }}" tabindex='{{ tabidx }}'>register an account manually</a>.{% endblocktrans %}</p>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,10 @@
|
||||
{% extends "base_min.html" %}
|
||||
{% block title %}{% trans "Invite Expired" %} | {{ site_name }}{% endblock %}
|
||||
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
|
||||
{% block content %}
|
||||
<h2 class="card-title h5">{% trans "Invite expired" %}</h2>
|
||||
|
||||
<p>{% trans "Sorry, it looks like this invite code has expired!" %}</p>
|
||||
|
||||
<img class="w-100" alt="{% trans "Sad person holding empty box" %}" src="{{ static }}/illus-empty.svg">
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,72 @@
|
||||
{% extends "base_min.html" %}
|
||||
|
||||
{% block title %}{% if error %}{% trans "Registration Error" %}{% else %}{% trans "Registration Form" %}{% endif %} | {{ site_name }}{% endblock %}
|
||||
{% block h1 %}{% if error %}{% trans "Registration Error" %}{% else %}{% blocktrans %}Register on {{ site_name }}{% endblocktrans %}{% endif %}{% endblock %}
|
||||
|
||||
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<p>{% if app %}{% blocktrans with app_name=app.name %}<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.{% endblocktrans %}{% else %}{% blocktrans %}<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.{% endblocktrans %}{% endif %}</p>
|
||||
|
||||
<p>{%if invite.inviter %}{% blocktrans with inviter=invite.inviter|user %}Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.{% endblocktrans %}{% else %}{% blocktrans %}Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.{% endblocktrans %}{% endif %}</p>
|
||||
|
||||
{% if app %}{% if app.supports_preauth_uri %}
|
||||
<div class="alert alert-info">
|
||||
<p>{% blocktrans with app_name=app.name %}If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:{% endblocktrans %}</p>
|
||||
<p class="text-center h6">{% blocktrans with app_name=app.name %}{{ app_name }} already installed?{% endblocktrans %}</p>
|
||||
<div class="text-center">
|
||||
<a href="{{ uri }}"><button class="btn btn-secondary btn-sm">{% trans "Open the app" %}</button></a><br/>
|
||||
<small class="text-muted">{% trans "This button works only if you have the app installed already!" %}</small>
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
{% endif %}{% endif %}
|
||||
<h2 class="card-title h5">{% trans "Create an account" %}</h2>
|
||||
{%if error and error.class == 'undefined' %}<div class="alert alert-danger" role="alert">{{ error.text }}</div>{% endif %}
|
||||
<form method="post" class="needs-validation" novalidate>
|
||||
<div class="input-group mb-3">
|
||||
<label for="user" class="col-md-4 col-lg-12 form-label fw-bold">{% trans "Username" %}:</label>
|
||||
<div class="col-md-8 col-lg-12">
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text" name="user" class="form-control {% if error.class == 'username' %}is-invalid{% endif %}" aria-describedby="usernameHelp" tabindex="1"
|
||||
required autofocus minlength="1" maxlength="30" length="30"{% if username %} value="{{ username }}"{% endif %}>
|
||||
<div class="input-group-append">
|
||||
<span class="input-group-text">@{{ domain }}</span>
|
||||
</div>
|
||||
<div class="invalid-feedback">
|
||||
{% if error.class == 'username' %}{{ error.text }}{% else %}
|
||||
{% blocktrans %}Please provide a valid username!{% endblocktrans %}{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<small id="usernameHelp" class="d-block form-text text-muted">{% trans "Choose a username, this will become the first part of your new chat address." %}</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group mb-3">
|
||||
<label for="password" class="col-md-4 col-lg-12 form-label col-form-label fw-bold">{% trans "Password" %}:</label>
|
||||
<div class="col-md-8 col-lg-12">
|
||||
<input type="password" name="password" class="form-control {% if error.class == 'password' %}is-invalid{% endif %}" aria-describedby="passwordHelp" tabindex="2"
|
||||
autocomplete="new-password" required minlength="{{ password_min_length }}">
|
||||
<div class="invalid-feedback">
|
||||
{% if error.class == 'password' %}{{ error.text }}{% else %}
|
||||
{% blocktrans %}Please provide a password! Minimum length: {{ password_min_length }}{% endblocktrans %}{% endif %}
|
||||
</div>
|
||||
<small id="passwordHelp" class="form-text text-muted">{% trans "Enter a secure password that you do not use anywhere else." %}</small>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<input type="hidden" name="token" value="{{ token }}">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
||||
{% if app %}<input type="hidden" name="app_id" value="{{ app.id }}">{% endif %}
|
||||
<button type="submit" tabindex="3" class="btn btn-primary float-end">{% trans "Submit" %}</button>
|
||||
</div>
|
||||
</form>
|
||||
<nav aria-label="{% trans 'Page navigation' %}">
|
||||
<ul class="pagination mt-3 mb-0">
|
||||
<li class="page-item"><a tabindex="4" class="page-link" href="/{{ base }}/{{ token }}" aria-label="{% trans 'Previous' %}">
|
||||
<span aria-hidden="true">«</span>
|
||||
<span>{% trans "Previous" %}</span>
|
||||
</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,7 @@
|
||||
{% extends "base_min.html" %}
|
||||
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
|
||||
{% block content %}
|
||||
<h2 class="card-title h5">{% trans "Registration error" %}</h2>
|
||||
|
||||
<p>{% if message %}{{ message }}{% else %}{% trans "Sorry, there was a problem registering your account." %}{% endif %}</p>
|
||||
{% endblock%}
|
||||
@@ -0,0 +1,84 @@
|
||||
{% extends "base_min.html" %}
|
||||
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
|
||||
{% block title %}{% trans "Registration Success" %} | {{site_name}}{% endblock %}
|
||||
{% block h1 %}{{site_name}}{% endblock %}
|
||||
{% block content %}
|
||||
<h2 class="card-title h5">{% trans "Congratulations!" %}</h2>
|
||||
|
||||
<p>{% blocktrans %}You have created an account on <strong>{{ site_name }}</strong>.{% endblocktrans %}</p>
|
||||
|
||||
<p>{% trans "To start chatting, you need to enter your new account credentials into your chosen XMPP software." %}</p>
|
||||
|
||||
{% if webchat_url %}
|
||||
<div class="bd-callout bd-callout-info col-12">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-9">
|
||||
<svg class="svg-inline--fa fa-lightbulb fa-w-11 text-warning" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lightbulb" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" data-fa-i2svg=""><path fill="currentColor" d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z"></path></svg> {% trans "<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!" %}
|
||||
</div>
|
||||
<div class="col text-end mt-3 mt-md-0">
|
||||
<a class="btn btn-primary" href="{{ webchat_url }}" target="_blank" noopener>{% trans "Log in via web" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if app %}
|
||||
<p>{% blocktrans with app_name=app.name %}You can now set up {{ app_name }} and connect it to your new account.{% endblocktrans %}</p>
|
||||
|
||||
<h2 class="h5 alert alert-info p-2">{% blocktrans with app_name=app.name %}Step 1: Download and install {{ app_name }}{% endblocktrans %}</h2>
|
||||
|
||||
<p>{% if app.download.text %}{{ app.download.text }}{% else %}{% blocktrans with app_name=app.name %}Download and install {{ app_name }} below:{% endblocktrans %}{% endif %}</p>
|
||||
|
||||
<div class="ms-5 mb-3">
|
||||
{% for item in app.download.buttons %}
|
||||
{% if item.image %}
|
||||
<a href="{{ item.url }}" {%if item.target %}target="{{ item.target }}"{% endif %} rel="noopener">
|
||||
<img src="{{ item.image }}" {% if item.alttext %}alt="{{ item.alttext }}"{% endif %}>
|
||||
</a>
|
||||
{% endif %}
|
||||
{%if item.text %}
|
||||
<a href="{{item.url}}" {% if item.target %}target="{{ item.target }}"{% endif %} rel="noopener">
|
||||
<button class="btn btn-primary">
|
||||
{{ item.text }}
|
||||
</button>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<h2 class="h5 alert alert-info p-2">{% blocktrans with app_name=app.name %}Step 2: Connect {{ app_name }} to your new account{% endblocktrans %}</h2>
|
||||
|
||||
<p>{% if app.setup.text %}{{ app.setup.text }}{% else %}{% blocktrans with app_name=app.name %}Launch {{ app_name }} and sign in using your account credentials.{% endblocktrans %}{% endif %}</p>
|
||||
{% endif %}
|
||||
|
||||
<p>{% trans "As a final reminder, your account details are shown below:" %}</p>
|
||||
|
||||
<form class="account-details col-12 mx-auto">
|
||||
<div class="input-group">
|
||||
<label for="user" class="col-md-4 col-form-label fw-bold">{% trans "Chat address (JID)" %}:</label>
|
||||
<div class="col-md-8 col-12">
|
||||
<input type="text" class="form-control-plaintext" readonly value="{{ username }}@{{ domain }}">
|
||||
</div>
|
||||
</div>
|
||||
{% if password %}
|
||||
<div class="input-group">
|
||||
<label for="password" class="col-md-4 col-12 col-form-label fw-bold">{% trans "Password" %}:</label>
|
||||
<div class="col-md-8 col-12">
|
||||
<div class="input-group">
|
||||
<input type="password" readonly disabled aria-label="{% trans "Password" %}" class="form-control" value="{{ password }}">
|
||||
<div class="input-group-append">
|
||||
<button id="toggle-pw-button" class="btn btn-outline-secondary rounded-start-0" type="button"
|
||||
data-text-show="{% trans "Show" %}" data-text-hide="{% trans "Hide" %}">{% trans "Show" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
|
||||
{% if password %}
|
||||
<p class="mt-3">{% trans "Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone." %}</p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,18 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{% trans "Add Contact" %} | {{ site_name }}{% endblock %}
|
||||
{% block h1 %}{% blocktrans with inviter=invite.inviter|user %}{{ inviter }} has invited you to connect!{% endblocktrans %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="col-12 col-md-8">
|
||||
{% blocktrans with inviter=invite.inviter|jid %}This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!{% endblocktrans %}
|
||||
<div class="text-center">
|
||||
<a href="{{ invite.uri }}" class="btn btn-success my-3" tabindex="3">{% blocktrans with inviter=invite.inviter|user %}Add {{ inviter }} to your contact list{% endblocktrans %}</a><br/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bd-callout bd-callout-info col-12 col-md-8 mb-3">
|
||||
<svg class="svg-inline--fa fa-lightbulb fa-w-11 text-warning" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lightbulb" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" data-fa-i2svg=""><path fill="currentColor" d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z"></path></svg>
|
||||
<strong class="text-warning-emphasis">{% trans 'Hint' %}:</strong> {% trans "If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform." %}
|
||||
</div>
|
||||
{% include "apps.html" %}
|
||||
{% endblock %}
|
||||
|
After Width: | Height: | Size: 395 B |
|
After Width: | Height: | Size: 34 KiB |
@@ -0,0 +1,53 @@
|
||||
#qr-invite-page{
|
||||
width: 256px;
|
||||
}
|
||||
.invite-download-button {
|
||||
max-width: 160px;
|
||||
}
|
||||
.clear-both {
|
||||
clear: both;
|
||||
}
|
||||
.bd-callout {
|
||||
padding: 1.25rem;
|
||||
margin-top: 1.25rem;
|
||||
margin-bottom: 1.25rem;
|
||||
background-color: var(--bd-callout-bg, var(--bs-gray-100));
|
||||
border-left:0.25rem solid var(--bd-callout-border, var(--bs-gray-300))
|
||||
}
|
||||
.bd-callout h4 {
|
||||
margin-bottom:.25rem
|
||||
}
|
||||
.bd-callout > :last-child {
|
||||
margin-bottom:0
|
||||
}
|
||||
.bd-callout + .bd-callout {
|
||||
margin-top:-.25rem
|
||||
}
|
||||
.bd-callout .highlight {
|
||||
background-color:rgba(0, 0, 0, 0.05)
|
||||
}
|
||||
.bd-callout-info {
|
||||
--bd-callout-bg: rgba(var(--bs-info-rgb), .075);
|
||||
--bd-callout-border: rgba(var(--bs-info-rgb), .5)
|
||||
}
|
||||
.bd-callout-warning {
|
||||
--bd-callout-bg: rgba(var(--bs-warning-rgb), .075);
|
||||
--bd-callout-border: rgba(var(--bs-warning-rgb), .5)
|
||||
}
|
||||
.bd-callout-danger {
|
||||
--bd-callout-bg: rgba(var(--bs-danger-rgb), .075);
|
||||
--bd-callout-border: rgba(var(--bs-danger-rgb), .5)
|
||||
}
|
||||
.fa-w-11 {
|
||||
width: .6875em;
|
||||
}
|
||||
.fa-w-16 {
|
||||
widht: 1em;
|
||||
}
|
||||
.svg-inline--fa {
|
||||
display: inline-block;
|
||||
font-size: inherit;
|
||||
height: 1em;
|
||||
overflow: visible;
|
||||
vertical-align: -.125em;
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
(function () {
|
||||
document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'));
|
||||
|
||||
// If QR lib loaded ok, show QR button on desktop devices
|
||||
if (window.QRCode) {
|
||||
const qrcode_opts = {
|
||||
text: document.location.href,
|
||||
addQuietZone: true
|
||||
};
|
||||
new QRCode(document.getElementById("qr-invite-page"), qrcode_opts);
|
||||
document.getElementById('qr-button-container').classList.add("d-md-block");
|
||||
}
|
||||
|
||||
const toggle_pw_button = document.getElementById('toggle-pw-button');
|
||||
if (toggle_pw_button)
|
||||
toggle_pw_button.addEventListener('click', toggle_password);
|
||||
|
||||
// Detect current platform and show/hide appropriate clients
|
||||
if (window.platform) {
|
||||
let platform_friendly = null;
|
||||
let platform_classname = null;
|
||||
switch (platform.os.family) {
|
||||
case "Ubuntu":
|
||||
case "Linux":
|
||||
case "Fedora":
|
||||
case "Red Hat":
|
||||
case "SuSE":
|
||||
platform_friendly = platform.os.family + " (Linux)";
|
||||
platform_classname = "linux";
|
||||
break;
|
||||
case "Linux aarch64":
|
||||
platform_friendly = "Linux mobile";
|
||||
platform_classname = "linux";
|
||||
break;
|
||||
case "Haiku R1":
|
||||
platform_friendly = "Haiku";
|
||||
platform_classname = "haiku";
|
||||
break;
|
||||
case "Windows Phone":
|
||||
platform_friendly = "Windows Phone";
|
||||
platform_classname = "windows-phone";
|
||||
break;
|
||||
case "OS X":
|
||||
if (navigator.maxTouchPoints > 1) {
|
||||
// looks like iPad to me!
|
||||
platform_friendly = "iPadOS";
|
||||
platform_classname = "ipados";
|
||||
} else {
|
||||
platform_friendly = "macOS";
|
||||
platform_classname = "macos";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (platform.os.family.startsWith("Windows")) {
|
||||
platform_friendly = "Windows";
|
||||
platform_classname = "windows";
|
||||
} else {
|
||||
platform_friendly = platform.os.family;
|
||||
platform_classname = platform_friendly.toLowerCase();
|
||||
}
|
||||
}
|
||||
|
||||
if (platform_friendly && platform_classname) {
|
||||
if (document.querySelectorAll('.client-card .client-platform-badge-' + platform_classname).length == 0) {
|
||||
const badges = document.querySelectorAll('.client-card .client-platform-badge');
|
||||
for (let badge of badges) {
|
||||
badge.classList.add("text-bg-secondary");
|
||||
badge.classList.remove("text-bg-info");
|
||||
}
|
||||
// No clients recognised for this platform, do nothing
|
||||
return;
|
||||
}
|
||||
// Hide clients not for this platform
|
||||
const client_cards = document.getElementsByClassName('client-card');
|
||||
for (let card of client_cards) {
|
||||
if (card.classList.contains('app-platform-' + platform_classname))
|
||||
card.classList.add('supported-platform');
|
||||
else if (!card.classList.contains('app-platform-web'))
|
||||
card.hidden = true;
|
||||
const badges = card.querySelectorAll('.client-platform-badge');
|
||||
let has_platform = false;
|
||||
for (let badge of badges) {
|
||||
if (badge.classList.contains('client-platform-badge-' + platform_classname)) {
|
||||
badge.classList.add("text-bg-success");
|
||||
badge.classList.remove("text-bg-info");
|
||||
has_platform = true;
|
||||
} else {
|
||||
badge.classList.add("text-bg-secondary");
|
||||
badge.classList.remove("text-bg-info");
|
||||
}
|
||||
}
|
||||
if (!has_platform)
|
||||
$(card).find("a.btn").removeClass("btn-primary").addClass("btn-secondary");
|
||||
}
|
||||
const show_all_clients_button_container = document.getElementById('show-all-clients-button-container');
|
||||
if (show_all_clients_button_container) {
|
||||
show_all_clients_button_container.querySelector('.platform-name').innerHTML = platform_friendly;
|
||||
show_all_clients_button_container.classList.remove("d-none");
|
||||
document.getElementById('show-all-clients-button').addEventListener('click', function (e) {
|
||||
for (let card of client_cards)
|
||||
card.hidden = false;
|
||||
show_all_clients_button_container.hidden = true;
|
||||
e.preventDefault();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
function toggle_password(e) {
|
||||
var button = e.target;
|
||||
var input = button.parentNode.parentNode.querySelector("input");
|
||||
switch (input.attributes.type.value) {
|
||||
case "password":
|
||||
input.attributes.type.value = "text";
|
||||
button.innerText = button.getAttribute('data-text-hide');
|
||||
break;
|
||||
case "text":
|
||||
input.attributes.type.value = "password";
|
||||
button.innerText = button.getAttribute('data-text-show');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
window.addEventListener('load', function () {
|
||||
// Fetch all the forms we want to apply custom Bootstrap validation styles to
|
||||
var forms = document.getElementsByClassName('needs-validation');
|
||||
// Loop over them and prevent submission
|
||||
var validation = Array.prototype.filter.call(forms, function (form) {
|
||||
form.addEventListener('submit', function (event) {
|
||||
if (form.checkValidity() === false) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
form.classList.add('was-validated');
|
||||
}, false);
|
||||
});
|
||||
}, false);
|
||||
})();
|
||||
@@ -0,0 +1,46 @@
|
||||
<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
|
||||
<title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
|
||||
<path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
|
||||
</g>
|
||||
<g id="_Group_" data-name="<Group>">
|
||||
<g id="_Group_2" data-name="<Group>">
|
||||
<g id="_Group_3" data-name="<Group>">
|
||||
<path id="_Path_" data-name="<Path>" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
|
||||
<path id="_Path_2" data-name="<Path>" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
|
||||
<path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
|
||||
<path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
|
||||
<path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
|
||||
<path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
|
||||
<path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
|
||||
<path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
|
||||
<path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="_Group_4" data-name="<Group>">
|
||||
<g>
|
||||
<path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
|
||||
<path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
|
||||
<path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
|
||||
<path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
|
||||
<path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
|
||||
<path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
|
||||
<path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
|
||||
<path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
|
||||
<path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
|
||||
<path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
|
||||
<path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
|
||||
<path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
|
||||
<path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,105 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 201.96849 201.96849" id="svg4211" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="conversations_baloon.svg">
|
||||
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" showguides="false" inkscape:zoom="2.2196812" inkscape:cx="39.109276" inkscape:cy="132.27753" inkscape:window-width="1600" inkscape:window-height="836" inkscape:window-x="0" inkscape:window-y="27" inkscape:window-maximized="1" inkscape:current-layer="layer8"/>
|
||||
<defs id="defs4213">
|
||||
<linearGradient osb:paint="solid" id="linearGradient5393">
|
||||
<stop id="stop5395" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clipPath4831" clipPathUnits="userSpaceOnUse">
|
||||
<circle style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="circle4833" cx="883.16943" cy="677.19611" r="229.80969"/>
|
||||
</clipPath>
|
||||
<clipPath id="clipPath4859" clipPathUnits="userSpaceOnUse">
|
||||
<circle style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="circle4861" cx="883.16943" cy="677.19611" r="229.80969"/>
|
||||
</clipPath>
|
||||
<clipPath id="clipPath5624" clipPathUnits="userSpaceOnUse">
|
||||
<g style="display:inline" id="g5626" transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11014)">
|
||||
<path sodipodi:nodetypes="ccsssc" inkscape:connector-curvature="0" id="path5628" d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z" style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
|
||||
<circle transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)" clip-path="url(#clipPath4859)" r="229.80969" cy="677.19611" cx="883.16943" id="circle5630" style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</g>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10653">
|
||||
<g style="display:inline" id="g10655" transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11015)" inkscape:export-xdpi="100" inkscape:export-ydpi="100">
|
||||
<path sodipodi:nodetypes="ccsssc" inkscape:connector-curvature="0" id="path10657" d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z" style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
|
||||
<circle transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)" clip-path="url(#clipPath4859)" r="229.80969" cy="677.19611" cx="883.16943" id="circle10659" style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</g>
|
||||
</clipPath>
|
||||
<radialGradient inkscape:collect="always" xlink:href="#linearGradient3913" id="radialGradient3883" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.68662089,-0.30388739,0.24146012,0.54605188,-300.74233,-264.46964)" cx="262.33273" cy="945.23846" fx="262.33273" fy="945.23846" r="185.49754"/>
|
||||
<linearGradient inkscape:collect="always" id="linearGradient3913">
|
||||
<stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop3915"/>
|
||||
<stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop3917"/>
|
||||
</linearGradient>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5315">
|
||||
<g inkscape:export-ydpi="100" inkscape:export-xdpi="100" transform="matrix(0.3835576,0,0,0.3835576,-246.60108,-156.11013)" id="g5317" style="display:inline;fill:#00a000;fill-opacity:1">
|
||||
<path style="display:inline;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z" id="path5319" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsssc"/>
|
||||
<circle style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="circle5321" cx="883.16943" cy="677.19611" r="229.80969" clip-path="url(#clipPath4859)" transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)"/>
|
||||
</g>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6882">
|
||||
<path inkscape:connector-curvature="0" id="path6884" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6886">
|
||||
<path inkscape:connector-curvature="0" id="path6888" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6890">
|
||||
<path inkscape:connector-curvature="0" id="path6892" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6894">
|
||||
<path inkscape:connector-curvature="0" id="path6896" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6898">
|
||||
<path inkscape:connector-curvature="0" id="path6900" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6902">
|
||||
<path inkscape:connector-curvature="0" id="path6904" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6906">
|
||||
<path inkscape:connector-curvature="0" id="path6908" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6910">
|
||||
<path inkscape:connector-curvature="0" id="path6912" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
<filter inkscape:collect="always" style="color-interpolation-filters:sRGB" id="filter5640" x="-0.012227737" width="1.0244555" y="-0.011780591" height="1.0235612">
|
||||
<feGaussianBlur inkscape:collect="always" stdDeviation="0.9782166" id="feGaussianBlur5642"/>
|
||||
</filter>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5745">
|
||||
<path inkscape:connector-curvature="0" id="path5747" d="M 99.908581,-2.3831968e-4 A 95.889392,95.889392 0 0 0 4.0199102,95.888436 95.889392,95.889392 0 0 0 99.908581,191.77906 95.889392,95.889392 0 0 0 142.61366,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 183.8285,142.24002 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.79921,95.888466 95.889392,95.889392 0 0 0 99.908581,-2.0831968e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<metadata id="metadata4216">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g inkscape:groupmode="layer" id="layer9" inkscape:label="shaddow" transform="translate(-4,2.6816164)" style="display:inline">
|
||||
<path inkscape:connector-curvature="0" id="path6914" d="M 104.88867,0.06226191 A 95.889392,95.889392 0 0 0 8.9999996,95.950936 95.889392,95.889392 0 0 0 104.88867,191.84156 95.889392,95.889392 0 0 0 147.59375,181.76343 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,95.950966 95.889392,95.889392 0 0 0 104.88867,0.06229191 Z" style="display:inline;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter5640)"/>
|
||||
</g>
|
||||
<g style="display:inline" inkscape:label="bubble" id="layer4" inkscape:groupmode="layer" transform="translate(-4,2.6816348)">
|
||||
<path style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="M 104.88867,-1.9377566 A 95.889392,95.889392 0 0 0 8.9999996,93.950918 95.889392,95.889392 0 0 0 104.88867,189.84154 95.889392,95.889392 0 0 0 147.59375,179.76341 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 188.80859,140.3025 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,93.950948 95.889392,95.889392 0 0 0 104.88867,-1.9377266 Z" id="circle6661" inkscape:connector-curvature="0"/>
|
||||
<text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:125px;line-height:1000%;font-family:Sans;letter-spacing:-10.89000034px;word-spacing:5px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" x="85.862968" y="-55.271603" id="text6634" sodipodi:linespacing="1000%"><tspan sodipodi:role="line" id="tspan6636" x="85.862968" y="-55.271603"/></text>
|
||||
</g>
|
||||
<g inkscape:groupmode="layer" id="layer8" inkscape:label="dotted line" style="display:inline" transform="translate(-4,2.6816164)">
|
||||
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6910)" d="m 145.16406,11.183594 -5.13232,9.649402 c -0.77924,1.465076 -0.65974,2.41396 0.66876,3.18097 9.66686,5.488467 18.12303,12.874168 24.86104,21.711122 1.05534,1.616079 2.08054,1.713076 3.67763,0.571565 L 178.04883,40 C 169.45271,27.990203 158.19857,18.128379 145.16406,11.183594 Z" id="path7364" inkscape:connector-curvature="0" sodipodi:nodetypes="csccscc" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6906)" d="m 193.80469,75.615234 -9.62713,2.062751 c -2.66266,0.570512 -3.40763,1.172953 -2.90593,3.917433 0.85823,4.714633 1.30424,9.497137 1.33189,14.293254 -0.028,5.578758 -0.62194,11.137108 -1.77093,16.589918 -0.86591,3.23162 0.13682,3.77092 3.16149,4.58138 l 8.98639,2.30136 c 1.98177,-7.66828 3.00584,-15.55255 3.04883,-23.472658 -0.0187,-6.817681 -0.76446,-13.613926 -2.22461,-20.273438 z" id="path7366" inkscape:connector-curvature="0" sodipodi:nodetypes="csccccccc" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6902)" d="m 14.264281,102.76512 -10.2076406,0.87943 c 1.2093798,14.83154 5.8540346,29.17808 13.5664056,41.90429 l 8.544301,-5.23239 c 2.394983,-1.46665 1.895406,-3.37834 0.986202,-5.04513 -5.118253,-9.40257 -8.359018,-19.71635 -9.536202,-30.36553 0,-2.09418 -1.881577,-2.26744 -3.353066,-2.14067 z" id="path7372" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccs" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6898)" d="m 51.504371,166.60235 -5.82273,8.50898 c 12.710503,8.71282 27.333669,14.23394 42.630859,16.0957 l 1.220329,-9.90843 c 0.355066,-2.88295 -1.085712,-3.52946 -3.332252,-3.90256 -10.402329,-1.73697 -20.373956,-5.45322 -29.373754,-10.94516 -1.647505,-1.06744 -3.639993,-2.30718 -5.322452,0.15147 z" id="path7370" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccs" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6894)" d="M 32.208984,27.683594 C 21.779177,38.079001 13.883707,50.736882 9.1347656,64.675781 L 19.33617,68.090365 c 1.658147,0.55501 2.832564,-0.120955 3.374272,-1.591979 3.777598,-10.021698 9.470788,-19.210103 16.759132,-27.052307 1.561136,-1.561136 1.567283,-2.960058 0.447507,-4.076606 z" id="path7374" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccsc" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6890)" d="M 99.888672,-0.25 C 87.701045,-0.2239408 75.630114,2.1252837 64.322266,6.671875 l 3.530435,8.74898 c 1.063314,2.635062 1.616754,3.526314 4.973913,2.352259 8.692057,-3.031338 17.839027,-4.588849 27.062058,-4.599286 5.555828,0 6.486278,0.350026 6.780788,-3.4460223 l 0.74851,-9.64772758 C 104.9135,-0.12857239 102.40179,-0.23868346 99.888672,-0.25 Z" id="path7376" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccscc" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6886)" d="m 138.72416,168.48439 c -4.17634,2.25458 -8.55959,4.09055 -13.0504,5.63418 -1.00363,0.34498 -1.20742,1.18222 -0.8682,2.27372 l 3.44056,11.0706 c 4.92985,-1.53124 9.72799,-3.45808 14.34766,-5.76172 l 0.12695,0.0137 14.0293,5.44532 4.12174,-10.20577 c 0.7548,-1.86894 -0.0184,-2.7016 -1.59462,-3.31324 l -14.72114,-5.71251 c -1.86679,-0.7244 -3.68834,-0.60144 -5.83185,0.55572 z" id="path5005" inkscape:connector-curvature="0" sodipodi:nodetypes="cssccccsssc" transform="translate(4.9999996,-1.9374999)"/>
|
||||
<path style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6882)" d="m 186.53125,152.80469 -10.6386,2.70888 c -0.78879,0.20085 -1.67397,1.02386 -1.35494,2.33801 l 9.75918,40.15428 c 8.56713,5.97538 15.30408,3.06731 11.01563,-9.47266 z" id="path5071" inkscape:connector-curvature="0" sodipodi:nodetypes="cssccc" transform="translate(4.9999996,-1.9374999)"/>
|
||||
</g>
|
||||
<g style="display:inline" inkscape:label="dots" id="layer2" inkscape:groupmode="layer" transform="translate(-4,2.6816348)">
|
||||
<g inkscape:export-ydpi="100" inkscape:export-xdpi="100" style="fill:#f5f5f5;fill-opacity:1" transform="matrix(0.3835576,0,0,0.3835576,-248.17635,-138.86977)" id="g5126">
|
||||
<circle r="27.299093" style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3047-4" cx="799.11273" cy="609.86285"/>
|
||||
<circle r="27.299093" style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3047-1-2" cx="918.91962" cy="609.86285"/>
|
||||
<circle r="27.299093" style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3047-1-8-6" cx="1039.0352" cy="609.86285"/>
|
||||
</g>
|
||||
</g>
|
||||
<g inkscape:groupmode="layer" id="layer1" inkscape:label="light" style="display:inline" transform="translate(-4,2.6816164)">
|
||||
<path style="display:inline;opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none" d="m 192.44891,47.715674 c -61.69765,0 -111.704333,49.103472 -111.704333,109.668976 0,12.77573 2.228815,25.0414 6.321575,36.4393 5.069139,0.70557 10.251828,1.06876 15.514978,1.06876 18.80489,0 30.91434,7.28449 47.46533,1.26909 l 54.00234,6.06606 c 5.24363,2.11897 11.63381,1.37954 10.27166,-4.11162 l -14.23663,-57.56735 c 9.15073,-16.06873 12.27539,-34.36633 12.27539,-53.240271 0,-13.72556 -2.63167,-26.842322 -7.42478,-38.909717 -4.09925,-0.447474 -8.2658,-0.683228 -12.48553,-0.683228 z" id="path3878" inkscape:connector-curvature="0" clip-path="url(#clipPath5745)" transform="translate(4.9800894,-1.9374999)" sodipodi:nodetypes="sscsccccscs"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="converse-svg-logo" viewBox="0 0 364 364"><g data-name="Layer 2" fill="#fff"><g data-name="Layer 7"><path d="M179.9 4.15c-70.975 0-134.962 42.755-162.121 108.326-27.16 65.57-12.142 141.044 38.044 191.23 50.187 50.187 125.66 65.205 191.231 38.045 65.571-27.16 108.326-91.146 108.326-162.121 0-96.915-78.565-175.48-175.48-175.48z" class="cls-4"/><path d="M221.46 103.71c0 18.83-29.36 18.83-29.12 0-.24-18.83 29.12-18.83 29.12 0z" class="cls-3"/></g></g><g data-name="Layer 2"><g data-name="Layer 7"><path class="cls-3" d="M221.46 103.71c0 18.83-29.36 18.83-29.12 0-.24-18.83 29.12-18.83 29.12 0z"/><path class="cls-4" d="M179.9 4.15a175.48 175.48 0 1 0 175.48 175.48A175.48 175.48 0 0 0 179.9 4.15zm-40.79 264.5c-.23-17.82 27.58-17.82 27.58 0s-27.81 17.83-27.58 0zm79.49-100.41a79.65 79.65 0 0 1-13.45 5.76 12.76 12.76 0 0 0-6.29 4.65L167.54 222a1.36 1.36 0 0 1-2.46-.8v-35.8a2.58 2.58 0 0 0-3.06-2.53c-15.43 3-30.23 7.7-42.73 19.94-38.8 38-29.42 105.69 16.09 133.16a162.25 162.25 0 0 1-91.47-67.27C-3.86 182.26 34.5 47.25 138.37 25.66c46.89-9.75 118.25 5.16 123.73 62.83 3.05 32.15-15.54 64.4-43.5 79.75z"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128" version="1.1">
|
||||
<defs>
|
||||
<radialGradient id="radial0" gradientUnits="userSpaceOnUse" cx="16.488304" cy="23.537582" fx="16.488304" fy="23.537582" r="19" gradientTransform="matrix(5.830516,0,0,5.186123,-57.136612,106.88559)">
|
||||
<stop offset="0" style="stop-color:rgb(45.09804%,82.352942%,8.627451%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(30.588236%,60.392159%,2.352941%);stop-opacity:1;"/>
|
||||
</radialGradient>
|
||||
<filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
|
||||
<feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<mask id="mask0">
|
||||
<g filter="url(#alpha)">
|
||||
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.137778;stroke:none;"/>
|
||||
</g>
|
||||
</mask>
|
||||
<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="15.571428" y1="29.99917" x2="15.571428" y2="42.285942" gradientTransform="matrix(2.931288,0,0,2.931288,-1.412986,2.510315)">
|
||||
<stop offset="0" style="stop-color:rgb(0%,0%,0%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip1">
|
||||
<rect x="0" y="0" width="192" height="152"/>
|
||||
</clipPath>
|
||||
<g id="surface511779" clip-path="url(#clip1)">
|
||||
<path style=" stroke:none;fill-rule:evenodd;fill:url(#linear0);" d="M 36.695312 90.449219 C 39.863281 90.667969 45.804688 93.007812 48.417969 90.449219 C 42.980469 93.910156 45.859375 116.472656 43.183594 127.925781 C 41.019531 115.433594 39.433594 94.847656 36.695312 90.449219 Z M 36.695312 90.449219 "/>
|
||||
</g>
|
||||
<mask id="mask1">
|
||||
<g filter="url(#alpha)">
|
||||
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.137778;stroke:none;"/>
|
||||
</g>
|
||||
</mask>
|
||||
<linearGradient id="linear1" gradientUnits="userSpaceOnUse" x1="15.571428" y1="29.99917" x2="15.571428" y2="42.285942" gradientTransform="matrix(2.931288,0,0,2.931288,4.44959,2.510315)">
|
||||
<stop offset="0" style="stop-color:rgb(0%,0%,0%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip2">
|
||||
<rect x="0" y="0" width="192" height="152"/>
|
||||
</clipPath>
|
||||
<g id="surface511782" clip-path="url(#clip2)">
|
||||
<path style=" stroke:none;fill-rule:evenodd;fill:url(#linear1);" d="M 107.042969 90.449219 C 103.875 90.667969 97.933594 93.007812 95.320312 90.449219 C 100.757812 93.910156 97.878906 116.472656 100.554688 127.925781 C 102.71875 115.433594 104.304688 94.847656 107.042969 90.449219 Z M 107.042969 90.449219 "/>
|
||||
</g>
|
||||
<linearGradient id="linear2" gradientUnits="userSpaceOnUse" x1="16" y1="2" x2="38.465416" y2="42.405006" gradientTransform="matrix(3.689005,0,0,3.693769,-24.666805,156.809784)">
|
||||
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="radial1" gradientUnits="userSpaceOnUse" cx="21.142859" cy="22.17857" fx="21.142859" fy="22.17857" r="9" gradientTransform="matrix(2.931285,0,0,2.932291,-6.481694,134.102966)">
|
||||
<stop offset="0" style="stop-color:rgb(99.607843%,94.901961%,56.862748%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(92.941177%,83.137256%,0%);stop-opacity:1;"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linear3" gradientUnits="userSpaceOnUse" x1="24.260687" y1="2.533504" x2="24.832115" y2="22.012075" gradientTransform="matrix(1.342451,0,-0.837372,1.723858,33.163297,2.90654)">
|
||||
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear4" gradientUnits="userSpaceOnUse" x1="16" y1="2" x2="32.927006" y2="31.587952" gradientTransform="matrix(2.912369,0,0,2.925584,-6.027668,173.323547)">
|
||||
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear5" gradientUnits="userSpaceOnUse" x1="24.000008" y1="31.785711" x2="30.00001" y2="38.499996" gradientTransform="matrix(1.993,0,0,2.079344,16.040779,163.224747)">
|
||||
<stop offset="0" style="stop-color:rgb(44.705883%,62.352943%,81.176472%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(22.352941%,43.137255%,65.490198%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear6" gradientUnits="userSpaceOnUse" x1="17.725422" y1="3.860764" x2="27.055439" y2="24.431168" gradientTransform="matrix(2.912369,0,0,2.925584,-6.027668,173.323547)">
|
||||
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="surface511761">
|
||||
<path style="fill-rule:nonzero;fill:url(#radial0);stroke-width:2.931288;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(30.588236%,60.392159%,2.352941%);stroke-opacity:1;stroke-miterlimit:4;" d="M 63.871094 218.601562 C 35.554688 218.601562 9.640625 233.59375 9.640625 243.296875 C 9.640625 247.816406 28.058594 245.226562 28.695312 249.191406 L 33.273438 280.140625 C 33.273438 283.101562 34.832031 285.421875 36.847656 285.421875 C 55.203125 290.164062 73.234375 290.09375 90.800781 285.421875 C 92.8125 285.421875 94.464844 283.101562 94.464844 280.140625 L 99.042969 249.191406 C 99.890625 245.851562 118.097656 247.816406 118.097656 243.296875 C 118.097656 233.59375 92.183594 218.601562 63.871094 218.601562 Z M 63.871094 218.601562 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
<use xlink:href="#surface511779" transform="matrix(1,0,0,1,-8,-16)" mask="url(#mask0)"/>
|
||||
<use xlink:href="#surface511782" transform="matrix(1,0,0,1,-8,-16)" mask="url(#mask1)"/>
|
||||
<path style="fill:none;stroke-width:2.93129;stroke-linecap:butt;stroke-linejoin:miter;stroke:url(#linear2);stroke-miterlimit:4;" d="M 63.871094 221.53125 C 37.082031 221.53125 11.375 237.507812 13.199219 242.46875 C 13.453125 243.152344 30.621094 243.289062 31.222656 247.117188 L 36.183594 277.121094 C 36.183594 279.984375 36.402344 283.0625 38.308594 283.0625 C 56.125 287.078125 73.109375 286.9375 89.34375 283.0625 C 91.25 283.0625 91.554688 280.820312 91.554688 277.960938 L 96.304688 247.324219 C 97.105469 244.101562 113.710938 244.800781 114.121094 241.632812 C 114.886719 235.6875 90.65625 221.53125 63.871094 221.53125 Z M 63.871094 221.53125 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:0.0593608;stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,100%,100%);stroke-opacity:0.423529;stroke-miterlimit:4;" d="M 79.992188 233.257812 C 79.992188 239.734375 72.773438 244.984375 63.871094 244.984375 C 54.964844 244.984375 47.746094 239.734375 47.746094 233.257812 C 47.746094 226.78125 54.964844 221.53125 63.871094 221.53125 C 72.773438 221.53125 79.992188 226.78125 79.992188 233.257812 Z M 79.992188 233.257812 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
<path style="fill-rule:nonzero;fill:url(#radial1);stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(76.862746%,62.7451%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 63.871094 177.5625 C 50.109375 177.5625 38.953125 188.730469 38.953125 202.488281 C 38.953125 211.28125 43.503906 219.019531 50.382812 223.457031 C 54.878906 228.578125 52.875 226.90625 53.609375 233.1875 C 53.609375 234.851562 54.96875 236.210938 56.632812 236.210938 C 61.96875 240.304688 66.722656 239.871094 71.105469 236.210938 C 72.769531 236.210938 74.128906 234.851562 74.128906 233.1875 C 75 227.039062 73.738281 227.816406 76.945312 223.714844 C 84.054688 219.320312 88.785156 211.453125 88.785156 202.488281 C 88.785156 188.730469 77.628906 177.5625 63.871094 177.5625 Z M 63.871094 177.5625 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear3);" d="M 59.097656 24.617188 C 56.738281 29.472656 52.273438 33.410156 49.128906 33.410156 C 45.984375 33.410156 45.34375 29.472656 47.703125 24.617188 C 50.0625 19.761719 54.527344 15.824219 57.671875 15.824219 C 60.816406 15.824219 61.453125 19.761719 59.097656 24.617188 Z M 59.097656 24.617188 "/>
|
||||
<path style="fill:none;stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:url(#linear4);stroke-miterlimit:4;" d="M 63.871094 180.496094 C 51.726562 180.496094 41.882812 190.714844 41.882812 203.304688 C 41.882812 211.351562 46.273438 217.214844 53.070312 222.492188 C 57.035156 227.183594 55.574219 226.542969 55.875 231.449219 C 55.875 232.972656 56.378906 233.441406 57.847656 233.441406 C 61.960938 237.171875 66.179688 237.078125 70.132812 233.320312 C 71.601562 233.320312 71.738281 232.636719 71.738281 231.113281 C 72.25 224.757812 72.535156 225.519531 75.367188 221.765625 C 81.640625 217.746094 85.855469 211.511719 85.855469 203.304688 C 85.855469 190.714844 76.011719 180.496094 63.871094 180.496094 Z M 63.871094 180.496094 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
<path style="fill-rule:nonzero;fill:url(#linear5);stroke-width:2.931288;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(20.392157%,39.607844%,64.313728%);stroke-opacity:1;stroke-miterlimit:4;" d="M 52.171875 225.542969 C 53.09375 227.152344 53.101562 228.8125 53.605469 233.160156 C 53.605469 234.832031 54.9375 236.195312 56.589844 236.195312 C 61.890625 240.308594 66.640625 239.875 70.992188 236.195312 C 72.648438 236.195312 74.191406 234.882812 74.191406 233.210938 C 74.757812 229.15625 74.984375 226.558594 75.582031 225.144531 L 71.519531 227.507812 L 56.171875 227.507812 Z M 52.171875 225.542969 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
<path style="fill:none;stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:url(#linear6);stroke-miterlimit:4;" d="M 56.4375 230.328125 L 56.59375 233.285156 L 58.058594 233.285156 C 63.382812 237.972656 66.652344 235.839844 69.785156 233.265625 L 70.925781 233.265625 L 71.300781 230.328125 Z M 56.4375 230.328125 " transform="matrix(1,0,0,1,0,-172)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.9 KiB |
@@ -0,0 +1,267 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
xml:space="preserve"
|
||||
viewBox="0 0 200 200"
|
||||
enable-background="new 0 0 200 200"
|
||||
id="svg36"
|
||||
sodipodi:docname="xmpp.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
|
||||
id="metadata42"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs40"><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1291"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1289"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1329" /><feColorMatrix
|
||||
id="feColorMatrix1331"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1295"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1293"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1333" /><feColorMatrix
|
||||
id="feColorMatrix1335"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1299"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1297"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1337" /><feColorMatrix
|
||||
id="feColorMatrix1339"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1303"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1301"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1341" /><feColorMatrix
|
||||
id="feColorMatrix1343"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1307"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1305"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1345" /><feColorMatrix
|
||||
id="feColorMatrix1347"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1311"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1309"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1349" /><feColorMatrix
|
||||
id="feColorMatrix1351"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1315"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1313"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1353" /><feColorMatrix
|
||||
id="feColorMatrix1355"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1319"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1317"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1357" /><feColorMatrix
|
||||
id="feColorMatrix1359"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1323"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1321"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1361" /><feColorMatrix
|
||||
id="feColorMatrix1363"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter><filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Greyscale"
|
||||
id="filter1327"><feColorMatrix
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
id="feColorMatrix1325"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix1365" /><feColorMatrix
|
||||
id="feColorMatrix1367"
|
||||
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
|
||||
in="fbSourceGraphic" /></filter></defs><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1918"
|
||||
inkscape:window-height="1126"
|
||||
id="namedview38"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.18"
|
||||
inkscape:cx="-83.898305"
|
||||
inkscape:cy="100"
|
||||
inkscape:window-x="1200"
|
||||
inkscape:window-y="744"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg36" />
|
||||
|
||||
<linearGradient
|
||||
id="SVGID_right_"
|
||||
y2="1.279e-13"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="-1073.2"
|
||||
gradientTransform="translate(1196.604,15.368977)"
|
||||
y1="126.85"
|
||||
x1="-1073.2">
|
||||
<stop
|
||||
stop-color="#1b3967"
|
||||
offset=".011"
|
||||
id="stop2" />
|
||||
<stop
|
||||
stop-color="#13b5ea"
|
||||
offset=".467"
|
||||
id="stop4" />
|
||||
<stop
|
||||
stop-color="#002b5c"
|
||||
offset=".9945"
|
||||
id="stop6" />
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient
|
||||
id="SVGID_left_"
|
||||
y2="1.279e-13"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="-1073.2"
|
||||
gradientTransform="matrix(-1,0,0,1,-994.78801,15.367977)"
|
||||
y1="126.85"
|
||||
x1="-1073.2">
|
||||
<stop
|
||||
stop-color="#1b3967"
|
||||
offset=".011"
|
||||
id="stop9" />
|
||||
<stop
|
||||
stop-color="#13b5ea"
|
||||
offset=".467"
|
||||
id="stop11" />
|
||||
<stop
|
||||
stop-color="#002b5c"
|
||||
offset=".9945"
|
||||
id="stop13" />
|
||||
</linearGradient>
|
||||
|
||||
<rect
|
||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.29300005;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.77952766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="rect1369"
|
||||
width="191.52542"
|
||||
height="191.52542"
|
||||
x="4.2372894"
|
||||
y="4.2372894"
|
||||
rx="13.4362"
|
||||
ry="13.435" /><path
|
||||
d="m 151.80512,29.557978 c 0.077,1.313 -1.787,0.968 -1.787,2.293 0,38.551 -46.558,97.366012 -91.687985,108.730012 v 1.639 C 118.28313,136.69999 186.89012,74.419978 188.40012,15.369977 l -36.599,14.189001 z"
|
||||
style="fill:url(#SVGID_right_);opacity:0.293;filter:url(#filter1327)"
|
||||
id="path16" />
|
||||
<path
|
||||
d="m 133.67312,34.300978 c 0.076,1.313 0.12,2.63 0.12,3.957 0,38.551 -30.69898,90.497012 -75.826985,101.860012 v 1.639 c 59.044005,-2.79 105.809995,-63.024012 105.809995,-109.200012 0,-2.375 -0.128,-4.729 -0.371,-7.056 l -29.73,8.798 z"
|
||||
style="fill:#e96d1f;opacity:0.293;filter:url(#filter1323)"
|
||||
id="path18" />
|
||||
<path
|
||||
d="m 163.69112,24.951978 -7.61699,2.722 c 0.041,0.962 0.066,2.254 0.066,3.225 0,41.219 -37.271,98.204012 -87.271995,107.120012 -3.24501,1.088 -7.53801,2.077 -10.932,2.931 v 1.638 C 123.19013,137.02799 169.03613,70.721978 163.69612,24.947978 Z"
|
||||
style="fill:#d9541e;opacity:0.293;filter:url(#filter1319)"
|
||||
id="path20" />
|
||||
|
||||
<path
|
||||
d="m 50.011,29.556978 c -0.077,1.313 1.787,0.968 1.787,2.293 0,38.551 46.558007,97.366012 91.68799,108.730012 v 1.639 C 83.533,136.69899 14.926,74.418978 13.416,15.368977 l 36.599,14.189001 z"
|
||||
style="fill:url(#SVGID_left_);opacity:0.293;filter:url(#filter1315)"
|
||||
id="path22" />
|
||||
<path
|
||||
d="m 68.143,34.299978 c -0.076,1.313 -0.12,2.63 -0.12,3.957 0,38.551 30.698995,90.497012 75.82699,101.860012 v 1.639 C 84.806,138.96599 38.04,78.731978 38.04,32.555978 c 0,-2.375 0.128,-4.729 0.371,-7.056 l 29.73,8.798 z"
|
||||
style="fill:#a0ce67;opacity:0.293;filter:url(#filter1311)"
|
||||
id="path24" />
|
||||
<path
|
||||
d="m 38.125,24.950978 7.617,2.722 c -0.041,0.962 -0.066,2.254 -0.066,3.225 0,41.219 37.271,98.204012 87.27199,107.120012 3.245,1.088 7.538,2.077 10.932,2.931 v 1.638 C 78.626,137.02699 32.78,70.720978 38.12,24.946978 Z"
|
||||
style="fill:#439639;opacity:0.293;filter:url(#filter1307)"
|
||||
id="path26" />
|
||||
|
||||
<path
|
||||
d="m 25.988,172.07799 -13.388,-14.65 h 11.643 l 9.127,10.268 9.129,-10.268 h 11.643 l -13.387,14.646 14.401,14.728 h -12.09 l -9.697,-10.67 -9.693,10.67 H 11.584 l 14.404,-14.73 z"
|
||||
id="path28"
|
||||
style="opacity:0.293;filter:url(#filter1303)" />
|
||||
<path
|
||||
d="m 58.508,157.42799 h 13.836 l 10.183,18.905 10.183,-18.905 h 13.83199 v 29.374 h -8.761983 v -21.096 h -0.08 L 85.893,186.80199 H 79.16 l -11.807,-21.096 h -0.082 v 21.096 h -8.764 v -29.37 z"
|
||||
id="path30"
|
||||
style="opacity:0.293;filter:url(#filter1299)" />
|
||||
<path
|
||||
d="m 112.66199,157.42799 h 24.546 c 8.559,0 10.628,4.302 10.628,10.063 v 2.516 c 0,4.381 -1.908,9.41 -8.275,9.41 h -17.894 v 7.385 h -9.005 v -29.38 z m 9,14.69 h 13.997 c 2.10901,0 2.92401,-1.377 2.92401,-3.123 v -1.135 c 0,-1.99 -0.976,-3.127 -3.694,-3.127 h -13.227 v 7.38 z"
|
||||
id="path32"
|
||||
style="opacity:0.293;filter:url(#filter1295)" />
|
||||
<path
|
||||
d="m 152.72199,157.42799 h 24.546 c 8.561,0 10.63,4.302 10.63,10.063 v 2.516 c 0,4.381 -1.907,9.41 -8.275,9.41 h -17.893 v 7.385 h -9.008 v -29.38 z m 9.01,14.69 h 13.996 c 2.11,0 2.922,-1.377 2.922,-3.123 v -1.135 c 0,-1.99 -0.974,-3.127 -3.693,-3.127 h -13.225 v 7.38 z"
|
||||
id="path34"
|
||||
style="opacity:0.293;filter:url(#filter1291)" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
@@ -0,0 +1,28 @@
|
||||
<svg width="1920" height="1920" viewBox="0 0 1920 1920" xmlns="http://www.w3.org/2000/svg">
|
||||
<clipPath id="a">
|
||||
<path id="b" fill="#2cd3e3" d="m1334.5488 1582.1247c-28.4552-23.0252-43.2128-44.8707-64.5988-95.6247-25.3093-60.0651-47.8839-87.6239-87.964-107.3859-19.9998-9.8611-40.1173-15.0444-66.3812-17.1032-18.9074-1.4822-86.6304-.5278-105.3003-2.0652-69.92737-5.7579-123.90089-26.1169-173.47181-65.4343-33.41312-26.5017-70.02913-69.9082-94.99294-112.5114-59.79603-102.0478-81.37876-198.78271-213.27375-277.5941 12.39924-21.70183 34.09241-35.09759 55.52244-46.62618 20.4843-40.74139 42.32638-74.39974 95.91156-90.58542 12.92189-3.90313 19.90689-4.69554 41-4.65128 19.70006.0414 20.96826.16562 32.5 3.18481 21.18287 5.546 34.31788 11.45635 53.38893 24.02338 19.97173 13.16053 31.44414 24.26503 56.13281 54.33267 17.87816 21.77332 20.10026 24.33205 29.31923 33.76085 38.65972 39.53961 73.34668 36.56267 77.81969 36.14929-3.67291-7.73135-7.29364-23.38307-9.10389-39.62667-1.95764-17.56621-3.46012-42.21303-.95323-62.86735 2.58304-21.28177 9.83227-48.31061 17.50821-65.27964 1.31354-2.90379 2.38825-5.54332 2.38825-5.86561 0-1.65552 15.0061-30.21565 21.1639-40.27977 15.3858-25.14644 47.5329-70.83509 57.3361-81.48827.55-.59769 3.6688-4.42585 6.9307-8.50703 20.0294-25.06008 61.3537-67.08217 85.5693-87.01412 4.125-3.3953 9.7022-8.06154 12.3937-10.36942s5.8415-4.84506 7-5.63818 2.3313-1.72317 2.6063-2.06678c.8826-1.1028 27.1338-20.41419 38.5-28.32203 6.05-4.2092 11.45-8.01486 12-8.45702.55-.44217 7.525-4.99177 15.5-10.11024s16.3-10.54797 18.5-12.06558c2.2-1.5176 6.25-3.99698 9-5.50973s7.925-4.47099 11.5-6.57386c13.4478-7.91025 40.507-21.75211 58.5406-29.94597 3.8277-1.73914 8.3094-3.83676 9.9594-4.66137s8.6073-3.99308 15.4606-7.04105c10.2629-4.56435 23.0544-10.9269 35.5224-17.66911 11.2219-6.06834 23.0076-14.83706 33.267-24.75094 3.9875-3.85322 7.25-7.2074 7.25-7.45373 0-.41324 3.9579-5.11446 6.6475-7.896 13.3625-17.52378 25.7406-36.11072 37.3525-54.41717 2.8879-6.21005 7.1747-10.94806 10.9967-16.61738 14.2693-21.35936 38.3987-46.12055 52.8954-54.28053 6.5625-3.69394 6.6868-3.71947 18.1079-3.71947h11.5l7.072 4.76366c7.5209 5.06596 10.2495 8.10481 12.3342 13.73634.7126 1.925 1.8127 4.58582 2.4447 5.91293.6555 1.3765 1.0922 6.59185 1.0166 12.142-.1294 9.49449-1.9623 17.67936-5.9561 26.5962-.7763 1.73312-1.4114 3.46586-1.4114 3.85053 0 1.64538-11.5429 23.35454-16.3963 30.83705-5.0777 7.82835-16.4697 23.23766-22.6523 30.64036-5.262 6.30047-11.3563 14.48273-16.0682 21.57342-8.8399 13.3025-15.6286 24.4666-16.5854 26.0786 10.8788-1.30869 21.897-1.65453 32.6366 1.10818 1.2886.4184 2.1768.98674 3.669 1.86853 4.1956 2.47926 11.6427 7.2794 15.4941 12.3922 1.8644 2.475 3.6551 4.725 3.9794 5 .3242.275 1.8996 3.2 3.5007 6.5 2.6871 5.53821 2.9707 9.13322 3.1386 18.60473.189 10.66226-.9846 16.29074-1.191 19.75385 6.6399-3.85785 68.2097-48.67035 101.9748-81.25338 11.0808-10.69288 36.2578-31.38092 45-37.25385 7.9297-5.32709 19.7095-10.85876 26.3612-12.37894 7.6088-1.73891 17.6682-.79227 24.418 2.29787 5.7726 2.64277 12.1294 8.29114 13.2286 11.75417.3448 1.08655 1.0105 1.97555 1.4792 1.97555 1.8172 0 4.2605 10.38748 4.1748 17.7484-.1093 9.39437-2.037 16.08622-7.322 25.41898-3.6169 6.38689-11.1266 16.63906-12.7836 18.83262-1.5504 2.05248-40.135 48.18251-56.9886 65.86569 30.3686 14.93501 32.4554 41.18744 24.255 71.63431-3.1937 10.14275-18.2308 38.01159-25.8091 53-20.1691 39.89035-69.5128 84.65212-89.0886 100 21.0212 8.92454 30.5113 33.51052 28.588 60.4132-1.4231 19.90537-12.2817 36.97875-37.1412 66.76616-33.7924 40.49125-49.7967 56.06859-72.5779 70.64162-20.2524 12.9553-43.9723 19.71177-43.9723 19.71177l2.0507 5.73362c2.7125 7.58411 2.9095 26.06285.3634 34.10628-2.032 6.41958-7.4973 16.55768-13.0067 24.12735-14.0923 19.36253-57.6985 53.0432-84.2781 65.095-23.5526 10.6791-38.5513 11.0799-38.5513 11.0799s4.4828 17.4333 4.5366 32.3251c.062 17.2547-1.6171 24.9745-8.4225 38.7141-13.1955 27.7415-40.4507 43.1189-64.2219 60.6872.624 1.5922 14.0082 16.3275 33.214 33.2719 24.8978 21.9664 46.1991 38.8539 58.1406 46.0936 2.9445 1.7851 7.3787 4.6388 9.8537 6.3416 6.9336 4.77 23.2748 13.4845 35.5 18.9314 6.9705 3.1057 26.8466 10.3458 30.5 11.1099 1.375.2876 4.525 1.143 7 1.9009 6.4625 1.9791 28.7403 5.8808 57 9.9829 44.0448 6.3935 66.3152 13.2318 83.5 25.6391 6.0801 4.3899 18.6026 18.1866 21.9348 24.1668 1.888 3.3883 4.6832 9.7606 6.2116 14.1606 2.5802 7.4282 2.7815 9.1436 2.8162 24 .042 17.9653-1.0805 23.8424-6.9121 36.1911-19.8567 42.0471-55.5096 46.1675-56.5901 47.4421l.2016 18.8668c.1149 10.7554-.309 15.0482-1.9509 21.116-7.88 29.1225-30.5077 51.5014-60.7111 60.0436-6.468 1.8294-10.5853 2.7691-21.5 2.8332-4.0173.024-17.2994-.6829-19.9921-1.4742 0 3.326-10.1664 20.2644-14.9191 25.1952-11.8393 12.2831-25.5479 18.2905-43.0888 18.8825-38.6908 1.3062-77.5246-27.63-88.4512-36.4716z"/>
|
||||
</clipPath>
|
||||
<path d="m0 0h1920v1920h-1920z" fill="#99eaff"/>
|
||||
<path d="m-44.254722 682.91057c195.353132-132.92976 351.447222-98.86848 466.022032-48.80765 204.35207-329.62316 703.72149-387.88427 998.49769-44.04599 161.505-107.80619 371.353-50.80746 513.0074 52.62089v1277.32218h-1933.2724z" fill="#ccf4fe"/>
|
||||
<path d="m-31.628257 1167.2235c141.494017-53.3934 359.227947-17.1959 518.575047 66.9771 65.06772-453.22794 741.28201-465.29026 983.71021-104.8824 63.4716-32.6017 324.2921-63.3571 474.0492 90.6289v700.0529h-1944.7062z" fill="#fff"/>
|
||||
<g fill="none" stroke="#24a8b5" stroke-width="54" transform="rotate(19,563,-133)">
|
||||
<rect fill="#fff" height="291.04729" rx="6" width="465.78566" x="658.32253" y="885.69167"/>
|
||||
<path d="m679.21967 898.18315 135.36056 123.54005c52.5322 47.9448 95.48415 41.0626 142.69405 2.6219l160.20842-128.62378"/>
|
||||
<path d="m660.09283 1167.9354 165.27316-150.8431"/>
|
||||
<path d="m1120.3373 1163.3457-172.18298-144.7062"/>
|
||||
</g>
|
||||
<g clip-path="url(#a)">
|
||||
<use href="#b"/>
|
||||
<g fill="#86dae2">
|
||||
<path d="m1233.1711 1089.7708c74.3447 200.172 163.4242 242.1899 428.0614 258.5212z"/>
|
||||
<path d="m953.96862 900.02607c87.31948-193.16064 157.28438-342.38841 439.70248-467.33639 138.8966-73.9092 194.465-250.8988 206.6771-310.43615-821.074 333.68623-646.37958 777.77254-646.37958 777.77254z"/>
|
||||
<path d="m1304.4521 518.42089c-3.1972 24.87639 8.6381 41.59821 36.7513 33.28049 71.1957-54.02509 205.5464-129.071 264.9326-160.18902l-42.9959-39.98576c-86.0448 61.38901-171.0257 114.41378-258.688 166.89429z"/>
|
||||
</g>
|
||||
<g fill="#24a8b5">
|
||||
<path d="m650.66153 1043.6358c35.84819-7.7967 100.70568 99.4805 195.35014 170.7051 87.87216 66.1281 182.82513 122.737 315.04673 156.9323h-400z"/>
|
||||
<path d="m1512.902 1589.2508c-18.6453-5.0324-36.0134-17.755-46.902-25.6075-22.5409-16.2558-34.9983-29.0675-52.526-54.0201-3.983-5.6702-4.909-7.824-5.2782-12.2758-.8038-9.6922 5.4325-20.9839 14.1406-25.6039 6.403-3.397 18.5519-3.1944 24.6636.4113 2.475 1.4602 5.5452 3.774 6.8227 5.1419 2.3601 2.527 14.1773 22.3559 14.1773 23.789 0 .4308 2.6168 4.0753 5.8152 8.0988 6.3214 7.9525 13.6647 12.5624 21.6158 13.57 2.2379.2836 4.519.8656 5.069 1.2934 3.0571 2.3778 21.7976 11.5654 28.8134 14.1258 9.3454 3.4107 38.4695 11.239 52.0269 8.325zm56.098-117.9241c-25.6398-4.1122-45.313-11.2939-63.4578-23.1654-3.8732-2.5342-7.5463-5.0916-8.1625-5.6833-2.4442-2.347-4.6232-8.0813-5.0882-13.3901-1.3041-14.888 10.8462-28.0084 25.9906-28.0659 6.9742-.026 10.3204 1.2892 21.0182 8.2643 18.1237 11.8168 18.9424 12.0203 43.3285 10.77 15.5849-.7991 21.9984-1.5668 29.7328-3.5589 11.2454-2.8964 32.7607-14.8363 39.8916-19.9593 29.3594-21.0928-4.3677 60.6463-51.7667 74.4379-5.2291 1.5215-24.7641 1.4288-31.4865.3507z"/>
|
||||
<path d="m1288.7736 1166.6709c-14.4841-7.4689-27.8659-16.0015-33.595-21.4209-.7268-.6875-1.6268-1.2572-2-1.266-.3732-.01-2.0891-1.2463-3.813-2.75-5.0574-4.4113-7.6001-6.5206-12.3365-10.234-6.9934-5.4829-12.4377-11.2687-23.5562-25.0336-5.6703-7.0198-11.3497-14.0465-12.6208-15.6149-3.9429-4.8645-30.0607-30.7167-35.7676-35.4038-2.9785-2.4462-5.9035-4.8977-6.5-5.4477-2.7209-2.5089-16.3102-13.0809-29.0845-22.6268-7.7-5.754-14.9-11.191-16-12.0823-27.8685-22.57972-50.2047-44.82165-64.5636-64.2909-2.4337-3.3-4.7044-6.225-5.0459-6.5-1.3255-1.0675-11.6505-19.90497-15.073-27.5-4.9158-10.90894-5.9546-16.35613-5.9937-16.35734-.039-.001 14.657-10.58109 22.2869-17.87067 12.9353-12.35828 24.2378-27.46964 34.609-46.27199 1.6686-3.025 5.4172-9.775 8.3303-15 5.3314-9.56273 10.95-20.60836 10.95-21.52683 0-.92199 4.2808-9.89307 18.1199-37.97317 20.0968-40.77691 24.0013-47.37572 43.194-73 9.0207-12.0435 34.4314-36.74541 48.7689-47.40861 6.8295-5.07924 13.0922-9.77542 13.9172-10.43596 2.2846-1.82914 24.9623-16.08734 29.5-18.54758 2.2-1.19279 6.25-3.51776 9-5.16659s5.9-3.43407 7-3.96718c1.1-.53312 2.675-1.41859 3.5-1.96772 1.7622-1.17296 38.3689-20.45569 65.5-34.50245 22.871-11.84113 62.7539-31.79659 74.5-37.27615 4.675-2.18089 11.4789-5.35569 15.1197-7.05511 8.3699-3.90673 18.5224-7.94846 36.8803-14.6821 52.0745-19.10082 82.1244-35.88524 114.5663-57.93548 56.591-54.73241 114.6827-143.77442 204.8677-130.93094.4589.34691-2.9044 5.47537-4.6891 7.43032-1.7847 1.95494-6.6199 7.34971-10.7449 11.98838-8.3713 9.41369-67.4215 68.80341-76 76.43687-3.025 2.69177-8.659 7.84751-12.5201 11.45721-3.861 3.6097-9.8916 9.03809-13.4014 12.06309-3.5097 3.025-7.3257 6.41342-8.4799 7.52983s-3.0471 2.69141-4.2064 3.5-5.3858 4.39517-9.3922 7.97017-8.2329 7.15658-9.3922 7.95908c-1.1593.80249-2.7345 2.07205-3.5005 2.82124-3.4044 3.32982-22.146 18.12892-39.1073 30.88055-6.325 4.75519-13.3 10.33063-15.5 12.38986-2.2 2.05924-7.8659 6.82773-12.5909 10.59667-9.2341 7.36566-10.9713 8.69193-20.8478 15.91646-7.6025 5.56117-7.5357 5.50965-12.1933 9.40136-1.9976 1.66913-3.9297 3.03478-4.2936 3.03478-.6844 0-6.3395 4.98978-12.3271 10.87699-7.8164 7.68525-12.2473 18.09358-12.2473 28.76916 0 8.24671 6.7852 19.31415 14.2501 23.24339 2.4436 1.28622 3.0344 1.14175 7.9449-1.9428 7.2368-4.54577 43.0629-28.18107 44.305-29.22898.55-.46402 5.725-4.17698 11.5-8.25104 18.3873-12.9716 54.7069-39.83495 56-41.41971.275-.33703 7.25-5.97722 15.5-12.53373 8.25-6.55652 17.6892-14.19172 20.9759-16.96711 6.676-5.63736 6.714-5.67032 12.142-10.54617 2.143-1.925 8.6181-7.53436 14.3892-12.46525 5.7711-4.93088 17.3806-16.47746 19.8378-18.83408 14.1473-13.56818 40.9289 20.21634 34.0829 48.6802-1.6566 6.88714-41.7247 48.98956-68.8345 72.61913-13.0542 11.37834-36.8282 28.85402-55.0933 40.49771-6.875 4.38271-12.725 8.20114-13 8.48542s-3.425 2.05594-7 3.93703-10.1306 5.81859-14.568 8.75c-4.4375 2.93141-8.5625 5.32984-9.1667 5.32984-.6043 0-1.2486.39679-1.432.88177-1.0625 2.81072-34.9649 17.57585-55.1028 23.9983-7.528 2.40085-41.1813 10.90498-55.418 14.00404-9.5115 2.07045-13.3542 3.61322-16.8639 6.77047-14.14 12.72-10.9471 36.08206 6.0105 43.97855 8.3843 3.90423 14.5044 3.25572 44.5409-4.71974 23.2114-6.16323 55.8635-17.70206 77.5-27.38751 13.773-6.1654 45.7416-23.08079 46.4986-23.4063 19.2912-8.29473 50.8351 37.4702 31.0473 65.79168-4.7798 6.84129-28.1452 30.01453-37.0459 37.42496-4.675 3.89223-8.725 7.32249-9 7.62281-2.5034 2.73388-26.6145 19.2044-35 23.90891-8.1316 4.56204-27.8123 13.8933-36.1821 17.15511-15.8184 6.16462-25.8704 9.06135-57.3179 16.51751-14.6692 3.47805-24.5121 4.58773-41.5 4.67865-16.4011.0878-22.6551-.4613-48.1926-4.23122-3.681-.5434-9.531-.98359-13-.97822-19.6876.0305-32.571 19.93082-24.267 37.48403 4.1799 8.8356 7.3725 10.90357 20.5966 13.34134 15.9836 2.94647 23.909 3.8949 43.5059 5.20641 19.4217 1.29976 44.5016.15505 66.2442-3.02356 6.9371-1.01416 16.7595-2.20862 16.9641-2.00613 7.0343 17.98197 15.4318 34.89104-.5251 46.85513-7.6975 5.77148-20.0799 12.38579-30.8261 18.09216-5.7335 3.04459-19.9844 8.87616-29.5 12.07162-26.6188 8.93895-53.585 12.08754-86.5 10.09981-15.4676-.93409-20.3213-1.66343-34.5-5.18412-12.6562-3.14267-17.8977-4.00843-22.5-3.71645-10.3873.659-17.7758 5.84336-22.2827 15.63534-2.1083 4.58065-2.3966 6.38465-1.9709 12.33435.4327 6.047 1.0116 7.7078 4.3761 12.553l3.8775 5.584 11 3.3669c24.2908 7.4351 57.1068 13.2823 75.8676 12.9354 17.3135-.3202 26.4227 119.255-72.197 130.361-.6139.069-6.6465-2.8481-13.397-6.3291z"/>
|
||||
</g>
|
||||
<circle cx="708.6" cy="879.6" fill="#fff" r="26"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 32 KiB |
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<svg version="1.1" width="512" height="512" viewBox="0 0 64 64" color-interpolation="linearRGB"
|
||||
xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">
|
||||
<g>
|
||||
<path style="fill:#000000; fill-opacity:0.4"
|
||||
d="M20.99 2C10.5 2 1.99 9.15 1.99 18C1.99 26.82 10.5 34 20.99 34C31.47 34 40 26.82 40 18C40 9.15 31.47 2 20.99 2z
|
||||
M40 36C37 33 36 26 36 26L28 32C28 32 36 36 40 36z"
|
||||
transform="matrix(1.4544,0,0,1.4544,2.9135,6.9089)"
|
||||
/>
|
||||
<path style="fill:none; stroke:#000000; stroke-width:4; stroke-linecap:round; stroke-linejoin:round"
|
||||
d="M20.99 2C10.5 2 1.99 9.15 1.99 18C1.99 26.82 10.5 34 20.99 34C31.47 34 40 26.82 40 18C40 9.15 31.47 2 20.99 2z
|
||||
M40 36C37 33 36 26 36 26L28 32C28 32 36 36 40 36z"
|
||||
transform="matrix(1.4544,0,0,1.4544,0.0047,4)"
|
||||
/>
|
||||
<linearGradient id="gradient0" gradientUnits="userSpaceOnUse" x1="128" y1="1.99" x2="128" y2="40">
|
||||
<stop offset="0" stop-color="#ffffff"/>
|
||||
<stop offset="1" stop-color="#e5e5e5"/>
|
||||
</linearGradient>
|
||||
<path style="fill:url(#gradient0)"
|
||||
d="M20.99 2C10.5 2 1.99 9.15 1.99 18C1.99 26.82 10.5 34 20.99 34C31.47 34 40 26.82 40 18C40 9.15 31.47 2 20.99 2z
|
||||
M40 36C37 33 36 26 36 26L28 32C28 32 36 36 40 36z"
|
||||
transform="matrix(1.4544,0,0,1.4544,0.0047,4)"
|
||||
/>
|
||||
<path style="fill:#000000"
|
||||
d="M22.48 26.76H26.1V28.82H22.48
|
||||
M26.1 21.75V23.99H22.48V21.75
|
||||
M34.03 23.99H30.29V21.75H34.03
|
||||
M30.29 28.82V26.76H34.03V28.82
|
||||
M30.29 40.24V36.75H40.15V33.27H30.29V31.75H38.14V18.77H30.29V17.75H39.71V14.3H30.29V11.57H26.1V14.3H17.15V17.75H26.1V18.77H18.59V31.75H26.1V33.27H16.71V36.75H26.1V40.24
|
||||
M15.39 16.61C12.9 14.22 10.89 12.49 10.89 12.49L7.6 15.07C7.6 15.07 7.6 15.07 9.62 16.79C12 18.82 13.01 20.57 13.01 20.57L16.53 18.16
|
||||
M7.46 25.83V29.75H11.5V37.75C11.5 37.75 11.5 37.75 10.06 39C8.43 40.21 7.03 41.13 7.03 41.13L9.04 45.46C9.04 45.46 9.04 45.46 10.89 43.82C12.35 42.46 13.79 41.05 15.96 43.82C18.84 44.86 23.12 45.07 27.51 45.29C35.15 45.19 39.6 44.94 39.82 43.76C40.43 41.77 40.93 40.75 35.96 41.16C27.48 41.27 23.15 41.08 19.48 40.94C16.96 39.93 15.56 37.46 15.56 37.46V25.83H7.46z
|
||||
M51.62 40.02H48.67V37.75H51.62
|
||||
M54.73 34.99H45.57V44.55H48.67V42.75H54.73
|
||||
M48.82 24.18V21.75H51.59V24.18
|
||||
M73.48 22.75C73.48 22.75 73.48 22.75 73.23 25.18C72.93 27.24 72.65 28.75 72.65 28.75L76.07 29.55C76.07 29.55 76.07 29.55 76.75 26.88C77.4 22.66 77.82 19.35 77.82 19.35L75.03 18.77L74.37 18.88H67.43C67.43 18.88 67.43 18.88 67.82 17.15C68.18 15.21 68.48 13.22 68.48 13.22L64.34 12.61C64.34 12.61 64.34 12.61 63.71 17.93C62.46 23.02 60.26 26.69 60.31 26.47C60.31 26.19 60.31 25.9 60.31 25.9V17.75H62.5V14.3H44.57V17.75H56.53V25.79C56.53 25.79 56.53 25.79 56.53 26.15C56.37 26.25 56.01 26.25 56.01 26.25H54.68V19.21H45.73V28H48.82V26.75H53.39C53.39 26.75 53.39 26.75 53.75 28C54.1 28.97 54.26 29.75 56.34 29.75C57.82 29.72 58.93 29.25 59.62 28.9C59.98 28.47 60.15 27.79 61.2 28.32C62.82 29.33 63.46 29.93 64.59 28.21C65.56 25.88 66.35 22.75 66.35 22.75H66.92V28.07C66.92 28.07 66.92 28.07 66.92 31.43C65.78 38.38 60.34 42.61 60.34 42.61V33.75H62.82V30.27H44.18V33.75H56.53V42.69C56.53 42.69 56.53 42.69 56.53 43.19C56.42 43.29 55.98 43.35 55.65 43.38C54.32 43.38 53.07 43.35 53.53 44.29C54.04 45.72 54.18 46.75 56.28 46.75C57.78 46.72 58.93 46.15 59.79 45.68C60.15 45.04 60.31 43.96 60.98 44.9C61.78 46.11 62.1 46.9 66.46 43.85C68.57 37.88 69.09 34.85 69.51 37.72C71.46 43.96 75.64 46.85 76.25 45.83C77.43 44.02 78.2 42.97 72.4 38.79C71.1 31.49 71.1 27.75 71.1 27.75V22.75H73.48z"
|
||||
transform="matrix(0.6943,0,0,0.669,0.986,10.1795)"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
@@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 484.03 474.84">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #e5cf62;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #392e1f;
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
fill: #feffff;
|
||||
}
|
||||
|
||||
.cls-4 {
|
||||
fill: #c4b62f;
|
||||
}
|
||||
|
||||
.cls-5 {
|
||||
fill: #baab9a;
|
||||
}
|
||||
|
||||
.cls-6 {
|
||||
clip-path: url(#clippath-1);
|
||||
}
|
||||
|
||||
.cls-7 {
|
||||
stroke: url(#linear-gradient-2);
|
||||
}
|
||||
|
||||
.cls-7, .cls-8, .cls-9, .cls-10 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-7, .cls-8, .cls-10 {
|
||||
stroke-miterlimit: 10;
|
||||
stroke-width: 4px;
|
||||
}
|
||||
|
||||
.cls-11 {
|
||||
fill: #c1b66e;
|
||||
}
|
||||
|
||||
.cls-12 {
|
||||
fill: #2e2130;
|
||||
}
|
||||
|
||||
.cls-13 {
|
||||
fill: #cab01c;
|
||||
}
|
||||
|
||||
.cls-8 {
|
||||
stroke: url(#linear-gradient-3);
|
||||
}
|
||||
|
||||
.cls-14 {
|
||||
fill: #212121;
|
||||
}
|
||||
|
||||
.cls-15 {
|
||||
clip-path: url(#clippath);
|
||||
}
|
||||
|
||||
.cls-16 {
|
||||
fill: #000805;
|
||||
}
|
||||
|
||||
.cls-10 {
|
||||
stroke: url(#linear-gradient);
|
||||
}
|
||||
|
||||
.cls-17 {
|
||||
fill: #a19a42;
|
||||
}
|
||||
|
||||
.cls-18 {
|
||||
fill: #e8d96d;
|
||||
}
|
||||
</style>
|
||||
<clipPath id="clippath">
|
||||
<path class="cls-9" d="m155.97,474.84c7.81-22.57,14.87-41.17,20.32-55,7.75-19.68,11.14-26.91,14.04-32.69,5.91-11.79,5.69-9.39,18.17-32.42,0,0,6.98-12.89,12.99-21.62,3.1-4.5,6.45-8.9,6.45-8.9,0,0,1.62-2.13,3.39-4.34,19.7-24.71,37.39-42.47,37.39-42.47,16.07-16.13,29.3-26.98,33.86-30.66,1.39-1.13,2.09-1.69,3.04-2.43,10.94-8.46,23.07-17.66,41.13-23.66,16.54-5.49,32.93-11.11,47.57-2.97,15.11,8.4,23.96,26.19,22.79,45.59,2.7,2.4,8.44,8.2,11.15,17.59,1.82,6.32,1.55,11.79,1.11,15.11-5.31-2.37-9.53-4.76-12.64-6.69-3.8-2.36-4.42-2.86-6.57-3.96-7.69-3.97-15.14-4.23-17.15-4.25-4-.05-12.02.48-20.11,5.4-1.81,1.1-5.49,3.55-9.89,8.76-7.98,9.47-6.36,13.87-12.6,24.54-8.59,14.68-22.3,24.5-30.92,30.71-.42.3-.95.68-1.6,1.13-6.32,4.37-21.12,13.79-47.95,21.66-28.58,8.38-56.07,10.71-69.13,11.48,20.68-10.52,48.58-28.44,72.96-58.1,7.25-8.82,28.21-35.77,35.57-69.33,2.12-9.69,2.61-17.76,1.49-26.01-2.16-15.83-9.62-27.43-15.61-35.43-35.45-47.32-79.28-74.32-79.28-74.32-33.41-20.09-41.33-16.6-86.45-39.71-29.69-15.21-52.46-30.15-66.66-40.06,3.77,5.61,10.25,14.8,19.32,25.27,8.86,10.23,29.39,32.29,98.99,76.27,9.78,6.18,24.06,15.02,41.73,25.3-4.86-1.48-11.52-3.61-19.32-6.44-37.63-13.67-64.07-30-72.96-35.68-16.44-10.5-36.81-25.42-57.85-46.08,8.9,21.52,24.08,48.86,51.16,70.98,16.71,13.65,41.42,24.83,60.29,34.01,11.17,5.43,20.63,9.61,27.28,12.44-5.29.29-10.84.29-16.62-.08-38.61-2.48-68.4-20.46-86.56-34.48,5.64,10.12,18.27,29.63,41.99,45.34,23.61,15.63,46.4,19.67,57.9,20.93-6.41,1.48-14.13,2.62-22.87,2.6-23.51-.03-41.67-8.36-51.64-14,8.02,9.49,21.04,22.6,40.13,33.69,14.6,8.48,28.24,13.17,38.65,15.86-4.31,1.64-9.74,3.15-16.1,3.72-18.09,1.61-32.18-5.49-38.4-9.17,6.82,8.07,17.07,18.41,31.46,27.75,10.85,7.04,21.12,11.61,29.48,14.62-3.65,1.16-8.12,2.17-13.25,2.48-14.71.89-26.17-4.48-31.83-7.68,5.49,8.3,17.27,23.2,37.16,29.98,3.91,1.33,7.68,2.2,11.2,2.73"/>
|
||||
</clipPath>
|
||||
<clipPath id="clippath-1">
|
||||
<path class="cls-9" d="m357.86,36.48c-3.83,12.38-7.82,30.95-5.23,52.83,1.84,15.53,6.17,25.77,8.37,32.3,6.36,18.9,9.05,48.9-9.42,96.51-13.39,7.26-26.79,14.51-40.18,21.77-.76-6.82-2.35-16.97-6.11-28.83-3.27-10.29-5.94-14.51-7.76-20.37-2.96-9.53-4.54-24.24,3.06-45.93,1.02,8.26,3.21,14.35,4.97,18.31,2.64,5.95,6.03,9.15,8.63,16.74,1.41,4.12,2.03,7.66,2.33,9.92,1.58-1.71,3.98-4.69,5.61-8.9,5.91-15.24-5.9-28.41-8.98-46.27-1.6-9.27-1.41-22.94,7.51-41.1-1.47,14.83,1.32,25.22,4.26,32.08,3.33,7.76,7.48,12.45,10.98,23.41,2.38,7.44,3.23,13.91,3.56,18.27,2-2.59,4.64-6.62,6.38-11.99,2.75-8.52,1.31-14.53-2.48-34-4.61-23.65-5.96-32.74-4.4-44.61.21-1.59.46-4.02,1.27-7.18,3.85-15.02,11.71-26.05,17.65-32.95Z"/>
|
||||
</clipPath>
|
||||
<linearGradient id="linear-gradient" x1="268.88" y1="386.34" x2="283.69" y2="386.34" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#000"/>
|
||||
<stop offset="1" stop-color="#000"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-2" x1="287.9" y1="375.66" x2="304.37" y2="375.66" xlink:href="#linear-gradient"/>
|
||||
<linearGradient id="linear-gradient-3" x1="268.98" y1="393.87" x2="313.02" y2="393.87" xlink:href="#linear-gradient"/>
|
||||
</defs>
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<g>
|
||||
<g class="cls-15">
|
||||
<g>
|
||||
<ellipse class="cls-11" cx="227.21" cy="287.64" rx="167.4" ry="77.79" transform="translate(-56.17 55.13) rotate(-12.33)"/>
|
||||
<path class="cls-1" d="m354.43,167.55c6.99,35.51-67.81,92.56-136.54,95.53-17.09.74-17.95-2.55-61.92-8.64-94.28-13.06-122.42-2.73-128.62-15.42-9.38-19.19,56.45-91.96,146.94-111.73,76.91-16.81,172.92,3.53,180.15,40.26Z"/>
|
||||
<path class="cls-12" d="m337.67,94.75c1.22,12.05-13.76,14.9-65.79,63.92-40.48,38.14-42.7,47.05-61.28,52.98-22.89,7.3-36.62-.78-91.72-15.39-85.29-22.61-103.83-16.89-108.29-30.04C.98,137.94,73.66,72.89,157.53,54.49c84.57-18.55,177.19,11.07,180.15,40.26Z"/>
|
||||
<path class="cls-4" d="m327.83,45.82c.9,16.43-34.14,17.8-65.3,61.01-27.45,38.08-15.85,58.66-37.44,73.44-14.79,10.13-31.85,8.42-145.44-28.08C11.15,130.18,3.22,126.27.75,117.29-8.33,84.38,66.87,23,147.68,5.56c87.18-18.81,178.72,13.99,180.15,40.26Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g class="cls-6">
|
||||
<g>
|
||||
<ellipse class="cls-1" cx="290.17" cy="178.71" rx="167.4" ry="77.79" transform="translate(-31.46 66.06) rotate(-12.33)"/>
|
||||
<path class="cls-11" d="m483.71,246.33c6.16,46.65-77.97,96.66-146.94,111.73-90.32,19.74-170.98,1.71-180.15-40.26-6.6-30.21,59.19-64.87,146.94-111.73,32.11-17.15,48.95-23.4,69.92-23.91,48.33-1.18,105.51,28.42,110.23,64.17Z"/>
|
||||
<path class="cls-12" d="m413.75,76.82c.88,8.85-6.55,14.86-38.83,41.98-95.16,79.97-93.16,80.38-101.76,84-70.46,29.68-179.32-8.41-186.5-54.51-6.75-43.37,76.07-96.53,146.94-111.73,82.85-17.77,177.17,10.38,180.15,40.26Z"/>
|
||||
<path class="cls-4" d="m400,50.06c-.01,5.23-5.62,6.9-22.68,29.86-9.98,13.43-15.61,23.03-18.34,27.27-12.89,20.03-54.43,65.83-96.38,82.17-72.52,28.25-183.99-16.79-189.69-67.83-5.23-46.94,79.17-97.42,146.94-111.73,89.76-18.96,180.2,19.23,180.15,40.26Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<path class="cls-17" d="m311.4,239.89c0,1.34-.06,3.35-.27,5.78-.61,6.93-2.12,12.06-3,15-5.05,16.86-7.57,25.29-9.24,29.4-8.68,21.31-26.85,39.38-39.61,51.89-12.6,12.35-30.87,28.2-55.49,43.57l-4.44.41c-11.98,16.33-23.96,32.65-35.94,48.97-2.88,1.6-5.76,3.2-8.64,4.8,18.15-21.67,29.13-40.12,35.86-53.17,4.42-8.57,11.41-23.36,24-42.96,4.75-7.39,8.79-13.14,11-16.26,10.43-14.78,17.15-24.27,27.06-34.49,4.43-4.56,12.89-12.78,18.34-17.89.6-.56,1.8-1.68,3.76-3.53,7.29-6.85,8.62-8.17,11.03-10.39,4.23-3.9,7.45-6.58,11.37-9.85,3.91-3.25,8.67-7.09,14.21-11.28Z"/>
|
||||
<path class="cls-13" d="m203.79,385.53c7.63-4.77,17.18-11.19,27.69-19.44,19.05-14.95,31.58-28.32,34.68-31.66,9.56-10.33,21.21-24.49,32.51-42.78-.36,1.86-3.26,18.24,8.62,31.6,11.6,13.03,27.67,12.39,29.67,12.27-9.99,8.22-22.35,16.91-37.24,24.73-37.49,19.69-73.05,24.38-95.93,25.29Z"/>
|
||||
<path class="cls-18" d="m402.98,282.1c2.27-1.04,6-3.11,9.44-6.97,2.93-3.28,4.51-6.58,5.36-8.78.33-7.5.2-27.92-13.42-40.77-19.36-18.27-60.49-16.06-92.97,14.31-4.47,17.97-8.94,35.94-13.4,53.92-.36,2.45-2.1,16.03,7.25,27.94,11.64,14.84,30.11,13.87,31.71,13.76,11.2-10.91,17.72-21.2,21.66-28.85,4.02-7.79,4.71-11.59,8.74-15.84,8.97-9.45,23.88-9.96,35.62-8.72Z"/>
|
||||
<g>
|
||||
<path class="cls-14" d="m417.86,264.27c-5.99,1.04-11.99,2.08-17.98,3.12-8.69,0-25.87-.87-28.93-8.82-1.6-4.15.11-11.62-1.98-16.77-.18-.44-1.07-2.55-.4-4.78.16-.54.49-1.57,1.4-1.97,1-.44,2.22.1,2.9.69,1.22,1.05.81,2.26,1.56,2.86,1.68,1.34,8.04-1.25,8.71-5,.72-4.07-5.47-8.43-10.07-10.04-1.26-.44-3.77-.7-8.74-1.22-6.26-.65-9.4-1.07-10.73-.93-.16.02-.3.03-.44.05-1.49.2-2.56.42-2.88.48-2.63.52-4.95.15-4.95.15-.38-.04-.84-.12-1.35-.3-1.16-.42-1.91-1.15-2.29-1.59,1.54-.63,3.82-1.52,6.62-2.44,11.95-3.91,25.14-8.22,39.06-3.42,9.13,3.15,16,9.33,19.68,13.85,1.79,2.19,3.18,4.43,3.37,4.73,3.59,5.81,4.92,10.95,5.74,14.12,1.79,7,1.93,13.06,1.71,17.22Z"/>
|
||||
<path class="cls-14" d="m372.89,286.46c1.28-3.15,3.24-7,6.31-10.92,6.75-8.6,15.04-12.64,19.56-14.43l5.1,7.48c2.04,5.7,1.91,11.31-.89,13.51-3.01,2.38-10.22.91-12.52.46-.52-.1-1.88-.41-3.72-.39-1.62.02-2.99.28-4.51.68-3.78,1.01-7.23,2.56-9.33,3.6Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<circle class="cls-16" cx="385.54" cy="247.87" r="7.95"/>
|
||||
<circle class="cls-3" cx="387.05" cy="245.08" r="2.79"/>
|
||||
</g>
|
||||
<path class="cls-5" d="m426.99,293.81c.88-2.4,2.22-7.14,1.25-12.95-1.64-9.81-8.66-15.31-10.38-16.59-1.51,3.49-3.02,6.97-4.54,10.46-3.89,2.17-7.77,4.35-11.66,6.52,8.44,4.19,16.88,8.37,25.33,12.56Z"/>
|
||||
<g>
|
||||
<path class="cls-5" d="m417.86,264.27c3.09,4.69,6.52,10.91,9.19,18.6,1.51,4.35,2.51,8.41,3.19,12.04-1.07-.34-2.38-.8-3.86-1.43,0,0-1.62-.69-3.2-1.52-3.71-1.94-7.24-4.8-9.36-6.21-2.26-1.5-5.74-3.24-10.95-4.02-.48-1.16-.93-2.54-1.22-4.12-.64-3.57-.19-6.73.45-9.09.27-1,.58-1.85.85-2.53,1.77-.38,3.66-.72,5.66-1,3.33-.46,6.43-.67,9.25-.73Z"/>
|
||||
<path class="cls-2" d="m402.95,266c-.18.49-.36.98-.53,1.47,3.49,2.64,7.32,5.87,11.23,9.79,4.24,4.25,7.69,8.41,10.46,12.15,1.18,1.21,2.36,2.42,3.54,3.63-3.27-4.91-7.48-10.45-12.84-16.11-4.09-4.32-8.13-7.93-11.86-10.94Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="cls-10" d="m270.73,372.87l11.11,26.94"/>
|
||||
<path class="cls-7" d="m289.62,364.79c4.34,7.25,8.69,14.5,13.03,21.75"/>
|
||||
<line class="cls-8" x1="269.93" y1="405.27" x2="312.07" y2="382.47"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.5 KiB |
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 240 240" id="svg2" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="icon.svg" inkscape:export-filename="/usr/src/G1/yaxim/asset-graphics/yak-grass.png" inkscape:export-xdpi="100.07505" inkscape:export-ydpi="100.07505">
|
||||
<defs id="defs4">
|
||||
<linearGradient inkscape:collect="always" id="hair-3">
|
||||
<stop style="stop-color:#803300;stop-opacity:1;" offset="0" id="stop4211"/>
|
||||
<stop style="stop-color:#632800;stop-opacity:1" offset="1" id="stop4213"/>
|
||||
</linearGradient>
|
||||
<linearGradient inkscape:collect="always" id="face-4">
|
||||
<stop style="stop-color:#7d5d5d;stop-opacity:1" offset="0" id="stop4187"/>
|
||||
<stop style="stop-color:#653a3a;stop-opacity:1" offset="1" id="stop4189"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="horn-6-7" inkscape:collect="always">
|
||||
<stop id="stop4173" offset="0" style="stop-color:#c8b7b7;stop-opacity:1;"/>
|
||||
<stop id="stop4175" offset="1" style="stop-color:#916f6f;stop-opacity:1"/>
|
||||
</linearGradient>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#horn-6-7" id="linearGradient4169" x1="163.93039" y1="136.61838" x2="221.33586" y2="103.28334" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#horn-6-7" id="linearGradient4183" x1="485.88913" y1="130.25711" x2="531.94739" y2="162.58197" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#face-4" id="linearGradient4191" x1="374.63556" y1="428.83673" x2="371.53345" y2="297.51688" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#face-4" id="linearGradient4199" x1="476.2699" y1="351.55411" x2="494.49133" y2="344.48303" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#face-4" id="linearGradient4207" x1="267.55359" y1="363.70987" x2="243.70245" y2="356.63879" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
|
||||
<radialGradient inkscape:collect="always" xlink:href="#hair-3" id="radialGradient4217" cx="374.30594" cy="290.83109" fx="374.30594" fy="290.83109" r="110.27738" gradientTransform="matrix(0.51642294,-0.00883784,0.00347391,0.20388409,-65.930166,877.32132)" gradientUnits="userSpaceOnUse"/>
|
||||
</defs>
|
||||
<sodipodi:namedview id="base" pagecolor="#494745" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="2.8284271" inkscape:cx="28.129339" inkscape:cy="114.93147" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1920" inkscape:window-height="1029" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" units="px" showguides="false">
|
||||
<inkscape:grid type="xygrid" id="grid5353" originx="20" originy="20" spacingx="10" spacingy="10"/>
|
||||
</sodipodi:namedview>
|
||||
<metadata id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-812.36216)">
|
||||
<path style="fill:#99cc33;fill-opacity:1;stroke:#669900;stroke-width:4.86499977;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 53.269531,845.17578 c -10.266673,0.27991 -19.576776,9.05841 -20.373047,19.375 -0.26138,20.53097 -0.03593,41.07704 -0.111328,61.61377 0.05527,24.53746 -0.11011,49.08127 0.0819,73.61482 0.621828,10.71753 10.383803,19.87393 21.128864,19.78623 44.355126,-0.013 88.714509,0.078 133.067589,-0.045 10.73105,-0.4371 20.03681,-10.06 20.13139,-20.79981 0.009,-44.47334 0.0809,-88.95148 -0.0357,-133.42297 -0.42153,-10.46516 -9.65497,-19.63915 -20.03422,-20.0919 -44.6149,-0.11601 -89.238883,-0.0556 -133.855489,-0.0301 z" id="rect3450-3" inkscape:connector-curvature="0"/>
|
||||
<path style="fill:#669900;fill-opacity:1;fill-rule:evenodd;stroke:#669900;stroke-width:1.19520223px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 38.515721,918.34836 c 10.153917,-33.55991 1.580157,-9.90509 18.878429,16.61745 2.012347,-8.48401 0.912034,-11.20893 3.728838,-27.27196 2.379487,10.84674 6.650859,27.91872 13.044822,34.69493 6.400509,-4.36969 11.61382,-12.34846 17.248541,-18.62057 3.295109,-4.28321 10.061749,-18.57227 9.496769,-4.33479 0.82159,6.10771 2.27229,20.6289 6.22927,19.60063 4.72677,-11.44421 3.29557,-46.95893 10.61584,-55.94089 2.59523,29.15561 12.24177,39.269 21.03786,5.12515 1.20391,14.14385 7.17312,22.32945 11.5106,32.74898 1.02162,3.02994 3.98033,14.80846 3.30568,5.2513 3.112,-14.57771 5.72674,13.26446 10.19135,8.38642 3.23087,-9.85848 3.38164,-13.10423 7.14522,-22.69087 4.36856,-26.44247 -1.00942,-3.47087 12.66614,20.55863 9.83166,-23.16191 6.30039,-52.63407 11.75854,6.50228 2.73098,-8.50802 4.24473,-23.67634 5.87972,-27.20895 3.0054,10.94164 6.25616,17.73384 5.94973,30.15986 0.55323,12.4288 -0.0479,24.91693 0.44471,37.3202 -1.65107,12.07059 -1.53944,26.25464 -9.9972,32.92814 -7.39708,9.6221 -17.81944,4.4354 -26.71442,6.6529 -12.35655,3.5218 -25.10876,1.3684 -37.6455,1.9068 -14.93086,0.8338 -29.80367,-2.4911 -44.743153,-1.5038 -14.698821,-0.2743 -29.669186,1.7255 -44.010515,-3.8641 -8.413667,-6.1703 -11.741297,-21.52304 -12.078954,-34.33751 -2.350132,-29.67846 0.341394,-36.69079 6.057683,-62.68023 z" id="path4197" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccccccccc"/>
|
||||
<path style="fill:#4c7800;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 38.183767,974.46578 c 1.125388,-3.25592 3.691308,-13.922 4.520832,-5.10924 3.528397,6.00636 1.465648,13.15556 2.587646,19.71831 3.229295,-0.37355 5.346597,-9.99777 6.32655,-14.43519 1.85021,7.02583 3.854887,14.1364 8.724737,19.79695 2.497566,-3.42027 2.926958,-9.49874 5.154944,-13.80332 1.075234,-3.49721 4.319041,-6.99851 5.090463,-1.32089 2.409525,7.63579 3.680854,16.14546 9.170615,22.3859 6.365047,0.6367 7.544458,-9.3862 10.056699,-13.84277 4.197301,-10.36624 11.092337,-19.38831 15.597357,-29.58218 4.83312,-5.07432 4.81333,6.60783 7.08119,9.34229 3.58646,9.94509 6.22094,20.35999 11.03628,29.7711 5.30954,6.17606 6.01006,-8.29794 9.88477,-10.69399 3.51571,1.7617 3.40407,12.27625 7.25147,10.95891 2.58805,-6.44985 4.92169,-12.96839 6.43875,-19.74445 2.51003,-2.80506 2.90985,12.35197 8.78685,7.29604 2.58121,-5.29019 4.70103,-11.80212 10.21325,-14.79395 6.14772,1.22743 2.97818,10.85611 7.03881,15.00086 3.33086,9.11976 6.63837,-3.03364 9.63101,-5.88045 1.61196,-3.07383 3.85618,-7.28598 4.22063,-1.64528 1.11168,3.26036 0.84743,13.56286 5.19729,11.20021 2.8324,-5.41483 2.92539,-10.20999 9.34521,-19.35545 5.06547,12.33161 8.87029,26.05954 2.96798,37.76131 -1.26925,9.0966 -11.14031,10.2574 -18.41187,12.2102 -8.52172,1.09 -17.24804,0.2031 -25.85201,0.504 -14.29863,0.067 -28.57511,-0.1857 -42.86349,0.3377 -6.03701,-0.6015 -12.10213,-0.5491 -18.114569,-0.3437 -7.030939,-0.8427 -14.137698,0.8658 -21.114055,-0.7193 -6.148516,-0.2699 -12.455199,-2.2202 -18.425624,0.2232 -18.523823,2.33 -29.725482,-7.2061 -29.01334,-23.34892 -0.793226,-3.96804 5.573212,-17.68678 7.471625,-21.8879 z" id="path4174" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccccccccccccccc"/>
|
||||
<rect ry="21.962282" rx="21.962288" y="844.79456" x="32.43243" height="175.13513" width="175.13513" id="rect3450" style="fill:none;fill-opacity:1;stroke:#669900;stroke-width:4.865;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
|
||||
<g id="g4262" transform="translate(-4.8361402,0)">
|
||||
<path sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" inkscape:connector-curvature="0" id="path4272" d="m 126.58306,1042.1389 c -7.09035,0.1774 -13.66992,-2.7851 -18.75841,-7.5104 -5.88417,-4.2836 -9.381015,-10.8254 -12.749868,-17.1103 -4.208493,-8.5784 -9.094199,-16.9566 -10.92662,-26.51907 -1.803917,-5.76691 0.331622,-4.9829 -6.286858,-6.52366 -2.3545,-0.6022 -2.933021,-0.65562 -5.127509,-1.49781 -3.307555,-1.66113 -6.82072,-4.90316 -6.026895,-9.14553 0.08147,-3.34016 2.748025,-9.29511 3.97469,-12.04361 0.91534,-1.65692 3.058877,-3.12108 2.201741,-5.09228 0.528801,-4.64531 1.345241,-9.54102 3.378281,-13.64115 1.236436,-2.65573 3.147097,-5.53074 4.609704,-8.02095 -2.195938,-0.96604 -5.210293,2.93179 -6.487379,0.82212 -0.05406,-2.05336 1.505113,-4.40962 2.594297,-6.2735 1.73941,-2.94874 7.683875,-3.44611 1.047935,-5.04802 -5.486425,-2.00028 -9.771628,-5.95319 -14.096424,-9.8264 -2.303704,-3.44345 -6.15485,-5.84069 -8.525329,-9.37725 -2.884844,-3.50736 -6.066033,-7.57438 -7.448098,-11.71551 -2.096051,-4.05535 -4.085075,-8.10164 -6.226413,-12.065 -2.121078,-4.13334 -3.183825,-8.15761 -3.862042,-12.64611 -0.06224,-2.65508 -0.532585,-6.54839 -0.815643,-8.27126 0.146292,-4.44179 0.668419,-9.14264 1.83774,-13.69518 0.496324,-2.98753 1.323428,-6.24528 1.353207,-8.70666 0.302197,-6.21234 4.301217,-11.87896 9.239082,-15.46794 0.379912,5.04446 0.214517,10.87118 0.867348,15.306 0.285403,3.27095 1.176012,5.65808 2.405197,8.49605 1.690048,2.85054 3.807757,6.79173 5.929922,10.01148 3.585485,4.56445 7.808228,9.47947 11.02808,14.55661 1.598335,2.04308 3.157992,4.77727 5.234862,6.7205 1.494321,2.05329 3.399273,3.43578 4.942179,4.93772 2.983537,3.21707 6.504731,5.61338 9.541551,8.54921 1.606526,1.5923 3.269674,2.74249 4.456728,3.85064 2.857588,2.65316 4.760789,3.96737 9.665604,8.18004 1.89317,1.33926 3.9661,3.22774 4.83934,2.24536 4.5159,-1.78631 10.39091,-1.34346 15.34674,0.41505 1.55667,0.69093 3.27329,2.71745 4.68732,2.1484 3.76411,-3.51423 9.3342,-4.94278 14.37801,-4.82612 3.05916,0.33108 3.99723,-3.05457 6.18447,-4.5005 5.01848,-6.46319 11.4081,-11.62361 17.09092,-17.33168 1.36158,-2.02375 4.40218,-5.33511 6.04822,-7.83666 1.81188,-2.27416 3.88026,-6.43952 5.52961,-8.21422 3.55278,-5.41595 7.22461,-11.1506 9.7389,-16.74806 2.53507,-6.56673 5.91343,-12.68945 7.94775,-18.97709 0.5899,-1.78877 1.77538,-3.52089 2.06935,-5.44175 1.69184,-2.13109 3.95725,1.31247 4.91473,2.71372 3.44757,6.2125 4.5866,12.96437 6.71963,19.50302 2.04198,8.06207 0.6828,16.88473 -1.69602,24.90312 -1.00747,6.46671 -3.55283,13.37555 -5.51135,19.26871 -0.26761,1.80626 -2.05447,4.9708 -3.18281,6.58997 -2.77196,5.62244 -6.87337,10.26188 -10.77642,15.01436 -3.91191,4.20367 -8.16947,8.32363 -13.11539,10.98009 -1.3679,0.0317 -4.20256,1.85775 -1.70564,3.43976 1.08194,1.47816 3.06663,4.95188 -0.13991,4.60357 -3.22443,-0.54393 -6.79533,-0.15054 -2.64276,2.96154 3.23213,3.91664 3.4291,10.06727 2.59427,14.83218 1.43984,0.7415 4.8641,1.57501 5.2188,4.62545 2.63582,6.29969 7.64664,11.96238 9.0529,18.41008 0.17894,2.944 -1.38965,4.87826 -2.79168,6.78295 -2.79418,2.67527 -7.15063,3.8727 -11.17285,2.61969 -2.78489,-1.28268 -1.52093,3.80886 -2.36034,5.22389 -1.20787,6.5517 -3.81355,12.30606 -7.1399,17.90839 -2.94235,6.1633 -6.02787,12.0681 -9.82112,17.7466 -2.21619,2.6131 -4.44333,5.2258 -6.85245,7.6824 -7.05077,7.3235 -11.24756,12.073 -20.42298,12.025 z" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.43099999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
|
||||
<path sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0" id="path4270" d="m 124.94764,1039.4395 c 0.45196,-5.4315 2.23538,-13.306 -4.43943,-14.0383 -2.36257,-1.1866 -2.18981,-4.3763 0.35274,-5.2857 3.61766,-2.0579 7.58221,-3.6452 11.57249,-1.6342 3.6779,1.8919 2.40163,7.901 -1.82318,7.5412 -3.54555,-0.4379 -2.81783,2.8858 -2.88188,4.5135 0.0932,3.4069 0.46995,10.8351 5.66537,7.4806 4.83252,-2.1883 8.82018,-6.011 12.19586,-10.561 3.25582,-3.3427 6.73813,-7.1379 9.41477,-11.5532 2.40167,-3.1021 -2.18401,-4.8065 -2.18401,-4.8065 -11.22713,-6.5688 -24.74797,-9.3533 -37.52649,-6.6627 -4.89674,1.8141 -9.9689,3.4359 -14.59616,5.7852 -3.735505,1.4671 -5.812815,3.9107 -2.377214,7.6579 3.544274,6.2296 7.527934,12.4324 13.657084,16.4724 3.59928,2.9931 8.22809,5.2943 12.97005,5.0908 z" style="fill:#ffccaa;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4268" d="m 127.77864,1028.5536 c -0.33143,-0.8631 -0.24671,0.764 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4266" d="m 95.110116,1009.9642 c 6.192304,-5.004 14.119014,-7.0315 21.552834,-9.4869 9.08852,-1.25252 18.93599,-0.63338 27.72462,2.8106 4.74516,1.6946 9.05975,4.2725 13.38615,6.7895 3.13085,-6.5983 7.19946,-12.69759 9.14372,-19.6641 1.67898,-9.12788 2.87027,-18.79835 3.24203,-27.77863 1.53706,-4.32197 -3.75501,-3.65998 -3.47044,-7.73059 -1.44979,-6.71739 -7.96946,-10.61799 -12.6846,-15.02827 -1.55845,-1.15439 -4.14997,-4.49449 -5.25038,-1.18211 -2.40033,3.80647 -3.79028,7.11535 -6.00666,11.28136 -1.30501,1.78827 -1.81869,3.89215 -3.05086,5.17836 -0.5988,2.77893 -4.94597,3.73813 -5.68516,0.5474 -2.49235,-3.2659 -5.10802,-6.44695 -7.22391,-10.03014 -1.90244,-2.6233 -4.22002,-4.87591 -5.57647,-7.80881 -3.00792,5.05715 -6.55362,9.70305 -9.49124,14.75691 -0.60225,1.41966 -5.62843,5.42602 -1.34103,4.74166 3.66716,0.75186 6.89516,3.76168 8.67136,6.9249 0.81715,2.15796 2.76089,5.04151 1.42371,8.05265 -1.46661,4.72243 -3.65888,9.56592 -8.52601,11.30075 -1.60292,0.77239 -4.76075,0.47482 -6.73336,-0.58595 -5.260678,-3.75463 -6.028115,-11.55234 -5.243684,-16.73457 1.044694,-3.26092 2.599224,-6.24966 5.441354,-8.22714 1.20609,-0.66012 -1.40213,-2.00638 -1.9847,-2.89876 -3.18084,-1.26913 -7.97928,-13.18968 -9.545105,-6.40156 -0.916812,3.77918 -1.658102,8.16512 -1.785957,11.76495 1.056162,2.38327 -2.268368,4.18328 -3.999083,-0.0136 -1.211268,-4.84004 -5.132394,-12.13358 -3.989331,-2.39447 -1.400776,8.53844 -1.840117,17.37535 0.774106,25.67913 1.079416,3.56658 1.605863,7.08664 3.054079,10.30129 1.777301,5.55088 3.68378,11.15954 6.85241,16.05254 l 0.32238,-0.2167 -8.61e-4,3e-4 z" style="fill:url(#linearGradient4191);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4264" d="m 144.75917,985.10612 c -5.00323,-0.74681 -5.72318,-6.80041 -7.3575,-10.81229 -1.24824,-5.51939 -2.30247,-12.69374 3.16981,-16.22504 4.08828,-3.257 10.85078,-3.87544 14.41456,0.61584 2.91703,4.09468 3.1902,10.22 2.49912,15.16856 -1.43353,5.62842 -6.08105,11.95636 -12.72599,11.25293 z" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4262" d="m 146.49725,982.37512 c 7.49728,-2.18714 9.9371,-11.63828 7.74831,-18.50959 -0.39137,-4.62761 -5.17127,-7.51551 -9.27625,-5.40849 -4.20824,1.23546 -6.89632,6.00195 -5.81471,10.41253 0.63271,4.5578 1.74702,9.53483 4.7217,13.0716 0.74176,0.51785 1.77674,0.67856 2.62095,0.43395 z" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path4260" d="m 148.64583,963.35949 c 5.70461,2.5998 3.15538,13.82318 0.29976,15.25607 -6.93873,3.76236 -6.10181,-15.13758 -0.29976,-15.25607 z" style="fill:#2b1100;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4258" d="m 145.85926,972.31023 c 4.59816,-4.00808 -4.89135,-2.59786 0,0 z" style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4256" d="m 81.053927,982.22661 c 0.561925,-2.45753 -0.06169,-6.15944 -0.137593,-8.63166 -1.094328,-4.78181 0.299555,-9.22834 -0.122532,-14.11748 0.161803,-2.50547 0.891665,-4.76478 1.021637,-7.25404 -3.121039,4.12073 -7.144058,8.16819 -9.543605,13.01839 -0.87811,3.60041 -2.021231,6.12013 -2.776901,9.66665 -0.162836,5.82203 6.924755,7.75301 11.558994,7.31814 z" style="fill:url(#linearGradient4207);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4254" d="m 108.90781,981.26062 c 1.92403,-0.0999 3.36222,-0.88527 5.10546,-2.74132 3.47829,-3.71814 4.96745,-9.54241 2.11005,-13.86037 -1.66599,-4.28446 -8.7801,-6.84792 -11.25498,-1.94187 -3.51007,5.32384 -3.07282,13.3211 1.21849,18.09334 l 1.52844,0.51677 1.29252,-0.0666 z" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4252" d="m 108.8755,978.71903 c -6.60916,-2.24108 -2.27162,-19.00122 4.29366,-13.12054 2.50053,3.91366 2.75349,14.36784 -4.29366,13.12054 z" style="fill:#2b1100;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4250" d="m 108.47887,974.48353 c 4.49073,-4.73386 -5.62263,-2.69987 0,0 z" style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4248" d="m 176.60372,979.50001 c 5.4633,-0.0564 9.99716,-6.9663 6.29891,-11.66927 -2.65752,-5.03255 -5.58145,-10.36989 -8.44524,-15.06528 -4.38273,0.14275 -0.35238,6.60365 -1.17551,9.59416 -0.0721,5.26761 -1.07664,10.66993 -1.24098,16.24966 1.37488,0.72275 3.19541,0.52242 4.56282,0.89073 z" style="fill:url(#linearGradient4199);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4246" d="m 89.731453,956.60697 c 0.173568,-5.32519 -0.180447,-12.28655 5.590404,-15.12102 3.150277,4.44276 6.829553,8.58454 10.641823,12.51176 1.78954,-0.74636 1.51349,-0.69393 2.26558,-2.042 3.43702,-5.55328 7.52336,-10.67604 10.35257,-16.57298 3.69459,-3.67658 6.25146,1.55308 7.91672,4.53411 3.388,3.53988 5.66824,8.0974 8.45311,11.82223 1.24654,2.14342 2.68433,1.81345 3.26416,-0.6616 2.25969,-3.77661 3.65235,-7.0567 5.58798,-10.58719 1.59373,-2.35421 3.20008,-8.23864 6.75011,-6.10697 6.559,3.57532 11.6129,9.23252 16.74379,14.60182 1.62457,4.57232 3.12993,-0.021 2.91127,-2.8438 0.95345,-5.01345 -0.92851,-9.47647 -4.50774,-13.06986 -1.39257,-1.62992 -5.63419,-4.54815 -2.31103,-6.30336 1.2542,1.08333 6.39428,3.0371 6.33144,0.26069 -3.04194,-4.9365 -7.15441,-9.72873 -12.75704,-11.84722 -4.15491,-2.52854 -14.9926,-0.15831 -16.21165,-2.76621 2.66453,-2.53008 7.20354,-4.15112 9.82517,-5.49947 -6.38683,-0.74863 -13.1544,-1.07072 -18.77168,2.71324 -3.12054,3.87803 -6.69441,0.41676 -10.15969,-0.76382 -6.5254,-1.4538 -13.70751,-1.06917 -19.3361,3.10596 -2.653329,2.48141 12.14927,4.1582 3.87421,6.51493 -6.03041,2.69933 -12.782689,3.78789 -17.92203,7.95704 -3.678534,2.50206 -9.002231,2.69938 -11.516492,6.77552 2.305328,0.54308 12.505332,-2.07178 6.860956,3.89175 -2.831323,5.15423 -7.162303,10.01721 -7.691565,16.00843 4.312504,-4.6541 11.665769,-10.9461 11.934718,0.74294 -0.03555,0.94448 0.609548,3.29376 1.881006,2.74508 z" style="fill:url(#radialGradient4217);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4242" d="m 86.145969,923.85117 c 4.587176,-3.61061 10.154469,-5.93937 15.853441,-6.68536 -1.53265,-1.9481 -12.18342,-0.70676 -3.956101,-5.25409 1.536719,-1.6878 8.365841,-3.87014 5.046641,-5.70064 -4.789838,-3.50948 -9.025174,-8.27479 -14.230512,-11.85683 -3.045864,-2.47926 -5.577902,-5.43696 -8.580939,-7.64059 -0.572717,1.68718 -1.717362,1.45856 -3.152146,3.13608 -1.628709,1.50462 -4.094887,3.57826 -5.733969,3.78124 -2.408785,-1.53229 -0.5903,-3.93488 1.734893,-4.71833 1.722184,-0.81617 3.098347,-2.50094 3.926406,-3.56869 2.085069,-0.62836 -0.840701,-2.62968 -1.788628,-3.61902 -0.804505,-1.19274 -2.714621,-2.21899 -2.372178,-3.07321 -2.251751,-0.82342 -3.142816,-3.71537 -4.765386,-5.31631 -4.036603,-5.53463 -7.522991,-11.09371 -12.125029,-16.01425 -2.306047,0.69273 -3.96513,2.78847 -6.60286,2.17672 -2.497742,0.26259 -4.396942,-5.17935 -0.778906,-3.24898 2.145206,0.19025 6.888711,-1.44907 4.292002,-4.09223 -1.298724,-2.40367 -3.449949,-6.20431 -4.204114,-7.77215 -1.964442,-2.47961 -0.393332,-8.17203 -0.909231,-11.5122 0.365733,-8.32558 -2.299744,-1.45835 -3.420584,1.47812 -1.561137,6.63686 -1.820903,13.26144 -3.671306,19.85281 -0.403021,6.52554 -0.243852,12.32979 1.15104,18.6792 0.819796,3.20877 1.959534,6.37947 3.571534,9.26185 2.901689,0.23343 5.415028,-1.88815 7.559153,-3.88609 1.571984,-2.16599 4.304249,1.54186 2.017856,2.57414 -2.001222,2.21812 -4.954513,5.07688 -7.913833,4.35006 3.365297,6.99412 6.403429,14.19299 11.861699,19.90966 3.409578,3.99881 7.238373,7.53105 10.661436,11.05544 2.123897,0.87931 3.677617,4.50276 6.073495,2.53301 2.127989,-1.58334 13.3692,-8.10752 7.831136,-2.27185 -2.387397,1.82721 -4.572762,3.34597 -6.893467,4.68476 1.774778,1.09113 4.136502,1.85865 6.389633,2.56233 1.198958,-0.66097 2.022411,0.0783 3.128824,0.1954 z" style="fill:url(#linearGradient4169);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4240" d="m 170.16763,922.04792 c 4.16178,-1.02835 7.67158,-4.26231 11.00661,-7.07162 4.41106,-4.53441 8.35929,-9.01617 11.86917,-14.50443 1.05207,-1.02203 2.83507,-3.00253 1.80989,-4.10513 -3.24255,0.32116 -6.40267,-2.60384 -6.78757,-5.6632 2.76236,-1.78156 5.37447,5.65599 9.2717,2.49561 2.00989,-4.28631 3.27652,-8.97751 4.8138,-13.1922 1.57418,-5.20838 2.43067,-10.50309 3.8092,-15.47958 0.45775,-2.46254 1.10234,-3.96741 1.10565,-6.94924 0.74471,-3.36167 0.14202,-5.69807 -3.93393,-4.56689 -5.85517,-1.3395 -0.73417,-4.04059 2.95664,-2.87549 1.75194,-1.82696 -0.90112,-5.48718 -1.17947,-8.04915 -0.90657,-2.14667 -1.04157,-4.40977 -1.93894,-6.381 -0.66906,-3.06039 -1.99643,-6.05579 -3.84838,-8.53548 -1.81396,5.14469 -3.99616,10.13578 -6.10508,15.18764 -1.32168,4.53232 -3.81415,8.67942 -5.53444,12.68826 -2.85204,5.36797 -6.04907,9.77903 -9.20999,14.90104 5.11484,0.0256 10.90093,-0.37726 14.67172,-4.20549 2.1993,-0.23438 2.71951,2.16469 1.04341,3.09553 -2.22942,2.40289 -5.129,2.96104 -8.07984,3.91843 -3.68442,1.51983 -8.72364,-2.48989 -10.24859,1.02972 -3.12732,4.63718 -6.28503,8.77715 -10.23307,12.91915 -4.60723,4.39994 -9.8012,8.68205 -13.47735,13.68076 2.9809,2.50887 8.47607,2.87451 12.04683,0.91128 2.94045,4.77113 -12.66012,2.01493 -14.97059,1.80235 4.41884,0.88877 15.86554,9.28826 4.34515,7.36554 -7.84996,1.32913 2.89574,1.19752 5.46354,2.64387 4.4323,2.02212 8.34712,5.55519 11.33393,8.93972 z" style="fill:url(#linearGradient4183);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4238" d="m 186.4269,913.81595 c -0.79257,-0.24807 -0.13619,0.26364 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4236" d="m 207.6889,869.52893 c -0.47547,-0.49648 -0.62037,0.19284 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path4234" d="m 51.535953,858.9088 c -0.109095,-0.29681 -0.559784,0.29265 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
<path inkscape:connector-curvature="0" id="path3429" d="m 55.041894,857.36439 c -1.179898,-0.26619 -0.275201,0.27547 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
|
||||
</g>
|
||||
<path style="fill:#000000;stroke:#000000;stroke-opacity:1" d="" id="path3427" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,100 @@
|
||||
/*!* Platform.js <https://mths.be/platform>
|
||||
* Copyright 2014-2018 Benjamin Tan <https://bnjmnt4n.now.sh/>
|
||||
* Copyright 2011-2013 John-David Dalton <http://allyoucanleet.com/>
|
||||
* Available under MIT license <https://mths.be/mit>*/;(function(){'use strict';var objectTypes={'function':true,'object':true};var root=(objectTypes[typeof window]&&window)||this;var oldRoot=root;var freeExports=objectTypes[typeof exports]&&exports;var freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module;var freeGlobal=freeExports&&freeModule&&typeof global=='object'&&global;if(freeGlobal&&(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal||freeGlobal.self===freeGlobal)){root=freeGlobal;}
|
||||
var maxSafeInteger=Math.pow(2,53)-1;var reOpera=/\bOpera/;var thisBinding=this;var objectProto=Object.prototype;var hasOwnProperty=objectProto.hasOwnProperty;var toString=objectProto.toString;function capitalize(string){string=String(string);return string.charAt(0).toUpperCase()+string.slice(1);}
|
||||
function cleanupOS(os,pattern,label){var data={'10.0':'10','6.4':'10 Technical Preview','6.3':'8.1','6.2':'8','6.1':'Server 2008 R2 / 7','6.0':'Server 2008 / Vista','5.2':'Server 2003 / XP 64-bit','5.1':'XP','5.01':'2000 SP1','5.0':'2000','4.0':'NT','4.90':'ME'};if(pattern&&label&&/^Win/i.test(os)&&!/^Windows Phone /i.test(os)&&(data=data[/[\d.]+$/.exec(os)])){os='Windows '+data;}
|
||||
os=String(os);if(pattern&&label){os=os.replace(RegExp(pattern,'i'),label);}
|
||||
os=format(os.replace(/ ce$/i,' CE').replace(/\bhpw/i,'web').replace(/\bMacintosh\b/,'Mac OS').replace(/_PowerPC\b/i,' OS').replace(/\b(OS X) [^ \d]+/i,'$1').replace(/\bMac (OS X)\b/,'$1').replace(/\/(\d)/,' $1').replace(/_/g,'.').replace(/(?: BePC|[ .]*fc[ \d.]+)$/i,'').replace(/\bx86\.64\b/gi,'x86_64').replace(/\b(Windows Phone) OS\b/,'$1').replace(/\b(Chrome OS \w+) [\d.]+\b/,'$1').split(' on ')[0]);return os;}
|
||||
function each(object,callback){var index=-1,length=object?object.length:0;if(typeof length=='number'&&length>-1&&length<=maxSafeInteger){while(++index<length){callback(object[index],index,object);}}else{forOwn(object,callback);}}
|
||||
function format(string){string=trim(string);return /^(?:webOS|i(?:OS|P))/.test(string)?string:capitalize(string);}
|
||||
function forOwn(object,callback){for(var key in object){if(hasOwnProperty.call(object,key)){callback(object[key],key,object);}}}
|
||||
function getClassOf(value){return value==null?capitalize(value):toString.call(value).slice(8,-1);}
|
||||
function isHostType(object,property){var type=object!=null?typeof object[property]:'number';return!/^(?:boolean|number|string|undefined)$/.test(type)&&(type=='object'?!!object[property]:true);}
|
||||
function qualify(string){return String(string).replace(/([ -])(?!$)/g,'$1?');}
|
||||
function reduce(array,callback){var accumulator=null;each(array,function(value,index){accumulator=callback(accumulator,value,index,array);});return accumulator;}
|
||||
function trim(string){return String(string).replace(/^ +| +$/g,'');}
|
||||
function parse(ua){var context=root;var isCustomContext=ua&&typeof ua=='object'&&getClassOf(ua)!='String';if(isCustomContext){context=ua;ua=null;}
|
||||
var nav=context.navigator||{};var userAgent=nav.userAgent||'';ua||(ua=userAgent);var isModuleScope=isCustomContext||thisBinding==oldRoot;var likeChrome=isCustomContext?!!nav.likeChrome:/\bChrome\b/.test(ua)&&!/internal|\n/i.test(toString.toString());var objectClass='Object',airRuntimeClass=isCustomContext?objectClass:'ScriptBridgingProxyObject',enviroClass=isCustomContext?objectClass:'Environment',javaClass=(isCustomContext&&context.java)?'JavaPackage':getClassOf(context.java),phantomClass=isCustomContext?objectClass:'RuntimeObject';var java=/\bJava/.test(javaClass)&&context.java;var rhino=java&&getClassOf(context.environment)==enviroClass;var alpha=java?'a':'\u03b1';var beta=java?'b':'\u03b2';var doc=context.document||{};var opera=context.operamini||context.opera;var operaClass=reOpera.test(operaClass=(isCustomContext&&opera)?opera['[[Class]]']:getClassOf(opera))?operaClass:(opera=null);var data;var arch=ua;var description=[];var prerelease=null;var useFeatures=ua==userAgent;var version=useFeatures&&opera&&typeof opera.version=='function'&&opera.version();var isSpecialCasedOS;var layout=getLayout([{'label':'EdgeHTML','pattern':'Edge'},'Trident',{'label':'WebKit','pattern':'AppleWebKit'},'iCab','Presto','NetFront','Tasman','KHTML','Gecko']);var name=getName(['Adobe AIR','Arora','Avant Browser','Breach','Camino','Electron','Epiphany','Fennec','Flock','Galeon','GreenBrowser','iCab','Iceweasel','K-Meleon','Konqueror','Lunascape','Maxthon',{'label':'Microsoft Edge','pattern':'Edge'},'Midori','Nook Browser','PaleMoon','PhantomJS','Raven','Rekonq','RockMelt',{'label':'Samsung Internet','pattern':'SamsungBrowser'},'SeaMonkey',{'label':'Silk','pattern':'(?:Cloud9|Silk-Accelerated)'},'Sleipnir','SlimBrowser',{'label':'SRWare Iron','pattern':'Iron'},'Sunrise','Swiftfox','Waterfox','WebPositive','Opera Mini',{'label':'Opera Mini','pattern':'OPiOS'},'Opera',{'label':'Opera','pattern':'OPR'},'Chrome',{'label':'Chrome Mobile','pattern':'(?:CriOS|CrMo)'},{'label':'Firefox','pattern':'(?:Firefox|Minefield)'},{'label':'Firefox for iOS','pattern':'FxiOS'},{'label':'IE','pattern':'IEMobile'},{'label':'IE','pattern':'MSIE'},'Safari']);var product=getProduct([{'label':'BlackBerry','pattern':'BB10'},'BlackBerry',{'label':'Galaxy S','pattern':'GT-I9000'},{'label':'Galaxy S2','pattern':'GT-I9100'},{'label':'Galaxy S3','pattern':'GT-I9300'},{'label':'Galaxy S4','pattern':'GT-I9500'},{'label':'Galaxy S5','pattern':'SM-G900'},{'label':'Galaxy S6','pattern':'SM-G920'},{'label':'Galaxy S6 Edge','pattern':'SM-G925'},{'label':'Galaxy S7','pattern':'SM-G930'},{'label':'Galaxy S7 Edge','pattern':'SM-G935'},'Google TV','Lumia','iPad','iPod','iPhone','Kindle',{'label':'Kindle Fire','pattern':'(?:Cloud9|Silk-Accelerated)'},'Nexus','Nook','PlayBook','PlayStation Vita','PlayStation','TouchPad','Transformer',{'label':'Wii U','pattern':'WiiU'},'Wii','Xbox One',{'label':'Xbox 360','pattern':'Xbox'},'Xoom']);var manufacturer=getManufacturer({'Apple':{'iPad':1,'iPhone':1,'iPod':1},'Archos':{},'Amazon':{'Kindle':1,'Kindle Fire':1},'Asus':{'Transformer':1},'Barnes & Noble':{'Nook':1},'BlackBerry':{'PlayBook':1},'Google':{'Google TV':1,'Nexus':1},'HP':{'TouchPad':1},'HTC':{},'LG':{},'Microsoft':{'Xbox':1,'Xbox One':1},'Motorola':{'Xoom':1},'Nintendo':{'Wii U':1,'Wii':1},'Nokia':{'Lumia':1},'Samsung':{'Galaxy S':1,'Galaxy S2':1,'Galaxy S3':1,'Galaxy S4':1},'Sony':{'PlayStation':1,'PlayStation Vita':1}});var os=getOS(['Windows Phone','Android','CentOS',{'label':'Chrome OS','pattern':'CrOS'},'Debian','Fedora','FreeBSD','Gentoo','Haiku','Kubuntu','Linux Mint','OpenBSD','Red Hat','SuSE','Ubuntu','Xubuntu','Cygwin','Symbian OS','hpwOS','webOS ','webOS','Tablet OS','Tizen','Linux','Mac OS X','Macintosh','Mac','Windows 98;','Windows ']);function getLayout(guesses){return reduce(guesses,function(result,guess){return result||RegExp('\\b'+(guess.pattern||qualify(guess))+'\\b','i').exec(ua)&&(guess.label||guess);});}
|
||||
function getManufacturer(guesses){return reduce(guesses,function(result,value,key){return result||(value[product]||value[/^[a-z]+(?: +[a-z]+\b)*/i.exec(product)]||RegExp('\\b'+qualify(key)+'(?:\\b|\\w*\\d)','i').exec(ua))&&key;});}
|
||||
function getName(guesses){return reduce(guesses,function(result,guess){return result||RegExp('\\b'+(guess.pattern||qualify(guess))+'\\b','i').exec(ua)&&(guess.label||guess);});}
|
||||
function getOS(guesses){return reduce(guesses,function(result,guess){var pattern=guess.pattern||qualify(guess);if(!result&&(result=RegExp('\\b'+pattern+'(?:/[\\d.]+|[ \\w.]*)','i').exec(ua))){result=cleanupOS(result,pattern,guess.label||guess);}
|
||||
return result;});}
|
||||
function getProduct(guesses){return reduce(guesses,function(result,guess){var pattern=guess.pattern||qualify(guess);if(!result&&(result=RegExp('\\b'+pattern+' *\\d+[.\\w_]*','i').exec(ua)||RegExp('\\b'+pattern+' *\\w+-[\\w]*','i').exec(ua)||RegExp('\\b'+pattern+'(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)','i').exec(ua))){if((result=String((guess.label&&!RegExp(pattern,'i').test(guess.label))?guess.label:result).split('/'))[1]&&!/[\d.]+/.test(result[0])){result[0]+=' '+result[1];}
|
||||
guess=guess.label||guess;result=format(result[0].replace(RegExp(pattern,'i'),guess).replace(RegExp('; *(?:'+guess+'[_-])?','i'),' ').replace(RegExp('('+guess+')[-_.]?(\\w)','i'),'$1 $2'));}
|
||||
return result;});}
|
||||
function getVersion(patterns){return reduce(patterns,function(result,pattern){return result||(RegExp(pattern+
|
||||
'(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)','i').exec(ua)||0)[1]||null;});}
|
||||
function toStringPlatform(){return this.description||'';}
|
||||
layout&&(layout=[layout]);if(manufacturer&&!product){product=getProduct([manufacturer]);}
|
||||
if((data=/\bGoogle TV\b/.exec(product))){product=data[0];}
|
||||
if(/\bSimulator\b/i.test(ua)){product=(product?product+' ':'')+'Simulator';}
|
||||
if(name=='Opera Mini'&&/\bOPiOS\b/.test(ua)){description.push('running in Turbo/Uncompressed mode');}
|
||||
if(name=='IE'&&/\blike iPhone OS\b/.test(ua)){data=parse(ua.replace(/like iPhone OS/,''));manufacturer=data.manufacturer;product=data.product;}
|
||||
else if(/^iP/.test(product)){name||(name='Safari');os='iOS'+((data=/ OS ([\d_]+)/i.exec(ua))?' '+data[1].replace(/_/g,'.'):'');}
|
||||
else if(name=='Konqueror'&&!/buntu/i.test(os)){os='Kubuntu';}
|
||||
else if((manufacturer&&manufacturer!='Google'&&((/Chrome/.test(name)&&!/\bMobile Safari\b/i.test(ua))||/\bVita\b/.test(product)))||(/\bAndroid\b/.test(os)&&/^Chrome/.test(name)&&/\bVersion\//i.test(ua))){name='Android Browser';os=/\bAndroid\b/.test(os)?os:'Android';}
|
||||
else if(name=='Silk'){if(!/\bMobi/i.test(ua)){os='Android';description.unshift('desktop mode');}
|
||||
if(/Accelerated *= *true/i.test(ua)){description.unshift('accelerated');}}
|
||||
else if(name=='PaleMoon'&&(data=/\bFirefox\/([\d.]+)\b/.exec(ua))){description.push('identifying as Firefox '+data[1]);}
|
||||
else if(name=='Firefox'&&(data=/\b(Mobile|Tablet|TV)\b/i.exec(ua))){os||(os='Firefox OS');product||(product=data[1]);}
|
||||
else if(!name||(data=!/\bMinefield\b/i.test(ua)&&/\b(?:Firefox|Safari)\b/.exec(name))){if(name&&!product&&/[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data+'/')+8))){name=null;}
|
||||
if((data=product||manufacturer||os)&&(product||manufacturer||/\b(?:Android|Symbian OS|Tablet OS|webOS)\b/.test(os))){name=/[a-z]+(?: Hat)?/i.exec(/\bAndroid\b/.test(os)?os:data)+' Browser';}}
|
||||
else if(name=='Electron'&&(data=(/\bChrome\/([\d.]+)\b/.exec(ua)||0)[1])){description.push('Chromium '+data);}
|
||||
if(!version){version=getVersion(['(?:Cloud9|CriOS|CrMo|Edge|FxiOS|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\d.]+$))','Version',qualify(name),'(?:Firefox|Minefield|NetFront)']);}
|
||||
if((data=layout=='iCab'&&parseFloat(version)>3&&'WebKit'||/\bOpera\b/.test(name)&&(/\bOPR\b/.test(ua)?'Blink':'Presto')||/\b(?:Midori|Nook|Safari)\b/i.test(ua)&&!/^(?:Trident|EdgeHTML)$/.test(layout)&&'WebKit'||!layout&&/\bMSIE\b/i.test(ua)&&(os=='Mac OS'?'Tasman':'Trident')||layout=='WebKit'&&/\bPlayStation\b(?! Vita\b)/i.test(name)&&'NetFront')){layout=[data];}
|
||||
if(name=='IE'&&(data=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua)||0)[1])){name+=' Mobile';os='Windows Phone '+(/\+$/.test(data)?data:data+'.x');description.unshift('desktop mode');}
|
||||
else if(/\bWPDesktop\b/i.test(ua)){name='IE Mobile';os='Windows Phone 8.x';description.unshift('desktop mode');version||(version=(/\brv:([\d.]+)/.exec(ua)||0)[1]);}
|
||||
else if(name!='IE'&&layout=='Trident'&&(data=/\brv:([\d.]+)/.exec(ua))){if(name){description.push('identifying as '+name+(version?' '+version:''));}
|
||||
name='IE';version=data[1];}
|
||||
if(useFeatures){if(isHostType(context,'global')){if(java){data=java.lang.System;arch=data.getProperty('os.arch');os=os||data.getProperty('os.name')+' '+data.getProperty('os.version');}
|
||||
if(rhino){try{version=context.require('ringo/engine').version.join('.');name='RingoJS';}catch(e){if((data=context.system)&&data.global.system==context.system){name='Narwhal';os||(os=data[0].os||null);}}
|
||||
if(!name){name='Rhino';}}
|
||||
else if(typeof context.process=='object'&&!context.process.browser&&(data=context.process)){if(typeof data.versions=='object'){if(typeof data.versions.electron=='string'){description.push('Node '+data.versions.node);name='Electron';version=data.versions.electron;}else if(typeof data.versions.nw=='string'){description.push('Chromium '+version,'Node '+data.versions.node);name='NW.js';version=data.versions.nw;}}
|
||||
if(!name){name='Node.js';arch=data.arch;os=data.platform;version=/[\d.]+/.exec(data.version);version=version?version[0]:null;}}}
|
||||
else if(getClassOf((data=context.runtime))==airRuntimeClass){name='Adobe AIR';os=data.flash.system.Capabilities.os;}
|
||||
else if(getClassOf((data=context.phantom))==phantomClass){name='PhantomJS';version=(data=data.version||null)&&(data.major+'.'+data.minor+'.'+data.patch);}
|
||||
else if(typeof doc.documentMode=='number'&&(data=/\bTrident\/(\d+)/i.exec(ua))){version=[version,doc.documentMode];if((data=+data[1]+4)!=version[1]){description.push('IE '+version[1]+' mode');layout&&(layout[1]='');version[1]=data;}
|
||||
version=name=='IE'?String(version[1].toFixed(1)):version[0];}
|
||||
else if(typeof doc.documentMode=='number'&&/^(?:Chrome|Firefox)\b/.test(name)){description.push('masking as '+name+' '+version);name='IE';version='11.0';layout=['Trident'];os='Windows';}
|
||||
os=os&&format(os);}
|
||||
if(version&&(data=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version)||/(?:alpha|beta)(?: ?\d)?/i.exec(ua+';'+(useFeatures&&nav.appMinorVersion))||/\bMinefield\b/i.test(ua)&&'a')){prerelease=/b/i.test(data)?'beta':'alpha';version=version.replace(RegExp(data+'\\+?$'),'')+
|
||||
(prerelease=='beta'?beta:alpha)+(/\d+\+?/.exec(data)||'');}
|
||||
if(name=='Fennec'||name=='Firefox'&&/\b(?:Android|Firefox OS)\b/.test(os)){name='Firefox Mobile';}
|
||||
else if(name=='Maxthon'&&version){version=version.replace(/\.[\d.]+/,'.x');}
|
||||
else if(/\bXbox\b/i.test(product)){if(product=='Xbox 360'){os=null;}
|
||||
if(product=='Xbox 360'&&/\bIEMobile\b/.test(ua)){description.unshift('mobile mode');}}
|
||||
else if((/^(?:Chrome|IE|Opera)$/.test(name)||name&&!product&&!/Browser|Mobi/.test(name))&&(os=='Windows CE'||/Mobi/i.test(ua))){name+=' Mobile';}
|
||||
else if(name=='IE'&&useFeatures){try{if(context.external===null){description.unshift('platform preview');}}catch(e){description.unshift('embedded');}}
|
||||
else if((/\bBlackBerry\b/.test(product)||/\bBB10\b/.test(ua))&&(data=(RegExp(product.replace(/ +/g,' *')+'/([.\\d]+)','i').exec(ua)||0)[1]||version)){data=[data,/BB10/.test(ua)];os=(data[1]?(product=null,manufacturer='BlackBerry'):'Device Software')+' '+data[0];version=null;}
|
||||
else if(this!=forOwn&&product!='Wii'&&((useFeatures&&opera)||(/Opera/.test(name)&&/\b(?:MSIE|Firefox)\b/i.test(ua))||(name=='Firefox'&&/\bOS X (?:\d+\.){2,}/.test(os))||(name=='IE'&&((os&&!/^Win/.test(os)&&version>5.5)||/\bWindows XP\b/.test(os)&&version>8||version==8&&!/\bTrident\b/.test(ua))))&&!reOpera.test((data=parse.call(forOwn,ua.replace(reOpera,'')+';')))&&data.name){data='ing as '+data.name+((data=data.version)?' '+data:'');if(reOpera.test(name)){if(/\bIE\b/.test(data)&&os=='Mac OS'){os=null;}
|
||||
data='identify'+data;}
|
||||
else{data='mask'+data;if(operaClass){name=format(operaClass.replace(/([a-z])([A-Z])/g,'$1 $2'));}else{name='Opera';}
|
||||
if(/\bIE\b/.test(data)){os=null;}
|
||||
if(!useFeatures){version=null;}}
|
||||
layout=['Presto'];description.push(data);}
|
||||
if((data=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua)||0)[1])){data=[parseFloat(data.replace(/\.(\d)$/,'.0$1')),data];if(name=='Safari'&&data[1].slice(-1)=='+'){name='WebKit Nightly';prerelease='alpha';version=data[1].slice(0,-1);}
|
||||
else if(version==data[1]||version==(data[2]=(/\bSafari\/([\d.]+\+?)/i.exec(ua)||0)[1])){version=null;}
|
||||
data[1]=(/\bChrome\/([\d.]+)/i.exec(ua)||0)[1];if(data[0]==537.36&&data[2]==537.36&&parseFloat(data[1])>=28&&layout=='WebKit'){layout=['Blink'];}
|
||||
if(!useFeatures||(!likeChrome&&!data[1])){layout&&(layout[1]='like Safari');data=(data=data[0],data<400?1:data<500?2:data<526?3:data<533?4:data<534?'4+':data<535?5:data<537?6:data<538?7:data<601?8:'8');}else{layout&&(layout[1]='like Chrome');data=data[1]||(data=data[0],data<530?1:data<532?2:data<532.05?3:data<533?4:data<534.03?5:data<534.07?6:data<534.10?7:data<534.13?8:data<534.16?9:data<534.24?10:data<534.30?11:data<535.01?12:data<535.02?'13+':data<535.07?15:data<535.11?16:data<535.19?17:data<536.05?18:data<536.10?19:data<537.01?20:data<537.11?'21+':data<537.13?23:data<537.18?24:data<537.24?25:data<537.36?26:layout!='Blink'?'27':'28');}
|
||||
layout&&(layout[1]+=' '+(data+=typeof data=='number'?'.x':/[.+]/.test(data)?'':'+'));if(name=='Safari'&&(!version||parseInt(version)>45)){version=data;}}
|
||||
if(name=='Opera'&&(data=/\bzbov|zvav$/.exec(os))){name+=' ';description.unshift('desktop mode');if(data=='zvav'){name+='Mini';version=null;}else{name+='Mobile';}
|
||||
os=os.replace(RegExp(' *'+data+'$'),'');}
|
||||
else if(name=='Safari'&&/\bChrome\b/.exec(layout&&layout[1])){description.unshift('desktop mode');name='Chrome Mobile';version=null;if(/\bOS X\b/.test(os)){manufacturer='Apple';os='iOS 4.3+';}else{os=null;}}
|
||||
if(version&&version.indexOf((data=/[\d.]+$/.exec(os)))==0&&ua.indexOf('/'+data+'-')>-1){os=trim(os.replace(data,''));}
|
||||
if(layout&&!/\b(?:Avant|Nook)\b/.test(name)&&(/Browser|Lunascape|Maxthon/.test(name)||name!='Safari'&&/^iOS/.test(os)&&/\bSafari\b/.test(layout[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|Web)/.test(name)&&layout[1])){(data=layout[layout.length-1])&&description.push(data);}
|
||||
if(description.length){description=['('+description.join('; ')+')'];}
|
||||
if(manufacturer&&product&&product.indexOf(manufacturer)<0){description.push('on '+manufacturer);}
|
||||
if(product){description.push((/^on /.test(description[description.length-1])?'':'on ')+product);}
|
||||
if(os){data=/ ([\d.+]+)$/.exec(os);isSpecialCasedOS=data&&os.charAt(os.length-data[0].length-1)=='/';os={'architecture':32,'family':(data&&!isSpecialCasedOS)?os.replace(data[0],''):os,'version':data?data[1]:null,'toString':function(){var version=this.version;return this.family+((version&&!isSpecialCasedOS)?' '+version:'')+(this.architecture==64?' 64-bit':'');}};}
|
||||
if((data=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch))&&!/\bi686\b/i.test(arch)){if(os){os.architecture=64;os.family=os.family.replace(RegExp(' *'+data),'');}
|
||||
if(name&&(/\bWOW64\b/i.test(ua)||(useFeatures&&/\w(?:86|32)$/.test(nav.cpuClass||nav.platform)&&!/\bWin64; x64\b/i.test(ua)))){description.unshift('32-bit');}}
|
||||
else if(os&&/^OS X/.test(os.family)&&name=='Chrome'&&parseFloat(version)>=39){os.architecture=64;}
|
||||
ua||(ua=null);var platform={};platform.description=ua;platform.layout=layout&&layout[0];platform.manufacturer=manufacturer;platform.name=name;platform.prerelease=prerelease;platform.product=product;platform.ua=ua;platform.version=name&&version;platform.os=os||{'architecture':null,'family':null,'version':null,'toString':function(){return 'null';}};platform.parse=parse;platform.toString=toStringPlatform;if(platform.version){description.unshift(version);}
|
||||
if(platform.name){description.unshift(name);}
|
||||
if(os&&name&&!(os==String(os).split(' ')[0]&&(os==name.split(' ')[0]||product))){description.push(product?'('+os+')':'on '+os);}
|
||||
if(description.length){platform.description=description.join(' ');}
|
||||
return platform;}
|
||||
var platform=parse();if(typeof define=='function'&&typeof define.amd=='object'&&define.amd){root.platform=platform;define(function(){return platform;});}
|
||||
else if(freeExports&&freeModule){forOwn(platform,function(value,key){freeExports[key]=value;});}
|
||||
else{root.platform=platform;}}.call(this));
|
||||
@@ -4,22 +4,34 @@
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (Добавете * в края на полето, за да съответства на подниза)"}.
|
||||
{"{{ app_name }} already installed?","{{ app_name }} инсталиран ли е?"}.
|
||||
{" has set the subject to: "," е задал темата на: "}.
|
||||
{"{{ inviter }} has invited you to connect!","{{ inviter }} ви покани да се свържете!"}.
|
||||
{"# participants","# участници"}.
|
||||
{"A description of the node","Описание на нода"}.
|
||||
{"A friendly name for the node","Удобно име на нода"}.
|
||||
{"A fully-featured desktop chat client for Windows and Linux.","Пълнофункционален чат клиент за Windows и Linux."}.
|
||||
{"A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.","Изчистен Jabber/XMPP клиент за Android. Насочен е към функционалност, лек и сигурен. Работи на устройства с Android от нисък клас, започвайки с Android 4.0."}.
|
||||
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Лек и мощен XMPP клиент за iPhone и iPad. Предоставя лесен начин да говорите и споделяте моменти с приятелите си."}.
|
||||
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Модерен чат клиент с отворен код за iPhone и iPad. Лесен за използване, с изчистен потребителски интерфейс."}.
|
||||
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Модерен чат клиент с отворен код за Mac. Лесен за използване, с изчистен потребителски интерфейс."}.
|
||||
{"A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.","Модерен клиент за чат с отворен код за настолни компютри. Фокусира се върху предоставянето на чисто и надеждно Jabber/XMPP изживяване, като същевременно се грижи за вашата поверителност."}.
|
||||
{"A password is required to enter this room","Необходима е парола за влизане в тази стая"}.
|
||||
{"A Web Page","Уеб страница"}.
|
||||
{"Accept invite using {{ app_name }}","Приемете поканата, използвайки {{ app_name }}"}.
|
||||
{"Accept","Приемам"}.
|
||||
{"Access denied by service policy","Достъпът е отказан спрямо политиката на услугата"}.
|
||||
{"Access model","Модел на достъп"}.
|
||||
{"Account doesn't exist","Профилът не съществува"}.
|
||||
{"Action on user","Действие върху потребител"}.
|
||||
{"Add a hat to a user","Добави шапка към потребител"}.
|
||||
{"Add {{ inviter }} to your contact list","Добавете {{ inviter }} към вашия списък с контакти"}.
|
||||
{"Add Contact","Добавете контакти"}.
|
||||
{"Add User","Добави потребител"}.
|
||||
{"Administration of ","Администриране на "}.
|
||||
{"Administration","Администриране"}.
|
||||
{"Administrator privileges required","Изискватт се администраторски права"}.
|
||||
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","След като щракнете върху бутона, ще бъдете пренасочени към {{ app_name }}, за да завършите настройката на новия вашия нов {{ site_name }} профил."}.
|
||||
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","След като инсталирате успешно {{ app_name }}, върнете се на тази страница и <strong>продължете със стъпка 2</strong>."}.
|
||||
{"All activity","Цялата статистика"}.
|
||||
{"All Users","Всички потребители"}.
|
||||
{"Allow subscription","Разреши абониране"}.
|
||||
@@ -46,8 +58,13 @@
|
||||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Всеки, който има абонамент за присъствие на двете или от: може да се абонира и да извлича елементи"}.
|
||||
{"Anyone with Voice","Всеки, с възможност за гласово обаждане"}.
|
||||
{"Anyone","Всеки"}.
|
||||
{"API Commands","API Команди"}.
|
||||
{"Apple Store Logo","Apple Store лого"}.
|
||||
{"April","Април"}.
|
||||
{"Attribute 'channel' is required for this request","Атрибутът 'канал' е задължителен за тази заявка"}.
|
||||
{"Arguments","Аргументи"}.
|
||||
{"As a final reminder, your account details are shown below:","Като последно напомняне, данните за вашия профил са показани по-долу:"}.
|
||||
{"Assign a hat to a user","Присвои шапка към потребител"}.
|
||||
{"Attribute 'channel' is required for this request","Изисква се атрибут 'канал' за тази заявка"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","Атрибутът 'id' е задължителен за MIX съобщения"}.
|
||||
{"Attribute 'jid' is not allowed here","Атрибутът 'jid' не е разрешен тук"}.
|
||||
{"Attribute 'node' is not allowed here","Атрибутът 'нод' не е разрешен тук"}.
|
||||
@@ -59,6 +76,9 @@
|
||||
{"Backup to File at ","Архивиране във файл на "}.
|
||||
{"Backup","Резервно копие"}.
|
||||
{"Bad format","Лош формат"}.
|
||||
{"BAD REQUEST","BAD REQUEST"}.
|
||||
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM от Tigase, Inc. е лек и мощен XMPP клиент за macOS."}.
|
||||
{"Beagle IM Logo","Beagle IM лого"}.
|
||||
{"Birthday","Рожден ден"}.
|
||||
{"Both the username and the resource are required","Изискват се потребителското име и ресурсът"}.
|
||||
{"Bytestream already activated","Bytestream вече е активиран"}.
|
||||
@@ -75,6 +95,7 @@
|
||||
{"Channel JID","JID на канал"}.
|
||||
{"Channels","Канали"}.
|
||||
{"Characters not allowed:","Неразрешени символи:"}.
|
||||
{"Chat address (JID)","Чат адрес (JID)"}.
|
||||
{"Chatroom configuration modified","Конфигурацията на стаята за чат е променена"}.
|
||||
{"Chatroom is created","Стаята за чат е създадена"}.
|
||||
{"Chatroom is destroyed","Стаята за чат е унищожена"}.
|
||||
@@ -82,16 +103,29 @@
|
||||
{"Chatroom is stopped","Стаята за чат е спряна"}.
|
||||
{"Chatrooms","Чат стаи"}.
|
||||
{"Choose a username and password to register with this server","Изберете потребителско име и парола, за да се регистрирате на този сървър"}.
|
||||
{"Choose a username, this will become the first part of your new chat address.","Изберете потребителско име, то ще стане първата част от новия ви чат адрес."}.
|
||||
{"Choose storage type of tables","Изберете тип за съхранение на таблици"}.
|
||||
{"Choose whether to approve this entity's subscription.","Изберете дали да одобрите абонамента на този субект."}.
|
||||
{"City","Град"}.
|
||||
{"Click the button to open the Dino website where you can download and install it on your PC.","Щракнете върху бутона, за да отворите уебсайта на Dino, където можете да го изтеглите и инсталирате на вашия компютър."}.
|
||||
{"Client acknowledged more stanzas than sent by server","Клиентът потвърди повече строфи от изпратените от сървъра"}.
|
||||
{"Close","Затвори"}.
|
||||
{"Clustering","Клъстеризация"}.
|
||||
{"Commands","Команди"}.
|
||||
{"Conference room does not exist","Конферентната стая не съществува"}.
|
||||
{"Configuration of room ~s","Конфигурация на стая ~s"}.
|
||||
{"Configuration","Конфигурация"}.
|
||||
{"Congratulations!","Поздравления!"}.
|
||||
{"Contact Addresses (normally, room owner or owners)","Адреси за контакт (обикновено собственик или собственици на стая)"}.
|
||||
{"Contacts","Контакти"}.
|
||||
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations е Jabber/XMPP клиент за смартфони с Android 6.0+, оптимизиран да осигури уникално мобилно изживяване."}.
|
||||
{"Conversations Logo","Conversations лого"}.
|
||||
{"Country","Държава"}.
|
||||
{"Create a Hat","Създай Шапка"}.
|
||||
{"Create Account","Създай профил"}.
|
||||
{"Create an account","Създайте профил"}.
|
||||
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Създаването на профил, ще Ви позволи да комуникирате с други хора в <strong>{{ site_name }}</strong> и други услуги в мрежата XMPP."}.
|
||||
{"Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Създаването на профил, ще ви позволи да комуникирате с <strong>{{ inviter }}</strong>, други хора в <strong>{{ site_name }}</strong> и други услуги в мрежата XMPP."}.
|
||||
{"Current Discussion Topic","Текуща тема на дискусита"}.
|
||||
{"Database failure","Грешка в базата данни"}.
|
||||
{"Database Tables Configuration at ","Конфигурация на таблиците в базата данни при "}.
|
||||
@@ -103,8 +137,16 @@
|
||||
{"Delete User","Изтрий потребителя"}.
|
||||
{"Deliver event notifications","Достави известията за събития"}.
|
||||
{"Deliver payloads with event notifications","Достави прикачените обекти с известията за събития"}.
|
||||
{"Destroy a Hat","Разруши Шапка"}.
|
||||
{"Dino Logo","Dino лого"}.
|
||||
{"Disable User","Деактивирай потребителя"}.
|
||||
{"Disc only copy","Копие само на диска"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Не казвайте паролата си на никого, дори на администраторите на XMPP сървъра."}.
|
||||
{"Download and install {{ app_name }} below:","Изтеглете и инсталирайте {{ app_name }} по-долу:"}.
|
||||
{"Download Dino for Linux","Свалете Dino за Linux"}.
|
||||
{"Download from Mac App Store","Изтегляне от Mac App Store"}.
|
||||
{"Download Gajim","Свалете Gajim"}.
|
||||
{"Download Renga for Haiku","Свалете Renga за Haiku"}.
|
||||
{"Dump Backup to Text File at ","Архивиране в текстов файл при "}.
|
||||
{"Dump to Text File","Архивиране в текстов файл"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","Дублирани групи не са разрешени от RFC6121"}.
|
||||
@@ -126,6 +168,7 @@
|
||||
{"Enable message archiving","Активирай архивиране на съобщенията"}.
|
||||
{"Enabling push without 'node' attribute is not supported","Активиране на известията без атрибут 'нод' не се поддържа"}.
|
||||
{"End User Session","Прекрати сесията на потребителя"}.
|
||||
{"Enter a secure password that you do not use anywhere else.","Въведете сигурна парола, която не използвате на друго място."}.
|
||||
{"Enter nickname you want to register","Въведете псевдонима, който желаете да регистрирате"}.
|
||||
{"Enter path to backup file","Въведете пътя към архивния файл"}.
|
||||
{"Enter path to jabberd14 spool dir","Въведете пътя към jabberd14 spool директорията"}.
|
||||
@@ -146,6 +189,7 @@
|
||||
{"Failed to process option '~s'","Неуспешо обработена опция '~s'"}.
|
||||
{"Family Name","Фамилно име"}.
|
||||
{"FAQ Entry","Въвеждане на ЧЗВ"}.
|
||||
{"F-Droid Store Logo","F-Droid Store лого"}.
|
||||
{"February","Февруари"}.
|
||||
{"File larger than ~w bytes","Файлът е по-голям от ~w байта"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Попълнете формата, за да търсите съвпадащ XMPP потребител"}.
|
||||
@@ -154,27 +198,44 @@
|
||||
{"Full List of Room Admins","Пълен списък на администраторите на стаята"}.
|
||||
{"Full List of Room Owners","Пълен списък на собствениците на стаята"}.
|
||||
{"Full Name","Пълно име"}.
|
||||
{"Get List of Online Users","Списък на онлайн потребителите"}.
|
||||
{"Gajim Logo","Gajim лого"}.
|
||||
{"Get List of Active Users","Списък с активни потребители"}.
|
||||
{"Get List of Disabled Users","Списък на деактивираните потребители"}.
|
||||
{"Get List of Idle Users","Списък на неактивните потребители"}.
|
||||
{"Get List of Online Users","Списък на онлайн потребители"}.
|
||||
{"Get List of Registered Users","Списък на регистрираните потребители"}.
|
||||
{"Get Number of Active Users","Брой на активните потребители"}.
|
||||
{"Get Number of Disabled Users","Брой на деактивираните потребители"}.
|
||||
{"Get Number of Idle Users","Брой на неактивните потребители"}.
|
||||
{"Get Number of Online Users","Брой на онлайн потребителите"}.
|
||||
{"Get Number of Registered Users","Брой на регистрираните потребители"}.
|
||||
{"Get Pending","Виж чакащи"}.
|
||||
{"Get started","Започнете"}.
|
||||
{"Get User Last Login Time","Покажи времето, когато потребителят е влязъл за последно"}.
|
||||
{"Get User Roster","Списък с потребители"}.
|
||||
{"Get User Statistics","Покажи статистика за потребителя"}.
|
||||
{"Given Name","Наименование"}.
|
||||
{"Google Play Store Logo","Google Play Store лого"}.
|
||||
{"Grant voice to this person?","Предоставяне на глас за потребителя?"}.
|
||||
{"has been banned","е със забранен достъп"}.
|
||||
{"has been kicked because of a system shutdown","е отстранен поради изключване на системата"}.
|
||||
{"has been kicked because of an affiliation change","е отстранен поради промяна на принадлежността"}.
|
||||
{"has been kicked because the room has been changed to members-only","е изгонен, защото стаята е променена и е само за членове"}.
|
||||
{"has been kicked","е отстранен"}.
|
||||
{"Hash computed from the list of hats available in a room","Хеш стойност на листа от шапки налични в стаята"}.
|
||||
{"Hash of the vCard-temp avatar of this room","Хеш на временния vCard аватар на тази стая"}.
|
||||
{"Hat hue","Цвят на шапката"}.
|
||||
{"Hat title","Заглавие на шапката"}.
|
||||
{"Hat URI","URI адрес за шапка"}.
|
||||
{"Hats limit exceeded","Превишен е лимитът за шапка"}.
|
||||
{"Hide","Скрий"}.
|
||||
{"Hint","Подсказка"}.
|
||||
{"Host unknown","Неизвестен хост"}.
|
||||
{"Hostname invalid","Невалидно име за хост"}.
|
||||
{"HTTP File Upload","Качване на файл по HTTP"}.
|
||||
{"Idle connection","Неактивна връзка"}.
|
||||
{"If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:","Ако вече сте инсталирали {{ app_name }}, препоръчваме Ви да продължите процеса на създаване на профил, използвайки приложението, като кликнете върху бутона по-долу:"}.
|
||||
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Ако все още нямате инсталиран XMPP клиент, ето списък с подходящи клиенти за вашата платформа."}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Ако не виждате CAPTCHA изображението, посетете уеб страницата."}.
|
||||
{"Import Directory","Импорт на директория"}.
|
||||
{"Import File","Импорт на файл"}.
|
||||
@@ -193,6 +254,7 @@
|
||||
{"Incorrect value of 'action' in data form","Неправилна стойност на 'action' във формата за данни"}.
|
||||
{"Incorrect value of 'path' in data form","Неправилна стойност на 'path' във формата за данни"}.
|
||||
{"Installed Modules:","Инсталирани модули:"}.
|
||||
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","Инсталира ли се нормално? Чудесно! <strong>Кликнете или докоснете бутона по-долу</strong>, за да приемете поканата си и да продължите с настройката на вашия профил:"}.
|
||||
{"Install","Инсталирай"}.
|
||||
{"Insufficient privilege","Недостатъчни права"}.
|
||||
{"Internal server error","Вътрешна сървърна грешка"}.
|
||||
@@ -200,6 +262,11 @@
|
||||
{"Invalid node name","Невалидно име на нода"}.
|
||||
{"Invalid 'previd' value","Невалидна стойност на 'previd'"}.
|
||||
{"Invitations are not allowed in this conference","Поканите не са разрешени в тази конференция"}.
|
||||
{"Invite Expired","Изтекла покана"}.
|
||||
{"Invite expired","Поканата е изтекла"}.
|
||||
{"Invite to {{ site_name }}","Покани в {{ site_name }}"}.
|
||||
{"Invite User","Покани потребител"}.
|
||||
{"Invite","Покани"}.
|
||||
{"IP addresses","IP адреси"}.
|
||||
{"is now known as","е известен като"}.
|
||||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Не е позволено да изпращате съобщения за грешки в стаята. Участникът (~s) е изпратил съобщение за грешка (~s) и е бил отстранен от стаята"}.
|
||||
@@ -209,6 +276,7 @@
|
||||
{"January","Януари"}.
|
||||
{"JID normalization denied by service policy","Политиката на услугата не допуска нормализирането на JID"}.
|
||||
{"JID normalization failed","Нормализирането на JID е неуспешно"}.
|
||||
{"Join {{ site_name }} with {{ app_name }}","Присъединете се към {{ site_name }} с {{ app_name }}"}.
|
||||
{"Joined MIX channels of ~ts","Свързани MIX канали на ~ts"}.
|
||||
{"Joined MIX channels:","Свързани MIX канали:"}.
|
||||
{"joins the room","се присъединява към стаята"}.
|
||||
@@ -220,10 +288,13 @@
|
||||
{"Last message","Последно съобщение"}.
|
||||
{"Last month","Миналия месец"}.
|
||||
{"Last year","Миналата година"}.
|
||||
{"Launch {{ app_name }} and sign in using your account credentials.","Стартирайте {{ app_name }} и влезте, използвайки данни за вашия профил."}.
|
||||
{"Launch Beagle IM, and select \\'Yes\\' to add a new account. Click the \\'+\\' button under the empty account list and then enter your credentials.","Стартирайте Beagle IM и изберете \\'Да\\', за да добавите нов профил. Кликнете върху бутона \\'+\\' под празния списък с профили и след това въведете вашите идентификационни данни."}.
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Най-малко значимите битове SHA-256 хеш на текст трябва да са равни на шестнайсетичния етикет"}.
|
||||
{"leaves the room","напуска стаята"}.
|
||||
{"List of users with hats","Списък на потребителите с шапки"}.
|
||||
{"List of Hats","Списък с шапки"}.
|
||||
{"List users with hats","Избройте потребителите с шапки"}.
|
||||
{"Log in via web","Влезте през уеб"}.
|
||||
{"Logged Out","Излязъл"}.
|
||||
{"Logging","Регистриране на събития"}.
|
||||
{"Make participants list public","Направи списъка с участниците публичен"}.
|
||||
@@ -240,9 +311,11 @@
|
||||
{"Max payload size in bytes","Максимален размер на прикачения обект в байтове"}.
|
||||
{"Maximum file size","Максимален размер на файла"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Максимален брой съобщения от хронологията, върнати от стая"}.
|
||||
{"Maximum number of invites reached","Максималният брой покани е достигнат"}.
|
||||
{"Maximum number of items to persist","Максимален брой елементи за запазване"}.
|
||||
{"Maximum Number of Occupants","Максимален брой участници"}.
|
||||
{"May","Май"}.
|
||||
{"Members are allowed to invite others","Участниците могат да канят други"}.
|
||||
{"Membership is required to enter this room","Изисква се членство, за вход в тази стая"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Запомнете паролата си или я запишете на лист хартия, поставен на сигурно място. В XMPP няма автоматичен начин за възстановяване на паролата в случай, че я забравите."}.
|
||||
{"Mere Availability in XMPP (No Show Value)","Наличност в XMPP (Не показвай стойност)"}.
|
||||
@@ -257,6 +330,7 @@
|
||||
{"Moderators Only","Само модератори"}.
|
||||
{"Moderator","Модератор"}.
|
||||
{"Module failed to handle the query","Модулът не успя да обработи заявката"}.
|
||||
{"Monal Logo","Monal лого"}.
|
||||
{"Monday","Понеделник"}.
|
||||
{"Multicast","Мултикаст"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","Повече от един <item/> елемента не се разрешават от RFC6121"}.
|
||||
@@ -310,19 +384,22 @@
|
||||
{"Node","Нод"}.
|
||||
{"None","Нито един"}.
|
||||
{"Not allowed","Не е разрешено"}.
|
||||
{"NOT FOUND","NOT FOUND"}.
|
||||
{"Not Found","Не е намерен"}.
|
||||
{"Not subscribed","Няма абонамент"}.
|
||||
{"Notify subscribers when items are removed from the node","Уведоми абонатите, когато елементите бъдат премахнати от нода"}.
|
||||
{"Notify subscribers when the node configuration changes","Уведоми абонатите, когато конфигурацията на нода се промени"}.
|
||||
{"Notify subscribers when the node is deleted","Уведоми абонатите, когато нодът бъде изтрит"}.
|
||||
{"November","Ноември"}.
|
||||
{"Number of active users","Брой активни потребители"}.
|
||||
{"Number of answers required","Брой на необходимите отговори"}.
|
||||
{"Number of disabled users","Брой деактивирани потребители"}.
|
||||
{"Number of idle users","Брой неактивни потребители"}.
|
||||
{"Number of occupants","Брой участници"}.
|
||||
{"Number of Offline Messages","Брой офлайн съобщения"}.
|
||||
{"Number of online users","Брой онлайн потребители"}.
|
||||
{"Number of registered users","Брой регистрирани потребители"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Брой секунди, след които автоматично да се изчистят елементите, или `max` за липса на конкретно ограничение, различно от наложения от сървъра максимум"}.
|
||||
{"Occupants are allowed to invite others","На участниците е позволено да канят други"}.
|
||||
{"Occupants are allowed to query others","Участниците могат да отправят заявки към други лица"}.
|
||||
{"Occupants May Change the Subject","Участниците могат да променят темата"}.
|
||||
{"October","Октомври"}.
|
||||
@@ -345,12 +422,15 @@
|
||||
{"Only service administrators are allowed to send service messages","Само администраторите на услуги имат право да изпращат системни съобщения"}.
|
||||
{"Only those on a whitelist may associate leaf nodes with the collection","Само тези от списъка с позволени могат да свързват листови нодове с колекцията"}.
|
||||
{"Only those on a whitelist may subscribe and retrieve items","Само тези от списъка с позволени могат да се абонират и да извличат елементи"}.
|
||||
{"Open the app","Отворете приложението"}.
|
||||
{"Organization Name","Име на организацията"}.
|
||||
{"Organization Unit","Отдел"}.
|
||||
{"Other Modules Available:","Други налични модули:"}.
|
||||
{"Other software","Друг софтуер"}.
|
||||
{"Outgoing s2s Connections","Изходящи s2s връзки"}.
|
||||
{"Owner privileges required","Изискват се привилегии на собственик"}.
|
||||
{"Packet relay is denied by service policy","Предаването на пакети е отказано от политиката на услугата"}.
|
||||
{"Page navigation","Навигация по страниците"}.
|
||||
{"Participant ID","ID на участник"}.
|
||||
{"Participant","Участник"}.
|
||||
{"Password Verification","Проверка на паролата"}.
|
||||
@@ -366,6 +446,8 @@
|
||||
{"Ping query is incorrect","Заявката за пинг е неправилна"}.
|
||||
{"Ping","Пинг"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Обърнете внимание, че тези опции ще направят резервно копие само на вградената (Mnesia) база данни. Ако използвате модула ODBC, трябва да направите резервно копие на SQL базата данни отделно."}.
|
||||
{"Please provide a password! Minimum length: {{ password_min_length }}","Моля, въведете парола! Минимална дължина: {{ password_min_length }}"}.
|
||||
{"Please provide a valid username!","Моля, въведете валидно потребителско име!"}.
|
||||
{"Please, wait for a while before sending new voice request","Моля, изчакайте известно време, преди да изпратите нова заявка за гласова връзка"}.
|
||||
{"Pong","Понг"}.
|
||||
{"Possessing 'ask' attribute is not allowed by RFC6121","Притежаването на атрибут 'ask' не е разрешено от RFC6121"}.
|
||||
@@ -375,6 +457,7 @@
|
||||
{"Previous session PID has exited","Предишният PID на сесията е излязъл"}.
|
||||
{"Previous session PID is dead","PID от предишната сесия не съществува"}.
|
||||
{"Previous session timed out","Времето на предишната сесия изтече"}.
|
||||
{"Previous","Предишен"}.
|
||||
{"private, ","частна, "}.
|
||||
{"Public","Публичен"}.
|
||||
{"Publish model","Модел за публикуване"}.
|
||||
@@ -392,11 +475,18 @@
|
||||
{"Receive notification of new items only","Получаване на известия само за нови елементи"}.
|
||||
{"Receive notification of new nodes only","Получаване на известия само за нови нодове"}.
|
||||
{"Recipient is not in the conference room","Получателят не е в конферентната стая"}.
|
||||
{"Register an XMPP account","Регистрирай XMPP акаунт"}.
|
||||
{"Re-Enable User","Активиране на потребител"}.
|
||||
{"Register an XMPP account","Регистрирай XMPP профил"}.
|
||||
{"Register on {{ site_name }}","Регистрирайте се на {{ site_name }}"}.
|
||||
{"Register","Регистрирай"}.
|
||||
{"Registration Error","Грешка при регистрация"}.
|
||||
{"Registration error","Грешка при регистриране"}.
|
||||
{"Registration Form","Форма за регистрация"}.
|
||||
{"Registration Success","Успешна регистрация"}.
|
||||
{"Remote copy","Отдалечено копие"}.
|
||||
{"Remove a hat from a user","Премахни шапка от потребител"}.
|
||||
{"Remove User","Премахни потребител"}.
|
||||
{"Renga Logo","Renga лого"}.
|
||||
{"Replaced by new connection","Заменен от нова връзка"}.
|
||||
{"Request has timed out","Времето за заявка изтече"}.
|
||||
{"Request is ignored","Заявката е игнорирано"}.
|
||||
@@ -408,6 +498,7 @@
|
||||
{"Restore binary backup immediately:","Възстанови незабавно двоично копие:"}.
|
||||
{"Restore plain text backup immediately:","Възстановете незабавно копие от обикновен текст:"}.
|
||||
{"Restore","Възстанови"}.
|
||||
{"Result","Резултат"}.
|
||||
{"Roles and Affiliations that May Retrieve Member List","Роли и принадлежности, които могат да извличат списък с членове"}.
|
||||
{"Roles for which Presence is Broadcasted","Роли, за които се излъчва присъствие"}.
|
||||
{"Roles that May Send Private Messages","Роли, които могат да изпращат лични съобщения"}.
|
||||
@@ -421,16 +512,21 @@
|
||||
{"Roster size","Размер на списъка с контакти"}.
|
||||
{"Running Nodes","Работещи нодове"}.
|
||||
{"~s invites you to the room ~s","~s ви кани в стая ~s"}.
|
||||
{"Sad person holding empty box","Тъжен човек, държащ празна кутия"}.
|
||||
{"Saturday","Събота"}.
|
||||
{"Scan invite code","Сканирайте код за покана"}.
|
||||
{"Scan with mobile device","Сканиране с мобилно устройство"}.
|
||||
{"Search from the date","Търси от дата"}.
|
||||
{"Search Results for ","Резултати от търсенето за "}.
|
||||
{"Search the text","Търси текста"}.
|
||||
{"Search until the date","Търси до дата"}.
|
||||
{"Search users in ","Търси потребители в "}.
|
||||
{"Select","Избери"}.
|
||||
{"Send announcement to all online users on all hosts","Изпрати съобщение до всички онлайн потребители на всички хостове"}.
|
||||
{"Send announcement to all online users","Изпрати съобщение до всички онлайн потребители"}.
|
||||
{"Send announcement to all users on all hosts","Изпрати съобщение до всички потребители на всички хостове"}.
|
||||
{"Send announcement to all users","Изпрати съобщение до всички потребители"}.
|
||||
{"Send this invite to your device","Изпратете тази покана до вашето устройство"}.
|
||||
{"September","Септември"}.
|
||||
{"Server:","Сървър:"}.
|
||||
{"Service list retrieval timed out","Времето за изчакване на извличането на списъка с услуги изтече"}.
|
||||
@@ -441,9 +537,14 @@
|
||||
{"Show Integral Table","Покажи интегрална таблица"}.
|
||||
{"Show Occupants Join/Leave","Покажи участници Влязъл/Напускнал"}.
|
||||
{"Show Ordinary Table","Покажи обикновена таблица"}.
|
||||
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">view all apps.</a>","Показват се приложения само за <span class='platform-name'>текущата ви платформа</span>. Можете също да <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">прегледате всички приложения.</a>"}.
|
||||
{"Show","Покажи"}.
|
||||
{"Shut Down Service","Изключи услугата"}.
|
||||
{"Siskin IM Logo","Siskin IM лого"}.
|
||||
{"SOCKS5 Bytestreams","SOCKS5 байтови потоци"}.
|
||||
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Някои XMPP клиенти могат да съхраняват паролата Ви в компютъра, но от съображения за сигурност трябва да го правите само на личния си компютър."}.
|
||||
{"Sorry, it looks like this invite code has expired!","Съжалявам, изглежда, че този код за покана е изтекъл!"}.
|
||||
{"Sorry, there was a problem registering your account.","За съжаление, възникна проблем с регистрацията на вашия профил."}.
|
||||
{"Sources Specs:","Спецификации на източниците:"}.
|
||||
{"Specify the access model","Задай модела за достъп"}.
|
||||
{"Specify the event message type","Задай типа на съобщението за събитие"}.
|
||||
@@ -451,13 +552,22 @@
|
||||
{"Stanza id is not valid","Невалидно ID на строфата"}.
|
||||
{"Stanza ID","ID на строфа"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Статично задаване на replyto на собственика(ците) на нода"}.
|
||||
{"Step 1: Download and install {{ app_name }}","Стъпка 1: Изтеглете и инсталирайте {{ app_name }}"}.
|
||||
{"Step 1: Install {{ app_name }}","Стъпка 1: Инсталирайте {{ app_name }}"}.
|
||||
{"Step 2: Activate your account","Стъпка 2: Активирайте профила си"}.
|
||||
{"Step 2: Connect {{ app_name }} to your new account","Стъпка 2: Свържете {{ app_name }} с новия си профил"}.
|
||||
{"Stopped Nodes","Спрени нодове"}.
|
||||
{"Store binary backup:","Запази бинарен архив:"}.
|
||||
{"Store plain text backup:","Запази архив като обикновен текст:"}.
|
||||
{"Stream management is already enabled","Управлението на потока вече е активирано"}.
|
||||
{"Stream management is not enabled","Управлението на потока не е активирано"}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> е част от XMPP, сигурна и децентрализирана мрежа за съобщения. За да започнете да чатите, използвайки <strong>{{ app_name }}</strong>, първо трябва да регистрирате профил."}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.","<strong>{{ site_name }}</strong> е част от XMPP, сигурна и децентрализирана мрежа за съобщения. За да започнете да чатите, първо трябва да регистрирате профил."}.
|
||||
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>В момента нямате инсталиран подходящ софтуер?</strong> Можете, също да влезете в профила си чрез нашия онлайн уеб чат!"}.
|
||||
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Съвет:</strong> Можете да отворите тази покана на мобилното си устройство, като сканирате баркод с камерата."}.
|
||||
{"Subject","Тема"}.
|
||||
{"Submitted","Изпратено"}.
|
||||
{"Submit","Изпрати"}.
|
||||
{"Subscriber Address","Адрес на абоната"}.
|
||||
{"Subscribers may publish","Абонатите могат да публикуват"}.
|
||||
{"Subscription requests must be approved and only subscribers may retrieve items","Заявките за абонамент трябва да бъдат одобрени и само абонатите могат да извличат елементи"}.
|
||||
@@ -485,6 +595,9 @@
|
||||
{"The JIDs of those to contact with questions","JID на лицата, с които да се свържете при въпроси"}.
|
||||
{"The JIDs of those with an affiliation of owner","JID на лицата с принадлежност на собственик"}.
|
||||
{"The JIDs of those with an affiliation of publisher","JID-та на лица с принадлежност към публикуващи"}.
|
||||
{"The list of all active users","Списъкът на всички активни потребители"}.
|
||||
{"The list of all disabled users","Списък на всички деактвирани потребители"}.
|
||||
{"The list of all idle users","Списък на всички неактивни потребители"}.
|
||||
{"The list of all online users","Списък на всички онлайн потребители"}.
|
||||
{"The list of all users","Списък на всички потребители"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","Списъкът с JID, които могат да асоциират листови нодове с колекция"}.
|
||||
@@ -506,16 +619,20 @@
|
||||
{"The presence states for which an entity wants to receive notifications","Състояния на присъствие, за които даден субект желае да получава известия"}.
|
||||
{"The query is only allowed from local users","Заявката е разрешена само за локални потребители"}.
|
||||
{"The query must not contain <item/> elements","Заявката не може да съдържа елементи <item/>"}.
|
||||
{"The role","Ролята"}.
|
||||
{"The room subject can be modified by participants","Темата на стаята може да бъде променяна от участниците"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Информацията за семантичния тип данни на нода, обикновено зададена от пространството на имената на прикачените данни (ако има такива)"}.
|
||||
{"The sender of the last received message","Подателят на последното получено съобщение"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Строфата ТРЯБВА да съдържа само един <active/> елемент, един <default/> елемент или един <list/> елемент"}.
|
||||
{"The subscription identifier associated with the subscription request","Идентификаторът на абонамента, свързан със заявката за абонамент"}.
|
||||
{"The token provided is either invalid or expired.","Предоставеният токен код е невалиден или изтекъл."}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","URL адрес на XSL трансформацията, която може да се приложи към прикачените данни, за да се генерира подходящ елемент от тялото на съобщението."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","URL адрес на XSL трансформацията, която може да се приложи към формата на прикачените данни, за да се генерира валиден резултат от Data Forms, който клиентът може да покаже с помощта на общ механизъм за визуализация на Data Forms"}.
|
||||
{"There was an error changing the password: ","Възникна грешка при промяна на паролата: "}.
|
||||
{"There was an error creating the account: ","Възникна грешка при създаването на профила: "}.
|
||||
{"There was an error deleting the account: ","Възникна грешка при изтриването на профила: "}.
|
||||
{"This button works only if you have the app installed already!","Този бутон работи, само ако вече имате инсталирано приложението!"}.
|
||||
{"This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!","Това е покана от <strong>{{ inviter }}</strong> за свързване и чат в XMPP мрежата. Ако вече имате инсталиран XMPP клиент, просто натиснете бутона по-долу!"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Не е чувствително към регистъра (главни и малки букви): \"macbeth\"е същото като \"MacBeth\"и \"Macbeth\"."}.
|
||||
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Тази страница позволява регистриране на XMPP профил на този сървър. Вашият JID (Jabber ID) ще бъде във формата: username@server. Моля, прочетете внимателно инструкциите, за да попълните правилно полетата."}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","Тази страница позволява премахване на XMPP профил от този сървър."}.
|
||||
@@ -524,7 +641,9 @@
|
||||
{"Thursday","Четвъртък"}.
|
||||
{"Time delay","Закъснение"}.
|
||||
{"Timed out waiting for stream resumption","Времето за изчакване за възобновяване на потока изтече"}.
|
||||
{"To get started, you need to install an app for your platform:","За да започнете, трябва да инсталирате приложение за вашата платформа:"}.
|
||||
{"To register, visit ~s","За да се регистрирате, посетете ~s"}.
|
||||
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","За да започнете чат, трябва да въведете новите си идентификационни данни в избрания от вас XMPP софтуер."}.
|
||||
{"To ~ts","До ~ts"}.
|
||||
{"Token TTL","Токен TTL"}.
|
||||
{"Too many active bytestreams","Твърде много активни \"bytestreams\" потоци"}.
|
||||
@@ -557,6 +676,7 @@
|
||||
{"Updating the vCard is not supported by the vCard storage backend","Актуализирането на vCard не се поддържа от настройката за съхранение на vCard"}.
|
||||
{"Upgrade","Обнови"}.
|
||||
{"URL for Archived Discussion Logs","URL адрес за дневници на архивирани дискусии"}.
|
||||
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Използвайте скенер за <em>QR код</em> на вашето мобилно устройство, за да сканирате кода по-долу:"}.
|
||||
{"User already exists","Потребителят вече съществува"}.
|
||||
{"User (jid)","Потребител (jid)"}.
|
||||
{"User JID","Потребител JID"}.
|
||||
@@ -566,6 +686,9 @@
|
||||
{"User session not found","Потребителската сесия не е намерена"}.
|
||||
{"User session terminated","Потребителската сесия е прекратена"}.
|
||||
{"User ~ts","Потребител ~ts"}.
|
||||
{"Username invalid","Невалидно потребителско име"}.
|
||||
{"Username is reserved","Потребителското име е резервирано"}.
|
||||
{"Username","Потребителско име"}.
|
||||
{"Username:","Потребителско име:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Не е разрешено потребителите да регистрират профили толкова бързо"}.
|
||||
{"Users Last Activity","Последна активност на потребителите"}.
|
||||
@@ -584,6 +707,7 @@
|
||||
{"Visitor","Посетител"}.
|
||||
{"Voice requests are disabled in this conference","Гласовите обаждания са деактивирани в тази конференция"}.
|
||||
{"Voice request","Заявка за гласово обаждане"}.
|
||||
{"Web client which allows to join the room anonymously","Уеб клиентът, който позволява анонимно свързване със стаята"}.
|
||||
{"Wednesday","Сряда"}.
|
||||
{"When a new subscription is processed and whenever a subscriber comes online","Когато се обработва нов абонамент и всеки път, когато абонат се появи онлайн"}.
|
||||
{"When a new subscription is processed","Когато се обработва нов абонамент"}.
|
||||
@@ -601,6 +725,7 @@
|
||||
{"Wrong parameters in the web formulary","Грешни параметри в уеб формуляра"}.
|
||||
{"Wrong xmlns","Грешен xmlns"}.
|
||||
{"XMPP Account Registration","Регистриране на XMPP профил"}.
|
||||
{"XMPP client for Haiku","XMPP клиент за Haiku"}.
|
||||
{"XMPP Domains","XMPP домейни"}.
|
||||
{"XMPP Show Value of Away","XMPP покажи стойност на Отсъства"}.
|
||||
{"XMPP Show Value of Chat","XMPP покажи стойност на Чат"}.
|
||||
@@ -610,8 +735,17 @@
|
||||
{"You are being removed from the room because of a system shutdown","Премахнати сте от стаята поради изключване на системата"}.
|
||||
{"You are not allowed to send private messages","Нямате право да изпращате лични съобщения"}.
|
||||
{"You are not joined to the channel","Не сте присъединени към канала"}.
|
||||
{"You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>register an account manually</a>.","Можете да се свържете с {{ site_name }}, използвайки всеки XMPP-съвместим софтуер. Ако предпочитаният от вас софтуер не е посочен по-горе, все още можете <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>да регистрирате акаунт ръчно</a>."}.
|
||||
{"You can later change your password using an XMPP client.","По-късно можете да промените паролата си с помощта на XMPP клиент."}.
|
||||
{"You can now set up {{ app_name }} and connect it to your new account.","Вече можете да настроите {{ app_name }} и да го свържете с вашия нов профил."}.
|
||||
{"You can start chatting right away with {{ app_name }}. Let's get started!","Можете да започнете да чатите веднага с {{ app_name }}. Да започваме!"}.
|
||||
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Можете да прехвърлите тази покана на мобилното си устройство, като сканирате код с камерата на вашето устройство."}.
|
||||
{"You have been banned from this room","Достъпът ви до тази стая е забранен"}.
|
||||
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите в {{ site_name }}, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
|
||||
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите в <strong>{{ site_name }}</strong>, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите с <strong>{{ inviter }}</strong> на {{ site_name }}, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите с <strong>{{ inviter }}</strong>на <strong>{{ site_name }}</strong>, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
|
||||
{"You have created an account on <strong>{{ site_name }}</strong>.","Създадохте профил в <strong>{{ site_name }}</strong>."}.
|
||||
{"You have joined too many conferences","Присъединили сте се към твърде много конференции"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Трябва да попълните полето \"Псевдоним\" във формата"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","За да се регистрирате Ви е нужен клиент, който поддържа x:data и CAPTCHA"}.
|
||||
@@ -619,7 +753,8 @@
|
||||
{"You need an x:data capable client to search","За да търсите, Ви е нужен клиент, който поддържа x:data"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Вашият активен списък за поверителност отказа маршрутизирането на тази строфа."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Достигнат е максималният брой офлайн съобщения за вашия контакт. Съобщението е отхвърлено."}.
|
||||
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","Вашата парола се съхранява криптирана на сървъра и няма да бъде достъпна, след като затворите тази страница. Пазете я в безопасност и не я споделяйте с никого."}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Вашата заявка за абонамент и/или съобщения до ~s са блокирани. За да отблокирате заявката си за абонамент, посетете ~s"}.
|
||||
{"Your XMPP account was successfully registered.","Вашият XMPP акаунт, беше регистриран успешно."}.
|
||||
{"Your XMPP account was successfully unregistered.","Вашият XMPP акаунт, беше успешно дерегистриран."}.
|
||||
{"Your XMPP account was successfully registered.","Вашият XMPP профил, беше регистриран успешно."}.
|
||||
{"Your XMPP account was successfully unregistered.","Вашият XMPP профил, беше успешно премахнат."}.
|
||||
{"You're not allowed to create nodes","Нямате право да създавате нодове"}.
|
||||
|
||||
@@ -4,22 +4,34 @@
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (Afegix * al final d'un camp per a buscar subcadenes)"}.
|
||||
{"{{ app_name }} already installed?","Ja està instal·lat {{ app_name }}?"}.
|
||||
{" has set the subject to: "," ha posat el tema: "}.
|
||||
{"{{ inviter }} has invited you to connect!","{{ inviter }} t'ha invitat a connectar-te!"}.
|
||||
{"# participants","# participants"}.
|
||||
{"A description of the node","Una descripció del node"}.
|
||||
{"A friendly name for the node","Un nom per al node"}.
|
||||
{"A fully-featured desktop chat client for Windows and Linux.","Un client de xat molt complet d'escriptori per a Windows i Linux."}.
|
||||
{"A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.","Un client Jabber/XMPP lleuger per a Android. Està orientat a la usabilitat, la seguretat i el baix consum, i funciona en aparats Android antics a partir de Android 4.0."}.
|
||||
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Un client XMPP lleuger i potent per a iPhone e iPad. Proporciona una forma senzilla de xarrar i compartir moments amb les teues amistats."}.
|
||||
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Un client de xat modern i de software lliure per a iPhone i iPad. Es simple d'usar i te una interfície d'usuari neta."}.
|
||||
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Un client de xat modern i de software lliure per a Mac. Es simple d'usar i te una interfície d'usuari neta."}.
|
||||
{"A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.","Un client de xat modern i de software lliure per a l'escriptori. Està enfocat en proporcionar una experiència Jabber/XMPP neta i comfiable, mentre mantenes la teva privacitat en ment."}.
|
||||
{"A password is required to enter this room","Es necessita contrasenya per a entrar en aquesta sala"}.
|
||||
{"A Web Page","Una Pàgina Web"}.
|
||||
{"Accept invite using {{ app_name }}","Accepta la invitació usant {{ app_name }}"}.
|
||||
{"Accept","Acceptar"}.
|
||||
{"Access denied by service policy","Accés denegat per la política del servei"}.
|
||||
{"Access model","Model d'Accés"}.
|
||||
{"Account doesn't exist","El compte no existeix"}.
|
||||
{"Action on user","Acció en l'usuari"}.
|
||||
{"Add a hat to a user","Afegir un barret a un usuari"}.
|
||||
{"Add {{ inviter }} to your contact list","Afegir {{ inviter }} a la teua llista de contactes"}.
|
||||
{"Add Contact","Afegir Contacte"}.
|
||||
{"Add User","Afegir usuari"}.
|
||||
{"Administration of ","Administració de "}.
|
||||
{"Administration","Administració"}.
|
||||
{"Administrator privileges required","Es necessita tenir privilegis d'administrador"}.
|
||||
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Al polsar el boto, s'obrirà {{ app_name }} per a terminar de configurar el teu compte a {{ site_name }}."}.
|
||||
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Després d'instal·lar correctament {{ app_name }}, torna ací i <strong>continua amb el Pas 2</strong>."}.
|
||||
{"All activity","Tota l'activitat"}.
|
||||
{"All Users","Tots els usuaris"}.
|
||||
{"Allow subscription","Permetre subscripció"}.
|
||||
@@ -46,7 +58,12 @@
|
||||
{"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"}.
|
||||
{"Anyone with Voice","Qualsevol amb Veu"}.
|
||||
{"Anyone","Qualsevol"}.
|
||||
{"API Commands","Comandaments API"}.
|
||||
{"Apple Store Logo","Logo de la Apple Store"}.
|
||||
{"April","Abril"}.
|
||||
{"Arguments","Arguments"}.
|
||||
{"As a final reminder, your account details are shown below:","Com a recordatori final, el detalls del teu compte es mostren ací:"}.
|
||||
{"Assign a hat to a user","Asignar un barret a un usuari"}.
|
||||
{"Attribute 'channel' is required for this request","L'atribut 'channel' és necessari per a aquesta petició"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","L'atribut 'id' es necessari per a missatges MIX"}.
|
||||
{"Attribute 'jid' is not allowed here","L'atribut 'jid' no està permès ací"}.
|
||||
@@ -59,6 +76,9 @@
|
||||
{"Backup to File at ","Desar còpia de seguretat a fitxer en "}.
|
||||
{"Backup","Guardar còpia de seguretat"}.
|
||||
{"Bad format","Format erroni"}.
|
||||
{"BAD REQUEST","MALA PETICIÓ"}.
|
||||
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM de Tigase, Inc. es un client XMPP lleuger i poderós per a macOS."}.
|
||||
{"Beagle IM Logo","Logo de Beagle IM"}.
|
||||
{"Birthday","Aniversari"}.
|
||||
{"Both the username and the resource are required","Es requereixen tant el nom d'usuari com el recurs"}.
|
||||
{"Bytestream already activated","El Bytestream ja està activat"}.
|
||||
@@ -75,6 +95,7 @@
|
||||
{"Channel JID","JID del Canal"}.
|
||||
{"Channels","Canals"}.
|
||||
{"Characters not allowed:","Caràcters no permesos:"}.
|
||||
{"Chat address (JID)","Direcció de xarrar (JID)"}.
|
||||
{"Chatroom configuration modified","Configuració de la sala de xat modificada"}.
|
||||
{"Chatroom is created","La sala s'ha creat"}.
|
||||
{"Chatroom is destroyed","La sala s'ha destruït"}.
|
||||
@@ -82,29 +103,50 @@
|
||||
{"Chatroom is stopped","La sala s'ha aturat"}.
|
||||
{"Chatrooms","Sales de xat"}.
|
||||
{"Choose a username and password to register with this server","Tria nom d'usuari i contrasenya per a registrar-te en aquest servidor"}.
|
||||
{"Choose a username, this will become the first part of your new chat address.","Elegeix un nom de compte, que serà la primera part de la direcció del teu compte."}.
|
||||
{"Choose storage type of tables","Selecciona el tipus d'almacenament de les taules"}.
|
||||
{"Choose whether to approve this entity's subscription.","Tria si aproves aquesta entitat de subscripció."}.
|
||||
{"City","Ciutat"}.
|
||||
{"Click the button to open the Dino website where you can download and install it on your PC.","Polsa el botó per a obrir la pàgina web de Dino on podràs descarregar el programa per a instalarlo al teu ordinador."}.
|
||||
{"Client acknowledged more stanzas than sent by server","El client ha reconegut més paquets dels que ha enviat el servidor"}.
|
||||
{"Close","Tancar"}.
|
||||
{"Clustering","Clustering"}.
|
||||
{"Commands","Comandaments"}.
|
||||
{"Conference room does not exist","La sala de conferències no existeix"}.
|
||||
{"Configuration of room ~s","Configuració de la sala ~s"}.
|
||||
{"Configuration","Configuració"}.
|
||||
{"Congratulations!","Enhorabona!"}.
|
||||
{"Contact Addresses (normally, room owner or owners)","Adreces de contacte (normalment, propietaris de la sala)"}.
|
||||
{"Contacts","Contactes"}.
|
||||
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations es un client Jabber/XMPP per a mòbils Android 6.0+ que ha sigut optimitzat per a proporcionar una experiència mòbil unica."}.
|
||||
{"Conversations Logo","Logo de Conversations"}.
|
||||
{"Country","Pais"}.
|
||||
{"Create a Hat","Crear un barret"}.
|
||||
{"Create Account","Crear un Compte"}.
|
||||
{"Create an account","Crear un compte"}.
|
||||
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Crear un compte et permetrà comunicar-te amb altra gent a <strong>{{ site_name }}</strong> i a altres serveis de la xarxa XMPP."}.
|
||||
{"Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Crear un compte e permetrà comunicar-te amb <strong>{{ inviter }}</strong> i altra gent a <strong>{{ site_name }}</strong> i a altres serveis de la xarxa XMPP."}.
|
||||
{"Current Discussion Topic","Assumpte de discussió actual"}.
|
||||
{"Database failure","Error a la base de dades"}.
|
||||
{"Database Tables Configuration at ","Configuració de la base de dades en "}.
|
||||
{"Database","Base de dades"}.
|
||||
{"December","Decembre"}.
|
||||
{"Default users as participants","Els usuaris són participants per defecte"}.
|
||||
{"Delete message of the day on all hosts","Elimina el missatge del dis de tots els hosts"}.
|
||||
{"Delete message of the day on all hosts","Elimina el missatge del dia de tots els dominis"}.
|
||||
{"Delete message of the day","Eliminar el missatge del dia"}.
|
||||
{"Delete User","Eliminar Usuari"}.
|
||||
{"Deliver event notifications","Entrega de notificacions d'events"}.
|
||||
{"Deliver payloads with event notifications","Enviar payloads junt a les notificacions d'events"}.
|
||||
{"Destroy a Hat","Destruir un barret"}.
|
||||
{"Dino Logo","Logo de Dino"}.
|
||||
{"Disable User","Deshabilitar un Usuari"}.
|
||||
{"Disc only copy","Còpia sols en disc"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","No li donis la teva contrasenya a ningú, ni tan sols als administradors del servidor XMPP."}.
|
||||
{"Download and install {{ app_name }} below:","Descarrega e instal·la {{ app_name }} ací baix:"}.
|
||||
{"Download Dino for Linux","Descarrega Dino per a Linux"}.
|
||||
{"Download from Mac App Store","Descarrega de la Tenda d'Apps de Mac"}.
|
||||
{"Download Gajim","Descarregar Gajim"}.
|
||||
{"Download Renga for Haiku","Descarrega Renga per a Haiku"}.
|
||||
{"Dump Backup to Text File at ","Exporta còpia de seguretat a fitxer de text en "}.
|
||||
{"Dump to Text File","Exportar a fitxer de text"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","No estan permesos els grups duplicats al RFC6121"}.
|
||||
@@ -126,6 +168,7 @@
|
||||
{"Enable message archiving","Activar l'emmagatzematge de missatges"}.
|
||||
{"Enabling push without 'node' attribute is not supported","No està suportat activar Push sense l'atribut 'node'"}.
|
||||
{"End User Session","Finalitzar Sesió d'Usuari"}.
|
||||
{"Enter a secure password that you do not use anywhere else.","Introdueix una contrasenya segura que no estiguis usant en cap altre lloc."}.
|
||||
{"Enter nickname you want to register","Introdueix el sobrenom que vols registrar"}.
|
||||
{"Enter path to backup file","Introdueix ruta al fitxer de còpia de seguretat"}.
|
||||
{"Enter path to jabberd14 spool dir","Introdueix la ruta al directori de jabberd14 spools"}.
|
||||
@@ -136,7 +179,7 @@
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Excloure Jabber IDs de la comprovació CAPTCHA"}.
|
||||
{"Export all tables as SQL queries to a file:","Exporta totes les taules a un fitxer SQL:"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar dades de tots els usuaris del servidor a arxius PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un host a arxius PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un domini a arxius PIEFXIS (XEP-0227):"}.
|
||||
{"External component failure","Error al component extern"}.
|
||||
{"External component timeout","Temps esgotat al component extern"}.
|
||||
{"Failed to activate bytestream","Errada al activar bytestream"}.
|
||||
@@ -146,6 +189,7 @@
|
||||
{"Failed to process option '~s'","Ha fallat el processat de la opció '~s'"}.
|
||||
{"Family Name","Cognom"}.
|
||||
{"FAQ Entry","Entrada a la FAQ"}.
|
||||
{"F-Droid Store Logo","Logo de la F-Droid Store"}.
|
||||
{"February","Febrer"}.
|
||||
{"File larger than ~w bytes","El fitxer es més gran que ~w bytes"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Emplena camps per a buscar usuaris XMPP que concorden"}.
|
||||
@@ -154,27 +198,44 @@
|
||||
{"Full List of Room Admins","Llista completa de administradors de la sala"}.
|
||||
{"Full List of Room Owners","Llista completa de propietaris de la sala"}.
|
||||
{"Full Name","Nom complet"}.
|
||||
{"Gajim Logo","Logo de Gajim"}.
|
||||
{"Get List of Active Users","Obté la llista d'usuaris actius"}.
|
||||
{"Get List of Disabled Users","Obté la llista d'usuaris deshabilitats"}.
|
||||
{"Get List of Idle Users","Obté la llista d'usuaris inactius"}.
|
||||
{"Get List of Online Users","Obté la llista d'usuaris en línia"}.
|
||||
{"Get List of Registered Users","Obté la llista d'usuaris registrats"}.
|
||||
{"Get Number of Active Users","Obtenir Número d'Usuaris Actius"}.
|
||||
{"Get Number of Disabled Users","Obtenir Número d'Usuaris Deshabilitats"}.
|
||||
{"Get Number of Idle Users","Obtenir Número d'Usuaris Inactius"}.
|
||||
{"Get Number of Online Users","Obtenir Número d'Usuaris Connectats"}.
|
||||
{"Get Number of Registered Users","Obtenir Número d'Usuaris Registrats"}.
|
||||
{"Get Pending","Obtenir Pendents"}.
|
||||
{"Get started","Comencem"}.
|
||||
{"Get User Last Login Time","Obtenir la última connexió d'Usuari"}.
|
||||
{"Get User Roster","Obtenir llista de contactes de l'usuari"}.
|
||||
{"Get User Statistics","Obtenir Estadístiques d'Usuari"}.
|
||||
{"Given Name","Nom propi"}.
|
||||
{"Google Play Store Logo","Logo de la Google Play Store"}.
|
||||
{"Grant voice to this person?","Concedir veu a aquesta persona?"}.
|
||||
{"has been banned","ha sigut bloquejat"}.
|
||||
{"has been kicked because of a system shutdown","ha sigut expulsat perquè el sistema va a apagar-se"}.
|
||||
{"has been kicked because of an affiliation change","ha sigut expulsat a causa d'un canvi d'afiliació"}.
|
||||
{"has been kicked because the room has been changed to members-only","ha sigut expulsat perquè la sala ara és només per a membres"}.
|
||||
{"has been kicked","ha sigut expulsat"}.
|
||||
{"Hash computed from the list of hats available in a room","Hash computat de la llista de barrets disponibles a una sala"}.
|
||||
{"Hash of the vCard-temp avatar of this room","Hash del avatar a vCard-temp d'esta sala"}.
|
||||
{"Hat hue","To de color del barret"}.
|
||||
{"Hat title","Títol del barret"}.
|
||||
{"Hat URI","URI del barret"}.
|
||||
{"Hats limit exceeded","El límit de tràfic ha sigut sobrepassat"}.
|
||||
{"Host unknown","Host desconegut"}.
|
||||
{"Hide","Amagar"}.
|
||||
{"Hint","Sugeriment"}.
|
||||
{"Host unknown","Domini desconegut"}.
|
||||
{"Hostname invalid","Nom de domini no vàlid"}.
|
||||
{"HTTP File Upload","HTTP File Upload"}.
|
||||
{"Idle connection","Connexió sense us"}.
|
||||
{"If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:","Si ja tens instal·lat {{ app_name }}, et recomanem que continues la creació del teu compte usant eixa app, polsa el boto:"}.
|
||||
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Si encara no tens un client XMPP instal·lat, mira esta llista de clients disponibles per a la teva plataforma."}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Si no veus la imatge CAPTCHA açí, visita la pàgina web."}.
|
||||
{"Import Directory","Importar directori"}.
|
||||
{"Import File","Importar fitxer"}.
|
||||
@@ -193,6 +254,7 @@
|
||||
{"Incorrect value of 'action' in data form","Valor incorrecte de 'action' al formulari de dades"}.
|
||||
{"Incorrect value of 'path' in data form","Valor incorrecte de 'path' al formulari de dades"}.
|
||||
{"Installed Modules:","Mòduls instal·lats:"}.
|
||||
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","S'ha instal·lat correctament? Perfecte! <strong>Polsa en el següent boto</strong> per a acceptar l'invitació i continuar preparant el teu compte:"}.
|
||||
{"Install","Instal·lar"}.
|
||||
{"Insufficient privilege","Privilegi insuficient"}.
|
||||
{"Internal server error","Error intern del servidor"}.
|
||||
@@ -200,6 +262,11 @@
|
||||
{"Invalid node name","Nom de node no vàlid"}.
|
||||
{"Invalid 'previd' value","Valor no vàlid de 'previd'"}.
|
||||
{"Invitations are not allowed in this conference","Les invitacions no estan permeses en aquesta sala de conferència"}.
|
||||
{"Invite expired","La invitació ha expirat"}.
|
||||
{"Invite Expired","La Invitació ha Expirat"}.
|
||||
{"Invite to {{ site_name }}","Invitació a {{ site_name }}"}.
|
||||
{"Invite User","Invitar Usuari"}.
|
||||
{"Invite","Invitar"}.
|
||||
{"IP addresses","Adreça IP"}.
|
||||
{"is now known as","ara es conegut com"}.
|
||||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No està permés enviar missatges d'error a la sala. El participant (~s) ha enviat un missatge d'error (~s) i ha sigut expulsat de la sala"}.
|
||||
@@ -209,6 +276,7 @@
|
||||
{"January","Gener"}.
|
||||
{"JID normalization denied by service policy","S'ha denegat la normalització del JID per política del servei"}.
|
||||
{"JID normalization failed","Ha fallat la normalització del JID"}.
|
||||
{"Join {{ site_name }} with {{ app_name }}","Uneix-te a {{ site_name }} amb {{ app_name }}"}.
|
||||
{"Joined MIX channels of ~ts","Canals MIX units de ~ts"}.
|
||||
{"Joined MIX channels:","Canals MIX units:"}.
|
||||
{"joins the room","entra a la sala"}.
|
||||
@@ -220,10 +288,13 @@
|
||||
{"Last message","Últim missatge"}.
|
||||
{"Last month","Últim mes"}.
|
||||
{"Last year","Últim any"}.
|
||||
{"Launch {{ app_name }} and sign in using your account credentials.","Inicia {{ app_name }} i entra al compte usant les teves credencials."}.
|
||||
{"Launch Beagle IM, and select \\'Yes\\' to add a new account. Click the \\'+\\' button under the empty account list and then enter your credentials.","Inicia Beagle IM, i selecciona \\'Sí\\' per a afegir un nou compte. Polsa el botó \\'+\\' baix la llista de comptes buida i ja podràs introduir les teues credencials."}.
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Els bits menys significants del hash SHA-256 del text deurien ser iguals a l'etiqueta hexadecimal"}.
|
||||
{"leaves the room","surt de la sala"}.
|
||||
{"List of users with hats","Llista d'usuaris amb barrets"}.
|
||||
{"List of Hats","Llista de barrets"}.
|
||||
{"List users with hats","Llista d'usuaris amb barrets"}.
|
||||
{"Log in via web","Entrar usant la web"}.
|
||||
{"Logged Out","Desconectat"}.
|
||||
{"Logging","Registre"}.
|
||||
{"Make participants list public","Crear una llista de participants pública"}.
|
||||
@@ -240,9 +311,11 @@
|
||||
{"Max payload size in bytes","Màxim tamany del payload en bytes"}.
|
||||
{"Maximum file size","Mida màxima de fitxer"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Numero màxim de missatges de l'historia que retorna la sala"}.
|
||||
{"Maximum number of invites reached","Ja has arribat al número màxim d'invitacions"}.
|
||||
{"Maximum number of items to persist","Número màxim d'elements que persistixen"}.
|
||||
{"Maximum Number of Occupants","Número màxim d'ocupants"}.
|
||||
{"May","Maig"}.
|
||||
{"Members are allowed to invite others","Els membres poden invitar a altres"}.
|
||||
{"Membership is required to enter this room","Necessites ser membre d'aquesta sala per a poder entrar"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Memoritza la teva contrasenya, o escriu-la en un paper guardat a un lloc segur. A XMPP no hi ha una forma automatitzada de recuperar la teva contrasenya si la oblides."}.
|
||||
{"Mere Availability in XMPP (No Show Value)","Simplement disponibilitat a XMPP (sense valor de 'show')"}.
|
||||
@@ -257,6 +330,7 @@
|
||||
{"Moderator","Moderador"}.
|
||||
{"Moderators Only","Només moderadors"}.
|
||||
{"Module failed to handle the query","El modul ha fallat al gestionar la petició"}.
|
||||
{"Monal Logo","Logo de Monal"}.
|
||||
{"Monday","Dilluns"}.
|
||||
{"Multicast","Multicast"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","No estan permesos múltiples elements <item/> per RFC6121"}.
|
||||
@@ -311,18 +385,21 @@
|
||||
{"None","Cap"}.
|
||||
{"Not allowed","No permès"}.
|
||||
{"Not Found","No Trobat"}.
|
||||
{"NOT FOUND","NO TROBAT"}.
|
||||
{"Not subscribed","No subscrit"}.
|
||||
{"Notify subscribers when items are removed from the node","Notificar subscriptors quan els elements són eliminats del node"}.
|
||||
{"Notify subscribers when the node configuration changes","Notificar subscriptors quan canvia la configuració del node"}.
|
||||
{"Notify subscribers when the node is deleted","Notificar subscriptors quan el node és eliminat"}.
|
||||
{"November","Novembre"}.
|
||||
{"Number of active users","Número d'usuaris actius"}.
|
||||
{"Number of answers required","Número de respostes requerides"}.
|
||||
{"Number of disabled users","Número d'Usuaris Deshabilitats"}.
|
||||
{"Number of idle users","Número d'usuaris inactius"}.
|
||||
{"Number of occupants","Número d'ocupants"}.
|
||||
{"Number of Offline Messages","Número de missatges offline"}.
|
||||
{"Number of online users","Número d'usuaris connectats"}.
|
||||
{"Number of registered users","Número d'Usuaris Registrats"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segons després dels quals es purgaran automàticament elements, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}.
|
||||
{"Occupants are allowed to invite others","Els ocupants poden invitar a altres"}.
|
||||
{"Occupants are allowed to query others","Els ocupants poden enviar peticions a altres"}.
|
||||
{"Occupants May Change the Subject","Els ocupants poden canviar el Tema"}.
|
||||
{"October","Octubre"}.
|
||||
@@ -345,12 +422,15 @@
|
||||
{"Only service administrators are allowed to send service messages","Sols els administradors del servei tenen permís per a enviar missatges de servei"}.
|
||||
{"Only those on a whitelist may associate leaf nodes with the collection","Només qui estiga a una llista blanca pot associar nodes fulla amb la col·lecció"}.
|
||||
{"Only those on a whitelist may subscribe and retrieve items","Només qui estiga a una llista blanca pot subscriure's i recuperar elements"}.
|
||||
{"Open the app","Obrir l'app"}.
|
||||
{"Organization Name","Nom de la organizació"}.
|
||||
{"Organization Unit","Unitat de la organizació"}.
|
||||
{"Other Modules Available:","Altres mòduls disponibles:"}.
|
||||
{"Other software","Altres programes"}.
|
||||
{"Outgoing s2s Connections","Connexions s2s d'eixida"}.
|
||||
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
|
||||
{"Packet relay is denied by service policy","S'ha denegat el reenviament del paquet per política del servei"}.
|
||||
{"Page navigation","Navegació de pàgina"}.
|
||||
{"Participant ID","ID del Participant"}.
|
||||
{"Participant","Participant"}.
|
||||
{"Password Verification","Verificació de la Contrasenya"}.
|
||||
@@ -366,6 +446,8 @@
|
||||
{"Ping query is incorrect","La petició de Ping es incorrecta"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Recorda que aquestes opcions només fan còpia de seguretat de la base de dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una còpia de seguretat de la base de dades de SQL a part."}.
|
||||
{"Please provide a password! Minimum length: {{ password_min_length }}","Per favor proporciona una contrasenya ! Llargària minima: {{ password_min_length }}"}.
|
||||
{"Please provide a valid username!","Per favor proporciona un nom vàlid per al teu compte!"}.
|
||||
{"Please, wait for a while before sending new voice request","Si us plau, espera una mica abans d'enviar una nova petició de veu"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Possessing 'ask' attribute is not allowed by RFC6121","Posseir l'atribut 'ask' no està permès per RFC6121"}.
|
||||
@@ -375,6 +457,7 @@
|
||||
{"Previous session PID has exited","El procés de la sessió prèvia ha sortit"}.
|
||||
{"Previous session PID is dead","El procés de la sessió prèvia està mort"}.
|
||||
{"Previous session timed out","La sessió prèvia ha caducat"}.
|
||||
{"Previous","Anterior"}.
|
||||
{"private, ","privat, "}.
|
||||
{"Public","Public"}.
|
||||
{"Publish model","Model de publicació"}.
|
||||
@@ -392,11 +475,18 @@
|
||||
{"Receive notification of new items only","Rebre notificació només de nous elements"}.
|
||||
{"Receive notification of new nodes only","Rebre notificació només de nous nodes"}.
|
||||
{"Recipient is not in the conference room","El receptor no està en la sala de conferència"}.
|
||||
{"Re-Enable User","Rehabilitar usuari"}.
|
||||
{"Register an XMPP account","Registrar un compte XMPP"}.
|
||||
{"Register on {{ site_name }}","Registrar a {{ site_name }}"}.
|
||||
{"Register","Registrar"}.
|
||||
{"Registration error","Error al fer el registre"}.
|
||||
{"Registration Error","Error al fer el Registre"}.
|
||||
{"Registration Form","Formulari de Registre"}.
|
||||
{"Registration Success","Registre completat correctament"}.
|
||||
{"Remote copy","Còpia remota"}.
|
||||
{"Remove a hat from a user","Eliminar un barret d'un usuari"}.
|
||||
{"Remove User","Eliminar usuari"}.
|
||||
{"Renga Logo","Logo de Renga"}.
|
||||
{"Replaced by new connection","Reemplaçat per una nova connexió"}.
|
||||
{"Request has timed out","La petició ha caducat"}.
|
||||
{"Request is ignored","La petició ha sigut ignorada"}.
|
||||
@@ -408,6 +498,7 @@
|
||||
{"Restore binary backup immediately:","Restaurar una còpia de seguretat binària ara mateix:"}.
|
||||
{"Restore plain text backup immediately:","Restaurar una còpia de seguretat en format de text pla ara mateix:"}.
|
||||
{"Restore","Restaurar"}.
|
||||
{"Result","Resultat"}.
|
||||
{"Roles and Affiliations that May Retrieve Member List","Rols i Afiliacions que poden recuperar la llista de membres"}.
|
||||
{"Roles for which Presence is Broadcasted","Rols per als que sí se difon la seua presencia"}.
|
||||
{"Roles that May Send Private Messages","Rols que poden enviar missatges privats"}.
|
||||
@@ -421,29 +512,39 @@
|
||||
{"Roster size","Mida de la llista"}.
|
||||
{"Running Nodes","Nodes funcionant"}.
|
||||
{"~s invites you to the room ~s","~s et convida a la sala ~s"}.
|
||||
{"Sad person holding empty box","Persona trista agafant una caixa buida"}.
|
||||
{"Saturday","Dissabte"}.
|
||||
{"Scan invite code","Escaneja el codi d'invitació"}.
|
||||
{"Scan with mobile device","Escanejar amb el mòbil"}.
|
||||
{"Search from the date","Buscar des de la data"}.
|
||||
{"Search Results for ","Resultats de la búsqueda "}.
|
||||
{"Search the text","Buscar el text"}.
|
||||
{"Search until the date","Buscar fins la data"}.
|
||||
{"Search users in ","Cerca usuaris en "}.
|
||||
{"Send announcement to all online users on all hosts","Enviar anunci a tots els usuaris connectats a tots els hosts"}.
|
||||
{"Select","Seleccionar"}.
|
||||
{"Send announcement to all online users on all hosts","Enviar anunci a tots els usuaris connectats a tots els dominis"}.
|
||||
{"Send announcement to all online users","Enviar anunci a tots els usuaris connectats"}.
|
||||
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els hosts"}.
|
||||
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els dominis"}.
|
||||
{"Send announcement to all users","Enviar anunci a tots els usuaris"}.
|
||||
{"Send this invite to your device","Envia esta invitació al teu dispositiu"}.
|
||||
{"September","Setembre"}.
|
||||
{"Server:","Servidor:"}.
|
||||
{"Service list retrieval timed out","L'intent de recuperar la llista de serveis ha caducat"}.
|
||||
{"Session state copying timed out","La copia del estat de la sessió ha caducat"}.
|
||||
{"Set message of the day and send to online users","Configurar el missatge del dia i enviar a tots els usuaris"}.
|
||||
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
|
||||
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els dominis i enviar-ho als usuaris connectats"}.
|
||||
{"Shared Roster Groups","Grups de contactes compartits"}.
|
||||
{"Show Integral Table","Mostrar Taula Integral"}.
|
||||
{"Show Occupants Join/Leave","Mostrar Entrades/Eixides dels Ocupants"}.
|
||||
{"Show Ordinary Table","Mostrar Taula Ordinaria"}.
|
||||
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">view all apps.</a>","Mostrant apps només per a <span class='platform-name'>la teua plataforma actual</span>. Tambè pots <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">vore totes les apps.</a>"}.
|
||||
{"Show","Mostrar"}.
|
||||
{"Shut Down Service","Apager el Servei"}.
|
||||
{"Siskin IM Logo","Logo de Siskin IM"}.
|
||||
{"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}.
|
||||
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alguns clients XMPP poden emmagatzemar la teva contrasenya al ordinador, però només hauries de fer això al teu ordinador personal, per raons de seguretat."}.
|
||||
{"Sorry, it looks like this invite code has expired!","Perdona, però pareix que esta invitació ja ha expirat!"}.
|
||||
{"Sorry, there was a problem registering your account.","Perdona, però hi ha hagut un error creant el compte."}.
|
||||
{"Sources Specs:","Especificacions de Codi Font:"}.
|
||||
{"Specify the access model","Especificar el model d'accés"}.
|
||||
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
|
||||
@@ -451,12 +552,21 @@
|
||||
{"Stanza id is not valid","L'identificador del paquet no es vàlid"}.
|
||||
{"Stanza ID","ID del paquet"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Especifica estaticament una adreça on respondre al propietari del node"}.
|
||||
{"Step 1: Download and install {{ app_name }}","Pas 1: Descarrega e instal·la {{ app_name }}"}.
|
||||
{"Step 1: Install {{ app_name }}","Pas 1: Instal·la {{ app_name }}"}.
|
||||
{"Step 2: Activate your account","Pas 2: Activa el teu compte"}.
|
||||
{"Step 2: Connect {{ app_name }} to your new account","Pas 2: Connecta {{ app_name }} al teu nou compte"}.
|
||||
{"Stopped Nodes","Nodes parats"}.
|
||||
{"Store binary backup:","Guardar una còpia de seguretat binària:"}.
|
||||
{"Store plain text backup:","Guardar una còpia de seguretat en format de text pla:"}.
|
||||
{"Stream management is already enabled","L'administració de la connexió (stream management) ja està activada"}.
|
||||
{"Stream management is not enabled","L'administració de la conexió (stream management) no està activada"}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> és part de XMPP, una xarxa de missatgeria segura i descentralitzada. Per a començar a xarrar usant <strong>{{ app_name }}</strong> primer tens que registrar un compte."}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.","<strong>{{ site_name }}</strong> és part de la xarxa XMPP de missatgeria segura i descentralitzada. Per a començar a xarrar, primer tindries que crear-te un compte."}.
|
||||
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>No tens instal·lat cap programa compatible?</strong> També pots connectarte al teu compte amb el nostre xat web en linia!"}.
|
||||
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Truquet:</strong> Pots obrir esta invitació al teu mòbil escanejant el codi amb la camera de fotos."}.
|
||||
{"Subject","Tema"}.
|
||||
{"Submit","Enviar"}.
|
||||
{"Submitted","Enviat"}.
|
||||
{"Subscriber Address","Adreça del Subscriptor"}.
|
||||
{"Subscribers may publish","Els subscriptors poden publicar"}.
|
||||
@@ -474,7 +584,7 @@
|
||||
{"The body text of the last received message","El contingut del text de l'ultim missatge rebut"}.
|
||||
{"The CAPTCHA is valid.","El CAPTCHA es vàlid."}.
|
||||
{"The CAPTCHA verification has failed","La verificació CAPTCHA ha fallat"}.
|
||||
{"The captcha you entered is wrong","El CAPTCHA que has proporcionat és incorrecte"}.
|
||||
{"The captcha you entered is wrong","El captcha que has proporcionat és incorrecte"}.
|
||||
{"The child nodes (leaf or collection) associated with a collection","El nodes fills (fulla o col·leccions) associats amb una col·lecció"}.
|
||||
{"The collections with which a node is affiliated","Les col.leccions amb les que un node està afiliat"}.
|
||||
{"The DateTime at which a leased subscription will end or has ended","La Data i Hora a la que una subscripció prestada terminarà o ha terminat"}.
|
||||
@@ -485,6 +595,9 @@
|
||||
{"The JIDs of those to contact with questions","Els JIDs a qui contactar amb preguntes"}.
|
||||
{"The JIDs of those with an affiliation of owner","Els JIDs de qui tenen una afiliació de propietaris"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Els JIDs de qui tenen una afiliació de publicadors"}.
|
||||
{"The list of all active users","La llista de tots els usuaris actius"}.
|
||||
{"The list of all disabled users","La llista de tots els usuaris deshabilitats"}.
|
||||
{"The list of all idle users","La llista de tots els usuaris inactius"}.
|
||||
{"The list of all online users","La llista de tots els usuaris en línia"}.
|
||||
{"The list of all users","La llista de tots els usuaris"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","La llista de JIDs que poden associar nodes fulla amb una col·lecció"}.
|
||||
@@ -506,16 +619,20 @@
|
||||
{"The presence states for which an entity wants to receive notifications","El estats de presencia per als quals una entitat vol rebre notificacions"}.
|
||||
{"The query is only allowed from local users","La petició està permesa només d'usuaris locals"}.
|
||||
{"The query must not contain <item/> elements","La petició no pot contenir elements <item/>"}.
|
||||
{"The role","El rol"}.
|
||||
{"The room subject can be modified by participants","El tema de la sala pot modificar-lo els participants"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","La informació semàntica de les dades al node, usualment especificat pel espai de noms de la càrrega util (si n'hi ha)"}.
|
||||
{"The sender of the last received message","Qui ha enviat l'ultim missatge rebut"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquet DEU contindre només un element <active/>, un element <default/>, o un element <list/>"}.
|
||||
{"The subscription identifier associated with the subscription request","L'identificador de subscripció associat amb la petició de subscripció"}.
|
||||
{"The token provided is either invalid or expired.","El token proporcionat no es vàlid o ja ha expirat."}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de uns transformació XSL que pot ser aplicada als payloads per a generar un element apropiat de contingut de missatge."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformació XSL que pot ser aplicada al format de payload per a generar un resultat valid de Data Forms, que el client puga mostrar usant un métode generic de Data Forms"}.
|
||||
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
|
||||
{"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}.
|
||||
{"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}.
|
||||
{"This button works only if you have the app installed already!","Aquest botó funciona només si ja tens la app instal·lada!"}.
|
||||
{"This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!","Esta es una invitació de <strong>{{ inviter }}</strong> per a connectar i xarrar en la xarxa XMPP. Si ja tens un client XMPP instal·lat, ja pots polsar el boto de baix!"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Això no distingeix majúscules de minúscules: macbeth es el mateix que MacBeth i Macbeth."}.
|
||||
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Aquesta pàgina permet crear un compte XMPP en aquest servidor XMPP. El teu JID (Jabber ID; Identificador Jabber) tindrà aquesta forma: usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar correctament els camps."}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","Aquesta pàgina permet esborrar un compte XMPP en aquest servidor XMPP."}.
|
||||
@@ -524,7 +641,9 @@
|
||||
{"Thursday","Dijous"}.
|
||||
{"Time delay","Temps de retard"}.
|
||||
{"Timed out waiting for stream resumption","Massa temps esperant que es resumisca la connexió"}.
|
||||
{"To get started, you need to install an app for your platform:","Per a començar, tens que instal·lar alguna app:"}.
|
||||
{"To register, visit ~s","Per a registrar-te, visita ~s"}.
|
||||
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","Per a començar a xarrar, tens que proporcionar les credencials del teu no compte al programa XMPP escollit."}.
|
||||
{"To ~ts","A ~ts"}.
|
||||
{"Token TTL","Token TTL"}.
|
||||
{"Too many active bytestreams","N'hi ha massa Bytestreams actius"}.
|
||||
@@ -551,12 +670,13 @@
|
||||
{"Unsupported <index/> element","Element <index/> no soportat"}.
|
||||
{"Unsupported version","Versió no suportada"}.
|
||||
{"Update message of the day (don't send)","Actualitzar el missatge del dia (no enviar)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Actualitza el missatge del dia en tots els hosts (no enviar)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Actualitza el missatge del dia en tots els dominis (no enviar)"}.
|
||||
{"Update specs to get modules source, then install desired ones.","Actualitza les especificacions per obtindre el codi font dels mòduls, després instal·la els que vulgues."}.
|
||||
{"Update Specs","Actualitzar Especificacions"}.
|
||||
{"Updating the vCard is not supported by the vCard storage backend","El sistema d'almacenament de vCard no te capacitat per a actualitzar la vCard"}.
|
||||
{"Upgrade","Actualitza"}.
|
||||
{"URL for Archived Discussion Logs","URL dels Arxius de Discussions"}.
|
||||
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Usa un escanejador de <em>codis QR</em> al te mòbil per a escanejar aquest codi:"}.
|
||||
{"User already exists","El usuari ja existeix"}.
|
||||
{"User JID","JID del usuari"}.
|
||||
{"User (jid)","Usuari (jid)"}.
|
||||
@@ -566,6 +686,9 @@
|
||||
{"User session not found","Sessió d'usuari no trobada"}.
|
||||
{"User session terminated","Sessió d'usuari terminada"}.
|
||||
{"User ~ts","Usuari ~ts"}.
|
||||
{"Username invalid","El nom d'usuari no es vàlid"}.
|
||||
{"Username is reserved","El nom d'usuari està reservat"}.
|
||||
{"Username","Nom d'usuari"}.
|
||||
{"Username:","Nom d'usuari:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Els usuaris no tenen permís per a crear comptes tan depresa"}.
|
||||
{"Users Last Activity","Última activitat d'usuari"}.
|
||||
@@ -578,12 +701,13 @@
|
||||
{"Value 'set' of 'type' attribute is not allowed","El valor 'set' a l'atribut 'type' no és permès"}.
|
||||
{"vCard User Search","vCard recerca d'usuari"}.
|
||||
{"View joined MIX channels","Vore els canals MIX units"}.
|
||||
{"Virtual Hosts","Hosts virtuals"}.
|
||||
{"Virtual Hosts","Dominis Virtuals"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Els visitants no tenen permés canviar el seus Nicknames en esta sala"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Els visitants no poden enviar missatges a tots els ocupants"}.
|
||||
{"Visitor","Visitant"}.
|
||||
{"Voice request","Petició de veu"}.
|
||||
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
|
||||
{"Web client which allows to join the room anonymously","Client web que permet entrar a la sala anonimament"}.
|
||||
{"Wednesday","Dimecres"}.
|
||||
{"When a new subscription is processed and whenever a subscriber comes online","Quan es processa una nova subscripció i un subscriptor es connecta"}.
|
||||
{"When a new subscription is processed","Quan es processa una nova subscripció"}.
|
||||
@@ -601,6 +725,7 @@
|
||||
{"Wrong parameters in the web formulary","Paràmetres incorrectes en el formulari web"}.
|
||||
{"Wrong xmlns","El xmlns ès incorrecte"}.
|
||||
{"XMPP Account Registration","Registre de compte XMPP"}.
|
||||
{"XMPP client for Haiku","Client XMPP per a Haiku"}.
|
||||
{"XMPP Domains","Dominis XMPP"}.
|
||||
{"XMPP Show Value of Away","Valor 'show' de XMPP: Ausent"}.
|
||||
{"XMPP Show Value of Chat","Valor 'show' de XMPP: Disposat per a xarrar"}.
|
||||
@@ -610,8 +735,17 @@
|
||||
{"You are being removed from the room because of a system shutdown","Has sigut expulsat de la sala perquè el sistema va a apagar-se"}.
|
||||
{"You are not allowed to send private messages","No tens permés enviar missatges privats"}.
|
||||
{"You are not joined to the channel","No t'has unit al canal"}.
|
||||
{"You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>register an account manually</a>.","Pots connectar-te a {{ site_name }} usant qualsevol programa compatible amb XMPP. Si el teu programa preferit no està en esta llista, pots <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>registrarte el teu compte manualment</a>."}.
|
||||
{"You can later change your password using an XMPP client.","Podràs canviar la teva contrasenya més endavant utilitzant un client XMPP."}.
|
||||
{"You can now set up {{ app_name }} and connect it to your new account.","Ara pots configurar {{ app_name }} i connectar al teu nou compte."}.
|
||||
{"You can start chatting right away with {{ app_name }}. Let's get started!","Ja pots començar a xarrar usant {{ app_name }}. Comencem!"}.
|
||||
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Pots transferir esta invitació al teu mòbil si escanejes el codi amb la càmera de fotos."}.
|
||||
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
|
||||
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Has rebut una invitació per a xarrar a {{ site_name }}, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
|
||||
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Has rebut una invitació per a xarrar a <strong>{{ site_name }}</strong>, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Has rebut una invitació a xarrar amb <strong>{{ inviter }}</strong> a {{ site_name }}, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","T'han invitat a xarrar amb <strong>{{ inviter }}</strong> a <strong>{{ site_name }}</strong>, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
|
||||
{"You have created an account on <strong>{{ site_name }}</strong>.","Has creat un compte en <strong>{{ site_name }}</strong>."}.
|
||||
{"You have joined too many conferences","Has entrat en massa sales de conferència"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Deus d'omplir el camp \"Nickname\" al formulari"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Necessites un client amb suport x:data i de CAPTCHA para poder registrar-te"}.
|
||||
@@ -619,6 +753,7 @@
|
||||
{"You need an x:data capable client to search","Necessites un client amb suport x:data per a poder buscar"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","La teva llista de privacitat activa ha denegat l'encaminament d'aquesta stanza."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","La teua cua de missatges offline és plena. El missatge ha sigut descartat."}.
|
||||
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","La teva contrasenya es guardarà xifrada al servidor, i no serà accessible una vegada que tanques esta pàgina. Mantin la contrasenya segura i no la compartis amb ningú mes."}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","La teua petició de subscripció i/o missatges a ~s han sigut bloquejats. Per a desbloquejar-los, visita ~s"}.
|
||||
{"Your XMPP account was successfully registered.","El teu compte XMPP ha sigut creat correctament."}.
|
||||
{"Your XMPP account was successfully unregistered.","El teu compte XMPP ha sigut esborrat correctament."}.
|
||||
|
||||
@@ -4,15 +4,24 @@
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" has set the subject to: "," změnil(a) téma na: "}.
|
||||
{"A description of the node","Popis uzlu"}.
|
||||
{"A friendly name for the node","Přívětivé jméno pro uzel"}.
|
||||
{"A fully-featured desktop chat client for Windows and Linux.","Plně funkční desktopový chatovací klient pro Windows a Linux."}.
|
||||
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Lehký a výkonný XMPP klient pro iPhone a iPad. Nabízí snadný způsob, jak komunikovat a sdílet okamžiky s přáteli."}.
|
||||
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Moderní chatovací klient s otevřeným zdrojovým kódem pro iPhone a iPad. Snadno se používá a má čisté uživatelské rozhraní."}.
|
||||
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Moderní chatovací klient s otevřeným zdrojovým kódem pro Mac. Snadno se používá a má čisté uživatelské rozhraní."}.
|
||||
{"A password is required to enter this room","Pro vstup do místnosti musíte zadat heslo"}.
|
||||
{"Accept invite using {{ app_name }}","Přijmout pozvánku pomocí {{ app_name }}"}.
|
||||
{"Accept","Přijmout"}.
|
||||
{"Access denied by service policy","Přístup byl zamítnut nastavením služby"}.
|
||||
{"Action on user","Akce aplikovaná na uživatele"}.
|
||||
{"Add Contact","Přidat kontakt"}.
|
||||
{"Add User","Přidat uživatele"}.
|
||||
{"Administration of ","Administrace "}.
|
||||
{"Administration","Administrace"}.
|
||||
{"Administrator privileges required","Potřebujete práva administrátora"}.
|
||||
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Po kliknutí na tlačítko budete přesměrováni do {{ app_name }}, kde dokončíte nastavení svého nového účtu na {{ site_name }}."}.
|
||||
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Po úspěšné instalaci {{ app_name }} se vraťte na tuto stránku a <strong>pokračujte krokem 2</strong>."}.
|
||||
{"All activity","Všechny aktivity"}.
|
||||
{"All Users","Všichni uživatelé"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Povolit tomuto Jabber ID odebírat tento pubsub uzel?"}.
|
||||
@@ -25,7 +34,9 @@
|
||||
{"Allow visitors to send status text in presence updates","Povolit návštěvníkům posílat stavové zprávy ve statusu"}.
|
||||
{"Allow visitors to send voice requests","Povolit uživatelům posílat žádosti o voice práva"}.
|
||||
{"Announcements","Oznámení"}.
|
||||
{"API Commands","API příkazy"}.
|
||||
{"April",". dubna"}.
|
||||
{"As a final reminder, your account details are shown below:","Pro připomenutí, níže jsou uvedeny údaje o vašem účtu:"}.
|
||||
{"August",". srpna"}.
|
||||
{"Automatic node creation is not enabled","Automatické vytváření uzlů není povoleno"}.
|
||||
{"Backup Management","Správa zálohování"}.
|
||||
@@ -33,6 +44,7 @@
|
||||
{"Backup to File at ","Záloha do souboru na "}.
|
||||
{"Backup","Zálohovat"}.
|
||||
{"Bad format","Nesprávný formát"}.
|
||||
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM od Tigase, Inc. je lehký a výkonný klient pro macOS."}.
|
||||
{"Birthday","Datum narození"}.
|
||||
{"Both the username and the resource are required","Uživatelské jméno i zdroj jsou požadované položky"}.
|
||||
{"Bytestream already activated","Bytestream již byl aktivován"}.
|
||||
@@ -51,14 +63,18 @@
|
||||
{"Chatroom is stopped","Místnost zastavena"}.
|
||||
{"Chatrooms","Místnosti"}.
|
||||
{"Choose a username and password to register with this server","Zadejte jméno uživatele a heslo pro registraci na tomto serveru"}.
|
||||
{"Choose a username, this will become the first part of your new chat address.","Zvolte si uživatelské jméno, to se stane první částí Vaší chatovací adresy."}.
|
||||
{"Choose storage type of tables","Vyberte typ úložiště pro tabulky"}.
|
||||
{"Choose whether to approve this entity's subscription.","Zvolte, zda chcete schválit odebírání touto entitou."}.
|
||||
{"City","Město"}.
|
||||
{"Click the button to open the Dino website where you can download and install it on your PC.","Kliknutím na tlačítko se otevře webová stránka, odkud si můžete stáhnout aplikaci Dino a nainstalovat ji na svůj počítač."}.
|
||||
{"Close","Zavřít"}.
|
||||
{"Commands","Příkazy"}.
|
||||
{"Conference room does not exist","Místnost neexistuje"}.
|
||||
{"Configuration of room ~s","Konfigurace místnosti ~s"}.
|
||||
{"Configuration","Konfigurace"}.
|
||||
{"Country","Země"}.
|
||||
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Vytvořením účtu budete moci komunikovat s ostatními lidmi na serveru <strong>{{ site_name }}</strong> i na ostatních serverech v rámci sítě XMPP."}.
|
||||
{"Database failure","Chyba databáze"}.
|
||||
{"Database Tables Configuration at ","Konfigurace databázových tabulek "}.
|
||||
{"Database","Databáze"}.
|
||||
@@ -70,6 +86,10 @@
|
||||
{"Deliver event notifications","Doručovat upozornění na události"}.
|
||||
{"Deliver payloads with event notifications","Doručovat náklad s upozorněním na událost"}.
|
||||
{"Disc only copy","Jen kopie disku"}.
|
||||
{"Download and install {{ app_name }} below:","Stáhněte a nainstalujte {{ app_name }}:"}.
|
||||
{"Download Dino for Linux","Stáhnout Dino pro Linux"}.
|
||||
{"Download Gajim","Stahnout Gajim"}.
|
||||
{"Download Renga for Haiku","Stáhnout Renga pro Haiku"}.
|
||||
{"Dump Backup to Text File at ","Uložit zálohu do textového souboru na "}.
|
||||
{"Dump to Text File","Uložit do textového souboru"}.
|
||||
{"Edit Properties","Upravit vlastnosti"}.
|
||||
@@ -85,6 +105,7 @@
|
||||
{"Enable message archiving","Povolit ukládání historie zpráv"}.
|
||||
{"Enabling push without 'node' attribute is not supported","Aktivováno push bez atributu 'node' není podporováno"}.
|
||||
{"End User Session","Ukončit sezení uživatele"}.
|
||||
{"Enter a secure password that you do not use anywhere else.","Zadejte bezpečné heslo, které nikde jinde nepoužíváte."}.
|
||||
{"Enter nickname you want to register","Zadejte přezdívku, kterou chcete zaregistrovat"}.
|
||||
{"Enter path to backup file","Zadajte cestu k souboru se zálohou"}.
|
||||
{"Enter path to jabberd14 spool dir","Zadejte cestu k jabberd14 spool adresáři"}.
|
||||
@@ -117,9 +138,11 @@
|
||||
{"has been banned","byl(a) zablokován(a)"}.
|
||||
{"has been kicked because of a system shutdown","byl(a) vyhozen(a), protože dojde k vypnutí systému"}.
|
||||
{"has been kicked because of an affiliation change","byl(a) vyhozen(a) kvůli změně přiřazení"}.
|
||||
{"has been kicked because the room has been changed to members-only","byl(a) vyhozen(a), protože mísnost je nyní pouze pro členy"}.
|
||||
{"has been kicked because the room has been changed to members-only","byl(a) vyhozen(a), protože místnost je nyní pouze pro členy"}.
|
||||
{"has been kicked","byl(a) vyhozen(a) z místnosti"}.
|
||||
{"Hide","Skrýt"}.
|
||||
{"Host unknown","Neznámý hostitel"}.
|
||||
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Pokud ještě nemáte nainstalovaného klienta XMPP, zde je seznam vhodných klientů pro vaši platformu."}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Pokud zde nevidíte obrázek CAPTCHA, přejděte na webovou stránku."}.
|
||||
{"Import Directory","Import adresáře"}.
|
||||
{"Import File","Import souboru"}.
|
||||
@@ -141,6 +164,7 @@
|
||||
{"Insufficient privilege","Nedostatečné oprávnění"}.
|
||||
{"Invalid 'from' attribute in forwarded message","Nesprávný atribut 'from' v přeposlané zprávě"}.
|
||||
{"Invitations are not allowed in this conference","Pozvánky nejsou povoleny v této místnosti"}.
|
||||
{"Invite expired","Platnost pozvánky vypršela"}.
|
||||
{"IP addresses","IP adresy"}.
|
||||
{"is now known as","se přejmenoval(a) na"}.
|
||||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Není povoleno posílat chybové zprávy do místnosti. Účastník (~s) odeslal chybovou zprávu (~s) a byl vyhozen z místnosti"}.
|
||||
@@ -152,21 +176,24 @@
|
||||
{"joins the room","vstoupil(a) do místnosti"}.
|
||||
{"July",". července"}.
|
||||
{"June",". června"}.
|
||||
{"Just created","Právě vytvořen"}.
|
||||
{"Last Activity","Poslední aktivita"}.
|
||||
{"Last login","Poslední přihlášení"}.
|
||||
{"Last message","Poslední zpráva"}.
|
||||
{"Last month","Poslední měsíc"}.
|
||||
{"Last year","Poslední rok"}.
|
||||
{"Launch {{ app_name }} and sign in using your account credentials.","Spusťte {{ app_name }} a přihlaste se pomocí Vašich přihlašovacích údajů."}.
|
||||
{"leaves the room","opustil(a) místnost"}.
|
||||
{"Logged Out","Odhlášen"}.
|
||||
{"Make participants list public","Nastavit seznam účastníků jako veřejný"}.
|
||||
{"Make room CAPTCHA protected","Chránit místnost pomocí CAPTCHA"}.
|
||||
{"Make room members-only","Zpřístupnit místnost jen členům"}.
|
||||
{"Make room moderated","Nastavit místnost jako moderovanou"}.
|
||||
{"Make room password protected","Chránit místnost heslem"}.
|
||||
{"Make room persistent","Nastavit místnost jako stálou"}.
|
||||
{"Make room public searchable","Nastavit místnost jako veřejnou"}.
|
||||
{"Malformed username","Chybně formátováné jméno uživatele"}.
|
||||
{"March",". března"}.
|
||||
{"Max payload size in bytes","Maximální náklad v bajtech"}.
|
||||
{"Maximum file size","Maximální velikost souboru"}.
|
||||
{"Maximum Number of Occupants","Maximální počet účastníků"}.
|
||||
{"May",". května"}.
|
||||
{"Membership is required to enter this room","Pro vstup do místnosti musíte být členem"}.
|
||||
@@ -193,7 +220,7 @@
|
||||
{"No body provided for announce message","Zpráva neobsahuje text"}.
|
||||
{"No data form found","Nebyl nalezen datový formulář"}.
|
||||
{"No Data","Žádná data"}.
|
||||
{"No features available","Žádné funce nejsou dostupné"}.
|
||||
{"No features available","Žádné funkce nejsou dostupné"}.
|
||||
{"No hook has processed this command","Žádný hook nebyl zpracován tímto příkazem"}.
|
||||
{"No info about last activity found","Nebyla žádná informace o poslední aktivitě"}.
|
||||
{"No 'item' element found","Element 'item' nebyl nalezen"}.
|
||||
@@ -219,6 +246,7 @@
|
||||
{"Nodeprep has failed","Nodeprep chyboval"}.
|
||||
{"Nodes","Uzly"}.
|
||||
{"None","Nic"}.
|
||||
{"Not allowed","Nepovoleno"}.
|
||||
{"Not Found","Nenalezeno"}.
|
||||
{"Not subscribed","Není odebíráno"}.
|
||||
{"Notify subscribers when items are removed from the node","Upozornit odběratele na odstranění položek z uzlu"}.
|
||||
@@ -236,14 +264,13 @@
|
||||
{"Only deliver notifications to available users","Doručovat upozornění jen právě přihlášeným uživatelům"}.
|
||||
{"Only <enable/> or <disable/> tags are allowed","Pouze značky <enable/> nebo <disable/>jsou povoleny"}.
|
||||
{"Only <list/> element is allowed in this query","Pouze element <list/> je povolen v tomto dotazu"}.
|
||||
{"Only members may query archives of this room","Pouze moderátoři mají povoleno měnit téma místnosti"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Jen moderátoři mají povoleno měnit téma místnosti"}.
|
||||
{"Only moderators can approve voice requests","Pouze moderátoři mohou schválit žádosti o voice práva"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat zprávy do místnosti"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Jen členové mohou odesílat požadavky (query) do místnosti"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Pouze členové mají povolené zasílat zprávy do místnosti"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Pouze členové mohou odesílat požadavky (query) do místnosti"}.
|
||||
{"Only service administrators are allowed to send service messages","Pouze správci služby smí odesílat servisní zprávy"}.
|
||||
{"Organization Name","Název firmy"}.
|
||||
{"Organization Name","Název organizace"}.
|
||||
{"Organization Unit","Oddělení"}.
|
||||
{"Other Modules Available:","Ostatní dostupné moduly:"}.
|
||||
{"Outgoing s2s Connections","Odchozí s2s spojení"}.
|
||||
@@ -260,10 +287,14 @@
|
||||
{"Ping query is incorrect","Ping dotaz je nesprávný"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Podotýkáme, že tato nastavení budou zálohována do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi samostatně."}.
|
||||
{"Please provide a password! Minimum length: {{ password_min_length }}","Prosím vyplňte heslo! Minimální délka hesla: {{ password_min_length }}"}.
|
||||
{"Please provide a valid username!","Prosím, zadejte platné uživatelské jméno!"}.
|
||||
{"Please, wait for a while before sending new voice request","Prosím, počkejte chvíli před posláním nové žádosti o voice práva"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Present real Jabber IDs to","Odhalovat skutečná Jabber ID"}.
|
||||
{"Previous","Předchozí"}.
|
||||
{"private, ","soukromá, "}.
|
||||
{"Public","Veřejný"}.
|
||||
{"Publish-Subscribe","Publish-Subscribe"}.
|
||||
{"PubSub subscriber request","Žádost odběratele PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Smazat všechny položky, pokud se příslušný poskytovatel odpojí"}.
|
||||
@@ -273,10 +304,13 @@
|
||||
{"RAM copy","Kopie RAM"}.
|
||||
{"Really delete message of the day?","Skutečně smazat zprávu dne?"}.
|
||||
{"Recipient is not in the conference room","Příjemce se nenachází v místnosti"}.
|
||||
{"Re-Enable User","Znovu povolit uživatele"}.
|
||||
{"Register on {{ site_name }}","Registrovat se na {{ site_name }}"}.
|
||||
{"Register","Zaregistrovat se"}.
|
||||
{"Remote copy","Vzdálená kopie"}.
|
||||
{"Remove User","Odstranit uživatele"}.
|
||||
{"Replaced by new connection","Nahrazeno novým spojením"}.
|
||||
{"Request has timed out","Časový limit požadavku vypršel"}.
|
||||
{"Resources","Zdroje"}.
|
||||
{"Restart Service","Restartovat službu"}.
|
||||
{"Restore Backup from File at ","Obnovit zálohu ze souboru na "}.
|
||||
@@ -284,6 +318,7 @@
|
||||
{"Restore binary backup immediately:","Okamžitě obnovit binární zálohu:"}.
|
||||
{"Restore plain text backup immediately:","Okamžitě obnovit zálohu z textového souboru:"}.
|
||||
{"Restore","Obnovit"}.
|
||||
{"Result","Výsledek"}.
|
||||
{"Roles for which Presence is Broadcasted","Role, pro které je zpráva o stavu šířena"}.
|
||||
{"Room Configuration","Nastavení místnosti"}.
|
||||
{"Room creation is denied by service policy","Pravidla služby nepovolují vytvořit místnost"}.
|
||||
@@ -293,49 +328,77 @@
|
||||
{"Roster groups allowed to subscribe","Skupiny kontaktů, které mohou odebírat"}.
|
||||
{"Roster size","Velikost seznamu kontaktů"}.
|
||||
{"Running Nodes","Běžící uzly"}.
|
||||
{"Sad person holding empty box","Smutný člověk držící prázdnou krabici"}.
|
||||
{"Saturday","Sobota"}.
|
||||
{"Scan invite code","Naskenovat kód pozvánky"}.
|
||||
{"Scan with mobile device","Skenovat pomocí mobilního zařízení"}.
|
||||
{"Search from the date","Hledat od data"}.
|
||||
{"Search Results for ","Výsledky hledání pro "}.
|
||||
{"Search the text","Hledat text"}.
|
||||
{"Search until the date","Hledat do data"}.
|
||||
{"Search users in ","Hledat uživatele v "}.
|
||||
{"Select","Vybrat"}.
|
||||
{"Send announcement to all online users on all hosts","Odeslat oznámení všem online uživatelům na všech hostitelích"}.
|
||||
{"Send announcement to all online users","Odeslat oznámení všem online uživatelům"}.
|
||||
{"Send announcement to all users on all hosts","Odeslat oznámení všem uživatelům na všech hostitelích"}.
|
||||
{"Send announcement to all users","Odeslat oznámení všem uživatelům"}.
|
||||
{"Send this invite to your device","Zaslat tuto pozvánku na Vaše zařízení"}.
|
||||
{"September",". září"}.
|
||||
{"Server:","Server:"}.
|
||||
{"Service list retrieval timed out","Časový limit pro načtení seznamu služeb vypršel"}.
|
||||
{"Set message of the day and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
|
||||
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne na všech hostitelích a odeslat ji online uživatelům"}.
|
||||
{"Shared Roster Groups","Skupiny pro sdílený seznam kontaktů"}.
|
||||
{"Show Integral Table","Zobrazit kompletní tabulku"}.
|
||||
{"Show Ordinary Table","Zobrazit běžnou tabulku"}.
|
||||
{"Shut Down Service","Vypnout službu"}.
|
||||
{"Sorry, it looks like this invite code has expired!","Je nám líto, ale zdá se, že platnost pozvánky vypršela!"}.
|
||||
{"Specify the access model","Uveďte přístupový model"}.
|
||||
{"Specify the event message type","Zvolte typ zpráv pro události"}.
|
||||
{"Specify the publisher model","Specifikovat model pro publikování"}.
|
||||
{"Step 1: Download and install {{ app_name }}","Krok 1: Stáhněte si a nainstalujte {{ app_name }}"}.
|
||||
{"Step 1: Install {{ app_name }}","Krok 1: Instalace {{ app_name }}"}.
|
||||
{"Step 2: Activate your account","Krok 2: Aktivujte svůj účet"}.
|
||||
{"Step 2: Connect {{ app_name }} to your new account","Step 2: Připojte se pomocí {{ app_name }} k Vašemu novému účtu"}.
|
||||
{"Stopped Nodes","Zastavené uzly"}.
|
||||
{"Store binary backup:","Uložit binární zálohu:"}.
|
||||
{"Store plain text backup:","Uložit zálohu do textového souboru:"}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> je součástí XMPP, bezpečné a decentralizované sítě pro zasílání zpráv. Abyste mohli začít chatovat pomocí aplikace <strong>{{ app_name }}</strong>, musíte se nejprve registrovat."}.
|
||||
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Tip:</strong> Tuto pozvánku můžete otevřít na svém mobilním zařízení naskenováním kódu fotoaparátem."}.
|
||||
{"Subject","Předmět"}.
|
||||
{"Submit","Odeslat"}.
|
||||
{"Submitted","Odeslané"}.
|
||||
{"Subscriber Address","Adresa odběratele"}.
|
||||
{"Subscriptions are not allowed","Předplatné není povoleno"}.
|
||||
{"Sunday","Neděle"}.
|
||||
{"That nickname is already in use by another occupant","Přezdívka je již používána jiným členem"}.
|
||||
{"That nickname is registered by another person","Přezdívka je zaregistrována jinou osobou"}.
|
||||
{"The account already exists","Účet již existuje"}.
|
||||
{"The account was not unregistered","Účet nebyl smazán"}.
|
||||
{"The CAPTCHA is valid.","CAPTCHA souhlasí."}.
|
||||
{"The CAPTCHA verification has failed","Ověření CAPTCHA se nezdařilo"}.
|
||||
{"The collections with which a node is affiliated","Kolekce, se kterými je uzel spřízněn"}.
|
||||
{"The datetime when the node was created","Datum a čas vytvoření uzlu"}.
|
||||
{"The default language of the node","Výchozí jazyk uzlu"}.
|
||||
{"The feature requested is not supported by the conference","Požadovaná vlastnost není podporována touto místností"}.
|
||||
{"The list of all online users","Seznam všech online uživatelů"}.
|
||||
{"The list of all users","Seznam všech uživatelů"}.
|
||||
{"The NodeID of the relevant node","NodeID příslušného uzlu"}.
|
||||
{"The number of subscribers to the node","Počet odběratelů uzlu"}.
|
||||
{"The number of unread or undelivered messages","Počet nepřečtených nebo nedoručených zpráv"}.
|
||||
{"The password contains unacceptable characters","Heslo obsahuje nepovolené znaky"}.
|
||||
{"The password is too weak","Heslo je příliš slabé"}.
|
||||
{"the password is","heslo je"}.
|
||||
{"The passwords are different","Hesla nejsou stejná"}.
|
||||
{"The query is only allowed from local users","Dotaz je povolen pouze pro místní uživatele"}.
|
||||
{"The query must not contain <item/> elements","Dotaz nesmí obsahovat elementy <item/>"}.
|
||||
{"The role","Role"}.
|
||||
{"The sender of the last received message","Odesílatel poslední doručené zprávy"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Stanza MUSÍ obsahovat pouze jeden element <active/>, jeden element <default/> nebo jeden element <list/>"}.
|
||||
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
|
||||
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě: "}.
|
||||
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
|
||||
{"This button works only if you have the app installed already!","Toto tlačítko funguje pouze v případě, že máte nainstalovanou vhodnou aplikaci!"}.
|
||||
{"This room is not anonymous","Tato místnost není anonymní"}.
|
||||
{"Thursday","Čtvrtek"}.
|
||||
{"Time delay","Časový posun"}.
|
||||
@@ -358,10 +421,12 @@
|
||||
{"Unsupported <index/> element","Nepodporovaný <index/> element"}.
|
||||
{"Update message of the day (don't send)","Aktualizovat zprávu dne (neodesílat)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Aktualizovat zprávu dne pro všechny hostitele (neodesílat)"}.
|
||||
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Naskenujte kód níže pomocí skeneru <em>QR kódů</em> na Vašem mobilním zařízení:"}.
|
||||
{"User already exists","Uživatel již existuje"}.
|
||||
{"User JID","Jabber ID uživatele"}.
|
||||
{"User (jid)","Uživatel (JID)"}.
|
||||
{"User Management","Správa uživatelů"}.
|
||||
{"User removed","Uživatel odstraněn"}.
|
||||
{"User session not found","Sezení uživatele nebylo nalezeno"}.
|
||||
{"User session terminated","Sezení uživatele bylo ukončeno"}.
|
||||
{"Username:","Uživatelské jméno:"}.
|
||||
@@ -384,13 +449,22 @@
|
||||
{"Wednesday","Středa"}.
|
||||
{"When to send the last published item","Kdy odeslat poslední publikovanou položku"}.
|
||||
{"Whether to allow subscriptions","Povolit odebírání"}.
|
||||
{"Wrong xmlns","Chybné xmlns"}.
|
||||
{"XMPP client for Haiku","XMPP klient pro Haiku"}.
|
||||
{"XMPP Domains","XMPP domény"}.
|
||||
{"You are being removed from the room because of a system shutdown","Budete vyloučeni z místnosti kvůli vypnutí systému"}.
|
||||
{"You are not allowed to send private messages","Nemáte povoleno posílat soukromé zprávy"}.
|
||||
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Tuto pozvánku můžete přenést do svého mobilního zařízení naskenováním kódu pomocí fotoaparátu."}.
|
||||
{"You have been banned from this room","Byl jste vyloučen z této místnosti"}.
|
||||
{"You have joined too many conferences","Vstoupil jste do příliš velkého množství místností"}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Byli jste pozváni do chatu s <strong>{{ inviter }}</strong> na serveru <strong>{{ site_name }}</strong>, který je součástí XMPP - bezpečné a decentralizované sítě pro zasílání zpráv."}.
|
||||
{"You have joined too many conferences","Vstoupili jste do příliš velkého množství místností"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Musíte vyplnit políčko \"Přezdívka\" ve formuláři"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Pro registraci potřebujete klienta s podporou x:data a CAPTCHA"}.
|
||||
{"You need a client that supports x:data to register the nickname","Pro registraci přezdívky potřebujete klienta s podporou x:data"}.
|
||||
{"You need an x:data capable client to search","K vyhledávání potřebujete klienta podporujícího x:data"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Vaše nastavení soukromí znemožnilo směrování této stance."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Fronta offline zpráv pro váš kontakt je plná. Zpráva byla zahozena."}.
|
||||
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","Vaše heslo je zašifrováno a uloženo na serveru a až zavřete tuto stránku, nebude již dostupné. Uložte si ho do bezpečí a nikdy ho s nikým nesdílejte."}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"}.
|
||||
{"Your XMPP account was successfully registered.","Váš účet XMPP byl úspěšně zaregistrován."}.
|
||||
{"You're not allowed to create nodes","Nemáte povoleno vytvářet uzly"}.
|
||||
|
||||
@@ -4,22 +4,34 @@
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (Fügen Sie * am Ende des Feldes hinzu um nach Teilzeichenketten zu suchen)"}.
|
||||
{"{{ app_name }} already installed?","{{ app_name }} bereits installiert?"}.
|
||||
{" has set the subject to: "," hat das Thema geändert auf: "}.
|
||||
{"{{ inviter }} has invited you to connect!","{{ inviter }} will sich mit dir verbinden!"}.
|
||||
{"# participants","# Teilnehmer"}.
|
||||
{"A description of the node","Eine Beschreibung des Knotens"}.
|
||||
{"A friendly name for the node","Ein benutzerfreundlicher Name für den Knoten"}.
|
||||
{"A fully-featured desktop chat client for Windows and Linux.","Ein funktionsreicher Desktop-Client für Windows und Linux."}.
|
||||
{"A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.","Ein schlanker Jabber/XMPP-Client für Android mit Fokus Benutzerfreundlichkeit und Sicherheit. Er funktioniert auch mit langsameren Android-Geräten mit Android 4.0 oder neuer."}.
|
||||
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Ein schlanker aber funktionsreicher XMPP-Client für iPhone und iPad. Ein einfacher Weg um mit Deinen Freunden zu kommunizieren und Erinnerungen zu teilen."}.
|
||||
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Ein moderner open-source Chatclient für iPhone und iPad mit einfacher und übersichtlicher Benutzeroberfläche."}.
|
||||
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Ein moderner open-source Chatclient für Mac mit einfacher und übersichtlicher Benutzeroberfläche."}.
|
||||
{"A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.","Ein moderner open-source Jabber/XMPP Chatclient für den Desktop mit Fokus auf Einfachheit und Zuverlässigkeit, aber auch Schutz deiner Privatsphäre."}.
|
||||
{"A password is required to enter this room","Ein Passwort ist erforderlich um diesen Raum zu betreten"}.
|
||||
{"A Web Page","Eine Webseite"}.
|
||||
{"Accept invite using {{ app_name }}","Einladung mittels {{ app_name }} annehmen"}.
|
||||
{"Accept","Akzeptieren"}.
|
||||
{"Access denied by service policy","Zugriff aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"Access model","Zugriffsmodell"}.
|
||||
{"Account doesn't exist","Konto existiert nicht"}.
|
||||
{"Action on user","Aktion auf Benutzer"}.
|
||||
{"Add a hat to a user","Funktion zu einem Benutzer hinzufügen"}.
|
||||
{"Add {{ inviter }} to your contact list","Füge {{ inviter }} zu deiner Kontaktliste hinzu"}.
|
||||
{"Add Contact","Kontakt hinzufügen"}.
|
||||
{"Add User","Benutzer hinzufügen"}.
|
||||
{"Administration of ","Administration von "}.
|
||||
{"Administration","Verwaltung"}.
|
||||
{"Administrator privileges required","Administratorrechte erforderlich"}.
|
||||
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Nach dem Drücken des Buttons wirst du nach {{ app_name }} umgeleitet um dort die Einrichtung deines neuen Kontos auf {{ site_name }} fertigzustellen."}.
|
||||
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Nachdem du {{ app_name }} erfolgreich installiert hast, komme zu dieser Seite zurück und <strong>fahre mit Schritt 2 fort</strong>!"}.
|
||||
{"All activity","Alle Aktivitäten"}.
|
||||
{"All Users","Alle Benutzer"}.
|
||||
{"Allow subscription","Abonnement erlauben"}.
|
||||
@@ -46,7 +58,12 @@
|
||||
{"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"}.
|
||||
{"Anyone with Voice","Jeder mit Stimme"}.
|
||||
{"Anyone","Jeder"}.
|
||||
{"API Commands","API Befehle"}.
|
||||
{"Apple Store Logo","Apple Store Logo"}.
|
||||
{"April","April"}.
|
||||
{"Arguments","Argumente"}.
|
||||
{"As a final reminder, your account details are shown below:","Zur Erinnerung hier nochmal deine Kontodetails:"}.
|
||||
{"Assign a hat to a user","Hut zu einem Benutzer hinzufügen"}.
|
||||
{"Attribute 'channel' is required for this request","Attribut 'channel' ist für diese Anforderung erforderlich"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","Attribut 'id' ist verpflichtend für MIX-Nachrichten"}.
|
||||
{"Attribute 'jid' is not allowed here","Attribut 'jid' ist hier nicht erlaubt"}.
|
||||
@@ -59,6 +76,9 @@
|
||||
{"Backup to File at ","Backup in Datei bei "}.
|
||||
{"Backup","Backup"}.
|
||||
{"Bad format","Ungültiges Format"}.
|
||||
{"BAD REQUEST","UNGÜLTIGE ANFRAGE"}.
|
||||
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM von Tigase Inc. ist eine schlanker aber funktionsreicher XMPP-Client für macOS."}.
|
||||
{"Beagle IM Logo","Beagle IM Logo"}.
|
||||
{"Birthday","Geburtsdatum"}.
|
||||
{"Both the username and the resource are required","Sowohl der Benutzername als auch die Ressource sind erforderlich"}.
|
||||
{"Bytestream already activated","Bytestream bereits aktiviert"}.
|
||||
@@ -75,6 +95,7 @@
|
||||
{"Channel JID","Kanal-JID"}.
|
||||
{"Channels","Kanäle"}.
|
||||
{"Characters not allowed:","Nicht erlaubte Zeichen:"}.
|
||||
{"Chat address (JID)","Chat-Adresse (JID)"}.
|
||||
{"Chatroom configuration modified","Chatraum-Konfiguration geändert"}.
|
||||
{"Chatroom is created","Chatraum ist erstellt"}.
|
||||
{"Chatroom is destroyed","Chatraum ist entfernt"}.
|
||||
@@ -82,16 +103,29 @@
|
||||
{"Chatroom is stopped","Chatraum ist beendet"}.
|
||||
{"Chatrooms","Chaträume"}.
|
||||
{"Choose a username and password to register with this server","Wählen Sie zum Registrieren auf diesem Server einen Benutzernamen und ein Passwort"}.
|
||||
{"Choose a username, this will become the first part of your new chat address.","Wähle eine Benutzernamen! Dies wird zum ersten Teil deiner neuen Chat-Adresse."}.
|
||||
{"Choose storage type of tables","Wähle Speichertyp der Tabellen"}.
|
||||
{"Choose whether to approve this entity's subscription.","Wählen Sie, ob das Abonnement dieser Entität genehmigt werden soll."}.
|
||||
{"City","Stadt"}.
|
||||
{"Click the button to open the Dino website where you can download and install it on your PC.","Klicke auf den Button um Dino's Webseite zu öffnen, wo du ihn für deinen PC herunterladen und installieren kannst."}.
|
||||
{"Client acknowledged more stanzas than sent by server","Client bestätigte mehr Stanzas als vom Server gesendet"}.
|
||||
{"Close","Schließen"}.
|
||||
{"Clustering","Clustering"}.
|
||||
{"Commands","Befehle"}.
|
||||
{"Conference room does not exist","Konferenzraum existiert nicht"}.
|
||||
{"Configuration of room ~s","Konfiguration des Raumes ~s"}.
|
||||
{"Configuration","Konfiguration"}.
|
||||
{"Congratulations!","Gratuliere!"}.
|
||||
{"Contact Addresses (normally, room owner or owners)","Kontaktadresse (normalerweise Raumbesitzer)"}.
|
||||
{"Contacts","Kontakte"}.
|
||||
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations ist ein Jabber/XMPP-Client für Android 6.0+, der für mobile Endgeräte optimiert wurde."}.
|
||||
{"Conversations Logo","Conversations Logo"}.
|
||||
{"Country","Land"}.
|
||||
{"Create a Hat","Einen Hut erstellen"}.
|
||||
{"Create Account","Konto anlegen"}.
|
||||
{"Create an account","Konto anlegen"}.
|
||||
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Ein Konto erlaubt es dir mit anderen Leuten auf <strong>{{ site_name }}</strong> und anderen Diensten des XMPP-Netwerkes zu kommunizieren."}.
|
||||
{"Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Ein Konto erlaubt es dir mit <strong>{{ inviter }}</strong> und anderen Leuten auf <strong>{{ site_name }}</strong> und anderen Diensten des XMPP-Netwerkes zu kommunizieren."}.
|
||||
{"Current Discussion Topic","Aktuelles Diskussionsthema"}.
|
||||
{"Database failure","Datenbankfehler"}.
|
||||
{"Database Tables Configuration at ","Datenbanktabellen-Konfiguration bei "}.
|
||||
@@ -103,8 +137,16 @@
|
||||
{"Delete User","Benutzer löschen"}.
|
||||
{"Deliver event notifications","Ereignisbenachrichtigungen zustellen"}.
|
||||
{"Deliver payloads with event notifications","Nutzdaten mit Ereignisbenachrichtigungen zustellen"}.
|
||||
{"Destroy a Hat","Einen Hut zerstören"}.
|
||||
{"Dino Logo","Dino Logo"}.
|
||||
{"Disable User","Benutzer deaktivieren"}.
|
||||
{"Disc only copy","Nur auf Festplatte"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Geben Sie niemandem Ihr Passwort, auch nicht den Administratoren des XMPP-Servers."}.
|
||||
{"Download and install {{ app_name }} below:","Herunterladen und Installieren von {{ app_name }}:"}.
|
||||
{"Download Dino for Linux","Dino für Linux herunterladen"}.
|
||||
{"Download from Mac App Store","Vom Mac App Store herunterladen"}.
|
||||
{"Download Gajim","Gajim herunterladen"}.
|
||||
{"Download Renga for Haiku","Renga für Haiku herunterladen"}.
|
||||
{"Dump Backup to Text File at ","Gib Backup in Textdatei aus bei "}.
|
||||
{"Dump to Text File","Ausgabe in Textdatei"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","Doppelte Gruppen sind laut RFC6121 nicht erlaubt"}.
|
||||
@@ -121,11 +163,12 @@
|
||||
{"ejabberd","ejabberd"}.
|
||||
{"Email Address","E-Mail-Adresse"}.
|
||||
{"Email","E-Mail"}.
|
||||
{"Enable hats","Funktion einschalten"}.
|
||||
{"Enable hats","Hüte Funktion einschalten"}.
|
||||
{"Enable logging","Protokollierung aktivieren"}.
|
||||
{"Enable message archiving","Nachrichtenarchivierung aktivieren"}.
|
||||
{"Enabling push without 'node' attribute is not supported","push ohne 'node'-Attribut zu aktivieren wird nicht unterstützt"}.
|
||||
{"End User Session","Benutzersitzung beenden"}.
|
||||
{"Enter a secure password that you do not use anywhere else.","Gib bitte ein sicheres Passwort ein, das du nirgends sonst verwendest!"}.
|
||||
{"Enter nickname you want to register","Geben Sie den Spitznamen ein den Sie registrieren wollen"}.
|
||||
{"Enter path to backup file","Geben Sie den Pfad zur Backupdatei ein"}.
|
||||
{"Enter path to jabberd14 spool dir","Geben Sie den Pfad zum jabberd14-Spoolverzeichnis ein"}.
|
||||
@@ -146,6 +189,7 @@
|
||||
{"Failed to process option '~s'","Konnte Option '~s' nicht verarbeiten"}.
|
||||
{"Family Name","Nachname"}.
|
||||
{"FAQ Entry","FAQ-Eintrag"}.
|
||||
{"F-Droid Store Logo","F-Droid Store Logo"}.
|
||||
{"February","Februar"}.
|
||||
{"File larger than ~w bytes","Datei größer als ~w Bytes"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Füllen Sie das Formular aus, um nach jeglichen passenden XMPP-Benutzern zu suchen"}.
|
||||
@@ -154,26 +198,44 @@
|
||||
{"Full List of Room Admins","Vollständige Liste der Raumadmins"}.
|
||||
{"Full List of Room Owners","Vollständige Liste der Raumbesitzer"}.
|
||||
{"Full Name","Vollständiger Name"}.
|
||||
{"Gajim Logo","Gajim Logo"}.
|
||||
{"Get List of Active Users","Liste der aktiven Benutzer abrufen"}.
|
||||
{"Get List of Disabled Users","Liste der deaktivierten Benutzer abrufen"}.
|
||||
{"Get List of Idle Users","Liste der inaktiven Benutzer abrufen"}.
|
||||
{"Get List of Online Users","Liste der angemeldeten Benutzer abrufen"}.
|
||||
{"Get List of Registered Users","Liste der registrierten Benutzer abrufen"}.
|
||||
{"Get Number of Active Users","Anzahl der aktiven Benutzer abrufen"}.
|
||||
{"Get Number of Disabled Users","Anzahl der deaktivierten Benutzer abrufen"}.
|
||||
{"Get Number of Idle Users","Anzahl der inaktiven Benutzer abrufen"}.
|
||||
{"Get Number of Online Users","Anzahl der angemeldeten Benutzer abrufen"}.
|
||||
{"Get Number of Registered Users","Anzahl der registrierten Benutzer abrufen"}.
|
||||
{"Get Pending","Ausstehende abrufen"}.
|
||||
{"Get started","Leg los!"}.
|
||||
{"Get User Last Login Time","letzte Anmeldezeit des Benutzers abrufen"}.
|
||||
{"Get User Roster","Kontaktliste abrufen"}.
|
||||
{"Get User Statistics","Benutzerstatistiken abrufen"}.
|
||||
{"Given Name","Vorname"}.
|
||||
{"Google Play Store Logo","Google Play Store Logo"}.
|
||||
{"Grant voice to this person?","Dieser Person Sprachrechte erteilen?"}.
|
||||
{"has been banned","wurde gebannt"}.
|
||||
{"has been kicked because of a system shutdown","wurde wegen einer Systemabschaltung hinausgeworfen"}.
|
||||
{"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}.
|
||||
{"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}.
|
||||
{"has been kicked","wurde hinausgeworfen"}.
|
||||
{"Hat title","Funktionstitel"}.
|
||||
{"Hat URI","Funktions-URI"}.
|
||||
{"Hats limit exceeded","Funktionslimit wurde überschritten"}.
|
||||
{"Hash computed from the list of hats available in a room","Hash wurde von der Liste der Hüte im Raum berechnet"}.
|
||||
{"Hash of the vCard-temp avatar of this room","Hash des vCard-temp Avatars dieses Raums"}.
|
||||
{"Hat hue","Hutfarbe"}.
|
||||
{"Hat title","Huttitle"}.
|
||||
{"Hat URI","Hüte Funktions-URI"}.
|
||||
{"Hats limit exceeded","Hütelimit wurde überschritten"}.
|
||||
{"Hide","Verbergen"}.
|
||||
{"Hint","Hinweis"}.
|
||||
{"Host unknown","Host unbekannt"}.
|
||||
{"Hostname invalid","Hostname unbekannt"}.
|
||||
{"HTTP File Upload","HTTP-Dateiupload"}.
|
||||
{"Idle connection","Inaktive Verbindung"}.
|
||||
{"If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:","Solltest du {{ app_name }} bereits installiert haben, empfehlen wir dir die Einrichtung des Kontos mittels dieser App durchzuführen indem du auf den Button unten klickst:"}.
|
||||
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Solltest du noch keinen XMPP-Client installiert haben, haben wir hier eine Liste geeigneter Clients für deine Platform."}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Wenn Sie das CAPTCHA-Bild nicht sehen, besuchen Sie die Webseite."}.
|
||||
{"Import Directory","Verzeichnis importieren"}.
|
||||
{"Import File","Datei importieren"}.
|
||||
@@ -192,6 +254,7 @@
|
||||
{"Incorrect value of 'action' in data form","Falscher Wert von 'action' in Datenformular"}.
|
||||
{"Incorrect value of 'path' in data form","Falscher Wert von 'path' in Datenformular"}.
|
||||
{"Installed Modules:","Installierte Module:"}.
|
||||
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","Fertig mit der Installation? Prima! <strong>Drück auf den Button unten</strong> um deine Einaldung anzunehmen und mit der Einrichtung deines Kontos fortzufahren:"}.
|
||||
{"Install","Installieren"}.
|
||||
{"Insufficient privilege","Unzureichende Privilegien"}.
|
||||
{"Internal server error","Interner Serverfehler"}.
|
||||
@@ -199,6 +262,11 @@
|
||||
{"Invalid node name","Ungültiger Knotenname"}.
|
||||
{"Invalid 'previd' value","Ungültiger 'previd'-Wert"}.
|
||||
{"Invitations are not allowed in this conference","Einladungen sind in dieser Konferenz nicht erlaubt"}.
|
||||
{"Invite expired","Die Einladung ist abgelaufen"}.
|
||||
{"Invite Expired","Die Einladung ist abgelaufen"}.
|
||||
{"Invite to {{ site_name }}","Einladung für {{ site_name }}"}.
|
||||
{"Invite User","Person einladen"}.
|
||||
{"Invite","Einladung"}.
|
||||
{"IP addresses","IP-Adressen"}.
|
||||
{"is now known as","ist nun bekannt als"}.
|
||||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Es ist nicht erlaubt Fehlermeldungen an den Raum zu senden. Der Teilnehmer (~s) hat eine Fehlermeldung (~s) gesendet und wurde aus dem Raum geworfen"}.
|
||||
@@ -208,6 +276,7 @@
|
||||
{"January","Januar"}.
|
||||
{"JID normalization denied by service policy","JID-Normalisierung aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"JID normalization failed","JID-Normalisierung fehlgeschlagen"}.
|
||||
{"Join {{ site_name }} with {{ app_name }}","Konto auf {{ site_name }} mittels {{ app_name }} anlegen"}.
|
||||
{"Joined MIX channels of ~ts","Beigetretene MIX-Channels von ~ts"}.
|
||||
{"Joined MIX channels:","Beigetretene MIX-Channels:"}.
|
||||
{"joins the room","betritt den Raum"}.
|
||||
@@ -219,10 +288,13 @@
|
||||
{"Last message","Letzte Nachricht"}.
|
||||
{"Last month","Letzter Monat"}.
|
||||
{"Last year","Letztes Jahr"}.
|
||||
{"Launch {{ app_name }} and sign in using your account credentials.","Starte {{ app_name }} und logge dich mit deinen Anmeldedaten ein."}.
|
||||
{"Launch Beagle IM, and select \\'Yes\\' to add a new account. Click the \\'+\\' button under the empty account list and then enter your credentials.","Starte Beagle IM und wähle \\'Yes\\' um ein neues Konto hinzuzufügen. Drücke auf das \\'+\\' unter der leeren Account-Liste und gib dann deine Anmeldedaten ein."}.
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Niederwertigstes Bit des SHA-256-Hashes des Textes sollte hexadezimalem Label gleichen"}.
|
||||
{"leaves the room","verlässt den Raum"}.
|
||||
{"List of users with hats","Liste der Benutzer mit Funktionen"}.
|
||||
{"List of Hats","Liste aller Hüte"}.
|
||||
{"List users with hats","Benutzer mit Funktionen auflisten"}.
|
||||
{"Log in via web","Via Web anmelden"}.
|
||||
{"Logged Out","Abgemeldet"}.
|
||||
{"Logging","Protokollierung"}.
|
||||
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
|
||||
@@ -239,9 +311,11 @@
|
||||
{"Max payload size in bytes","Maximale Nutzdatengröße in Bytes"}.
|
||||
{"Maximum file size","Maximale Dateigröße"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Maximale Anzahl der vom Raum zurückgegebenen History-Nachrichten"}.
|
||||
{"Maximum number of invites reached","Maximale Anzahl all Einladungen erreicht"}.
|
||||
{"Maximum number of items to persist","Maximale Anzahl persistenter Items"}.
|
||||
{"Maximum Number of Occupants","Maximale Anzahl der Teilnehmer"}.
|
||||
{"May","Mai"}.
|
||||
{"Members are allowed to invite others","Mitglieder dürfen andere einladen"}.
|
||||
{"Membership is required to enter this room","Mitgliedschaft ist erforderlich um diesen Raum zu betreten"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Merken Sie sich Ihr Passwort, oder schreiben Sie es auf einen Zettel den Sie sicher verwahren. Bei XMPP gibt es keine automatische Möglichkeit, das Passwort wiederherzustellen falls Sie es vergessen."}.
|
||||
{"Mere Availability in XMPP (No Show Value)","Bloße Verfügbarkeit in XMPP (kein Anzeigewert)"}.
|
||||
@@ -256,6 +330,7 @@
|
||||
{"Moderator","Moderator"}.
|
||||
{"Moderators Only","nur Moderatoren"}.
|
||||
{"Module failed to handle the query","Modul konnte die Anfrage nicht verarbeiten"}.
|
||||
{"Monal Logo","Monal Logo"}.
|
||||
{"Monday","Montag"}.
|
||||
{"Multicast","Multicast"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","Mehrere <item/>-Elemente sind laut RFC6121 nicht erlaubt"}.
|
||||
@@ -310,18 +385,21 @@
|
||||
{"None","Keine"}.
|
||||
{"Not allowed","Nicht erlaubt"}.
|
||||
{"Not Found","Nicht gefunden"}.
|
||||
{"NOT FOUND","NICHT GEFUNDEN"}.
|
||||
{"Not subscribed","Nicht abonniert"}.
|
||||
{"Notify subscribers when items are removed from the node","Abonnenten benachrichtigen, wenn Items vom Knoten entfernt werden"}.
|
||||
{"Notify subscribers when the node configuration changes","Abonnenten benachrichtigen, wenn sich die Knotenkonfiguration ändert"}.
|
||||
{"Notify subscribers when the node is deleted","Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"}.
|
||||
{"November","November"}.
|
||||
{"Number of active users","Anzahl der aktiven Benutzer"}.
|
||||
{"Number of answers required","Anzahl der erforderlichen Antworten"}.
|
||||
{"Number of disabled users","Anzahl der deaktivierten Benutzer"}.
|
||||
{"Number of idle users","Anzahl der inaktiven Benutzer"}.
|
||||
{"Number of occupants","Anzahl der Teilnehmer"}.
|
||||
{"Number of Offline Messages","Anzahl der Offline-Nachrichten"}.
|
||||
{"Number of online users","Anzahl der angemeldeten Benutzer"}.
|
||||
{"Number of registered users","Anzahl der registrierten Benutzer"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Anzahl der Sekunden, nach denen Elemente automatisch gelöscht werden sollen, oder `max`, wenn es keine spezifische Grenze gibt, außer einer vom Server festgelegten Höchstgrenze"}.
|
||||
{"Occupants are allowed to invite others","Teilnehmer dürfen andere einladen"}.
|
||||
{"Occupants are allowed to query others","Teilnehmer dürfen andere abfragen"}.
|
||||
{"Occupants May Change the Subject","Teilnehmer dürfen das Thema ändern"}.
|
||||
{"October","Oktober"}.
|
||||
@@ -344,12 +422,15 @@
|
||||
{"Only service administrators are allowed to send service messages","Nur Service-Administratoren dürfen Servicenachrichten senden"}.
|
||||
{"Only those on a whitelist may associate leaf nodes with the collection","Nur jemand auf einer Whitelist darf Blattknoten mit der Sammlung verknüpfen"}.
|
||||
{"Only those on a whitelist may subscribe and retrieve items","Nur jemand auf einer Whitelist darf Items abonnieren und abrufen"}.
|
||||
{"Open the app","App öffnen"}.
|
||||
{"Organization Name","Name der Organisation"}.
|
||||
{"Organization Unit","Abteilung"}.
|
||||
{"Other Modules Available:","Andere Module verfügbar:"}.
|
||||
{"Other software","Andere Software"}.
|
||||
{"Outgoing s2s Connections","Ausgehende s2s-Verbindungen"}.
|
||||
{"Owner privileges required","Besitzerrechte erforderlich"}.
|
||||
{"Packet relay is denied by service policy","Paket-Relay aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"Page navigation","Seiten-Navigation"}.
|
||||
{"Participant ID","Teilnehmer-ID"}.
|
||||
{"Participant","Teilnehmer"}.
|
||||
{"Password Verification","Passwort bestätigen"}.
|
||||
@@ -358,12 +439,15 @@
|
||||
{"Password:","Passwort:"}.
|
||||
{"Path to Dir","Pfad zum Verzeichnis"}.
|
||||
{"Path to File","Pfad zur Datei"}.
|
||||
{"Payload semantic type information","Semantische Typinformation des Payloads"}.
|
||||
{"Period: ","Zeitraum: "}.
|
||||
{"Persist items to storage","Items dauerhaft speichern"}.
|
||||
{"Persistent","Persistent"}.
|
||||
{"Ping query is incorrect","Ping-Anfrage ist falsch"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Beachten Sie, dass diese Optionen nur die eingebaute Mnesia-Datenbank sichern. Wenn Sie das ODBC-Modul verwenden, müssen Sie auch Ihre SQL-Datenbank separat sichern."}.
|
||||
{"Please provide a password! Minimum length: {{ password_min_length }}","Bitte gibt ein Passwort ein! Mindestens {{ password_min_length }} Zeichen."}.
|
||||
{"Please provide a valid username!","Bitte gib einen gültigen Benutzernamen ein!"}.
|
||||
{"Please, wait for a while before sending new voice request","Bitte warten Sie ein wenig, bevor Sie eine weitere Sprachrecht-Anforderung senden"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Possessing 'ask' attribute is not allowed by RFC6121","Ein 'ask'-Attribut zu besitzen ist laut RFC6121 nicht erlaubt"}.
|
||||
@@ -373,6 +457,7 @@
|
||||
{"Previous session PID has exited","Vorherige Sitzungs-PID wurde beendet"}.
|
||||
{"Previous session PID is dead","Vorherige Sitzungs-PID ist tot"}.
|
||||
{"Previous session timed out","Zeitüberschreitung bei vorheriger Sitzung"}.
|
||||
{"Previous","Zurück"}.
|
||||
{"private, ","privat, "}.
|
||||
{"Public","Öffentlich"}.
|
||||
{"Publish model","Veröffentlichungsmodell"}.
|
||||
@@ -390,11 +475,18 @@
|
||||
{"Receive notification of new items only","Benachrichtigung nur von neuen Items erhalten"}.
|
||||
{"Receive notification of new nodes only","Benachrichtigung nur von neuen Knoten erhalten"}.
|
||||
{"Recipient is not in the conference room","Empfänger ist nicht im Konferenzraum"}.
|
||||
{"Re-Enable User","Benutzer wieder aktivieren"}.
|
||||
{"Register an XMPP account","Ein XMPP-Konto registrieren"}.
|
||||
{"Register on {{ site_name }}","Registriere dich auf {{ site_name }}"}.
|
||||
{"Register","Anmelden"}.
|
||||
{"Registration error","Fehler beim registrieren"}.
|
||||
{"Registration Error","Fehler beim Registrieren"}.
|
||||
{"Registration Form","Registrierungsformular"}.
|
||||
{"Registration Success","Registrierung erfolgreich"}.
|
||||
{"Remote copy","Fernkopie"}.
|
||||
{"Remove a hat from a user","Eine Funktion bei einem Benutzer entfernen"}.
|
||||
{"Remove User","Benutzer löschen"}.
|
||||
{"Renga Logo","Renga Logo"}.
|
||||
{"Replaced by new connection","Durch neue Verbindung ersetzt"}.
|
||||
{"Request has timed out","Zeitüberschreitung bei Anforderung"}.
|
||||
{"Request is ignored","Anforderung wird ignoriert"}.
|
||||
@@ -406,6 +498,7 @@
|
||||
{"Restore binary backup immediately:","Stelle binäres Backup sofort wieder her:"}.
|
||||
{"Restore plain text backup immediately:","Stelle Klartext-Backup sofort wieder her:"}.
|
||||
{"Restore","Wiederherstellung"}.
|
||||
{"Result","Ergebnis"}.
|
||||
{"Roles and Affiliations that May Retrieve Member List","Rollen und Zugehörigkeiten die Mitgliederliste abrufen dürfen"}.
|
||||
{"Roles for which Presence is Broadcasted","Rollen für welche die Präsenz übertragen wird"}.
|
||||
{"Roles that May Send Private Messages","Rollen die Privatnachrichten senden dürfen"}.
|
||||
@@ -419,16 +512,21 @@
|
||||
{"Roster size","Kontaktlistengröße"}.
|
||||
{"Running Nodes","Laufende Knoten"}.
|
||||
{"~s invites you to the room ~s","~s lädt Sie in den Raum ~s ein"}.
|
||||
{"Sad person holding empty box","Eine traurige Person mit einer leeren Schachtel"}.
|
||||
{"Saturday","Samstag"}.
|
||||
{"Scan invite code","Einladungscode einscannen"}.
|
||||
{"Scan with mobile device","Mit Mobilgerät einscannen"}.
|
||||
{"Search from the date","Suche ab Datum"}.
|
||||
{"Search Results for ","Suchergebnisse für "}.
|
||||
{"Search the text","Text durchsuchen"}.
|
||||
{"Search until the date","Suche bis Datum"}.
|
||||
{"Search users in ","Suche Benutzer in "}.
|
||||
{"Select","Auswählen"}.
|
||||
{"Send announcement to all online users on all hosts","Ankündigung an alle angemeldeten Benutzer auf allen Hosts senden"}.
|
||||
{"Send announcement to all online users","Ankündigung an alle angemeldeten Benutzer senden"}.
|
||||
{"Send announcement to all users on all hosts","Ankündigung an alle Benutzer auf allen Hosts senden"}.
|
||||
{"Send announcement to all users","Ankündigung an alle Benutzer senden"}.
|
||||
{"Send this invite to your device","Sende diese Einladung auf dein Gerät"}.
|
||||
{"September","September"}.
|
||||
{"Server:","Server:"}.
|
||||
{"Service list retrieval timed out","Zeitüberschreitung bei Abfrage der Serviceliste"}.
|
||||
@@ -437,10 +535,16 @@
|
||||
{"Set message of the day on all hosts and send to online users","Nachricht des Tages auf allen Hosts setzen und an alle angemeldeten Benutzer senden"}.
|
||||
{"Shared Roster Groups","Gruppen der gemeinsamen Kontaktliste"}.
|
||||
{"Show Integral Table","Integral-Tabelle anzeigen"}.
|
||||
{"Show Occupants Join/Leave","Betreten und Verlassen von Teilnehmern anzeigen"}.
|
||||
{"Show Ordinary Table","Gewöhnliche Tabelle anzeigen"}.
|
||||
{"Show","Anzeigen"}.
|
||||
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">view all apps.</a>","Wir zeigen dir nur Apps für <span class='platform-name'>deine aktuelle Platform</span> an. Du kannst dir gerne auch <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">sämtliche Apps anzeigen lassen</a>."}.
|
||||
{"Shut Down Service","Dienst herunterfahren"}.
|
||||
{"Siskin IM Logo","Siskin IM Logo"}.
|
||||
{"SOCKS5 Bytestreams","SOCKS5-Bytestreams"}.
|
||||
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Einige XMPP-Clients speichern Ihr Passwort auf dem Computer. Aus Sicherheitsgründen sollten Sie das nur auf Ihrem persönlichen Computer tun."}.
|
||||
{"Sorry, it looks like this invite code has expired!","Entschuldigung, es sieht so aus als wäre diese Einladung abgelaufen!"}.
|
||||
{"Sorry, there was a problem registering your account.","Es trat leider ein Fehler beim Erstellen des Kontos auf."}.
|
||||
{"Sources Specs:","Quellenspezifikationen:"}.
|
||||
{"Specify the access model","Geben Sie das Zugangsmodell an"}.
|
||||
{"Specify the event message type","Geben Sie den Ereignisnachrichtentyp an"}.
|
||||
@@ -448,12 +552,21 @@
|
||||
{"Stanza id is not valid","Stanza-ID ist ungültig"}.
|
||||
{"Stanza ID","Stanza-ID"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Ein 'replyto' des/der Nodebesitzer(s) statisch angeben"}.
|
||||
{"Step 1: Download and install {{ app_name }}","Schritt 1: {{ app_name }} herunterladen und installieren"}.
|
||||
{"Step 1: Install {{ app_name }}","Schritt 1: Installiere {{ app_name }}"}.
|
||||
{"Step 2: Activate your account","Schritt 2: Konto aktivieren"}.
|
||||
{"Step 2: Connect {{ app_name }} to your new account","Schritt 2: Verbinde {{ app_name }} mit deinem neuen Konto"}.
|
||||
{"Stopped Nodes","Angehaltene Knoten"}.
|
||||
{"Store binary backup:","Speichere binäres Backup:"}.
|
||||
{"Store plain text backup:","Speichere Klartext-Backup:"}.
|
||||
{"Stream management is already enabled","Stream-Verwaltung ist bereits aktiviert"}.
|
||||
{"Stream management is not enabled","Stream-Verwaltung ist nicht aktiviert"}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> ist Teil von XMPP, ein sicheres und dezentrales Sofortnachrichten-Netzwerk. Um mittels <strong>{{ app_name }}</strong> chatten zu können musst du zunächst ein Konto anlegen."}.
|
||||
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.","<strong>{{ site_name }}</strong> is Teil von XMPP, ein sicheres und dezentrales Sofortnachrichten-Netzwerk. Um chatten zu können musst du zunächst ein Konto anlegen."}.
|
||||
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>Du hast keine passende Software zur Hand im Moment?</strong> Du kannst dich auch mit unserem online Webchat anmelden!"}.
|
||||
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Tipp:</strong> du kannst diese Einladung auf deinem mobilen Endgerät öffnen indem du einen Barcode mit deiner Kamera scannst."}.
|
||||
{"Subject","Betreff"}.
|
||||
{"Submit","Senden"}.
|
||||
{"Submitted","Gesendet"}.
|
||||
{"Subscriber Address","Abonnenten-Adresse"}.
|
||||
{"Subscribers may publish","Abonnenten dürfen veröffentlichen"}.
|
||||
@@ -482,6 +595,9 @@
|
||||
{"The JIDs of those to contact with questions","Die JIDs jener, die bei Fragen zu kontaktieren sind"}.
|
||||
{"The JIDs of those with an affiliation of owner","Die JIDs jener mit einer Zugehörigkeit von Besitzer"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Die JIDs jener mit einer Zugehörigkeit von Veröffentlicher"}.
|
||||
{"The list of all active users","Die Liste aller aktiven Benutzer"}.
|
||||
{"The list of all disabled users","Die Liste aller deaktivierten Benutzer"}.
|
||||
{"The list of all idle users","Die Liste aller inaktiven Benutzer"}.
|
||||
{"The list of all online users","Die Liste aller angemeldeter Benutzer"}.
|
||||
{"The list of all users","Die Liste aller Benutzer"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","Die Liste der JIDs die Blattknoten mit einer Sammlung verknüpfen dürfen"}.
|
||||
@@ -503,15 +619,20 @@
|
||||
{"The presence states for which an entity wants to receive notifications","Die Präsenzzustände für welche eine Entität Benachrichtigungen erhalten will"}.
|
||||
{"The query is only allowed from local users","Die Anfrage ist nur von lokalen Benutzern erlaubt"}.
|
||||
{"The query must not contain <item/> elements","Die Anfrage darf keine <item/>-Elemente enthalten"}.
|
||||
{"The role","Die Rolle"}.
|
||||
{"The room subject can be modified by participants","Das Raum-Thema kann von Teilnehmern geändert werden"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Die Art der Knotendaten, üblicherweise durch den Namespace der Nutzdaten angegeben (falls vorhanden)"}.
|
||||
{"The sender of the last received message","Der Absender der letzten erhaltenen Nachricht"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Das Stanza darf nur ein <active/>-Element, ein <default/>-Element oder ein <list/>-Element enthalten"}.
|
||||
{"The subscription identifier associated with the subscription request","Die mit der Abonnement-Anforderung verknüpfte Abonnement-Bezeichnung"}.
|
||||
{"The token provided is either invalid or expired.","Der Einladungscode ist entweder ungültig oder abgelaufen."}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Die URL einer XSL-Transformation welche auf Nutzdaten angewendet werden kann, um ein geeignetes Nachrichtenkörper-Element zu generieren."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Die URL einer XSL-Transformation welche auf das Nutzdaten-Format angewendet werden kann, um ein gültiges Data Forms-Ergebnis zu generieren das der Client mit Hilfe einer generischen Data Forms-Rendering-Engine anzeigen könnte"}.
|
||||
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passwortes auf: "}.
|
||||
{"There was an error creating the account: ","Es trat ein Fehler beim Erstellen des Kontos auf: "}.
|
||||
{"There was an error deleting the account: ","Es trat ein Fehler beim Löschen des Kontos auf: "}.
|
||||
{"This button works only if you have the app installed already!","Dieser Button funktioniert nur, wenn du die App bereits installiert hast!"}.
|
||||
{"This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!","Dies ist eine Kontakt-Einladung von <strong>{{ inviter }}</strong> um miteinander über XMPP zu chatten. Solltest du bereits einen XMPP-Client haben, so drücke einfach auf den Button hier unten!"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Dies ist schreibungsunabhängig: macbeth ist gleich MacBeth und Macbeth."}.
|
||||
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Diese Seite erlaubt das Anlegen eines XMPP-Kontos auf diesem XMPP-Server. Ihre JID (Jabber-ID) wird diese Form aufweisen: benutzername@server. Bitte lesen Sie die Anweisungen genau durch, um die Felder korrekt auszufüllen."}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","Diese Seite erlaubt es, ein XMPP-Konto von diesem XMPP-Server zu entfernen."}.
|
||||
@@ -520,7 +641,9 @@
|
||||
{"Thursday","Donnerstag"}.
|
||||
{"Time delay","Zeitverzögerung"}.
|
||||
{"Timed out waiting for stream resumption","Zeitüberschreitung beim Warten auf Streamfortsetzung"}.
|
||||
{"To get started, you need to install an app for your platform:","Um loszulegen musst du eine App für deine Platform installieren:"}.
|
||||
{"To register, visit ~s","Um sich zu registrieren, besuchen Sie ~s"}.
|
||||
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","Um mit dem Chatten zu beginnen, musst du deine neuen Anmeldedaten in der XMPP Software deiner Wahl eintragen."}.
|
||||
{"To ~ts","An ~ts"}.
|
||||
{"Token TTL","Token-TTL"}.
|
||||
{"Too many active bytestreams","Zu viele aktive Bytestreams"}.
|
||||
@@ -550,17 +673,23 @@
|
||||
{"Update message of the day on all hosts (don't send)","Aktualisiere Nachricht des Tages auf allen Hosts (nicht senden)"}.
|
||||
{"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."}.
|
||||
{"Update Specs","Spezifikationen aktualisieren"}.
|
||||
{"Updating the vCard is not supported by the vCard storage backend","Aktualisierung der vCard wird vom vCard-Speicher-Backend nicht unterstützt"}.
|
||||
{"Upgrade","Upgrade"}.
|
||||
{"URL for Archived Discussion Logs","URL für archivierte Diskussionsprotokolle"}.
|
||||
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Benutze einen <em>QR-Code</em> Scanner auf deinem mobilen Endgerät um den Code hier unten zu scannen:"}.
|
||||
{"User already exists","Benutzer existiert bereits"}.
|
||||
{"User (jid)","Benutzer (JID)"}.
|
||||
{"User JID","Benutzer-JID"}.
|
||||
{"User Management","Benutzerverwaltung"}.
|
||||
{"User not allowed to perform an IQ set on another user's vCard.","Benutzer darf kein IQ-set auf die vCard eines anderen ausführen."}.
|
||||
{"User removed","Benutzer entfernt"}.
|
||||
{"User session not found","Benutzersitzung nicht gefunden"}.
|
||||
{"User session terminated","Benutzersitzung beendet"}.
|
||||
{"User ~ts","Benutzer ~ts"}.
|
||||
{"User","Benutzer"}.
|
||||
{"Username invalid","Benutzername ungültig"}.
|
||||
{"Username is reserved","Benutzername ist reserviert"}.
|
||||
{"Username","Benutzername"}.
|
||||
{"Username:","Benutzername:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
|
||||
{"Users Last Activity","Letzte Benutzeraktivität"}.
|
||||
@@ -578,6 +707,7 @@
|
||||
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten versenden"}.
|
||||
{"Voice requests are disabled in this conference","Sprachrecht-Anforderungen sind in diesem Raum deaktiviert"}.
|
||||
{"Voice request","Sprachrecht-Anforderung"}.
|
||||
{"Web client which allows to join the room anonymously","Web-Client, der es ermöglicht, dem Raum anonym beizutreten"}.
|
||||
{"Wednesday","Mittwoch"}.
|
||||
{"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"}.
|
||||
{"When a new subscription is processed","Sobald ein neues Abonnement verarbeitet wird"}.
|
||||
@@ -595,6 +725,7 @@
|
||||
{"Wrong parameters in the web formulary","Falsche Parameter im Webformular"}.
|
||||
{"Wrong xmlns","Falscher xmlns"}.
|
||||
{"XMPP Account Registration","XMPP-Konto-Registrierung"}.
|
||||
{"XMPP client for Haiku","XMPP-Client für Haiku"}.
|
||||
{"XMPP Domains","XMPP-Domänen"}.
|
||||
{"XMPP Show Value of Away","XMPP-Anzeigewert von Abwesend"}.
|
||||
{"XMPP Show Value of Chat","XMPP-Anzeigewert von Chat"}.
|
||||
@@ -604,8 +735,17 @@
|
||||
{"You are being removed from the room because of a system shutdown","Sie werden wegen einer Systemabschaltung aus dem Raum entfernt"}.
|
||||
{"You are not allowed to send private messages","Sie dürfen keine privaten Nachrichten senden"}.
|
||||
{"You are not joined to the channel","Sie sind dem Raum nicht beigetreten"}.
|
||||
{"You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>register an account manually</a>.","Du kannst dich mit {{ site_name }} über jede XMPP-kompatible Software verbinden. Sollte deine gewünschte Software hier oben nicht aufgeführt sein, so kannst du zumindest <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>einen Account manuell anlegen</a>."}.
|
||||
{"You can later change your password using an XMPP client.","Sie können Ihr Passwort später mit einem XMPP-Client ändern."}.
|
||||
{"You can now set up {{ app_name }} and connect it to your new account.","Jetzt kannst du {{ app_name }} einrichten und mit deinem neuen Konto verknüpfen."}.
|
||||
{"You can start chatting right away with {{ app_name }}. Let's get started!","Mittels {{ app_name }} kannst du direkt mit dem Chatten loslegen. Auf geht's!"}.
|
||||
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Du kannst diese Einladung auf dein Mobilgerät übertragen indem du den Code mit Deiner Kamera einscannst."}.
|
||||
{"You have been banned from this room","Sie wurden aus diesem Raum verbannt"}.
|
||||
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Du wurdest auf <strong>{{ site_name }}</strong> zum Chat eingeladen, Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
|
||||
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Du wurdest auf <strong>{{ site_name }}</strong> zum Chat eingeladen. <strong>{{ site_name }}</strong> ist Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Du wurdest von <strong>{{ inviter }}</strong> auf {{ site_name }} zum Chat eingeladen. {{ site_name }} ist Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
|
||||
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Du wurdest von <strong>{{ inviter }}</strong> auf <strong>{{ site_name }}</strong> zum Chat eingeladen. <strong>{{ site_name }}</strong> ist Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
|
||||
{"You have created an account on <strong>{{ site_name }}</strong>.","Du hast ein Konto auf <strong>{{ site_name }}</strong> angelegt."}.
|
||||
{"You have joined too many conferences","Sie sind zu vielen Konferenzen beigetreten"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Sie müssen das Feld \"Spitzname\" im Formular ausfüllen"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Sie benötigen einen Client der x:data und CAPTCHA unterstützt, um sich zu registrieren"}.
|
||||
@@ -613,6 +753,7 @@
|
||||
{"You need an x:data capable client to search","Sie benötigen einen Client der x:data unterstützt, um zu suchen"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Ihre aktive Privacy-Liste hat das Routing dieses Stanzas verweigert."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Die Offline-Nachrichten-Warteschlange Ihres Kontaktes ist voll. Die Nachricht wurde verworfen."}.
|
||||
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","Dein Passwort wird verschlüsselt auf dem Server gespeichert und wird nicht mehr im Klartext verfügbar sein, nachdem du diese Seite geschlossen hast. Verwahre es an einem sicheren Ort und teile es mit niemandem!"}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Ihre Abonnement-Anforderung und/oder Nachrichten an ~s wurden blockiert. Um Ihre Abonnement-Anforderungen freizugeben, besuchen Sie ~s"}.
|
||||
{"Your XMPP account was successfully registered.","Ihr XMPP-Konto wurde erfolgreich registriert."}.
|
||||
{"Your XMPP account was successfully unregistered.","Ihr XMPP-Konto wurde erfolgreich entfernt."}.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
{"A Web Page","Μία ιστοσελίδα"}.
|
||||
{"Accept","Αποδοχή"}.
|
||||
{"Access denied by service policy","Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"}.
|
||||
{"Access model","Καθορίστε το μοντέλο πρόσβασης"}.
|
||||
{"Access model","Μοντέλο πρόσβασης"}.
|
||||
{"Account doesn't exist","Ο λογαριασμός δεν υπάρχει"}.
|
||||
{"Action on user","Eνέργεια για το χρήστη"}.
|
||||
{"Add User","Προσθήκη Χρήστη"}.
|
||||
@@ -45,7 +45,9 @@
|
||||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Όποιος έχει συνδρομή παρουσίας και των δύο ή από μπορεί να εγγραφεί και να ανακτήσει στοιχεία"}.
|
||||
{"Anyone with Voice","Οποιοσδήποτε με Φωνή"}.
|
||||
{"Anyone","Οποιοσδήποτε"}.
|
||||
{"API Commands","Εντολές του API"}.
|
||||
{"April","Απρίλιος"}.
|
||||
{"Arguments","Επιχειρήματα"}.
|
||||
{"Attribute 'channel' is required for this request","Το δηλωτικό 'channel' απαιτείται για αυτό το Ερώτημα"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","Το δηλωτικό 'id' επιτακτικό για μηνύματα MIX"}.
|
||||
{"Attribute 'jid' is not allowed here","Το δηλωτικό 'jid' δεν επιτρέπεται εδώ"}.
|
||||
@@ -71,6 +73,7 @@
|
||||
{"Changing role/affiliation is not allowed","Η αλλαγή ρόλου/ομάδας δεν επιτρέπεται"}.
|
||||
{"Channel already exists","Το κανάλι υπάρχει ήδη"}.
|
||||
{"Channel does not exist","Το κανάλι δεν υπάρχει"}.
|
||||
{"Channel JID","JID καναλιού"}.
|
||||
{"Channels","Κανάλια"}.
|
||||
{"Characters not allowed:","Χαρακτήρες που δεν επιτρέπονται:"}.
|
||||
{"Chatroom configuration modified","Η ρύθμιση παραμέτρων της αίθουσας σύνεδριασης τροποποιηθηκε"}.
|
||||
@@ -84,6 +87,7 @@
|
||||
{"Choose whether to approve this entity's subscription.","Επιλέξτε αν θα εγκρίθεί η εγγραφή αυτής της οντότητας."}.
|
||||
{"City","Πόλη"}.
|
||||
{"Client acknowledged more stanzas than sent by server","Ο πελάτης γνωρίζει περισσότερα δωμάτια από αυτά που στάλθηκαν από τον εξυπηρετητή"}.
|
||||
{"Clustering","Συσταδοποίηση"}.
|
||||
{"Commands","Εντολές"}.
|
||||
{"Conference room does not exist","Η αίθουσα σύνεδριασης δεν υπάρχει"}.
|
||||
{"Configuration of room ~s","Διαμόρφωση δωματίου ~ s"}.
|
||||
@@ -119,6 +123,7 @@
|
||||
{"ejabberd","ejabberd"}.
|
||||
{"Email Address","Ηλεκτρονική Διεύθυνση"}.
|
||||
{"Email","Ηλεκτρονικό ταχυδρομείο"}.
|
||||
{"Enable hats","Ενεργοποίηση καπέλων"}.
|
||||
{"Enable logging","Ενεργοποίηση καταγραφής"}.
|
||||
{"Enable message archiving","Ενεργοποιήστε την αρχειοθέτηση μηνυμάτων"}.
|
||||
{"Enabling push without 'node' attribute is not supported","Η ενεργοποίηση της ώθησης χωρίς το χαρακτηριστικό 'κόμβος' δεν υποστηρίζεται"}.
|
||||
@@ -151,6 +156,8 @@
|
||||
{"Full List of Room Admins","Πλήρης Κατάλογος Διαχειριστών αιθουσών"}.
|
||||
{"Full List of Room Owners","Πλήρης Κατάλογος Ιδιοκτητών αιθουσών"}.
|
||||
{"Full Name","Ονοματεπώνυμο"}.
|
||||
{"Get List of Online Users","Λίστα online χρηστών"}.
|
||||
{"Get List of Registered Users","Λίστα εγγεγραμμένων χρηστών"}.
|
||||
{"Get Number of Online Users","Έκθεση αριθμού συνδεδεμένων χρηστών"}.
|
||||
{"Get Number of Registered Users","Έκθεση αριθμού εγγεγραμμένων χρηστών"}.
|
||||
{"Get Pending","Λήψη των εκκρεμοτήτων"}.
|
||||
@@ -163,6 +170,10 @@
|
||||
{"has been kicked because of an affiliation change","έχει αποβληθεί λόγω αλλαγής υπαγωγής"}.
|
||||
{"has been kicked because the room has been changed to members-only","αποβλήθηκε επειδή η αίθουσα αλλάξε γιά μέλη μόνο"}.
|
||||
{"has been kicked","αποβλήθηκε"}.
|
||||
{"Hash of the vCard-temp avatar of this room","Hash του vCard-temp avatar αυτού του δωματίου"}.
|
||||
{"Hat title","Τίτλος καπέλου"}.
|
||||
{"Hat URI","Καπέλο URI"}.
|
||||
{"Hats limit exceeded","Υπέρβαση του ορίου καπέλων"}.
|
||||
{"Host unknown","Άγνωστος εξυπηρετητής"}.
|
||||
{"HTTP File Upload","Ανέβασμα αρχείου"}.
|
||||
{"Idle connection","Αδρανής σύνδεση"}.
|
||||
@@ -183,6 +194,8 @@
|
||||
{"Incorrect value of 'action' attribute","Λανθασμένη τιμή του χαρακτηριστικού 'action'"}.
|
||||
{"Incorrect value of 'action' in data form","Λανθασμένη τιμή 'action' στη φόρμα δεδομένων"}.
|
||||
{"Incorrect value of 'path' in data form","Λανθασμένη τιμή 'path' στη φόρμα δεδομένων"}.
|
||||
{"Installed Modules:","Εγκατεστημένες ενότητες:"}.
|
||||
{"Install","Εγκατάσταση"}.
|
||||
{"Insufficient privilege","Ανεπαρκή προνόμια"}.
|
||||
{"Internal server error","Εσωτερικό σφάλμα"}.
|
||||
{"Invalid 'from' attribute in forwarded message","Μη έγκυρο χαρακτηριστικό 'από' στο προωθούμενο μήνυμα"}.
|
||||
@@ -198,6 +211,8 @@
|
||||
{"January","Ιανουάριος"}.
|
||||
{"JID normalization denied by service policy","Απετράπη η κανονικοποίηση του JID, λόγω της τακτικής Παροχής Υπηρεσιών"}.
|
||||
{"JID normalization failed","Απετράπη η κανονικοποίηση του JID"}.
|
||||
{"Joined MIX channels of ~ts","Ενσωματωμένα κανάλια MIX του ~ts"}.
|
||||
{"Joined MIX channels:","Ενσωματωμένα κανάλια MIX:"}.
|
||||
{"joins the room","συνδέεται στην αίθουσα"}.
|
||||
{"July","Ιούλιος"}.
|
||||
{"June","Ιούνιος"}.
|
||||
@@ -209,6 +224,8 @@
|
||||
{"Last year","Πέρυσι"}.
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Τα ψηφία μικρότερης αξίας του αθροίσματος SHA-256 του κειμένου θα έπρεπε να ισούνται με την δεκαεξαδική ετικέτα"}.
|
||||
{"leaves the room","εγκαταλείπει την αίθουσα"}.
|
||||
{"List users with hats","Λίστα χρηστών με καπέλα"}.
|
||||
{"Logged Out","Αποσυνδεδεμένος"}.
|
||||
{"Logging","Καταγραφή"}.
|
||||
{"Make participants list public","Κάντε δημόσιο τον κατάλογο συμμετεχόντων"}.
|
||||
{"Make room CAPTCHA protected","Κάντε την αίθουσα προστατεύομενη με CAPTCHA"}.
|
||||
@@ -220,6 +237,7 @@
|
||||
{"Malformed username","Λανθασμένη μορφή ονόματος χρήστη"}.
|
||||
{"MAM preference modification denied by service policy","Άρνηση αλλαγής προτιμήσεων MAM, λόγω της τακτικής Παροχής Υπηρεσιών"}.
|
||||
{"March","Μάρτιος"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Μέγιστος αριθμός στοιχείων που πρέπει να παραμείνουν, ή « Μέγιστο » για κανένα συγκεκριμένο όριο εκτός από το μέγιστο που επιβάλλει ο διακομιστής"}.
|
||||
{"Max payload size in bytes","Μέγιστο μέγεθος φορτίου σε bytes"}.
|
||||
{"Maximum file size","Μέγιστο μέγεθος αρχείου"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Μέγιστος αριθμός μηνυμάτων Ιστορικού που επιστρέφονται από την Αίθουσα"}.
|
||||
@@ -290,6 +308,7 @@
|
||||
{"Node ~p","Κόμβος ~p"}.
|
||||
{"Nodeprep has failed","Το Nodeprep απέτυχε"}.
|
||||
{"Nodes","Κόμβοι"}.
|
||||
{"Node","Κόμβος"}.
|
||||
{"None","Κανένα"}.
|
||||
{"Not allowed","Δεν επιτρέπεται"}.
|
||||
{"Not Found","Δε βρέθηκε"}.
|
||||
@@ -303,7 +322,8 @@
|
||||
{"Number of Offline Messages","Πλήθος μηνυμάτων Χωρίς Σύνδεση"}.
|
||||
{"Number of online users","Αριθμός συνδεδεμένων χρηστών"}.
|
||||
{"Number of registered users","Αριθμός εγγεγραμμένων χρηστών"}.
|
||||
{"Occupants are allowed to invite others","Οι συμμετέχοντες μπορούν να προσκαλέσουν και άλλους"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Αριθμός δευτερολέπτων μετά από τα οποία θα καθαρίζονται αυτόματα τα στοιχεία, ή `max` για κανένα συγκεκριμένο όριο εκτός από το μέγιστο που επιβάλλει ο διακομιστής"}.
|
||||
{"Occupants are allowed to query others","Οι κάτοικοι επιτρέπεται να ρωτούν άλλους"}.
|
||||
{"Occupants May Change the Subject","Επιτρέψτε στους χρήστες να αλλάζουν το Θέμα"}.
|
||||
{"October","Οκτώβριος"}.
|
||||
{"OK","Εντάξει"}.
|
||||
@@ -317,6 +337,7 @@
|
||||
{"Only members may query archives of this room","Μόνο μέλη μπορούν να δούνε τα αρχεία αυτής της αίθουσας"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Μόνο οι συντονιστές και οι συμμετέχοντες μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Μόνο οι συντονιστές μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"}.
|
||||
{"Only moderators are allowed to retract messages","Μόνο οι συντονιστές επιτρέπεται να αποσύρουν μηνύματα"}.
|
||||
{"Only moderators can approve voice requests","Μόνο οι συντονιστές μπορούν να εγκρίνουν τις αιτήσεις φωνής"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Μόνο οι συμμετέχοντες επιτρέπεται να στέλνουν μηνύματα στο συνέδριο"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Μόνο οι συμμετέχοντες επιτρέπεται να στείλουν ερωτήματα στη διάσκεψη"}.
|
||||
@@ -326,9 +347,11 @@
|
||||
{"Only those on a whitelist may subscribe and retrieve items","Μόνο όσοι βρίσκονται στη λίστα επιτρεπόμενων μπορούν να εγγραφούν και να ανακτήσουν αντικείμενα"}.
|
||||
{"Organization Name","Όνομα Οργανισμού"}.
|
||||
{"Organization Unit","Μονάδα Οργανισμού"}.
|
||||
{"Other Modules Available:","Διαθέσιμες άλλες ενότητες:"}.
|
||||
{"Outgoing s2s Connections","Εξερχόμενες S2S Συνδέσεις"}.
|
||||
{"Owner privileges required","Aπαιτούνται προνόμια ιδιοκτήτη"}.
|
||||
{"Packet relay is denied by service policy","Απαγορεύεται η αναμετάδοση πακέτων, λόγω της τακτικής Παροχής Υπηρεσιών"}.
|
||||
{"Participant ID","ID συμμετέχοντος"}.
|
||||
{"Participant","Συμμετέχων"}.
|
||||
{"Password Verification","Επαλήθευση κωδικού πρόσβασης"}.
|
||||
{"Password Verification:","Επαλήθευση κωδικού πρόσβασης:"}.
|
||||
@@ -336,6 +359,7 @@
|
||||
{"Password:","Κωδικός πρόσβασης:"}.
|
||||
{"Path to Dir","Τοποθεσία κατάλογου αρχείων"}.
|
||||
{"Path to File","Τοποθεσία Αρχείου"}.
|
||||
{"Payload semantic type information","Πληροφορίες σημασιολογικού τύπου ωφέλιμου φορτίου"}.
|
||||
{"Period: ","Περίοδος: "}.
|
||||
{"Persist items to storage","Μόνιμη αποθήκευση στοιχείων"}.
|
||||
{"Persistent","Μόνιμη"}.
|
||||
@@ -371,6 +395,7 @@
|
||||
{"Register an XMPP account","Καταχωρείστε έναν XMPP λογαριασμό χρήστη"}.
|
||||
{"Register","Καταχωρήστε"}.
|
||||
{"Remote copy","Εξ αποστάσεως αντίγραφο"}.
|
||||
{"Remove a hat from a user","Αφαίρεση ενός καπέλου από έναν χρήστη"}.
|
||||
{"Remove User","Αφαίρεση χρήστη"}.
|
||||
{"Replaced by new connection","Αντικαταστάθηκε από μια νέα σύνδεση"}.
|
||||
{"Request has timed out","Το αίτημα έληξε"}.
|
||||
@@ -383,6 +408,7 @@
|
||||
{"Restore binary backup immediately:","Επαναφορά δυαδικού αντιγράφου ασφαλείας αμέσως:"}.
|
||||
{"Restore plain text backup immediately:","Επαναφορά αντιγράφου ασφαλείας από αρχείο κειμένου αμέσως:"}.
|
||||
{"Restore","Επαναφορά Αντιγράφου Ασφαλείας"}.
|
||||
{"Result","Αποτέλεσμα"}.
|
||||
{"Roles and Affiliations that May Retrieve Member List","Ρόλοι και δεσμοί που μπορούν να λάβουν την λίστα μελών"}.
|
||||
{"Roles for which Presence is Broadcasted","Ρόλοι των οποίων η παρουσία δηλώνεται δημόσια"}.
|
||||
{"Roles that May Send Private Messages","Ρόλοι που επιτρέπεται να αποστέλλουν ιδιωτικά μηνύματα"}.
|
||||
@@ -414,13 +440,16 @@
|
||||
{"Set message of the day on all hosts and send to online users","Ορίστε μήνυμα ημέρας και άμεση αποστολή στους συνδεδεμένους χρήστες σε όλους τους κεντρικούς υπολογιστές"}.
|
||||
{"Shared Roster Groups","Κοινές Ομάδες Καταλόγων Επαφών"}.
|
||||
{"Show Integral Table","Δείτε Ολοκληρωτικό Πίνακα"}.
|
||||
{"Show Occupants Join/Leave","Εμφάνιση ενοίκων Join/Leave"}.
|
||||
{"Show Ordinary Table","Δείτε Κοινό Πίνακα"}.
|
||||
{"Shut Down Service","Τερματισμός Υπηρεσίας"}.
|
||||
{"SOCKS5 Bytestreams","Bytestreams του SOCKS5"}.
|
||||
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Ορισμένοι πελάτες XMPP μπορούν να αποθηκεύσουν τον κωδικό πρόσβασής σας στον υπολογιστή, αλλά θα πρέπει να το κάνετε μόνο στον προσωπικό σας υπολογιστή για λόγους ασφαλείας."}.
|
||||
{"Sources Specs:","Πηγές Προδιαγραφές:"}.
|
||||
{"Specify the access model","Καθορίστε το μοντέλο πρόσβασης"}.
|
||||
{"Specify the event message type","Καθορίστε τον τύπο μηνύματος συμβάντος"}.
|
||||
{"Specify the publisher model","Καθορίστε το μοντέλο εκδότη"}.
|
||||
{"Stanza id is not valid","Το Stanza id δεν είναι έγκυρο"}.
|
||||
{"Stanza ID","Ταυτότητα Δωματίου"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Προσδιορίστε (στατικά) το Απάντηση Προς του ιδιοκτήτη-ων του κόμβου"}.
|
||||
{"Stopped Nodes","Σταματημένοι Κόμβοι"}.
|
||||
@@ -430,6 +459,7 @@
|
||||
{"Stream management is not enabled","Η διαχείριση Ροών δεν είναι ενεργοποιημένη"}.
|
||||
{"Subject","Θέμα"}.
|
||||
{"Submitted","Υποβλήθηκε"}.
|
||||
{"Submit","Υποβολή"}.
|
||||
{"Subscriber Address","Διεύθυνση Συνδρομητή"}.
|
||||
{"Subscribers may publish","Οι συνδρομητές μπορούν να δημοσιεύσουν"}.
|
||||
{"Subscription requests must be approved and only subscribers may retrieve items","Τα αιτήματα για συνδρομή πρέπει να εγκριθούν και μόνο οι συνδρομητές μπορούν να λάβουν αντικείμενα"}.
|
||||
@@ -457,7 +487,10 @@
|
||||
{"The JIDs of those to contact with questions","Το JID αυτών με τους οποίους θα επικοινωνήσετε με ερωτήσεις"}.
|
||||
{"The JIDs of those with an affiliation of owner","Το JID αυτών που σχετίζονται με τον ιδιοκτήτη"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Το JID αυτών που σχετίζονται με τον εκδότη"}.
|
||||
{"The list of all online users","Ο κατάλογος όλων των online χρηστών"}.
|
||||
{"The list of all users","Ο κατάλογος όλων των χρηστών"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","Λίστα των JIDs που μπορούν να σχετίζουν leaf κόμβους με μια Συλλογή"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","Ο μέγιστος αριθμός των παιδικών κόμβων που μπορούν να συσχετιστούν με μια συλλογή, ή `max` για κανένα συγκεκριμένο όριο εκτός από το μέγιστο που επιβάλλει ο διακομιστής"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","Το ελάχιστο πλήθος χιλιοστών του δευτερολέπτου μεταξύ της αποστολής δύο συγχωνεύσεων ειδοποιήσεων"}.
|
||||
{"The name of the node","Το όνομα του κόμβου"}.
|
||||
{"The node is a collection node","Ο κόμβος είναι κόμβος Συλλογής"}.
|
||||
@@ -476,6 +509,7 @@
|
||||
{"The query is only allowed from local users","Το ερώτημα επιτρέπεται μόνο από τοπικούς χρήστες"}.
|
||||
{"The query must not contain <item/> elements","Το ερώτημα δεν πρέπει να περιέχει στοιχείο <item/>"}.
|
||||
{"The room subject can be modified by participants","Το θέμα μπορεί να τροποποιηθεί από τους συμμετέχοντες"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Οι πληροφορίες σημασιολογικού τύπου των δεδομένων στον κόμβο, που συνήθως καθορίζονται από το χώρο ονομάτων του ωφέλιμου φορτίου (εάν υπάρχει)"}.
|
||||
{"The sender of the last received message","Ο αποστολέας του τελευταίου εισερχομένου μηνύματος"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Η stanza ΠΡΕΠΕΙ να περιέχει μόνο ένα στοιχείο <active />, ένα στοιχείο <default /> ή ένα στοιχείο <list />"}.
|
||||
{"The subscription identifier associated with the subscription request","Το αναγνωριστικό συνδρομής συσχετίστηκε με το αίτημα συνδρομής"}.
|
||||
@@ -505,6 +539,7 @@
|
||||
{"Too many unacked stanzas","Πάρα πολλές μη αναγνωρισμένες stanzas"}.
|
||||
{"Too many users in this conference","Πάρα πολλοί χρήστες σε αυτή τη διάσκεψη"}.
|
||||
{"Traffic rate limit is exceeded","Υπέρφορτωση"}.
|
||||
{"~ts's MAM Archive","Αρχείο MAM του ~ts"}.
|
||||
{"~ts's Offline Messages Queue","~ts's Χωρίς Σύνδεση Μηνύματα"}.
|
||||
{"Tuesday","Τρίτη"}.
|
||||
{"Unable to generate a CAPTCHA","Αδύνατη η δημιουργία CAPTCHA"}.
|
||||
@@ -512,17 +547,23 @@
|
||||
{"Unauthorized","Χωρίς Εξουσιοδότηση"}.
|
||||
{"Unexpected action","Απροσδόκητη ενέργεια"}.
|
||||
{"Unexpected error condition: ~p","Απροσδόκητες συνθήκες σφάλματος: ~p"}.
|
||||
{"Uninstall","Απεγκατάσταση"}.
|
||||
{"Unregister an XMPP account","Καταργήση λογαριασμού XMPP"}.
|
||||
{"Unregister","Καταργήση εγγραφής"}.
|
||||
{"Unsupported <index/> element","Μη υποστηριζόμενο στοιχείο <index />"}.
|
||||
{"Unsupported version","Μη υποστηριζόμενη έκδοση"}.
|
||||
{"Update message of the day (don't send)","Ενημέρωση μηνύματος ημέρας (χωρίς άμεση αποστολή)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Ενημέρωση μηνύματος ημέρας σε όλους τους κεντρικούς υπολογιστές (χωρίς άμεση αποστολή)"}.
|
||||
{"Update specs to get modules source, then install desired ones.","Ενημερώστε τις προδιαγραφές για να λάβετε την πηγή των ενοτήτων και, στη συνέχεια, εγκαταστήστε τις επιθυμητές."}.
|
||||
{"Update Specs","Προδιαγραφές ενημέρωσης"}.
|
||||
{"Updating the vCard is not supported by the vCard storage backend","Η ενημέρωση της vCard δεν υποστηρίζεται από το backend αποθήκευσης vCard"}.
|
||||
{"Upgrade","Αναβάθμιση"}.
|
||||
{"URL for Archived Discussion Logs","URL αρχειοθετημένων καταγραφών συζητήσεων"}.
|
||||
{"User already exists","Ο χρήστης υπάρχει ήδη"}.
|
||||
{"User JID","JID Χρήστη"}.
|
||||
{"User (jid)","Χρήστης (jid)"}.
|
||||
{"User Management","Διαχείριση χρηστών"}.
|
||||
{"User not allowed to perform an IQ set on another user's vCard.","Ο χρήστης δεν επιτρέπεται να εκτελέσει ένα σετ IQ στην vCard ενός άλλου χρήστη."}.
|
||||
{"User removed","Ο Χρήστης αφαιρέθηκε"}.
|
||||
{"User session not found","Η περίοδος σύνδεσης χρήστη δεν βρέθηκε"}.
|
||||
{"User session terminated","Η περίοδος σύνδεσης χρήστη τερματίστηκε"}.
|
||||
@@ -538,12 +579,14 @@
|
||||
{"Value of '~s' should be integer","Η τιμή του '~s' θα πρέπει να είναι ακέραιος"}.
|
||||
{"Value 'set' of 'type' attribute is not allowed","Δεν επιτρέπεται η παράμετρος 'set' του 'type'"}.
|
||||
{"vCard User Search","vCard Αναζήτηση χρηστών"}.
|
||||
{"View joined MIX channels","Προβολή ενταγμένων καναλιών MIX"}.
|
||||
{"Virtual Hosts","Eικονικοί κεντρικοί υπολογιστές"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Οι επισκέπτες δεν επιτρέπεται να αλλάξουν τα ψευδώνυμα τους σε αυτή την αίθουσα"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Οι επισκέπτες δεν επιτρέπεται να στείλουν μηνύματα σε όλους τους συμμετέχοντες"}.
|
||||
{"Visitor","Επισκέπτης"}.
|
||||
{"Voice requests are disabled in this conference","Τα αιτήματα φωνής είναι απενεργοποιημένα, σε αυτό το συνέδριο"}.
|
||||
{"Voice request","Αίτημα φωνής"}.
|
||||
{"Web client which allows to join the room anonymously","Web client που επιτρέπει την ανώνυμη είσοδο στην αίθουσα"}.
|
||||
{"Wednesday","Τετάρτη"}.
|
||||
{"When a new subscription is processed and whenever a subscriber comes online","Όταν μία νέα συνδρομή βρίσκεται εν επεξεργασία και όποτε ένας συνδρομητής συνδεθεί"}.
|
||||
{"When a new subscription is processed","Όταν μία νέα συνδρομή βρίσκεται εν επεξεργασία"}.
|
||||
@@ -556,6 +599,7 @@
|
||||
{"Whether to allow subscriptions","Εάν επιτρέπονται συνδρομές"}.
|
||||
{"Whether to make all subscriptions temporary, based on subscriber presence","Αν επιτρέπεται να γίνουν όλες οι συνδρομές προσωρινές, βασιζόμενοι στην παρουσία του συνδρομητή"}.
|
||||
{"Whether to notify owners about new subscribers and unsubscribes","Αν πρέπει να ειδοποιούνται οι ιδιοκτήτες για νέους συνδρομητές και αποχωρήσεις"}.
|
||||
{"Who can send private messages","Ποιος μπορεί να στείλει ιδιωτικά μηνύματα"}.
|
||||
{"Who may associate leaf nodes with a collection","Ποιός μπορεί να συσχετίζει leaf nodes με μία συλλογή"}.
|
||||
{"Wrong parameters in the web formulary","Εσφαλμένες παράμετροι στην διαμόρφωση τυπικότητας του δυκτίου"}.
|
||||
{"Wrong xmlns","Εσφαλμένο xmlns"}.
|
||||
@@ -567,6 +611,7 @@
|
||||
{"XMPP Show Value of XA (Extended Away)","Δείξε τιμή XMPP Αξία του Λίαν Απομακρυσμένος"}.
|
||||
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI του συσχετισμένου κόμβου Δημοσίευσης-Εγγραφής"}.
|
||||
{"You are being removed from the room because of a system shutdown","Απαιτείται η απομάκρυνσή σας από την αίθουσα, λόγω τερματισμού συστήματος"}.
|
||||
{"You are not allowed to send private messages","Δεν επιτρέπεται η αποστολή ιδιωτικών μηνυμάτων"}.
|
||||
{"You are not joined to the channel","Δεν λαμβάνετε μέρος στο κανάλι"}.
|
||||
{"You can later change your password using an XMPP client.","Μπορείτε αργότερα να αλλάξετε τον κωδικό πρόσβασής σας χρησιμοποιώντας ένα πρόγραμμα-πελάτη XMPP."}.
|
||||
{"You have been banned from this room","Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"}.
|
||||
|
||||
@@ -295,6 +295,7 @@
|
||||
{"Store binary backup:","Konservu duuman sekurkopion:"}.
|
||||
{"Store plain text backup:","Skribu sekurkopion en plata tekstdosiero"}.
|
||||
{"Subject","Temo"}.
|
||||
{"Submit","Sendu"}.
|
||||
{"Submitted","Sendita"}.
|
||||
{"Subscriber Address","Abonanta adreso"}.
|
||||
{"Subscribers may publish","Abonantoj rajtas publici"}.
|
||||
|
||||