Merge branch 'master' into standalone-package-testing

pull/1045/head
Gabriel Engel 10 years ago
commit f45dda4d40
  1. 4
      .meteor/packages
  2. 2
      .meteor/versions
  3. 1
      .sandstorm/.gitignore
  4. 1
      .sandstorm/CHANGELOG.md
  5. 96
      .sandstorm/Vagrantfile
  6. 15
      .sandstorm/build.sh
  7. 1
      .sandstorm/description.md
  8. 31
      .sandstorm/global-setup.sh
  9. 4
      .sandstorm/launcher.sh
  10. BIN
      .sandstorm/pgp-keyring
  11. BIN
      .sandstorm/pgp-signature
  12. 52
      .sandstorm/rocket.chat-128.svg
  13. 37
      .sandstorm/rocket.chat-150.svg
  14. 32
      .sandstorm/rocket.chat-24.svg
  15. 96
      .sandstorm/sandstorm-pkgdef.capnp
  16. BIN
      .sandstorm/screenshot.png
  17. 47
      .sandstorm/setup.sh
  18. 1
      .sandstorm/stack
  19. 27
      README.md
  20. 2
      client/lib/RoomHistoryManager.coffee
  21. 6
      client/lib/avatar.coffee
  22. 0
      client/lib/customEventPolyfill.js
  23. 11
      client/methods/updateMessage.coffee
  24. 6
      client/routes/router.coffee
  25. 6
      client/views/account/accountFlex.coffee
  26. 9
      client/views/account/accountFlex.html
  27. 1
      client/views/account/accountPreferences.coffee
  28. 7
      client/views/account/accountPreferences.html
  29. 2
      client/views/account/accountProfile.coffee
  30. 14
      client/views/account/avatar/prompt.coffee
  31. 11
      client/views/account/avatar/prompt.html
  32. 38
      client/views/admin/admin.html
  33. 4
      client/views/admin/rooms/adminRooms.html
  34. 8
      client/views/admin/users/adminUsers.coffee
  35. 12
      client/views/app/flexTabBar.coffee
  36. 18
      client/views/app/flexTabBar.html
  37. 16
      client/views/app/message.coffee
  38. 22
      client/views/app/message.html
  39. 3
      client/views/app/privateHistory.coffee
  40. 6
      client/views/app/room.coffee
  41. 4
      client/views/app/room.html
  42. 2
      client/views/app/roomSearch.html
  43. 4
      client/views/app/sideNav/channels.coffee
  44. 8
      client/views/app/sideNav/directMessages.coffee
  45. 8
      client/views/app/sideNav/privateGroups.coffee
  46. 2
      client/views/app/sideNav/sideNav.coffee
  47. 4
      client/views/app/sideNav/sideNav.html
  48. 8
      client/views/app/sideNav/starredRooms.coffee
  49. 14
      client/views/app/sideNav/unreadRooms.coffee
  50. 13
      client/views/app/sideNav/unreadRooms.html
  51. 0
      client/views/app/spotlight/mobileMessageMenu.coffee
  52. 0
      client/views/app/spotlight/mobileMessageMenu.html
  53. 5
      client/views/app/spotlight/spotlight.coffee
  54. 0
      client/views/app/spotlight/spotlight.html
  55. 17
      client/views/app/tabBar/messageSearch.coffee
  56. 4
      client/views/app/tabBar/messageSearch.html
  57. 13
      client/views/fxos.coffee
  58. 48
      client/views/fxos.html
  59. 5
      client/views/login/form.coffee
  60. 2
      client/views/login/form.html
  61. 11
      i18n/de.i18n.json
  62. 2
      i18n/el.i18n.json
  63. 32
      i18n/en.i18n.json
  64. 13
      i18n/es.i18n.json
  65. 140
      i18n/fi.i18n.json
  66. 3
      i18n/fr.i18n.json
  67. 15
      i18n/hr.i18n.json
  68. 1
      i18n/it.i18n.json
  69. 30
      i18n/km.i18n.json
  70. 2
      i18n/ko.i18n.json
  71. 11
      i18n/ms-MY.i18n.json
  72. 2
      i18n/pl.i18n.json
  73. 12
      i18n/pt.i18n.json
  74. 33
      i18n/ru.i18n.json
  75. 6
      i18n/tr.i18n.json
  76. 2
      i18n/zh.i18n.json
  77. 0
      packages/meteor-accounts-saml/saml_client.js
  78. 0
      packages/meteor-accounts-saml/saml_server.js
  79. 9
      packages/meteor-accounts-saml/saml_utils.js
  80. 0
      packages/meteor-streams/LICENSE
  81. 0
      packages/meteor-streams/README.md
  82. 0
      packages/meteor-streams/lib/client.js
  83. 0
      packages/meteor-streams/lib/ev.js
  84. 0
      packages/meteor-streams/lib/server.js
  85. 0
      packages/meteor-streams/lib/stream_permission.js
  86. 0
      packages/meteor-streams/package.js
  87. 6
      packages/rocketchat-authorization/server/functions/addUsersToRoles.coffee
  88. 3
      packages/rocketchat-chatops/i18n/fi.i18n.json
  89. 0
      packages/rocketchat-favico/favico.js
  90. 0
      packages/rocketchat-favico/package.js
  91. 6
      packages/rocketchat-github-enterprise/i18n/fi.i18n.json
  92. 2
      packages/rocketchat-gitlab/i18n/fi.i18n.json
  93. 128
      packages/rocketchat-ldap/.npm/package/npm-shrinkwrap.json
  94. 12
      packages/rocketchat-ldap/config_server.coffee
  95. 54
      packages/rocketchat-ldap/ldap_server.js
  96. 2
      packages/rocketchat-ldap/package.js
  97. 8
      packages/rocketchat-lib/client/lib/openRoom.coffee
  98. 1
      packages/rocketchat-lib/package.js
  99. 1
      packages/rocketchat-lib/server/functions/setUsername.coffee
  100. 19
      packages/rocketchat-lib/server/methods/robotMethods.coffee
  101. Some files were not shown because too many files have changed in this diff Show More

@ -59,13 +59,13 @@ rocketchat:slashcommands-leave
rocketchat:spotify
rocketchat:statistics
rocketchat:theme
rocketchat:tutum
rocketchat:webrtc
rocketchat:wordpress
#rocketchat:chatops
#rocketchat:hubot
#rocketchat:irc
#rocketchat:livechat
rocketchat:soundcloud
konecty:change-case
konecty:delayed-task
@ -82,6 +82,7 @@ jalik:ufs-gridfs
jparker:gravatar
kadira:blaze-layout
kadira:flow-router
kenton:accounts-sandstorm
kevohagan:sweetalert
meteorhacks:kadira
mizzao:autocomplete
@ -109,4 +110,3 @@ yasaricli:slugify
yasinuslu:blaze-meta
# sanjo:jasmine
# velocity:html-reporter
rocketchat:tutum

@ -59,6 +59,7 @@ jparker:gravatar@0.4.1
jquery@1.11.4
kadira:blaze-layout@2.2.0
kadira:flow-router@2.8.0
kenton:accounts-sandstorm@0.1.7
kevohagan:sweetalert@1.0.0
konecty:autolinker@1.0.3
konecty:change-case@2.3.0
@ -141,7 +142,6 @@ rocketchat:oembed@0.0.1
rocketchat:slashcommands-invite@0.0.1
rocketchat:slashcommands-join@0.0.1
rocketchat:slashcommands-leave@0.0.1
rocketchat:soundcloud@0.0.1
rocketchat:spotify@0.0.1
rocketchat:statistics@0.0.1
rocketchat:theme@0.0.1

@ -0,0 +1 @@
.vagrant

@ -0,0 +1 @@
### FIRST Sandstorm VERSION of Rocket.Chat

@ -0,0 +1,96 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Guess at a reasonable name for the VM based on the folder vagrant-spk is
# run from. The timestamp is there to avoid conflicts if you have multiple
# folders with the same name.
VM_NAME = File.basename(File.dirname(File.dirname(__FILE__))) + "_sandstorm_#{Time.now.utc.to_i}"
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# We base ourselves off Debian Jessie
config.vm.box = "debian/jessie64"
if Vagrant.has_plugin?("vagrant-vbguest") then
# vagrant-vbguest is a Vagrant plugin that upgrades
# the version of VirtualBox Guest Additions within each
# guest. If you have the vagrant-vbguest plugin, then it
# needs to know how to compile kernel modules, etc., and so
# we give it this hint about operating system type.
config.vm.guest = "debian"
end
# We forward port 6080, the Sandstorm web port, so that developers can
# visit their sandstorm app from their browser as local.sandstorm.io:6080
# (aka 127.0.0.1:6080).
config.vm.network :forwarded_port, guest: 6080, host: 6080
# Use a shell script to "provision" the box. This installs Sandstorm using
# the bundled installer.
config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/global-setup.sh"
# Then, do stack-specific and app-specific setup.
config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/setup.sh"
# Shared folders are configured per-provider since vboxsf can't handle >4096 open files,
# NFS requires privilege escalation every time you bring a VM up,
# and 9p is only available on libvirt.
# Calculate the number of CPUs and the amount of RAM the system has,
# in a platform-dependent way; further logic below.
cpus = nil
total_kB_ram = nil
host = RbConfig::CONFIG['host_os']
if host =~ /darwin/
cpus = `sysctl -n hw.ncpu`.to_i
total_kB_ram = `sysctl -n hw.memsize`.to_i / 1024
elsif host =~ /linux/
cpus = `nproc`.to_i
total_kB_ram = `grep MemTotal /proc/meminfo | awk '{print $2}'`.to_i
elsif host =~ /mingw/
# powershell may not be available on Windows XP and Vista, so wrap this in a rescue block
begin
cpus = `powershell -Command "(Get-WmiObject Win32_Processor -Property NumberOfLogicalProcessors | Select-Object -Property NumberOfLogicalProcessors | Measure-Object NumberOfLogicalProcessors -Sum).Sum"`.to_i
total_kB_ram = `powershell -Command "Get-CimInstance -class cim_physicalmemory | % $_.Capacity}"`.to_i / 1024
rescue
end
end
# Use the same number of CPUs within Vagrant as the system, with 1
# as a default.
#
# Use at least 512MB of RAM, and if the system has more than 2GB of
# RAM, use 1/4 of the system RAM. This seems a reasonable compromise
# between having the Vagrant guest operating system not run out of
# RAM entirely (which it basically would if we went much lower than
# 512MB) and also allowing it to use up a healthily large amount of
# RAM so it can run faster on systems that can afford it.
if cpus.nil? or cpus.zero?
cpus = 1
end
if total_kB_ram.nil? or total_kB_ram < 2048000
assign_ram_mb = 512
else
assign_ram_mb = (total_kB_ram / 1024 / 4)
end
# Actually apply these CPU/memory values to the providers.
config.vm.provider :virtualbox do |vb, override|
vb.cpus = cpus
vb.memory = assign_ram_mb
vb.name = VM_NAME
override.vm.synced_folder "..", "/opt/app"
override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm"
override.vm.synced_folder "..", "/vagrant"
end
config.vm.provider :libvirt do |libvirt, override|
libvirt.cpus = cpus
libvirt.memory = assign_ram_mb
libvirt.default_prefix = VM_NAME
override.vm.synced_folder "..", "/opt/app", type: "9p", accessmode: "passthrough"
override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm", type: "9p", accessmode: "passthrough"
override.vm.synced_folder "..", "/vagrant", type: "9p", accessmode: "passthrough"
end
end

@ -0,0 +1,15 @@
#!/bin/bash
set -euo pipefail
# Make meteor bundle
METEOR_WAREHOUSE_DIR="${METEOR_WAREHOUSE_DIR:-$HOME/.meteor}"
METEOR_DEV_BUNDLE=$(dirname $(readlink -f "$METEOR_WAREHOUSE_DIR/meteor"))/dev_bundle
cd /opt/app
meteor build --directory /home/vagrant/
(cd /home/vagrant/bundle/programs/server && "$METEOR_DEV_BUNDLE/bin/npm" install)
# Copy our launcher script into the bundle so the grain can start up.
mkdir -p /home/vagrant/bundle/opt/app/.sandstorm/
cp /opt/app/.sandstorm/launcher.sh /home/vagrant/bundle/opt/app/.sandstorm/

@ -0,0 +1 @@
The Complete Open Source Chat Solution. Rocket.Chat is a Web Chat Server, developed in JavaScript. It is a great solution for communities and companies wanting to privately host their own chat service or for developers looking forward to build and evolve their own chat platforms.

@ -0,0 +1,31 @@
#!/bin/bash
set -euo pipefail
echo localhost > /etc/hostname
hostname localhost
curl https://install.sandstorm.io/ > /host-dot-sandstorm/caches/install.sh
SANDSTORM_CURRENT_VERSION=$(curl -fs "https://install.sandstorm.io/dev?from=0&type=install")
SANDSTORM_PACKAGE="sandstorm-$SANDSTORM_CURRENT_VERSION.tar.xz"
if [[ ! -f /host-dot-sandstorm/caches/$SANDSTORM_PACKAGE ]] ; then
curl --output "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "https://dl.sandstorm.io/$SANDSTORM_PACKAGE"
mv "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE"
fi
bash /host-dot-sandstorm/caches/install.sh -d -e "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE"
modprobe ip_tables
# Make the vagrant user part of the sandstorm group so that commands like
# `spk dev` work.
usermod -a -G 'sandstorm' 'vagrant'
# Bind to all addresses, so the vagrant port-forward works.
sudo sed --in-place='' \
--expression='s/^BIND_IP=.*/BIND_IP=0.0.0.0/' \
/opt/sandstorm/sandstorm.conf
# TODO: update sandstorm installer script to ask about dev accounts, and
# specify a value for this option in the default config?
if ! grep --quiet --no-messages ALLOW_DEV_ACCOUNTS=true /opt/sandstorm/sandstorm.conf ; then
echo "ALLOW_DEV_ACCOUNTS=true" | sudo tee -a /opt/sandstorm/sandstorm.conf
sudo service sandstorm restart
fi
# Enable apt-cacher-ng proxy to make things faster if one appears to be running on the gateway IP
GATEWAY_IP=$(ip route | grep ^default | cut -d ' ' -f 3)
if nc -z "$GATEWAY_IP" 3142 ; then
echo "Acquire::http::Proxy \"http://$GATEWAY_IP:3142\";" > /etc/apt/apt.conf.d/80httpproxy
fi

@ -0,0 +1,4 @@
#!/bin/bash
set -euo pipefail
exec node /start.js -p 8000

Binary file not shown.

Binary file not shown.

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-241 333 128 128" style="enable-background:new -241 333 128 128;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.6;fill:#D1D1D1;enable-background:new ;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:#02273E;}
.st3{fill:#C1272D;}
.st4{fill:#FFFFFF;}
.st5{fill:#CCCCCC;}
</style>
<path class="st0" d="M-120.3,461.2h-110c-4,0-7.3-3.2-7.3-7.3v-110c0-4,3.2-7.3,7.3-7.3h110c4,0,7.3,3.2,7.3,7.3v110
C-113,457.9-116.2,461.2-120.3,461.2z"/>
<g>
<g>
<defs>
<path id="SVGID_1_" d="M-122.5,457.7h-112.3c-3.4,0-6.1-2.7-6.1-6.1V339.3c0-3.4,2.7-6.1,6.1-6.1h112.3c3.4,0,6.1,2.7,6.1,6.1
v112.3C-116.4,455-119.1,457.7-122.5,457.7z"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<rect x="-243.5" y="331.2" class="st2" width="129.9" height="128"/>
</g>
</g>
</g>
<path class="st3" d="M-128.6,392.8c0-5.1-1.5-10.1-4.6-14.7c-2.7-4.1-6.6-7.8-11.4-10.8c-9.3-5.9-21.5-9.2-34.4-9.2
c-4.3,0-8.5,0.4-12.7,1.1c-2.6-2.4-5.5-4.5-8.7-6.2c-16.9-8.2-30.9-0.2-30.9-0.2s13,10.7,10.9,20.1c-5.8,5.8-9,12.7-9,20
c0,0,0,0,0,0.1c0,0,0,0,0,0.1c0,7.3,3.2,14.2,9,20c2.1,9.4-10.9,20.1-10.9,20.1s14,8,30.9-0.2c3.2-1.7,6.1-3.8,8.7-6.2
c4.1,0.7,8.4,1.1,12.7,1.1c12.9,0,25.1-3.3,34.4-9.2c4.8-3.1,8.6-6.7,11.4-10.8c3-4.6,4.6-9.5,4.6-14.7
C-128.6,392.9-128.6,392.9-128.6,392.8C-128.6,392.8-128.6,392.8-128.6,392.8z"/>
<path class="st4" d="M-178.9,365.4c23.8,0,43.2,12.3,43.2,27.6c0,15.2-19.3,27.6-43.2,27.6c-5.3,0-10.4-0.6-15.1-1.7
c-4.8,5.7-15.3,13.7-25.5,11.1c3.3-3.6,8.2-9.6,7.2-19.5c-6.1-4.8-9.8-10.8-9.8-17.5C-222,377.7-202.7,365.4-178.9,365.4"/>
<g>
<g>
<circle class="st3" cx="-178.9" cy="393.8" r="5.7"/>
</g>
<g>
<circle class="st3" cx="-158.9" cy="393.8" r="5.7"/>
</g>
<g>
<circle class="st3" cx="-198.8" cy="393.8" r="5.7"/>
</g>
</g>
<g>
<path class="st5" d="M-178.9,416.9c-5.3,0-10.4-0.5-15.1-1.5c-4.2,4.4-12.9,10.3-21.9,10.1c-1.2,1.8-2.5,3.3-3.6,4.5
c10.2,2.6,20.7-5.4,25.5-11.1c4.7,1.1,9.8,1.7,15.1,1.7c23.6,0,42.9-12.1,43.2-27.2C-136,406.3-155.2,416.9-178.9,416.9z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-230 322 150 150" style="enable-background:new -230 322 150 150;" xml:space="preserve">
<style type="text/css">
.st0{fill:#02273E;}
.st1{fill:#C1272D;}
.st2{fill:#FFFFFF;}
.st3{fill:#CCCCCC;}
</style>
<g>
<rect x="-230" y="322" class="st0" width="150" height="150"/>
</g>
<path class="st1" d="M-90.2,395.1c0-6.5-2-12.8-5.8-18.6c-3.5-5.2-8.3-9.8-14.4-13.7c-11.8-7.5-27.2-11.7-43.5-11.7
c-5.4,0-10.8,0.5-16,1.4c-3.2-3-7-5.7-11-7.9c-21.4-10.4-39.1-0.2-39.1-0.2s16.5,13.5,13.8,25.4c-7.4,7.3-11.4,16.1-11.4,25.3
c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,9.2,4,18,11.4,25.3c2.7,11.9-13.8,25.4-13.8,25.4s17.7,10.1,39.1-0.2c4-2.2,7.8-4.9,11-7.9
c5.2,0.9,10.6,1.4,16,1.4c16.3,0,31.8-4.1,43.5-11.6c6.1-3.9,10.9-8.5,14.4-13.7c3.8-5.8,5.8-12.1,5.8-18.6
C-90.2,395.3-90.2,395.3-90.2,395.1C-90.2,395.2-90.2,395.2-90.2,395.1z"/>
<path class="st2" d="M-153.9,360.4c30.2,0,54.7,15.6,54.7,34.9c0,19.3-24.5,34.9-54.7,34.9c-6.7,0-13.2-0.8-19.1-2.2
c-6,7.3-19.3,17.4-32.3,14.1c4.2-4.5,10.4-12.1,9.1-24.7c-7.7-6-12.4-13.7-12.4-22.1C-208.6,376-184.1,360.4-153.9,360.4"/>
<g>
<g>
<circle class="st1" cx="-153.9" cy="396.4" r="7.3"/>
</g>
<g>
<circle class="st1" cx="-128.7" cy="396.4" r="7.3"/>
</g>
<g>
<circle class="st1" cx="-179.2" cy="396.4" r="7.3"/>
</g>
</g>
<g>
<path class="st3" d="M-153.9,425.6c-6.7,0-13.2-0.7-19.1-1.9c-5.3,5.6-16.3,13-27.7,12.8c-1.5,2.3-3.1,4.1-4.5,5.6
c12.9,3.3,26.2-6.8,32.3-14.1c5.9,1.4,12.4,2.2,19.1,2.2c30,0,54.3-15.4,54.7-34.5C-99.7,412.3-124,425.6-153.9,425.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-293 385 24 24" style="enable-background:new -293 385 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#C1272D;}
.st1{fill:#FFFFFF;}
.st2{fill:#CCCCCC;}
</style>
<path class="st0" d="M-269.9,397c0-1.1-0.3-2.2-1-3.2c-0.6-0.9-1.4-1.7-2.5-2.4c-2-1.3-4.7-2-7.6-2c-0.9,0-1.9,0.1-2.8,0.2
c-0.6-0.5-1.2-1-1.9-1.4c-3.7-1.8-6.8,0-6.8,0s2.9,2.3,2.4,4.4c-1.3,1.3-2,2.8-2,4.4c0,0,0,0,0,0c0,0,0,0,0,0c0,1.6,0.7,3.1,2,4.4
c0.5,2.1-2.4,4.4-2.4,4.4s3.1,1.8,6.8,0c0.7-0.4,1.4-0.8,1.9-1.4c0.9,0.2,1.8,0.2,2.8,0.2c2.8,0,5.5-0.7,7.6-2
c1.1-0.7,1.9-1.5,2.5-2.4C-270.2,399.2-269.9,398.1-269.9,397C-269.9,397-269.9,397-269.9,397C-269.9,397-269.9,397-269.9,397z"/>
<path class="st1" d="M-280.9,391c5.2,0,9.5,2.7,9.5,6.1c0,3.3-4.2,6.1-9.5,6.1c-1.2,0-2.3-0.1-3.3-0.4c-1,1.3-3.4,3-5.6,2.4
c0.7-0.8,1.8-2.1,1.6-4.3c-1.3-1-2.2-2.4-2.2-3.8C-290.4,393.7-286.2,391-280.9,391"/>
<g>
<g>
<circle class="st0" cx="-280.9" cy="397.2" r="1.3"/>
</g>
<g>
<circle class="st0" cx="-276.5" cy="397.2" r="1.3"/>
</g>
<g>
<circle class="st0" cx="-285.3" cy="397.2" r="1.3"/>
</g>
</g>
<g>
<path class="st2" d="M-280.9,402.3c-1.2,0-2.3-0.1-3.3-0.3c-0.9,1-2.8,2.3-4.8,2.2c-0.3,0.4-0.5,0.7-0.8,1c2.2,0.6,4.5-1.2,5.6-2.4
c1,0.2,2.1,0.4,3.3,0.4c5.2,0,9.4-2.7,9.5-6C-271.5,400-275.7,402.3-280.9,402.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,96 @@
@0xbbbe049af795122e;
using Spk = import "/sandstorm/package.capnp";
# This imports:
# $SANDSTORM_HOME/latest/usr/include/sandstorm/package.capnp
# Check out that file to see the full, documented package definition format.
const pkgdef :Spk.PackageDefinition = (
# The package definition. Note that the spk tool looks specifically for the
# "pkgdef" constant.
id = "vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0",
# Your app ID is actually its public key. The private key was placed in
# your keyring. All updates must be signed with the same key.
manifest = (
# This manifest is included in your app package to tell Sandstorm
# about your app.
appTitle = (defaultText = "Rocket.Chat"),
appVersion = 1, # Increment this for every release.
appMarketingVersion = (defaultText = "0.6"),
# Human-readable representation of appVersion. Should match the way you
# identify versions of your app in documentation and marketing.
actions = [
# Define your "new document" handlers here.
( title = (defaultText = "New Rocket.Chat"),
command = .myCommand
# The command to run when starting for the first time. (".myCommand"
# is just a constant defined at the bottom of the file.)
)
],
continueCommand = .myCommand,
# This is the command called to start your app back up after it has been
# shut down for inactivity. Here we're using the same command as for
# starting a new instance, but you could use different commands for each
# case.
metadata = (
icons = (
appGrid = (svg = embed "rocket.chat-128.svg"),
grain = (svg = embed "rocket.chat-24.svg"),
market = (svg = embed "rocket.chat-150.svg"),
),
website = "https://rocket.chat",
codeUrl = "https://github.com/RocketChat/Rocket.Chat",
license = (openSource = mit),
categories = [communications, productivity],
author = (
contactEmail = "team@rocket.chat",
pgpSignature = embed "pgp-signature",
upstreamAuthor = "Rocket.Chat",
),
pgpKeyring = embed "pgp-keyring",
description = (defaultText = embed "description.md"),
shortDescription = (defaultText = "Chat app"),
screenshots = [
(width = 1203, height = 760, png = embed "screenshot.png")
],
changeLog = (defaultText = embed "CHANGELOG.md"),
),
),
sourceMap = (
# The following directories will be copied into your package.
searchPath = [
( sourcePath = "/home/vagrant/bundle" ),
( sourcePath = "/opt/meteor-spk/meteor-spk.deps" )
]
),
alwaysInclude = [ "." ]
# This says that we always want to include all files from the source map.
# (An alternative is to automatically detect dependencies by watching what
# the app opens while running in dev mode. To see what that looks like,
# run `spk init` without the -A option.)
);
const myCommand :Spk.Manifest.Command = (
# Here we define the command used to start up your server.
argv = ["/sandstorm-http-bridge", "8000", "--", "/opt/app/.sandstorm/launcher.sh"],
environ = [
# Note that this defines the *entire* environment seen by your app.
(key = "PATH", value = "/usr/local/bin:/usr/bin:/bin")
]
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

@ -0,0 +1,47 @@
#!/bin/bash
set -euo pipefail
cd /opt/
PACKAGE=meteor-spk-0.1.7
PACKAGE_FILENAME="$PACKAGE.tar.xz"
CACHE_TARGET="/host-dot-sandstorm/caches/${PACKAGE_FILENAME}"
# Fetch meteor-spk tarball if not cached
if [ ! -f "$CACHE_TARGET" ] ; then
curl https://dl.sandstorm.io/${PACKAGE_FILENAME} > "$CACHE_TARGET"
fi
# Extract to /opt
tar xf "$CACHE_TARGET"
# Create symlink so we can rely on the path /opt/meteor-spk
ln -s "${PACKAGE}" meteor-spk
# Add bash, and its dependencies, so they get mapped into the image.
# Bash runs the launcher script.
cp -a /bin/bash /opt/meteor-spk/meteor-spk.deps/bin/
cp -a /lib/x86_64-linux-gnu/libncurses.so.* /opt/meteor-spk/meteor-spk.deps/lib/x86_64-linux-gnu/
cp -a /lib/x86_64-linux-gnu/libtinfo.so.* /opt/meteor-spk/meteor-spk.deps/lib/x86_64-linux-gnu/
# Unfortunately, Meteor does not explicitly make it easy to cache packages, but
# we know experimentally that the package is mostly directly extractable to a
# user's $HOME/.meteor directory.
METEOR_RELEASE=1.1.0.2
METEOR_PLATFORM=os.linux.x86_64
METEOR_TARBALL_FILENAME="meteor-bootstrap-${METEOR_PLATFORM}.tar.gz"
METEOR_TARBALL_URL="https://d3sqy0vbqsdhku.cloudfront.net/packages-bootstrap/${METEOR_RELEASE}/${METEOR_TARBALL_FILENAME}"
METEOR_CACHE_TARGET="/host-dot-sandstorm/caches/${METEOR_TARBALL_FILENAME}"
# Fetch meteor tarball if not cached
if [ ! -f "$METEOR_CACHE_TARGET" ] ; then
curl "$METEOR_TARBALL_URL" > "${METEOR_CACHE_TARGET}.partial"
mv "${METEOR_CACHE_TARGET}"{.partial,}
fi
# Extract as unprivileged user, which is the usual meteor setup
cd /home/vagrant/
su -c "tar xf '${METEOR_CACHE_TARGET}'" vagrant
# Link into global PATH
ln -s /home/vagrant/.meteor/meteor /usr/bin/meteor

@ -8,7 +8,7 @@ Checkout the latest version at [https://demo.rocket.chat](https://demo.rocket.ch
Available from the AppStore:
[![Rocket.Chat on Apple AppStore](http://linkmaker.itunes.apple.com/images/badges/en-us/badge_appstore-lrg.svg)](https://geo.itunes.apple.com/us/app/rocket.chat/id1028869439?mt=8)
[![Rocket.Chat on Apple AppStore](http://linkmaker.itunes.apple.com/images/badges/en-us/badge_appstore-lrg.svg)](https://itunes.apple.com/us/app/rocket.chat/id1028869439?mt=8)
Get the app for your Android phone:
@ -21,6 +21,11 @@ Host your own Rocket.Chat server in four seconds flat:
[![Rocket.Chat on Sandstorm.io](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/sandstorm.jpg)](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0)
Also available as FirefoxOS app:
[![Firefox OS app now available](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/firefoxos.png)](https://github.com/RocketChat/Rocket.Chat/wiki/Native-Firefox-OS-app-%28hosted-webapp%29)
Try it on Ubuntu:
@ -40,7 +45,8 @@ Download the Native Cross-Platform Desktop Application at [Rocket.Chat.Electron]
[![Build Status](https://img.shields.io/travis/RocketChat/Rocket.Chat/master.svg)](https://travis-ci.org/RocketChat/Rocket.Chat)
[![Coverage Status](https://coveralls.io/repos/RocketChat/Rocket.Chat/badge.svg)](https://coveralls.io/r/RocketChat/Rocket.Chat)
[![Code Climate](https://codeclimate.com/github/RocketChat/Rocket.Chat/badges/gpa.svg)](https://codeclimate.com/github/RocketChat/Rocket.Chat)
[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE)
[![Stories in Ready](https://badge.waffle.io/RocketChat/Rocket.Chat.png?label=ready&title=Ready)](https://waffle.io/RocketChat/Rocket.Chat)
Rocket.Chat is a Web Chat Server, developed in JavaScript, using the [Meteor](https://www.meteor.com/install) fullstack framework.
@ -51,7 +57,7 @@ It is a great solution for communities and companies wanting to privately host t
##### [Hacker News](https://news.ycombinator.com/item?id=9624737)
> Yes, we made it to the #1
##### [Product Hunt](http://www.producthunt.com/posts/rocket-chat)
##### [Product Hunt](https://www.producthunt.com/tech/rocket-chat)
> Your own open source Slack-like chat
##### [JavaScript Weekly](http://javascriptweekly.com/issues/234)
@ -97,9 +103,11 @@ It is a great solution for communities and companies wanting to privately host t
- REST APIs
- Remote Locations Video Monitoring
- Chat-ops powered by Hubot: scalable horizontal app integration (early access)
- Massively scalable hosting and provisioning (beta testing now)
- Native Cross-Platform Desktop Application [Windows, Mac OSX, or Linux](https://rocket.chat/)
- Mobile app for iPhone, iPad, and iPod touch [Download on AppStore!](https://geo.itunes.apple.com/us/app/rocket.chat/id1028869439?mt=8)
- Mobile app for Android phone, tablet, and TV stick [Available now on Google Play!](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat)
- Native Firefox OS Application (also for Desktop Firefox and Firefox for Android!) - [Check the wiki page for install instructions](https://github.com/RocketChat/Rocket.Chat/wiki/Native-Firefox-OS-app-%28hosted-webapp%29)
- Sandstorm.io instant Rocket.Chat server [Now on Sandstorm App Store](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0)
@ -107,7 +115,7 @@ It is a great solution for communities and companies wanting to privately host t
#### In Progress
- Support multiple teams on the same instance / same VPS infrastructure: [Issue #658](https://github.com/RocketChat/Rocket.Chat/issues/658), [Issue #630](https://github.com/RocketChat/Rocket.Chat/issues/630)
- Support for PostgreSQL: [Issue #533](https://github.com/RocketChat/Rocket.Chat/issues/533), [Issue #822](https://github.com/RocketChat/Rocket.Chat/issues/822)
- Support for PostgreSQL: [Issue #533](https://github.com/RocketChat/Rocket.Chat/issues/533), [Issue #822](https://github.com/RocketChat/Rocket.Chat/pull/822)
- Native iOS Application [Issue #270](https://github.com/RocketChat/Rocket.Chat/issues/270), [Rocket.Chat.iOS - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.iOS)
- Native Android Application [Issue #271 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/271)
- Off-the-Record (OTR) Messaging [Issue #36](https://github.com/RocketChat/Rocket.Chat/issues/36), [Issue #268 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/268)
@ -123,7 +131,6 @@ It is a great solution for communities and companies wanting to privately host t
- Anonymous use of Rocket.Chat: [Issue #604](https://github.com/RocketChat/Rocket.Chat/issues/604)
- File Sharing via P2P and Scalable Multicast: [Issue #369](https://github.com/RocketChat/Rocket.Chat/issues/369), [Issue #370](https://github.com/RocketChat/Rocket.Chat/issues/370)
- Anti-virus checking on file uploads: [Issue #757](https://github.com/RocketChat/Rocket.Chat/issues/757)
- Massively scalable hosting and provisioning
### Issues
@ -150,7 +157,7 @@ We are developing the APIs based on the competition, so stay tuned and you will
### Documentation
Checkout [Github Wiki](https://github.com/RocketChat/Rocket.Chat/wiki) (coming soon)
Checkout [Github Wiki](https://github.com/RocketChat/Rocket.Chat/wiki)
## Production Deployment
@ -174,9 +181,9 @@ Easy one click install right from your Ubuntu Desktop (coming soon).
### Docker
Use the automated build at our [Official Docker Registry](https://registry.hub.docker.com/u/rocketchat/rocket.chat/)
Use the automated build at our [Official Docker Registry](https://hub.docker.com/r/rocketchat/rocket.chat/)
[![Rocket.Chat logo](https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png)](https://registry.hub.docker.com/u/rocketchat/rocket.chat/)
[![Rocket.Chat logo](https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png)](https://hub.docker.com/r/rocketchat/rocket.chat/)
```
docker pull rocketchat/rocket.chat
@ -249,7 +256,7 @@ If you want to help, send an email to support at rocket.chat to be invited to th
### Community
Join the conversation at [Twitter](http://twitter.com/RocketChatApp), [Facebook](https://www.facebook.com/RocketChatApp) or [Google Plus](https://plus.google.com/+RocketChatApp)
Join the conversation at [Twitter](https://twitter.com/RocketChatApp), [Facebook](https://www.facebook.com/RocketChatApp) or [Google Plus](https://plus.google.com/+RocketChatApp)
### License
@ -260,3 +267,5 @@ Note that Rocket.Chat is distributed under the [MIT License](http://opensource.o
Rocket.Chat will be free forever, but you can help us speed-up the development!
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=49QX7TYCVZK8L)
[BountySource](https://www.bountysource.com/teams/rocketchat)

@ -27,7 +27,7 @@
if lastMessage?
ts = lastMessage.ts
else
ts = new Date
ts = undefined
ls = undefined
typeName = undefined

@ -4,7 +4,11 @@
if not username?
return
return Meteor.absoluteUrl "avatar/#{username}.jpg?_dc=#{random}"
if Meteor.isCordova
path = Meteor.absoluteUrl()
else
path = '/'
"#{path}avatar/#{encodeURIComponent(username)}.jpg?_dc=#{random}"
Blaze.registerHelper 'avatarUrlFromUsername', getAvatarUrlFromUsername

@ -9,6 +9,8 @@ Meteor.methods
editAllowed = RocketChat.settings.get 'Message_AllowEditing'
editOwn = originalMessage?.u?._id is Meteor.userId()
me = Meteor.users.findOne Meteor.userId()
unless hasPermission or (editAllowed and editOwn)
toastr.error t('Message_editing_not_allowed')
throw new Meteor.Error 'message-editing-not-allowed', t('Message_editing_not_allowed')
@ -23,7 +25,11 @@ Meteor.methods
Tracker.nonreactive ->
message.ets = new Date(Date.now() + TimeSync.serverOffset())
message.editedAt = new Date(Date.now() + TimeSync.serverOffset())
message.editedBy =
_id: Meteor.userId()
username: me.username
message = RocketChat.callbacks.run 'beforeSaveMessage', message
ChatMessage.update
@ -31,5 +37,6 @@ Meteor.methods
'u._id': Meteor.userId()
,
$set:
ets: message.ets
"editedAt": message.editedAt
"editedBy": message.editedBy
msg: message.msg

@ -97,3 +97,9 @@ FlowRouter.route '/room-not-found/:type/:name',
action: (params) ->
Session.set 'roomNotFound', {type: params.type, name: params.name}
BlazeLayout.render 'main', {center: 'roomNotFound'}
FlowRouter.route '/fxos',
name: 'firefox-os-install'
action: ->
BlazeLayout.render 'fxOsInstallPrompt'

@ -13,3 +13,9 @@ Template.accountFlex.events
'click .account-link': ->
menu.close()
Template.accountFlex.helpers
allowUserProfileChange: ->
return RocketChat.settings.get("Accounts_AllowUserProfileChange")
allowUserAvatarChange: ->
return RocketChat.settings.get("Accounts_AllowUserAvatarChange")

@ -9,10 +9,15 @@
<ul>
<li>
<a href="{{pathFor 'account' group='preferences'}}" class="account-link">{{_ "Preferences"}}</a>
<a href="{{pathFor 'account' group='profile'}}" class="account-link">{{_ "Profile"}}</a>
{{#if allowUserProfileChange}}
<a href="{{pathFor 'account' group='profile'}}" class="account-link">{{_ "Profile"}}</a>
{{/if}}
{{!-- <a href="{{pathFor 'account' group='account'}}" class="account-link">{{_ "Account_Settings"}}</a> --}}
{{!-- <a href="{{pathFor 'account' group='notification'}}" class="account-link">{{_ "Notification"}}</a> --}}
<a href="{{pathFor 'changeAvatar'}}" class="account-link">{{_ "Change_avatar"}}</a> {{!-- move this to profile --}}
{{#if allowUserProfileChange}}
<a href="{{pathFor 'changeAvatar'}}" class="account-link">{{_ "Change_avatar"}}</a>
{{/if}}
{{!-- move this to profile --}}
</li>
</ul>
</div>

@ -40,6 +40,7 @@ Template.accountPreferences.onCreated ->
data.convertAsciiEmoji = $('input[name=convertAsciiEmoji]:checked').val()
data.saveMobileBandwidth = $('input[name=saveMobileBandwidth]:checked').val()
data.compactView = $('input[name=compactView]:checked').val()
data.unreadRoomsMode = $('input[name=unreadRoomsMode]:checked').val()
data.autoImageLoad = $('input[name=autoImageLoad]:checked').val()
Meteor.call 'saveUserPreferences', data, (error, results) ->

@ -61,6 +61,13 @@
<label><input type="radio" name="compactView" value="0" checked="{{checked 'compactView' false true}}" /> {{_ "False"}}</label>
</div>
</div>
<div class="input-line double-col" id="unreadRoomsMode">
<label>{{_ "Unread_Rooms_Mode"}}</label>
<div>
<label><input type="radio" name="unreadRoomsMode" value="1" checked="{{checked 'unreadRoomsMode' true}}" /> {{_ "True"}}</label>
<label><input type="radio" name="unreadRoomsMode" value="0" checked="{{checked 'unreadRoomsMode' false true}}" /> {{_ "False"}}</label>
</div>
</div>
</div>
</div>
<div class="section">

@ -98,6 +98,8 @@ Template.accountProfile.onCreated ->
Template.accountProfile.onRendered ->
Tracker.afterFlush ->
# this should throw an error-template
FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserProfileChange")
SideNav.setFlex "accountFlex"
SideNav.openFlex()

@ -14,6 +14,8 @@ Template.avatarPrompt.onCreated ->
Template.avatarPrompt.onRendered ->
Tracker.afterFlush ->
# this should throw an error-template
FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserAvatarChange")
SideNav.setFlex "accountFlex"
SideNav.openFlex()
@ -43,6 +45,18 @@ Template.avatarPrompt.events
toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000))
else
toastr.success t('Avatar_changed_successfully')
else if @service is 'url'
if _.trim $('#avatarurl').val()
Meteor.call 'setAvatarFromService', $('#avatarurl').val(), '', @service, (err) ->
if err
if err.details?.timeToReset?
toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000))
else
toastr.error t('Avatar_url_invalid_or_error')
else
toastr.success t('Avatar_changed_successfully')
else
toastr.error t('Please_enter_value_for_url')
else
Meteor.call 'setAvatarFromService', @blob, @contentType, @service, (err) ->
if err?.details?.timeToReset?

@ -58,6 +58,17 @@
{{/unless}}
</div>
</div>
<div class="avatar-suggestion-item">
{{#with service='url'}}
<div class="avatar question-mark icon-upload"></div>
<div class="action">
<div class="input-line">
<input type="text" name="avatarurl" id="avatarurl" />
<button type="button" class="button primary select-service">{{_ "Use_url_for_avatar"}}</button>
</div>
</div>
{{/with}}
</div>
{{#if suggestions.ready}}
{{> avatarSuggestion suggestions.avatars.gravatar}}

@ -12,7 +12,7 @@
{{else}}
{{#with group}}
<div class="info">
<h3>{{description}}</h3>
<p class="settings-description">{{description}}</p>
</div>
{{/with}}
<div class="rocket-form">
@ -33,55 +33,33 @@
{{/if}}
{{/if}}
{{#each settings}}
{{#if $eq type 'string'}}
<div class="input-line double-col">
<label>{{label}}</label>
<div>
{{#if $eq type 'string'}}
{{#if multiline}}
<textarea name="{{_id}}" rows="4" style="height: auto">{{value}}</textarea>
{{else}}
<input type="text" name="{{_id}}" value="{{value}}" />
{{/if}}
{{#if description}}
<small>{{description}}</small>
{{/if}}
</div>
</div>
{{/if}}
{{#if $eq type 'int'}}
<div class="input-line double-col">
<label>{{label}}</label>
<div>
<input type="number" name="{{_id}}" value="{{value}}" />
{{#if description}}
<small>{{description}}</small>
{{/if}}
</div>
</div>
{{/if}}
{{#if $eq type 'boolean'}}
<div class="input-line double-col">
<label>{{label}}</label>
<div>
<label><input type="radio" name="{{_id}}" value="1" checked="{{$eq value true}}" /> {{_ "True"}}</label>
<label><input type="radio" name="{{_id}}" value="0" checked="{{$eq value false}}" /> {{_ "False"}}</label>
</div>
{{#if description}}
<small>{{description}}</small>
{{/if}}
</div>
{{/if}}
{{#if $eq type 'color'}}
<div class="input-line double-col">
<label>{{label}}</label>
<div>
<input type="text" class="minicolors" name="{{_id}}" value="{{value}}" />
{{#if description}}
<small>{{description}}</small>
{{/if}}
{{/if}}
{{#if description}}
<div>
<small class="settings-description">{{description}}</small>
</div>
{{/if}}
</div>
</div>
{{/if}}
{{/each}}
{{#if section}}

@ -17,8 +17,8 @@
{{#unless isReady}}<i class="icon-spin4"></i>{{/unless}}
</div>
<input type="checkbox" name="room-type" value="c"> {{_ "Channels"}}
<input type="checkbox" name="room-type" value="d"> {{_ "Direct Messages"}}
<input type="checkbox" name="room-type" value="p"> {{_ "Private Groups"}}
<input type="checkbox" name="room-type" value="d"> {{_ "Direct_Messages"}}
<input type="checkbox" name="room-type" value="p"> {{_ "Private_Groups"}}
</form>
<div class="results">
{{{_ "Showing_results" roomCount}}}

@ -37,7 +37,7 @@ Template.adminUsers.onCreated ->
@filter = new ReactiveVar ''
@ready = new ReactiveVar true
RocketChat.TabBar.addButton({ id: 'invite-user', title: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 })
RocketChat.TabBar.addButton({ id: 'invite-user', i18nTitle: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 })
@autorun ->
filter = instance.filter.get()
@ -49,11 +49,11 @@ Template.adminUsers.onCreated ->
if Session.get 'adminSelectedUser'
channelSubscription = instance.subscribe 'userChannels', Session.get 'adminSelectedUser'
RocketChat.TabBar.setData Meteor.users.findOne Session.get 'adminSelectedUser'
RocketChat.TabBar.addButton({ id: 'user-info', title: t('User_Info'), icon: 'icon-user', template: 'adminUserInfo', order: 2 })
# RocketChat.TabBar.addButton({ id: 'user-channel', title: t('User_Channels'), icon: 'icon-hash', template: 'adminUserChannels', order: 3 })
RocketChat.TabBar.addButton({ id: 'user-info', i18nTitle: t('User_Info'), icon: 'icon-user', template: 'adminUserInfo', order: 2 })
# RocketChat.TabBar.addButton({ id: 'user-channel', i18nTitle: t('User_Channels'), icon: 'icon-hash', template: 'adminUserChannels', order: 3 })
else
RocketChat.TabBar.reset()
RocketChat.TabBar.addButton({ id: 'invite-user', title: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 })
RocketChat.TabBar.addButton({ id: 'invite-user', i18nTitle: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 })
@users = ->
filter = _.trim instance.filter?.get()

@ -25,15 +25,3 @@ Template.flexTabBar.events
RocketChat.TabBar.setTemplate $(e.currentTarget).data('template'), ->
$('.flex-tab')?.find("input[type='text']:first")?.focus()
$('.flex-tab .content')?.scrollTop(0)
# if Session.get('flexOpened') and Session.equals('whichFlexOpened', $(e.currentTarget).data('target'))
# Session.set('rtcLayoutmode', 0)
# Session.set('flexOpened',false)
# Session.set('whichFlexOpened')
# else
# $(e.currentTarget).addClass 'active'
# Session.set('flexOpened', true)
# Session.set('whichFlexOpened', $(e.currentTarget).data('target'))
# # $('.user-info-content').hide()
# # $($(e.currentTarget).attr('href')).show()

@ -4,22 +4,4 @@
<i class="{{icon}}"></i>
</div>
{{/each}}
{{!-- <div class="tab-button" data-target="messageSearch" title="Search">
<i class="icon-search" aria-label="{{_ "Search"}}"></i>
</div>
<div class="tab-button" data-target="membersList" title="Member List">
<i class="icon-users" aria-label="{{_ "Members_List"}}"></i>
</div> --}}
{{!-- <div class="tab-button" data-target="pinned-messages" title="Pinned Messages">
<i class="icon-pin"></i>
</div>
<div class="tab-button" data-target="room-files" title="Files">
<i class="icon-hdd"></i>
</div>
<div class="tab-button" data-target="chat-ops" title="ChatOps">
<i class="icon-code"></i>
</div>
<div class="tab-button" data-target="channel-settings" title="Channel Settings">
<i class="icon-cog"></i>
</div> --}}
</template>

@ -46,8 +46,16 @@ Template.message.helpers
system: ->
return 'system' if this.t in ['s', 'p', 'f', 'r', 'au', 'ru', 'ul', 'nu', 'wm', 'uj', 'rm']
edited: ->
return @ets and @t not in ['s', 'p', 'f', 'r', 'au', 'ru', 'ul', 'nu', 'wm', 'uj', 'rm']
edited: -> Template.instance().wasEdited?(@)
editTime: ->
return "" unless Template.instance().wasEdited?(@)
moment(@editedAt).format('LL hh:mma') #TODO profile pref for 12hr/24hr clock?
editedBy: ->
return "" unless Template.instance().wasEdited?(@)
# try to return the username of the editor,
# otherwise a special "?" character that will be
# rendered as a special avatar
return @editedBy?.username or "?"
pinned: ->
return this.pinned
canEdit: ->
@ -82,6 +90,10 @@ Template.message.helpers
else if @label
return @label
Template.message.onCreated ->
@wasEdited = (msg) ->
msg.editedAt? and msg.t not in ['s', 'p', 'f', 'r', 'au', 'ru', 'ul', 'nu', 'wm', 'uj', 'rm']
Template.message.onViewRendered = (context) ->
view = this
this._domrange.onAttached (domRange) ->

@ -3,9 +3,27 @@
<a class="thumb user-card-message" href="#" data-username="{{u.username}}" tabindex="1">{{> avatar username=u.username}}</a>
<a class="user user-card-message" href="#" data-username="{{u.username}}" tabindex="1">{{u.username}}</a>
<span class="info">
<span class="time">{{time}}</span>
{{#if edited}}
<span class="edited">({{_ "edited"}})</span>
<span
title='{{_ "edited"}} at {{editTime}} {{_ "by"}} {{editedBy}}'
class="time">
{{time}}
</span>
<span
class="edited"
title='{{_ "edited"}} at {{editTime}} {{_ "by"}} {{editedBy}}'>
<i class="icon-edit"></i>
{{_ "by"}}
<a
class="thumb thumb-small user-card-message"
href="#"
data-username="{{editedBy}}"
tabindex="1">
{{> avatar username=editedBy}}
</a>
</span>
{{else}}
<span class="time">{{time}}</span>
{{/if}}
{{#if private}}
<span class="private">{{_ "Only_you_can_see_this_message"}}</span>

@ -30,6 +30,9 @@ Template.privateHistory.helpers
when 'd'
return FlowRouter.path 'direct', { username: this.name }
Template.privateHistory.onRendered ->
RocketChat.TabBar.reset()
Template.privateHistory.events
'keydown #history-filter': (event) ->
if event.which is 13

@ -159,7 +159,7 @@ Template.room.helpers
else
return t('See_all')
getPupupConfig: ->
getPopupConfig: ->
template = Template.instance()
return {
getInput: ->
@ -188,7 +188,9 @@ Template.room.helpers
return !! ChatRoom.findOne { _id: @_id, t: 'c' }
canRecordAudio: ->
return RocketChat.settings.get('Message_AudioRecorderEnabled') and (navigator.getUserMedia? or navigator.webkitGetUserMedia?)
wavRegex = /audio\/wav|audio\/\*/i
wavEnabled = RocketChat.settings.get("FileUpload_MediaTypeWhiteList").match(wavRegex)
return RocketChat.settings.get('Message_AudioRecorderEnabled') and (navigator.getUserMedia? or navigator.webkitGetUserMedia?) and wavEnabled and RocketChat.settings.get('FileUpload_Enabled')
unreadSince: ->
room = ChatRoom.findOne(this._id, { reactive: false })

@ -86,7 +86,7 @@
<input type="file" accept="{{fileUploadAllowedMediaTypes}}">
</div>
<div class="input-message-container">
{{> messagePopupConfig getPupupConfig}}
{{> messagePopupConfig getPopupConfig}}
<textarea dir="auto" name="msg" maxlength="{{maxMessageLength}}" class="input-message autogrow-short" placeholder="{{_ 'Message'}}"></textarea>
</div>
@ -154,4 +154,4 @@
{{> Template.dynamic template=flexTemplate data=flexData}}
</section>
</div>
</template>
</template>

@ -1,5 +1,5 @@
<template name="roomSearch">
<i class="{{roomIcon}} {{userStatus}}"></i> {{username}}
<i class="{{roomIcon}} {{userStatus}}"></i> {{name}}
</template>
<template name="roomSearchEmpty">
<p>{{_ "Nothing_found"}}.</p>

@ -13,6 +13,10 @@ Template.channels.helpers
if !RocketChat.settings.get 'Disable_Favorite_Rooms'
query.f = { $ne: true }
if Meteor.user()?.settings?.preferences?.unreadRoomsMode
query.alert =
$ne: true
return ChatSubscription.find query, { sort: 't': 1, 'name': 1 }
Template.channels.events

@ -1,6 +1,12 @@
Template.directMessages.helpers
rooms: ->
return ChatSubscription.find { t: { $in: ['d']}, f: { $ne: true }, open: true }, { sort: 't': 1, 'name': 1 }
query = { t: { $in: ['d']}, f: { $ne: true }, open: true }
if Meteor.user()?.settings?.preferences?.unreadRoomsMode
query.alert =
$ne: true
return ChatSubscription.find query, { sort: 't': 1, 'name': 1 }
isActive: ->
return 'active' if ChatSubscription.findOne({ t: { $in: ['d']}, f: { $ne: true }, open: true, rid: Session.get('openedRoom') }, { fields: { _id: 1 } })?

@ -3,7 +3,13 @@ Template.privateGroups.helpers
return t('Members_placeholder')
rooms: ->
return ChatSubscription.find { t: { $in: ['p']}, f: { $ne: true }, open: true }, { sort: 't': 1, 'name': 1 }
query = { t: { $in: ['p']}, f: { $ne: true }, open: true }
if Meteor.user()?.settings?.preferences?.unreadRoomsMode
query.alert =
$ne: true
return ChatSubscription.find query, { sort: 't': 1, 'name': 1 }
total: ->
return ChatSubscription.find({ t: { $in: ['p']}, f: { $ne: true } }).count()

@ -93,7 +93,7 @@ Template.sideNav.onRendered ->
AccountBox.init()
wrapper = $('.rooms-list .wrapper').get(0)
lastLink = $('.rooms-list h3').get(0)
lastLink = $('.rooms-list h3.history-div').get(0)
RocketChat.roomTypes.getTypes().forEach (roomType) ->
if RocketChat.authz.hasRole(Meteor.userId(), roomType.roles) && Template[roomType.template]?

@ -38,7 +38,9 @@
</div>
<div class="rooms-list">
<div class="wrapper">
<h3>
{{ > unreadRooms }}
<h3 class="history-div">
<a href="{{pathFor 'privateHistory'}}">{{_ "History"}}</a>
</h3>
</div>

@ -1,6 +1,12 @@
Template.starredRooms.helpers
rooms: ->
return ChatSubscription.find { f: true, open: true }, { sort: 't': 1, 'name': 1 }
query = { f: true, open: true }
if Meteor.user()?.settings?.preferences?.unreadRoomsMode
query.alert =
$ne: true
return ChatSubscription.find query, { sort: 't': 1, 'name': 1 }
total: ->
return ChatSubscription.find({ f: true }).count()
isActive: ->

@ -0,0 +1,14 @@
Template.unreadRooms.helpers
hasUnread: ->
return 'has-unread' if Meteor.user()?.settings?.preferences?.unreadRoomsMode and Template.instance().unreadRooms.count() > 0
rooms: ->
return Template.instance().unreadRooms
Template.unreadRooms.onCreated ->
@autorun =>
query =
alert: true
open: true
@unreadRooms = ChatSubscription.find query, { sort: 't': 1, 'name': 1 }

@ -0,0 +1,13 @@
<template name="unreadRooms">
<div class="unread-rooms-mode {{hasUnread}}">
<h3>
{{_ "Unread_Rooms"}}
</h3>
<ul>
{{#each rooms}}
{{> chatRoomItem }}
{{/each}}
</ul>
</div>
</template>

@ -14,12 +14,11 @@ Template.spotlight.helpers
rules: [
{
collection: 'UserAndRoom'
subscription: 'roomSearch'
subscription: 'spotlight'
field: 'name'
template: Template.roomSearch
noMatchTemplate: Template.roomSearchEmpty
matchAll: true
filter: { uid: { $ne: Meteor.userId() } }
sort: 'name'
}
]
@ -43,4 +42,4 @@ Template.spotlight.events
event.currentTarget.value = ''
spotlight.hide()
spotlight.hide()

@ -1,9 +1,9 @@
Template.messageSearch.helpers
tSearchMessages: ->
return t('Search_Messages')
searchResult: ->
return Template.instance().searchResult.get()
searchResultMessages: ->
return Template.instance().searchResult.get()?.messages
Template.messageSearch.events
"keydown #message-search": (e) ->
@ -11,16 +11,21 @@ Template.messageSearch.events
e.preventDefault()
"keyup #message-search": _.debounce (e, t) ->
t.searchResult.set undefined
value = e.target.value.trim()
if value is ''
if value is '' and t.currentSearchTerm
t.currentSearchTerm = ''
t.searchResult.set undefined
return
else if value is t.currentSearchTerm
return
Tracker.nonreactive ->
Meteor.call 'messageSearch', value, Session.get('openedRoom'), (error, result) ->
if result? and (result.messages?.length > 0 or result.users?.length > 0 or result.channels?.length > 0)
t.searchResult.set result
, 1000
t.currentSearchTerm = value
, 500
Template.messageSearch.onCreated ->
this.currentSearchTerm = ''
this.searchResult = new ReactiveVar

@ -8,12 +8,10 @@
</div>
</form>
</div>
{{#if searchResult.messages}}
<ul>
{{#each searchResult.messages}}
{{#each searchResultMessages}}
{{#nrr nrrargs 'message' .}}{{/nrr}}
{{/each}}
</ul>
{{/if}}
</div>
</template>

@ -0,0 +1,13 @@
Template.fxOsInstallPrompt.onRendered ->
showPrompt = () ->
request = window.navigator.mozApps.install 'http://' + location.host + '/manifest.webapp'
request.onsuccess = () ->
# Save the App object that is returned
appRecord = this.result
BlazeLayout.render 'fxOsInstallDone'
request.onerror = () ->
# Display the error information from the DOMError object
BlazeLayout.render 'fxOsInstallError', {installError: this.error.name}
setTimeout(showPrompt, 2000);

@ -0,0 +1,48 @@
<template name="fxOsInstallPrompt">
<section class="full-page">
<div class="wrapper">
<header>
<a class="logo" href="/">
<img src="/images/logo/logo.svg?v=3" />
</a>
</header>
<div class="cms-page">
<h1>{{_ "Install_FxOs"}}</h1>
<p>{{_ "Install_FxOs_follow_instructions"}}</p>
</div>
</div>
</section>
</template>
<template name="fxOsInstallDone">
<section class="full-page">
<div class="wrapper">
<header>
<a class="logo" href="/">
<img src="/images/logo/logo.svg?v=3" />
</a>
</header>
<div class="cms-page">
<h1>{{_ "Install_FxOs"}}</h1>
<p>{{_ "Install_FxOs_done"}}</p>
</div>
</div>
</section>
</template>
<template name="fxOsInstallError">
<section class="full-page">
<div class="wrapper">
<header>
<a class="logo" href="/">
<img src="/images/logo/logo.svg?v=3" />
</a>
</header>
<div class="cms-page">
<h1>{{_ "Install_FxOs"}}</h1>
<p>{{_ "Install_FxOs_error"}}</p>
<p>{{installError}}</p>
</div>
</div>
</section>
</template>

@ -2,6 +2,9 @@ Template.loginForm.helpers
userName: ->
return Meteor.user()?.username
namePlaceholder: ->
return if RocketChat.settings.get 'Accounts_RequireNameForSignUp' then t('Name') else t('Name_optional')
showName: ->
return 'hidden' unless Template.instance().state.get() is 'register'
@ -129,7 +132,7 @@ Template.loginForm.onCreated ->
validationObj['pass'] = t('Invalid_pass')
if instance.state.get() is 'register'
unless formObj['name']
if RocketChat.settings.get 'Accounts_RequireNameForSignUp' and not formObj['name']
validationObj['name'] = t('Invalid_name')
if formObj['confirm-pass'] isnt formObj['pass']
validationObj['confirm-pass'] = t('Invalid_confirm_pass')

@ -15,7 +15,7 @@
{{/if}}
<div class="fields">
<div class='input-text active {{showName}}'>
<input type="text" name='name' placeholder='{{_ "Name"}}' dir="auto" />
<input type="text" name='name' placeholder='{{namePlaceholder}}' dir="auto" />
</div>
<div class='input-text active {{showEmailOrUsername}}'>
<input type="text" name='emailOrUsername' placeholder='{{_ "Email_or_username"}}' autocapitalize="off" autocorrect="off" />

@ -41,6 +41,7 @@
"Administration" : "Administration",
"All_channels" : "Alle Kanäle",
"Allow_Invalid_SelfSigned_Certs" : "Selbstsignierte SSL-Zertifikate für die Link-Validierung und die Vorschau zulassen",
"CDN_PREFIX" : "CDN Präfix",
"and" : "und",
"API" : "API",
"API_Analytics" : "Analytics",
@ -70,6 +71,7 @@
"Channels" : "Kanäle",
"Channels_list" : "Liste der öffentlichen Channels",
"Chat_Rooms" : "Chaträume",
"Clear_all_unreads_question" : "Alle ungelesenen löschen?",
"close" : "schließen",
"coming_soon" : "kommt bald",
"Commands" : "Befehle",
@ -133,6 +135,10 @@
"hours" : "Stunden",
"Incorrect_Password" : "Falsches Passwort",
"inline_code" : "inline_code",
"Install_FxOs" : "Installiere Rocket.Chat auf deinem Firefox",
"Install_FxOs_follow_instructions" : "Bitte bestätige die Installation der App (drücke \"Installieren\" in der Aufforderung).",
"Install_FxOs_done" : "Super! Du kannst Rocket.Chat nun über das Icon auf deinem Startbildschirm nutzen. Viel Spaß mit Rocket.Chat!",
"Install_FxOs_error" : "Schade, das hat leider nicht geklappt! Der folgende Fehler ist aufgetreten:",
"Invalid_confirm_pass" : "Die Passwörter stimmen nicht überein",
"Invalid_email" : "Email-Adresse ungültigt",
"Invalid_name" : "Der Name darf nicht leer sein",
@ -166,7 +172,7 @@
"Layout_Sidenav_Footer_description" : "Die Footer Größe ist 260x70",
"Layout_Terms_of_Service" : "Nutzungsbedingungen",
"LDAP" : "LDAP",
"LDAP_Dn" : "LDAP DN",
"LDAP_DN" : "LDAP DN",
"LDAP_Port" : "LDAP Port",
"LDAP_Url" : "LDAP URL",
"Leave_room" : "Raum verlassen",
@ -216,6 +222,7 @@
"My_Account" : "Mein Konto",
"n_messages" : "%s Nachrichten",
"Name" : "Name",
"Name_optional" : "Name (freiwillig)",
"Name_cant_be_empty" : "Name darf nicht leer sein",
"New_messages" : "Neue Nachrichten",
"New_password" : "Neues Passwort",
@ -314,6 +321,7 @@
"Site_Url" : "Website URL",
"Site_Url_Description" : "Beispiel: https://chat.domain.com/",
"SAML" : "SAML",
"SAML_Custom_Generate_Username" : "Benutzernamen generieren",
"SMTP" : "SMTP",
"SMTP_Host" : "SMTP Host",
"SMTP_Password" : "SMTP Passwort",
@ -395,6 +403,7 @@
"Welcome_to_the" : "Willkommen bei",
"With_whom" : "Mit wem?",
"Yes_delete_it" : "Ja, löschen!",
"Yes_clear_all" : "Ja, alles!",
"you_are_in_preview_mode_of" : "Sie sind im Vorschau-Modus des Kanals #<strong>__room_name__</strong>",
"You_need_confirm_email" : "Sie müssen Ihre Email bestätigen!",
"You_will_not_be_able_to_recover" : "Sie können es nicht wieder rückgängig machen!",

@ -111,7 +111,7 @@
"Last_message" : "Τελευταίο μήνυμα",
"Layout_Home_Body" : "Αρχική Σώμα",
"Layout_Home_Title" : "Αρχική Τίτλος",
"LDAP_Dn" : "LDAP DN",
"LDAP_DN" : "LDAP DN",
"LDAP_Port" : "LDAP Θύρα",
"LDAP_Url" : "LDAP URL",
"Leave_room" : "Έξοδος από το δωμάτιο",

@ -44,6 +44,7 @@
"Accounts_OAuth_Custom_Button_Label_Text" : "Button Text",
"Accounts_OAuth_Custom_Button_Label_Color" : "Button Text Color",
"Accounts_OAuth_Custom_Button_Color" : "Button Color",
"Accounts_RequireNameForSignUp" : "Require name for signup",
"Activate" : "Activate",
"Add_custom_oauth" : "Add custom oauth",
"Add_Members" : "Add Members",
@ -62,6 +63,7 @@
"are_typing" : "are typing",
"Are_you_sure" : "Are you sure?",
"Avatar_changed_successfully" : "Avatar changed successfully",
"Avatar_url_invalid_or_error" : "The url provided is invalid or not accessible. Please try again, but with a different url.",
"away" : "away",
"Away" : "Away",
"away_female" : "away",
@ -149,6 +151,10 @@
"hours" : "hours",
"Incorrect_Password" : "Incorrect Password",
"inline_code" : "inline_code",
"Install_FxOs" : "Install Rocket.Chat on your Firefox",
"Install_FxOs_follow_instructions" : "Please confirm the app installation on your device (press \"Install\" when prompted).",
"Install_FxOs_done" : "Great! You can now use Rocket.Chat via the icon on your homescreen. Have fun with Rocket.Chat!",
"Install_FxOs_error" : "Sorry, that did not work as intended! The following error appeared:",
"Invalid_confirm_pass" : "The password confirmation does not match password",
"Invalid_email" : "The e-mail entered is invalid",
"Invalid_name" : "The name must not be empty",
@ -182,11 +188,21 @@
"Layout_Sidenav_Footer_description" : "Footer size is 260 x 70px",
"Layout_Terms_of_Service" : "Terms of Service",
"LDAP" : "LDAP",
"LDAP_Description" : "LDAP is a heirarchical database that many companies use to provide single sign on - a facility for sharing one password between multiple sites and services. For advanced configuration information and examples, please consult our twiki: https://github.com/RocketChat/Rocket.Chat/wiki/LDAP-Authentication.",
"LDAP_Bind_Search" : "Bind Search",
"LDAP_Dn" : "Distinguished Name (DN)",
"LDAP_Bind_Search_Description" : "A piece of JSON that governs bind and connection info and is of the form {\"filter\": \"(&(objectCategory=person)(objectclass=user)(memberOf=CN=ROCKET_ACCESS,CN=Users,DC=domain,DC=com)(sAMAccountName=#{username}))\", \"scope\": \"sub\", \"userDN\": \"rocket.service@domain.com\", \"password\": \"urpass\"}",
"LDAP_DN" : "Distinguished Name (DN)",
"LDAP_DN_Description" : "Search root; example: dc=domain,dc=com",
"LDAP_Enable" : "Enable LDAP",
"LDAP_Enable_Description" : "Attempt to utilize ldap for authentication.",
"LDAP_Port" : "LDAP Port",
"LDAP_Port_Description" : "Port to access LDAP on; eg: 389",
"LDAP_Sync_User_Data" : "Sync Data",
"LDAP_Sync_User_Data_Description" : "Keep user data in sync with server on login (eg: name, email).",
"LDAP_Sync_User_Data_FieldMap" : "User data field map",
"LDAP_Sync_User_Data_FieldMap_Description" : "Allows configuring how to populate user account fields (like email) from a record in ldap (once found). As an example, {\"cn\":\"name\", \"mail\":\"email\"} will choose a persion's human readable name from the cn attribute, and their email from the mail attribute. Available fields include name, and email.",
"LDAP_Url" : "LDAP URL",
"LDAP_Url_Description" : "Uri of the ldap server; example: ldap://company.dns.com",
"Leave_room" : "Leave room",
"line" : "line",
"Load_more" : "Load more",
@ -209,6 +225,7 @@
"Message_AllowEditing_BlockEditInMinutes" : "Block Message Editing After (n) Minutes",
"Message_AllowEditing_BlockEditInMinutesDescription" : "Enter 0 to disable blocking",
"Message_AudioRecorderEnabled" : "Audio Recorder Enabled",
"Message_AudioRecorderEnabledDescription" : "For this to work upload of Wav files must be enabled in the 'File Upload' section",
"Message_deleting_not_allowed" : "Message deleting not allowed",
"Message_editing_not_allowed" : "Message editing not allowed",
"Message_editing_blocked" : "This message cannot be edited anymore",
@ -237,6 +254,7 @@
"My_Account" : "My Account",
"n_messages" : "%s messages",
"Name" : "Name",
"Name_optional" : "Name (optional)",
"Name_cant_be_empty" : "Name can't be empty",
"New_messages" : "New messages",
"New_password" : "New password",
@ -267,6 +285,7 @@
"Please_wait" : "Please wait",
"Please_wait_activation" : "Please wait, this can take some time.",
"Please_wait_statistics" : "Please wait, statistics are being generated.",
"Please_enter_value_for_url" : "Please enter a value for the url of your avatar.",
"Powered_by" : "Powered by",
"Preferences" : "Preferences",
"Preferences_saved" : "Preferences saved",
@ -381,6 +400,8 @@
"The_field_is_required" : "The field %s is required.",
"True" : "True",
"Unnamed" : "Unnamed",
"Unread_Rooms" : "Unread Rooms",
"Unread_Rooms_Mode" : "Unread Rooms Mode",
"Upload_file_question" : "Upload file?",
"Use_Emojis" : "Use Emojis",
"Use_initials_avatar" : "Use your username initials",
@ -388,6 +409,7 @@
"Use_service_avatar" : "Use %s avatar",
"Use_this_username" : "Use this username",
"Use_uploaded_avatar" : "Use uploaded avatar",
"Use_url_for_avatar" : "Use url for avatar",
"User_added" : "User <em>__user_added__</em> added.",
"User_added_by" : "User <em>__user_added__</em> added by <em>__user_by__</em>.",
"User_Channels" : "User Channels",
@ -402,9 +424,9 @@
"User_joined_channel" : "Has joined the channel.",
"User_joined_channel_female" : "Has joined the channel.",
"User_joined_channel_male" : "Has joined the channel.",
"User_left" : "User <em>__user_left__</em> left.",
"User_left_female" : "User <em>__user_left__</em> left.",
"User_left_male" : "User <em>__user_left__</em> left.",
"User_left" : "Has left the channel.",
"User_left_female" : "Has left the channel.",
"User_left_male" : "Has left the channel.",
"User_logged_out" : "User is logged out",
"User_not_found_or_incorrect_password" : "User not found or incorrect password",
"User_removed_by" : "User <em>__user_removed__</em> removed by <em>__user_by__</em>.",
@ -431,4 +453,4 @@
"You_will_not_be_able_to_recover" : "You will not be able to recover this message!",
"Your_entry_has_been_deleted" : "Your entry has been deleted.",
"Your_Open_Source_solution" : "Your own Open Source chat solution"
}
}

@ -1,6 +1,7 @@
{
"Access_online_demo" : "Accede a la demo en línea",
"Access_Online_Demo" : "Accede a la demo online",
"Add_Members" : "Agregar miembros",
"Add_users" : "Añadir usuarios",
"All_channels" : "Todos los canales",
"and" : "y",
@ -10,6 +11,7 @@
"away" : "lejos",
"Away" : "Lejos",
"Back_to_login" : "Volver a identificarse",
"bold" : "negrita",
"busy" : "ocupado",
"Busy" : "Ocupado",
"Cancel" : "Cancelar",
@ -23,15 +25,17 @@
"Contact" : "Contacto",
"Conversation" : "Conversación",
"Create_new" : "Crear nuevo",
"Create_new_direct_message_room" : "Crear una sala de mensajes directos",
"Create_new_private_group" : "Crear un nuevo grupo privado",
"Create_new_public_channel" : "Crear un nuevo canal público",
"Created_at" : "Creado en",
"Deleted" : "¡Eliminar!",
"Direct_Messages" : "Mensajes Directos",
"edited" : "Editado",
"Email_or_username" : "Correo electrónico o nombre de usuario",
"Email_verified" : "Correo electrónico verificado",
"Enter_info" : "Introduce tus datos de acceso",
"Error_changing_password" : "Contraseña cambiada",
"Error_changing_password" : "Error al cambiar de contraseña",
"Favorites" : "Favoritas",
"Follow_social_profiles" : "Sigue nuestros perfiles sociales, realiza un fork en github y comparte tus pensamientos acerca de la aplicación rocket.chat en nuestro tablero de Trello.",
"Forgot_password" : "Olvidaste tu contraseña",
@ -50,6 +54,8 @@
"Invisible" : "Invisible",
"is_also_typing" : "está también escribiendo",
"is_typing" : "está escribiendo",
"italics" : "cursiva",
"join" : "Unirse",
"Join_the_Community" : "Únete a la Comunidad",
"Language" : "Idioma",
"Language_Version" : "Versión en Inglés",
@ -68,6 +74,7 @@
"Msgs" : "Mensajes",
"n_messages" : "%s mensajes",
"Name" : "Nombre",
"Name_optional" : "Nombre (opcional)",
"New_messages" : "Nuevos mensajes",
"New_password" : "Nueva contraseña",
"No_channels_yet" : "Todavía no eres parte de un canal.",
@ -87,6 +94,7 @@
"Private_Groups" : "Grupos Privados",
"Proudly_developed" : "Orgullosamente desarrollado con Meteor",
"Quick_Search" : "Búsqueda rápida",
"quote" : "cita",
"Recents" : "Recientes",
"Register" : "Registrar una nueva cuenta",
"Remember_me" : "Recuérdame",
@ -119,6 +127,7 @@
"Use_uploaded_avatar" : "Utilizar avatar subido",
"User_added" : "Usuario <em>__user_added__</em> añadido.",
"User_added_by" : "El usuario <em>__user_added__</em> ha sido añadido por <em>__user_by__</em>.",
"User_joined_channel" : "Se ha unido al canal.",
"User_left" : "Usuario <em>__user_left__</em> ha salido.",
"User_logged_out" : "El usuario está desconectado",
"User_removed_by" : "El usuario <em>__user_removed__</em> ha sido eliminado por <em>__user_by__</em>.",
@ -134,6 +143,8 @@
"Welcome" : "Bienvenido <em>%s</em>.",
"Welcome_to_the" : "Bienvenido a la",
"With_whom" : "Con quien",
"Yes_delete_it" : "¡Sí, eliminarla!",
"you_are_in_preview_mode_of" : "Estás en modo vista previa del canal #<strong>__room_name__</strong>",
"You_need_confirm_email" : "¡Es necesario confirmar tu correo electrónico para poder identificarte!",
"Your_Open_Source_solution" : "Tu propia solución de chat de código abierto"
}

@ -2,28 +2,38 @@
"Access_online_demo" : "Access the online demo",
"Access_Online_Demo" : "Access the Online Demo",
"Accounts" : "Tilit",
"Accounts_AllowedDomainsList" : "Pilkkueroteltu lista sallituista domaineista",
"Accounts_AllowUsernameChange" : "Salli käyttäjätunnuksen muuttaminen",
"Accounts_AllowPasswordChange" : "Salli salasanan vaihto",
"Accounts_AvatarResize" : "Muuta avatarien kokoa",
"Accounts_AvatarSize" : "Avatarin koko",
"Accounts_AvatarStorePath" : "Avatarin tallennuspolku",
"Accounts_AvatarStoreType" : "Avatarien tallennusmuoto",
"Accounts_denyUnverifiedEmail" : "Estä vahvistamaton sähköpostiosoite",
"Accounts_EmailVerification" : "Sähköpostiosoitteen varmistaminen",
"Accounts_OAuth_Facebook" : "Facebook-tunnus",
"Accounts_OAuth_Facebook_id" : "Facebook App Id",
"Accounts_OAuth_Facebook_secret" : "Facebook salalauseke",
"Accounts_OAuth_Github" : "GitHub-tunnus",
"Accounts_OAuth_Github_id" : "GitHub ID",
"Accounts_OAuth_Github_secret" : "GitHub salalauseke",
"Accounts_OAuth_Facebook_secret" : "Facebook Secret",
"Accounts_OAuth_Github" : "OAuth Käytössä",
"Accounts_OAuth_Github_id" : "Client ID",
"Accounts_OAuth_Github_secret" : "Client Secret",
"Accounts_OAuth_Gitlab" : "OAuth käytössä",
"Accounts_OAuth_Gitlab_id" : "Gitlab Id",
"Accounts_OAuth_Gitlab_secret" : "Client Secret",
"Accounts_OAuth_Google" : "Google-tunnus",
"Accounts_OAuth_Google_id" : "Google ID",
"Accounts_OAuth_Google_secret" : "Google salalauseke",
"Accounts_OAuth_Google_secret" : "Google Secret",
"Accounts_OAuth_Linkedin" : "LinkedIn-tunnus",
"Accounts_OAuth_Linkedin_id" : "LinkedIn ID",
"Accounts_OAuth_Linkedin_secret" : "LinkedIn salalauseke",
"Accounts_OAuth_Linkedin_secret" : "LinkedIn Secret",
"Accounts_OAuth_Meteor" : "Meteor-tunnus",
"Accounts_OAuth_Meteor_id" : "Meteor ID",
"Accounts_OAuth_Meteor_secret" : "Meteor salalauseke",
"Accounts_OAuth_Meteor_secret" : "Meteor Secret",
"Accounts_ManuallyApproveNewUsers" : "Hyväksy uudet käyttäjät manuaalisesti",
"Accounts_RegistrationRequired" : "Rekisteröinti vaaditaan",
"Accounts_OAuth_Twitter" : "Twitter-tunnus",
"Accounts_OAuth_Twitter_id" : "Twitter ID",
"Accounts_OAuth_Twitter_secret" : "Twitter salalauseke",
"Accounts_OAuth_Twitter_secret" : "Twitter Secret",
"Accounts_OAuth_Custom_id" : "Id",
"Accounts_OAuth_Custom_URL" : "URL",
"Accounts_OAuth_Custom_Token_Path" : "Token polku",
@ -34,6 +44,7 @@
"Accounts_OAuth_Custom_Button_Label_Text" : "Painikkeen teksti",
"Accounts_OAuth_Custom_Button_Label_Color" : "Painikkeen tekstin väri",
"Accounts_OAuth_Custom_Button_Color" : "Painikkeen väri",
"Accounts_RequireNameForSignUp" : "Vaadi nimi rekisteröityessä",
"Activate" : "Aktivoi",
"Add_custom_oauth" : "Lisää mukautettu oauth",
"Add_Members" : "Lisää osallistujia",
@ -41,14 +52,18 @@
"Administration" : "Ylläpito",
"All_channels" : "Kaikki kanavat",
"Allow_Invalid_SelfSigned_Certs" : "Salli virheelliset ja itse allekirjoitetut SSL varmenteet linkin validointiin ja esikatseluihin",
"CDN_PREFIX" : "CDN etuliite",
"and" : "ja",
"API" : "API",
"API_Analytics" : "Analytics",
"API_Embed" : "Upota",
"API_EmbedDisabledFor" : "Poista upotustoiminto käyttäjiltä",
"API_EmbedDisabledFor_Description" : "Pilkkueroteltu lista käyttäjätunnuksista",
"are_also_typing" : "kirjoittavat myös",
"are_typing" : "kirjoittavat",
"Are_you_sure" : "Oletko varma?",
"Avatar_changed_successfully" : "Avatar vaihdettu onnistuneesti",
"Avatar_url_invalid_or_error" : "URL on virheellinen tai ei ole käytettävissä. Yritä uudestaan.",
"away" : "poissa",
"Away" : "Poissa",
"away_female" : "poissa",
@ -69,9 +84,11 @@
"Channels" : "Kanavat",
"Channels_list" : "Julkiset kanavat",
"Chat_Rooms" : "Chathuoneet",
"Clear_all_unreads_question" : "Tyhjennä kaikki lukemattomat?",
"close" : "sulje",
"coming_soon" : "tulossa",
"Commands" : "Komennot",
"Compact_View" : "Suppea näkymä",
"Confirm_password" : "Vahvista salasanasi",
"Contact" : "Yhteys",
"Conversation" : "Keskustelu",
@ -82,14 +99,18 @@
"Create_new_public_channel" : "Luo uusi julkinen kanava",
"Created_at" : "Luotu",
"Custom_oauth_unique_name" : "Mukautettu oauth yksilöllinen nimi",
"Custom_oauth_helper" : "Kun perustat OAuth Provider, sinun täytyy ilmoittaa Callback URL. Käytä <pre>%s</pre>.",
"Custom_oauth_helper" : "Kun perustat OAuth Providerin, sinun täytyy ilmoittaa Callback URL. Käytä <pre>%s</pre>.",
"days" : "päivää",
"Deactivate" : "Deaktivoi",
"Delete_User_Warning" : "Käyttäjän poistaminen poistaa myös käyttäjän kaikki viestit. Toimintoa ei voi perua.",
"Delete_Room_Warning" : "Huomeen poistaminen poistaa kaikki huoneessa olevat viestit.\nToimintoa ei voi perua.",
"Delete" : "Poista",
"Deleted" : "Poistettu!",
"Desktop_Notifications" : "Työpöytäilmoituksia",
"Desktop_Notifications_Disabled" : "Työpöytäilmoitukset eivät ole käytössä. Muuta selaimen asetuksia mikäli haluat ilmoitukset käyttöön.",
"Desktop_Notifications_Enabled" : "Työpöytäilmoitukset ovat käytössä.",
"Direct_Messages" : "Yksityisviestit",
"Disable_Favorite_Rooms" : "Poista käytöstä suosikit",
"Disable_Favorite_Rooms" : "Poista Suosikit käytöstä",
"Disable_New_Message_Notification" : "Poista uuden viestin ilmoitus käytöstä",
"Disable_New_Room_Notification" : "Poista uuden huoneen ilmoitus käytöstä",
"Drop_to_upload_file" : "Vedä ja pudota lähettääksesi tiedoston",
@ -102,16 +123,23 @@
"Email_or_username" : "Sähköpostiosoite tai käyttäjänimi",
"Email_verified" : "Sähköpostiosoite vahvistettu",
"Emoji" : "Emoji",
"Enable_Desktop_Notifications" : "Ota työpöytäilmoitukset käyttöön",
"Enter_info" : "Syötä kirjautumistietosi",
"Enter_to" : "Astu sisään",
"Error_changing_password" : "Virhe vaihtaessa salasanaa",
"Error_too_many_requests" : "Virhe, liikaa pyyntöjä. Rauhoitu hieman.\nOdota %s sekuntia ennen uudelleenyritystä.",
"Esc_to" : "Poistu",
"False" : "Ei",
"Favorites" : "Suosikit",
"FileUpload" : "Lähetä tiedosto",
"FileUpload_Enabled" : "Tiedostojen lähetykset käytössä",
"FileUpload_MaxFileSize" : "Suurin lähetettävän tiedoston koko (tavuina)",
"FileUpload_MediaTypeWhiteList" : "Hyväksytyt mediatyypit",
"FileUpload_MediaTypeWhiteListDescription" : "Pilkkueroteltu lista mediatyypeistä",
"Follow_social_profiles" : "Seuraa someamme, forkkaa Githubissa ja jaa ajatuksiasi rocket.chatista trellossa.",
"Forgot_password" : "Unohditko salasanasi?",
"Fork_it_on_github" : "Forkkaa GitHubissa",
"From_Email" : "Sähköpostilta",
"From_Email" : "Sähköpostista",
"General" : "Yleinen",
"Get_to_know_the_team" : "Tutustu Rocket.Teamiin",
"github_no_public_email" : "GitHub-tunnukseltasi ei löydy julkisia sähköpostiosoitetietoja",
@ -123,6 +151,10 @@
"hours" : "tuntia",
"Incorrect_Password" : "Väärä salasana",
"inline_code" : "koodi",
"Install_FxOs" : "Asenna Rocket.Chat Firefoxiisi",
"Install_FxOs_follow_instructions" : "Vahvista sovelluksen asennus laitteellasi (paina \"Install\" käskettäessä)",
"Install_FxOs_done" : "Hienoa! Voit käyttää nyt Rocket.Chatiä etusivulla olevan kuvakkeen kautta. Pidä kivaa!",
"Install_FxOs_error" : "Pahoittelut, asennus ei onnistunut, seuraava virhe ilmeni:",
"Invalid_confirm_pass" : "Salasanat eivät täsmää",
"Invalid_email" : "Annettu sähköpostiosoite ei ole oikea",
"Invalid_name" : "Nimi ei voi olla tyhjä",
@ -131,7 +163,7 @@
"invisible" : "näkymätön",
"Invisible" : "Näkymätön",
"Invitation_HTML" : "Kutsu HTML",
"Invitation_Subject" : "Kutsu aihe",
"Invitation_Subject" : "Kutsun aihe",
"Invite_Users" : "Kutsu käyttäjiä",
"is_also_typing" : "kirjoittaa myös",
"is_also_typing_female" : "kirjoittaa myös",
@ -146,7 +178,7 @@
"Language_Version" : "Suomi",
"Last_login" : "Viimeisin kirjautuminen",
"Last_message" : "Viimeinen viesti",
"Layout" : "Layout",
"Layout" : "Ulkoasu",
"Layout_Home_Body" : "Etusivun runko",
"Layout_Home_Title" : "Etusivun otsikko",
"Layout_Login_Header" : "Kirjautumisruudun ylätunniste",
@ -156,11 +188,23 @@
"Layout_Sidenav_Footer_description" : "Alatunnisteen koko on 260x70",
"Layout_Terms_of_Service" : "Käyttöehdot",
"LDAP" : "LDAP",
"LDAP_Dn" : "LDAP DN",
"LDAP_Description" : "LDAP on laajasti käytössä oleva hierarkinen tietokantapalvelu, jolla organisaatioiden palveluille mahdollistetaan kertakirjautuminen (SSO).\nMääritystiedot ja esimerkit, katso wiki: https://github.com/RocketChat/Rocket.Chat/wiki/LDAP-Authentication",
"LDAP_Bind_Search" : "Bind haku",
"LDAP_Bind_Search_Description" : "JSON, joka määrää yhdistämistiedot.\nMuoto: {\"filter\": \"(&(objectCategory=person)(objectclass=user)(memberOf=CN=ROCKET_ACCESS,CN=Users,DC=domain,DC=com)(sAMAccountName=#{username}))\", \"scope\": \"sub\", \"userDN\": \"rocket.service@domain.com\", \"password\": \"urpass\"}",
"LDAP_DN" : "LDAP DN",
"LDAP_DN_Description" : "Etsintäpolku, esimerkiksi: dc = domain, dc = com",
"LDAP_Enable" : "Kytke LDAP päälle",
"LDAP_Enable_Description" : "Käytä LDAPia autentikointiin",
"LDAP_Port" : "LDAP portti",
"LDAP_Port_Description" : "LDAP-portti (esim 389)",
"LDAP_Sync_User_Data" : "Synkronoi käyttäjädata",
"LDAP_Sync_User_Data_Description" : "Pidä käyttäjädata synkronoituna palvelimelta kirjautumishetkellä (esim nimi, sähköposti)",
"LDAP_Sync_User_Data_FieldMap" : "Käyttäjätietojen kohdistus",
"LDAP_Sync_User_Data_FieldMap_Description" : "Määrittää, miten käyttäjätietojen kentät tuodaan LDAP-palvelimelta.\nEsimerkiksi, {\"cn\":\"name\", \"mail\":\"email\"} -määritys tuo käyttäjän nimen cn-tiedosta ja sähköpostin email-tiedosta. Käytettävissä olevat kentät ovat \"name\" ja \"email\".",
"LDAP_Url" : "LDAP URL",
"LDAP_Url_Description" : "LDAP-palvelimen URI, esimerkiksi: ldap://company.example.com",
"Leave_room" : "Poistu kanavalta",
"line" : "viiva",
"line" : "riviä",
"Load_more" : "Lataa lisää",
"Loading_more_from_history" : "Ladataan lisää historiasta",
"Loading..." : "Ladataan...",
@ -171,13 +215,17 @@
"Logout" : "Kirjaudu ulos",
"Make_Admin" : "Tee ylläpitäjäksi",
"Mark_as_read" : "Merkitse luetuksi",
"Markdown_Headers" : "Markdown otsikot",
"Members" : "Jäsenet",
"Members_List" : "Jäsenlista",
"Members_placeholder" : "Jäsenet",
"Message" : "Viesti",
"Message_AllowDeleting" : "Salli viestin poisto",
"Message_AllowEditing" : "Salli viestin muokkaus",
"Message_AllowEditing_BlockEditInMinutes" : "Estä viestin muokkaus jälkeen (minuuteissa - 0 poistaa käytöstä)",
"Message_AllowEditing_BlockEditInMinutes" : "Estä viestin muokkaus (x) minuutin jälkeen",
"Message_AllowEditing_BlockEditInMinutesDescription" : "Syötä 0 poistaaksesi muutoseston",
"Message_AudioRecorderEnabled" : "Äänentallennin käytössä",
"Message_AudioRecorderEnabledDescription" : "Jotta tämä toimisi, WAV-tiedostojen lähetys tulee olla sallittu",
"Message_deleting_not_allowed" : "Viestin poisto ei sallittu",
"Message_editing_not_allowed" : "Viestin muokkaus ei sallittu",
"Message_editing_blocked" : "Tätä viestiä ei voi muokata enää.",
@ -189,28 +237,31 @@
"Message_pinned" : "Viesti kiinnitetty",
"Message_ShowDeletedStatus" : "Näytä poistotila",
"Message_ShowEditedStatus" : "Näytä muokkaustila",
"Message_ShowFormattingTips" : "Näytä muotoiluvihjeet",
"Messages" : "Viestit",
"Meta" : "Meta",
"Meta_fb_app_id" : "Facebook APP ID",
"Meta_google-site-verification" : "Google sivuston vahvistaminen",
"Meta_google-site-verification" : "Google Site Verification",
"Meta_language" : "Kieli",
"Meta_msvalidate01" : "MSValidate.01",
"Meta_robots" : "Hakurobotit",
"minutes" : "minuuttia",
"More_channels" : "Lisää kanavia",
"More_groups" : "Lisää yksityisiä ryhmiä",
"More_groups" : "Lisää privaattiryhmiä",
"More_unreads" : "Lisää lukemattomia",
"Msgs" : "Viestit",
"multi" : "moni",
"multi" : "monta",
"My_Account" : "Käyttäjätilini",
"n_messages" : "%s viestiä",
"Name" : "Nimi",
"Name_optional" : "Nimi (valinnainen)",
"Name_cant_be_empty" : "Nimi ei voi olla tyhjä",
"New_messages" : "Uusia viestejä",
"New_password" : "Uusi salasana",
"No_channels_yet" : "Et ole vielä millään kanavalla.",
"No_direct_messages_yet" : "Et ole vielä aloittanut mitään keskustelua.",
"No_favorites_yet" : "Et ole vielä lisännyt suosikkeja.",
"No_groups_yet" : "Sinulla ei ole vielä yksityisviestikeskusteluja.",
"No_groups_yet" : "Sinulla ei ole vielä privaattiryhmiä.",
"No_permission_to_view_room" : "Sinulla ei ole oikeutta katsella tätä",
"No_channel_with_name_%s_was_found" : "Kanavaa nimeltä '%s' ei löytynyt!",
"No_group_with_name_%s_was_found" : "Privaattiryhmää '%s' ei löytynyt!",
@ -229,28 +280,32 @@
"others" : "muut",
"Password" : "Salasana",
"Password_changed_successfully" : "Salasana vaihdettu",
"Password_Change_Disabled" : "Rocket.Chat ylläpitäjäsi on poistanut salasanan vaihtamismahdollisuuden",
"People" : "Ihmiset",
"Please_wait" : "Odota hetki",
"Please_wait_activation" : "Odota, tämä voi kestää jonkin aikaa.",
"Please_wait_statistics" : "Odota, tilastoja generoidaan.",
"Please_enter_value_for_url" : "Anna avatarisi URL",
"Powered_by" : "Powered by",
"Preferences" : "Asetukset",
"Preferences_saved" : "Asetukset tallennettu",
"Privacy" : "Yksityisyys",
"Private_Groups" : "Yksityisviestikeskustelut",
"Private_Groups_list" : "Luettelo yksityisistä ryhmistä",
"Private_Groups" : "Privaatiryhmät",
"Private_Groups_list" : "Privaattiryhmäluettelo",
"Profile" : "Profiili",
"Profile_saved_successfully" : "Profiili tallennettu onnistuneesti",
"Proudly_developed" : "Proudly developed with Meteor",
"Push" : "Työnnä",
"Push" : "Push",
"Push_apn_cert" : "APN Cert",
"Push_apn_dev_cert" : "APN Cert (kehitys)",
"Push_apn_dev_key" : "APN Avain (kehitys)",
"Push_apn_dev_passphrase" : "APN Tunnuslause (kehitys)",
"Push_apn_key" : "APN Avain",
"Push_apn_passphrase" : "APN Tunnuslause",
"Push_apn_dev_key" : "APN Key (kehitys)",
"Push_apn_dev_passphrase" : "APN Passphrase (kehitys)",
"Push_apn_key" : "APN Key",
"Push_apn_passphrase" : "APN Passphrase",
"Push_debug" : "Debug",
"Push_enable" : "Kytke päälle",
"Push_gcm_api_key" : "GCM API Key",
"Push_gcm_project_number" : "GCM Project Number",
"Push_production" : "Tuotanto",
"Quick_Search" : "Pikaetsintä",
"quote" : "lainaus",
@ -272,7 +327,7 @@
"room_user_count" : "%s käyttäjää",
"Rooms" : "Huoneet",
"Save" : "Tallenna",
"Save_changes" : "Tallenna",
"Save_changes" : "Tallenna muutokset",
"Save_Mobile_Bandwidth" : "Säästä kaistaa mobiilissa",
"Search" : "Etsi",
"Search_Messages" : "Etsi viestejä",
@ -286,8 +341,8 @@
"Selected_users" : "Valitut käyttäjät",
"Send" : "Lähetä",
"Send_confirmation_email" : "Lähetä vahvistussähköposti",
"Send_invitation_email" : "Lähetä kutsu sähköposti",
"Send_invitation_email_error" : "Et ole antanyt yhtään pätevää sähköpostiosoitetta.",
"Send_invitation_email" : "Lähetä kutsusähköposti",
"Send_invitation_email_error" : "Et ole antanyt yhtään validia sähköpostiosoitetta.",
"Send_invitation_email_info" : "Voit lähettää useita sähköpostikutsuja kerralla.",
"Send_invitation_email_success" : "Olet onnistuneesti lähettänyt sähköpostikutsun seuraaviin osoitteisiin:",
"Send_invitation_email_warning" : "Lähettääksesi sähköpostikutsuja, sinun täytyy ensin tehdä SMTP asetukset.",
@ -299,7 +354,14 @@
"Silence" : "Hiljaisuus",
"since_creation" : "%s saakka",
"Site_Name" : "Sivuston nimi:",
"Site_Url" : "Sivuston URL-osoite",
"Site_Url_Description" : "Esimerkiksi: https://chat.domain.com/",
"SAML" : "SAML",
"SAML_Custom_Cert" : "Custom sertifikaatti",
"SAML_Custom_Entry_point" : "Custom Entry Point",
"SAML_Custom_Generate_Username" : "Generoi käyttäjätunnus",
"SAML_Custom_Issuer" : "Custom Issuer",
"SAML_Custom_Provider" : "Custom Provider",
"SMTP" : "SMTP",
"SMTP_Host" : "SMTP-palvelin",
"SMTP_Password" : "SMTP Salasana",
@ -338,6 +400,8 @@
"The_field_is_required" : "Kenttä %s vaaditaan.",
"True" : "Kyllä",
"Unnamed" : "Nimetön",
"Unread_Rooms" : "Lukemattomia",
"Unread_Rooms_Mode" : "Lukemattomien tila",
"Upload_file_question" : "Lähetä tiedosto?",
"Use_Emojis" : "Käytä Emojia",
"Use_initials_avatar" : "Käytä käyttäjätunnuksen nimikirjaimia",
@ -345,12 +409,14 @@
"Use_service_avatar" : "Käytä %s avataria",
"Use_this_username" : "Käytä tätä käyttäjänimieä",
"Use_uploaded_avatar" : "Käytä ladattua avataria",
"Use_url_for_avatar" : "Käytä avatar-URLia",
"User_added" : "Käyttäjä <em>__user_added__</em> lisätty.",
"User_added_by" : "Käyttäjä <em>__user_added__</em> lisätty <em>__user_by__</em> toimesta.",
"User_Channels" : "Käyttäjän kanavat",
"User_has_been_activated" : "Käyttäjä on aktivoitu",
"Username_Change_Disabled" : "Rocket.Chat ylläpitäjäsi on poistanut käyttäjätunnuksen vaihtamismahdollisuuden",
"User_has_been_deactivated" : "Käyttäjä on deaktivoitu",
"User_has_been_deleted" : "Käyttä",
"User_has_been_deleted" : "Käyttäjä on poistettu",
"User_Info" : "Käyttäjän tiedot",
"User_is_no_longer_an_admin" : "Käyttäjä ei ole enää ylläpitäjä",
"User_is_not_activated" : "Käyttäjää ei ole aktivoitu",
@ -358,12 +424,13 @@
"User_joined_channel" : "Liittyi kanavalle.",
"User_joined_channel_female" : "Liittyi kanavalle.",
"User_joined_channel_male" : "Liittyi kanavalle.",
"User_left" : "Käyttäjä <em>__user_left__</em> poistui.",
"User_left_female" : "Käyttäjä <em>__user_left__</em> poistui.",
"User_left_male" : "Käyttäjä <em>__user_left__</em> poistui.",
"User_left" : "Käyttäjä poistui kanavalta.",
"User_left_female" : "Käyttäjä poistui kanavalta.",
"User_left_male" : "Käyttäjä poistui kanavalta.",
"User_logged_out" : "Käyttäjä on kirjautunut ulos",
"User_not_found_or_incorrect_password" : "Käyttäjää ei löydy tai väärä salasana",
"User_removed_by" : "Käyttäjä <em>__user_removed__</em> poistettu <em>__user_by__</em> toimesta.",
"User_Settings" : "Käyttäjä",
"User_Settings" : "Käyttäjän asetukset",
"User_updated_successfully" : "Käyttäjän tiedot päivitetty",
"Users" : "Käyttäjät",
"Username" : "Käyttäjänimi",
@ -380,9 +447,10 @@
"Welcome_to_the" : "Tervetuloa",
"With_whom" : "kanssa",
"Yes_delete_it" : "Kyllä, poista!",
"Yes_clear_all" : "Jep, tyhjennä kaikki!",
"you_are_in_preview_mode_of" : "Tämä on kanavan #<strong>__room_name__</strong> esikatselutila",
"You_need_confirm_email" : "Sinun tulee vahvistaa sähköpostiosoitteesi!",
"You_will_not_be_able_to_recover" : "Palauttaminen ei ole mahdollista!",
"You_will_not_be_able_to_recover" : "Viestin palauttaminen ei ole mahdollista!",
"Your_entry_has_been_deleted" : "Your entry has been deleted.",
"Your_Open_Source_solution" : "Your own Open Source chat solution"
}

@ -160,7 +160,7 @@
"Layout_Sidenav_Footer_description" : "La taille du pied de page est 260x70",
"Layout_Terms_of_Service" : "Conditions de service",
"LDAP" : "LDAP",
"LDAP_Dn" : "DN LDAP",
"LDAP_DN" : "DN LDAP",
"LDAP_Port" : "Port LDAP",
"LDAP_Url" : "Adresse LDAP",
"Leave_room" : "Quitter le salon",
@ -209,6 +209,7 @@
"My_Account" : "Mon compte",
"n_messages" : "%s messages",
"Name" : "Nom",
"Name_optional" : "Nom (optionnel)",
"Name_cant_be_empty" : "Le nom ne peut pas être vide",
"New_messages" : "Nouveaux messages",
"New_password" : "Nouveau mot de passe",

@ -2,6 +2,9 @@
"Access_online_demo" : "Pristupi online demonstraciji",
"Access_Online_Demo" : "Pristupi Online demonstraciji",
"Accounts" : "Računi",
"Accounts_AllowUsernameChange" : "Dopusti promjenu korisničkog imena",
"Accounts_AllowPasswordChange" : "Dopusti promjenu lozinke",
"Accounts_AvatarSize" : "Veličina Avatara",
"Accounts_denyUnverifiedEmail" : "Odbij neprovjereni e-mail",
"Accounts_EmailVerification" : "E-mail Verifikacija",
"Accounts_OAuth_Facebook" : "Facebook prijava",
@ -61,6 +64,7 @@
"days" : "dana",
"Deactivate" : "Isključi",
"Delete_User_Warning" : "Brisanje korisnika će izbrisati i sve poruke od tog korisnika. Ovo se ne može poništiti.",
"Delete_Room_Warning" : "Brisanje sobe će obrisati sve poruke u toj sobi. Ovo se ne može poništiti.",
"Delete" : "Obriši",
"Deleted" : "Obrisano!",
"Direct_Messages" : "Izravne Poruke",
@ -93,7 +97,9 @@
"Hide_room" : "Sakrij sobu",
"History" : "Povijest",
"hours" : "sati",
"Incorrect_Password" : "Netočna lozinka",
"inline_code" : "jednolinijski kôd",
"Install_FxOs" : "Instalirajte Rocket.Chat na svoj Firefox",
"Invalid_confirm_pass" : "Potvrda lozinke se ne slaže sa lozinkom",
"Invalid_email" : "Uneseni e-mail nije valjan",
"Invalid_name" : "Ime ne smije biti prazno",
@ -148,6 +154,7 @@
"Message_pinned" : "Poruka je pribodena",
"Message_ShowDeletedStatus" : "Pokaži Izbrisan status",
"Message_ShowEditedStatus" : "Prikaži uređeni status",
"Messages" : "Poruke",
"Meta" : "Meta",
"Meta_fb_app_id" : "Facebook App-ID",
"Meta_language" : "Jezik",
@ -176,6 +183,7 @@
"Not_found_or_not_allowed" : "Nije Nađeno ili Nije Dozvoljeno",
"Nothing_found" : "Ništa nije nađeno",
"Notify_all_in_this_room" : "Obavijesti sve u ovoj sobi",
"Old_Password" : "Stara Lozinka",
"Only_you_can_see_this_message" : "Samo ti možeš vidjeti ovu poruku",
"Online" : "Online",
"Oops!" : "Ups",
@ -183,6 +191,8 @@
"others" : "drugi",
"Password" : "Lozinka",
"Password_changed_successfully" : "Lozinka je uspješno promijenjena",
"Password_Change_Disabled" : "Vaš Rocket.Chat Administrator je onemogućio izmjenu lozinke",
"People" : "Ljudi",
"Please_wait" : "Pričekaj",
"Please_wait_activation" : "Molimo pričekajte, ovo bi moglo potrajati neko vrijeme.",
"Please_wait_statistics" : "Molimo pričekajte, statistike se generiraju.",
@ -211,6 +221,8 @@
"Room_name_changed" : "Ime sobe promijenjeno u: <em>__room_name__</em> od <em>__user_by__</em>",
"Room_name_changed_successfully" : "Ime sobe je uspješno izmijenjeno",
"Room_not_found" : "Soba nije nađena",
"Room_uploaded_file_list" : "Popis datoteka",
"Room_uploaded_file_list_empty" : "Nijedna datoteka nije dostupna",
"room_user_count" : "% korisnika",
"Rooms" : "Sobe",
"Save" : "Sačuvaj",
@ -239,6 +251,7 @@
"Silence" : "Tišina",
"since_creation" : "%s",
"Site_Name" : "Ime Stranice:",
"SAML_Custom_Generate_Username" : "Izradi korisničko ime",
"SMTP_Password" : "SMTP lozinka",
"SMTP_Port" : "SMTP port",
"SMTP_Username" : "SMTP korisničko ime",
@ -279,6 +292,7 @@
"User_added_by" : "Korisnik <em>__user_added__</em> dodan od <em>__user_by__</em>.",
"User_Channels" : "Korisnički kanali",
"User_has_been_activated" : "Korisnik je aktiviran",
"Username_Change_Disabled" : "Vaš Rocket.Chat Administrator je onemogućio izmjenu korisničkih imena",
"User_has_been_deactivated" : "Korisnik je deaktiviran",
"User_has_been_deleted" : "Korisnik je obrisan",
"User_Info" : "Podaci o korisniku",
@ -292,6 +306,7 @@
"User_left_female" : "Korisnica <em>__user_left__</em> je otišla.",
"User_left_male" : "Korisnik <em>__user_left__</em> je otišao.",
"User_logged_out" : "Korisnik je odjavljen",
"User_not_found_or_incorrect_password" : "Korisnik nije pronađen ili pogrešna lozinka",
"User_removed_by" : "Korisnik <em>__user_removed__</em> maknut od <em>__user_by__</em>.",
"User_Settings" : "Korisničke postavke",
"User_updated_successfully" : "Korisnik je uspješno ažuriran",

@ -62,6 +62,7 @@
"Msgs" : "Msgs",
"n_messages" : "% messaggi",
"Name" : "Nome",
"Name_optional" : "Nome (opzionale)",
"New_messages" : "Nuovi messaggi",
"New_password" : "Nuova password",
"No_channels_yet" : "Non fai parte di nessun canale ancora.",

@ -2,6 +2,13 @@
"Access_online_demo" : "ចបងវនធន",
"Access_Online_Demo" : "ចបងវនធន",
"Accounts" : "គណន",
"Accounts_AllowedDomainsList" : "បសញស(,) ដងចង Domain ដលអនងបញ",
"Accounts_AllowUsernameChange" : "អននក",
"Accounts_AllowPasswordChange" : "អនសម",
"Accounts_AvatarResize" : "ប Avatar",
"Accounts_AvatarSize" : "ទ Avatar",
"Accounts_AvatarStorePath" : "ទងផក Avatar",
"Accounts_AvatarStoreType" : "បរភទបនក Avatar",
"Accounts_denyUnverifiedEmail" : "រងខទបនកមនបនផតផល",
"Accounts_EmailVerification" : "កងផល",
"Accounts_OAuth_Facebook" : "ចសបក",
@ -10,6 +17,9 @@
"Accounts_OAuth_Github" : "ចម Github",
"Accounts_OAuth_Github_id" : "លសម GitHub",
"Accounts_OAuth_Github_secret" : "GitHub សម",
"Accounts_OAuth_Gitlab" : "OAuth បនអន",
"Accounts_OAuth_Gitlab_id" : "លខសម Gitlab",
"Accounts_OAuth_Gitlab_secret" : "Client សម",
"Accounts_OAuth_Google" : "ចម Google",
"Accounts_OAuth_Google_id" : "លសម Google",
"Accounts_OAuth_Google_secret" : "Google សម",
@ -71,6 +81,7 @@
"Channels" : "ប",
"Channels_list" : "បណរណ",
"Chat_Rooms" : "បនទប",
"Clear_all_unreads_question" : "ចងជមលគរបរមនបនអនឬ?",
"close" : "បទ",
"coming_soon" : "មកដលៗ",
"Commands" : "ឃបញ",
@ -89,6 +100,7 @@
"days" : "ថ",
"Deactivate" : "ធយមនសកមម",
"Delete_User_Warning" : "កលបនកលបរបរបសផងរ។ ដ ។",
"Delete_Room_Warning" : "ករលបបនទបយនងតវលបលទងអសវររដលបនបរកសនងបនទប, ដរករននទនបញចប",
"Delete" : "លប",
"Deleted" : "បលប!",
"Desktop_Notifications" : "ជនដងល Desktop",
@ -120,6 +132,7 @@
"FileUpload_Enabled" : "អនឯកសរ",
"FileUpload_MaxFileSize" : "ទអតបរណតសមរផកឡយឯកសរ(គតជ)",
"FileUpload_MediaTypeWhiteList" : "បសញស(,) ដងចកបញរភទម",
"FileUpload_MediaTypeWhiteListDescription" : "បសញស(,) ដងចងបរភទ Media កងបញ",
"Follow_social_profiles" : "តបណគណនបណសងគមរបស, ម github នបទពធនរបសនក rocket.chat app នរឃរបសង",
"Forgot_password" : "ភសម",
"Fork_it_on_github" : "ទ github",
@ -135,6 +148,10 @@
"hours" : "មង",
"Incorrect_Password" : "ឃនតមតវ",
"inline_code" : "inline_code",
"Install_FxOs" : "ដង Rocket.Chat ន Firefox របសនក",
"Install_FxOs_follow_instructions" : "សមបញរដងកមមវឧបករណរបសនក(ចច \"Install\" ពលបញ)",
"Install_FxOs_done" : "អសយណឥឡវអនកអចប Rocket.Chat តមរយ Icon ន Homescreen។ សមរករយជយ Rocket.Chat!",
"Install_FxOs_error" : "សស ដលវនដរករខណនបញចឡងដចខងកម",
"Invalid_confirm_pass" : "ពសមបញសមបញ",
"Invalid_email" : "អបញវ",
"Invalid_name" : "ឈរ",
@ -168,8 +185,11 @@
"Layout_Sidenav_Footer_description" : " 260x70",
"Layout_Terms_of_Service" : "លខខកមម",
"LDAP" : "ប LDAP",
"LDAP_Dn" : " LDAP DN",
"LDAP_Bind_Search" : "ចណងសងរក",
"LDAP_DN" : " LDAP DN",
"LDAP_Enable" : "អន LDAP",
"LDAP_Port" : "ចរក LDAP",
"LDAP_Sync_User_Data" : "រកននយ User ដយ Sync ជយ Server",
"LDAP_Url" : "URL របស LDAP",
"Leave_room" : "ចបនទប",
"line" : "ជរ",
@ -190,6 +210,7 @@
"Message_AllowDeleting" : "អនរ",
"Message_AllowEditing" : "អនសមរ",
"Message_AllowEditing_BlockEditInMinutes" : "បទករកលសរបន (ជនន ឬ0ដទចល)",
"Message_AllowEditing_BlockEditInMinutesDescription" : "បញលលខ 0 ដទករ Block",
"Message_AudioRecorderEnabled" : "ករថតសមងបនអន",
"Message_deleting_not_allowed" : "កលបអន",
"Message_editing_not_allowed" : "កសមអន",
@ -244,10 +265,12 @@
"others" : "ផងៗ",
"Password" : "ពសម",
"Password_changed_successfully" : "ពសមគជយ",
"Password_Change_Disabled" : "សធជនកគរបរង Rocket.Chat តវបនបទមនឲយបរពយសមយ",
"People" : "មនស",
"Please_wait" : "សរង",
"Please_wait_activation" : "សរងរងបនច",
"Please_wait_statistics" : "សរងគណន",
"Please_enter_value_for_url" : "សមបញលតមរបស URL ន Avatar របសនក",
"Powered_by" : "រកយ",
"Preferences" : "ចណងត",
"Preferences_saved" : "ចណងរកក",
@ -317,6 +340,8 @@
"Site_Url" : "តបន URL",
"Site_Url_Description" : "ឧទហរណ៖ https://chat.domain.com/",
"SAML" : "ប SAML",
"SAML_Custom_Cert" : "វបនបតន",
"SAML_Custom_Generate_Username" : "គណននកប",
"SMTP" : "ពរ SMTP",
"SMTP_Host" : "មន SMTP",
"SMTP_Password" : "ឃសម SMTP",
@ -360,10 +385,12 @@
"Use_service_avatar" : "ប %s រប",
"Use_this_username" : "ប",
"Use_uploaded_avatar" : "បង",
"Use_url_for_avatar" : "ប URL សម Avatar",
"User_added" : "អនក <em>__user_added__</em> បបនម",
"User_added_by" : "អនក <em>__user_added__</em> បយ <em>__user_by__</em>.",
"User_Channels" : "បនកប",
"User_has_been_activated" : "អនកសកមម",
"Username_Change_Disabled" : "សធជនកគរបរង Rocket.Chat តវបនបទមនឲយបរឈនកបយ",
"User_has_been_deactivated" : "អនកអសកមម",
"User_has_been_deleted" : "អនកលប",
"User_Info" : "ពរបសនក",
@ -396,6 +423,7 @@
"Welcome_to_the" : "សគមនមក",
"With_whom" : "ជនរណ",
"Yes_delete_it" : "បទ លប!",
"Yes_clear_all" : "បទ, សមតចលទងអស",
"you_are_in_preview_mode_of" : "អនកទមរង #<strong>__room_name__</strong>",
"You_need_confirm_email" : "អនកបញកចល!",
"You_will_not_be_able_to_recover" : "អនកនអមកញ!",

@ -153,7 +153,7 @@
"Layout_Sidenav_Footer_description" : "바닥글 크기는 260x70입니다.",
"Layout_Terms_of_Service" : "이용약관",
"LDAP" : "LDAP",
"LDAP_Dn" : "LDAP DN",
"LDAP_DN" : "LDAP DN",
"LDAP_Port" : "LDAP 포트",
"LDAP_Url" : "LDAP URL",
"Leave_room" : "방 나가기",

@ -67,6 +67,7 @@
"close" : "tutup",
"coming_soon" : "akan datang",
"Commands" : "Arahan",
"Compact_View" : "Paparan Kompak",
"Confirm_password" : "Sahkan kata laluan anda",
"Contact" : "Hubungi",
"Conversation" : "Perbualan",
@ -105,11 +106,15 @@
"Esc_to" : "Esc untuk",
"False" : "Lumpuhkan",
"Favorites" : "Kegemaran",
"FileUpload" : "Muat Naik Fail",
"FileUpload_Enabled" : "Naik Fail Diaktifkan",
"FileUpload_MaxFileSize" : "Fail muat naik saiz Maksimum (dalam bytes)",
"Forgot_password" : "Lupa kata laluan anda",
"Fork_it_on_github" : "Mencabang pada github",
"From_Email" : "Daripada E-mel",
"General" : "Umum",
"Get_to_know_the_team" : "Kenali Rocket.Team",
"github_no_public_email" : "Anda tidak mempunyai sebarang e-mel umum pada akaun GitHub anda",
"Has_more" : "Ada lagi",
"Hide_room" : "Menyembunyikan bilik",
"History" : "Sejarah",
@ -147,7 +152,7 @@
"Layout_Sidenav_Footer_description" : "Saiz footer ialah 260x70",
"Layout_Terms_of_Service" : "Terma Perkhidmatan",
"LDAP" : "LDAP",
"LDAP_Dn" : "LDAP DN",
"LDAP_DN" : "LDAP DN",
"LDAP_Port" : "Port LDAP",
"LDAP_Url" : "URL LDAP",
"Leave_room" : "Meninggalkan bilik",
@ -169,6 +174,7 @@
"Message_AllowDeleting" : "Benarkan Pemadaman Mesej",
"Message_AllowEditing" : "Benarkan Penyuntingan Mesej",
"Message_AllowEditing_BlockEditInMinutes" : "Sekat penyuntingan mesej selepas (dalam minit - 0 hingga melumpuhkan)",
"Message_AudioRecorderEnabled" : "Perakam Audio Diaktifkan",
"Message_deleting_not_allowed" : "Pemadaman mesej tidak dibenarkan",
"Message_editing_not_allowed" : "Penyuntingan mesej tidak dibenarkan",
"Message_editing_blocked" : "Mesej ini tidak boleh lagi disunting",
@ -178,6 +184,7 @@
"Message_pinned" : "Mesej dipinkan",
"Message_ShowDeletedStatus" : "Tunjuk Status Pemadaman",
"Message_ShowEditedStatus" : "Tunjuk Status Penyuntingan",
"Message_ShowFormattingTips" : "Tunjuk Tip Pemformatan",
"Messages" : "Mesej",
"Meta" : "Meta",
"Meta_fb_app_id" : "Facebook APP ID",
@ -241,6 +248,7 @@
"Push_enable" : "Aktifkan",
"Push_production" : "Penerbitan",
"Quick_Search" : "Carian Pantas",
"Recents" : "baru-baru ini",
"Record" : "Rakam",
"Register" : "Mendaftar akaun baru",
"Registration_Succeeded" : "Pendaftaran Berjaya",
@ -329,6 +337,7 @@
"Use_service_avatar" : "Guna %s avatar",
"Use_this_username" : "Guna nama pengguna ini",
"Use_uploaded_avatar" : "Guna avatar yang dimuat naik",
"Use_url_for_avatar" : "Guna url untuk avatar",
"User_added" : "Pengguna <em>__user_added__</em> ditambah.",
"User_added_by" : "Pengguna <em>__user_added__</em> ditambah oleh <em>__user_by__</em>.",
"User_Channels" : "Saluran Pengguna",

@ -106,7 +106,7 @@
"Last_message" : "Ostatnia wiadomość",
"Layout_Home_Body" : "Treść strony głównej",
"Layout_Home_Title" : "Tytuł strony głównej",
"LDAP_Dn" : "LDAP DN",
"LDAP_DN" : "LDAP DN",
"LDAP_Port" : "Port LDAP",
"LDAP_Url" : "Adres URL LDAP",
"Leave_room" : "Opuść pokój",

@ -3,6 +3,9 @@
"Access_Online_Demo" : "Acesse o Demo Online",
"Accounts" : "Contas",
"Accounts_AllowedDomainsList" : "Lista de domínios permitidos (separados por vírgula)",
"Accounts_AllowUsernameChange" : "Permitir alterar usuário",
"Accounts_AvatarResize" : "Redimensionar Avatares",
"Accounts_AvatarSize" : "Tamanho do Avatar",
"Accounts_denyUnverifiedEmail" : "Proibir e-mail não verificado",
"Accounts_EmailVerification" : "Verificação de E-mail",
"Accounts_OAuth_Facebook" : "Login do Facebook",
@ -11,6 +14,7 @@
"Accounts_OAuth_Github" : "Login do GitHub",
"Accounts_OAuth_Github_id" : "GitHub Id",
"Accounts_OAuth_Github_secret" : "GitHub Secret",
"Accounts_OAuth_Gitlab_id" : "Gitlab Id",
"Accounts_OAuth_Google" : "Login do Google",
"Accounts_OAuth_Google_id" : "Google Id",
"Accounts_OAuth_Google_secret" : "Google Secret",
@ -35,6 +39,7 @@
"Accounts_OAuth_Custom_Button_Label_Text" : "Texto do botão",
"Accounts_OAuth_Custom_Button_Label_Color" : "Cor do texto do botão",
"Accounts_OAuth_Custom_Button_Color" : "Cor do botão",
"Accounts_RequireNameForSignUp" : "Nome é obrigatório para cadastro",
"Activate" : "Ativar",
"Add_custom_oauth" : "Adicionar oauth customizado",
"Add_Members" : "Adicionar membros",
@ -169,8 +174,10 @@
"Layout_Sidenav_Footer_description" : "Tamanho do rodapé é 260x70",
"Layout_Terms_of_Service" : "Termos de Serviço",
"LDAP" : "LDAP",
"LDAP_Dn" : "DN LDAP",
"LDAP_DN" : "DN LDAP",
"LDAP_Port" : "Porta LDAP",
"LDAP_Sync_User_Data" : "Manter dados dos usuários sincronizados",
"LDAP_Sync_User_Data_FieldMap" : "Mapeamento de campos do usuário",
"LDAP_Url" : "URL LDAP",
"Leave_room" : "Sair da sala",
"line" : "linha",
@ -220,6 +227,7 @@
"My_Account" : "Minha Conta",
"n_messages" : "%s mensagens",
"Name" : "Nome",
"Name_optional" : "Nome (opcional)",
"Name_cant_be_empty" : "Nome não pode ser vazio",
"New_messages" : "Novas mensagens",
"New_password" : "Nova senha",
@ -356,6 +364,8 @@
"The_field_is_required" : "O campo %s é obrigatório.",
"True" : "Verdadeiro",
"Unnamed" : "Sem nome",
"Unread_Rooms" : "Não Lidas",
"Unread_Rooms_Mode" : "Agrupar Salas Não Lidas",
"Upload_file_question" : "Enviar arquivo?",
"Use_Emojis" : "Usar Emojis",
"Use_initials_avatar" : "Usar as iniciais do seu nome de usuário",

@ -6,6 +6,11 @@
"Accounts_OAuth_Google_id" : "Google ID",
"Accounts_OAuth_Google_secret" : "Google пароль",
"Accounts_RegistrationRequired" : "Требуется регистрация",
"Accounts_OAuth_Custom_Secret" : "Ключ",
"Accounts_OAuth_Custom_Enable" : "Включить",
"Accounts_OAuth_Custom_Button_Label_Text" : "Текст кнопки",
"Accounts_OAuth_Custom_Button_Label_Color" : "Цвет текста кнопки",
"Accounts_OAuth_Custom_Button_Color" : "Цвет кнопки",
"Add_Members" : "Добавить Пользователей",
"Add_users" : "Добавить пользователей",
"All_channels" : "Все Чаты",
@ -21,6 +26,7 @@
"Away_female" : "Отошла",
"away_male" : "отошёл",
"Away_male" : "Отошёл",
"Auto_Load_Images" : "Автозагрузка изображений",
"Back_to_login" : "На страницу авторизации",
"bold" : "жирный",
"busy" : "занят",
@ -36,6 +42,7 @@
"Chat_Rooms" : "Чаты",
"close" : "закрыть",
"coming_soon" : "в разработке",
"Compact_View" : "Компактный вид",
"Confirm_password" : "Подтвердить пароль",
"Contact" : "Контакт",
"Conversation" : "Диалог",
@ -43,7 +50,9 @@
"Create_new_private_group" : "Создать новый приватный чат",
"Create_new_public_channel" : "Создать новый публичный чат",
"Created_at" : "Создано в",
"days" : "дней",
"Deleted" : "Удалено!",
"Desktop_Notifications_Enabled" : "Уведомления для рабочего стола включены",
"Direct_Messages" : "Личные сообщения",
"Drop_to_upload_file" : "Переместите сюда для загрузки файла",
"Duplicate_channel_name" : "Канал с именем '%s' существует",
@ -53,13 +62,15 @@
"Email_already_exists" : "Эл. адрес уже существует",
"Email_or_username" : "Почтовый ящик или логин",
"Email_verified" : "Электронный адрес проверен",
"Enter_info" : "Авторизация",
"Enable_Desktop_Notifications" : "Включить уведомления для рабочего стола",
"Enter_info" : "Введите свои данные",
"Error_changing_password" : "Ошибка изменения пароля",
"Favorites" : "Избранные чаты",
"Follow_social_profiles" : "Добавляйте нас в друзья в социальных сетях, форкайте на github и пишите свои отзывы о нашем приложении у нас в trello.",
"Forgot_password" : "Забыли пароль?",
"Fork_it_on_github" : "Форкайте на github",
"github_no_public_email" : "В настройках GitHub отсутствует публично доступный e-mail",
"Has_more" : "Еще",
"Hide_room" : "Скрыть чат",
"History" : "История",
"hours" : "час(ы)",
@ -71,6 +82,7 @@
"Invalid_room_name" : "<strong>%s</strong> недопустимое имя комнаты, <br/> допустимые символы: цифры, подчеркивание и буквы.",
"invisible" : "невидимый",
"Invisible" : "Невидимый",
"Invite_Users" : "Пригласить пользователей",
"is_also_typing" : "все ещё печатает",
"is_also_typing_female" : "все ещё печатает",
"is_also_typing_male" : "все ещё печатает",
@ -83,12 +95,15 @@
"Language" : "Язык",
"Language_Version" : "Русская версия",
"Last_message" : "Последнее сообщение",
"LDAP_Dn" : "LDAP домен",
"Layout_Privacy_Policy" : "Политика конфиденциальности",
"Layout_Terms_of_Service" : "Условия использования",
"LDAP_DN" : "LDAP домен",
"LDAP_Port" : "LDAP Порт",
"LDAP_Url" : "URL-адрес LDAP",
"Leave_room" : "Покинуть чат",
"line" : "линия",
"Load_more" : "Загрузить еще",
"Loading_more_from_history" : "Загрузка еще из истории",
"Loading..." : "Загрузка...",
"Loading_suggestion" : "Загрузка предпочтений...",
"Login" : "Войти",
@ -96,6 +111,7 @@
"login_with" : "Авторизация через",
"Logout" : "Выйти",
"Make_Admin" : "Сделать администратором",
"Mark_as_read" : "пометить как прочитанное",
"Members" : "Участники",
"Members_List" : "Список участников",
"Members_placeholder" : "Участники",
@ -106,9 +122,11 @@
"Message_removed" : "Сообщение удалено",
"Message_ShowDeletedStatus" : "Отображать статус \"Удалено\"",
"Message_ShowEditedStatus" : "Отображать статус \"Отредактировано\"",
"Messages" : "Сообщения",
"Meta_language" : "Язык",
"minutes" : "минут(ы)",
"More_channels" : "Другие чаты",
"More_unreads" : "Еще непрочитанные",
"Msgs" : "Сообщения",
"multi" : "много",
"My_Account" : "Мой аккаунт",
@ -138,6 +156,8 @@
"Please_wait_activation" : "Пожалуйста, подождите, это может занять некоторое время.",
"Please_wait_statistics" : "Пожалуйста, подождите, статистика генерируются.",
"Powered_by" : "Реализовано на",
"Preferences" : "Настройки",
"Preferences_saved" : "Настройки сохранены",
"Privacy" : "Приватность",
"Private_Groups" : "Приватные чаты",
"Profile" : "Профиль",
@ -161,6 +181,7 @@
"Save" : "Сохранить",
"Save_changes" : "Сохранить изменения",
"Search" : "Поиск",
"Search_Messages" : "Поиск сообщений",
"Search_settings" : "Настройки поиска",
"seconds" : "секунд(ы)",
"See_all" : "К общему списку",
@ -168,7 +189,9 @@
"Select_an_avatar" : "Выбор автара",
"Select_file" : "Выберите файл",
"Selected_users" : "Выбранные участники",
"Send" : "Послать",
"Send_confirmation_email" : "Отправить письмо с подтверждением",
"Send_invitation_email" : "Отправить приглашение по электронной почте",
"Send_Message" : "Отправить сообщение",
"Settings" : "Настройки",
"Settings_updated" : "Настройки обновлены",
@ -176,9 +199,11 @@
"Showing_results" : "<p>Отображено <b>%s</b> результатов</p>",
"Silence" : "Тишина",
"since_creation" : "с %s",
"Site_Name" : "Название сайта",
"SMTP_Password" : "Пароль SMTP",
"SMTP_Port" : "SMTP Порт",
"SMTP_Username" : "Имя пользователя SMTP-",
"Sound" : "Звук",
"Start_of_conversation" : "Начать диалог",
"Stats_Active_Users" : "Активные пользователи",
"Stats_Non_Active_Users" : "Неактивные пользователи",
@ -193,9 +218,11 @@
"Stats_OS_Type" : "Тип Системы",
"Stats_OS_Uptime" : "Аптайм системы",
"Stats_Total_Channels" : "Общее кол-во каналов",
"Stats_Total_Messages" : "Всего сообщений",
"Stats_Total_Users" : "Всего пользователей",
"Submit" : "Отправить",
"The_field_is_required" : "Поле %s обязательно.",
"True" : "Истина",
"Upload_file_question" : "Загрузить файл?",
"Use_initials_avatar" : "Использовать стандартный аватар",
"use_menu" : "Используйте боковое меню для доступа к вашим сообщениям и чатам",
@ -204,9 +231,11 @@
"Use_uploaded_avatar" : "Использовать загруженную аватарку",
"User_added" : "Пользователь <em>__user_added__</em> добавлен.",
"User_added_by" : "Пользователь <em>__user_added__</em> добавлен <em>__user_by__</em>.",
"User_Channels" : "Чаты пользователя",
"User_has_been_activated" : "Пользователь активирован",
"User_has_been_deactivated" : "Пользователь деактивирован",
"User_has_been_deleted" : "Пользователь был удален",
"User_Info" : "Информация о пользователе",
"User_is_no_longer_an_admin" : "Пользователь не больше не администратор",
"User_is_not_activated" : "Пользователь не активирован",
"User_is_now_an_admin" : "Пользователь теперь администратор",

@ -52,10 +52,12 @@
"Created_at" : "Oluşturulma saati",
"days" : "gün",
"Delete_User_Warning" : "Bu kullanıcıyı silerseniz tüm mesajları da beraberinde silinecektir! Bu işlemi bir daha geri alamazsınız.",
"Delete" : "Sil",
"Deleted" : "Silinmiş!",
"Direct_Messages" : "Direkt Mesajlar",
"Drop_to_upload_file" : "Dosya yüklemek için sürükle",
"E-mail" : "E-posta",
"Edit" : "Düzenle",
"edited" : "düzenlendi",
"Email_already_exists" : "Bu e-posta zaten var",
"Email_or_username" : "E-posta ya da kullanıcı adı",
@ -139,6 +141,7 @@
"Not_allowed" : "Izin verilmedi",
"Not_found_or_not_allowed" : "Bulunamadı veya izin verilmiyor",
"Nothing_found" : "Bulunamadı",
"Notify_all_in_this_room" : "Bu odadaki tüm bildirimleri göster",
"Online" : "Çevrimiçi",
"Oops!" : "Hata",
"others" : "Diğerleri",
@ -178,6 +181,7 @@
"Save" : "Kaydet",
"Save_changes" : "Değişiklikleri kaydet",
"Search" : "Ara",
"Search_Messages" : "Mesajlarda ara",
"Search_settings" : "Arama ayarları",
"seconds" : "saniye",
"See_all" : "Tümünü gör",
@ -194,6 +198,7 @@
"Showing_results" : "<p> <b>%s</b> kayıt bulundu</p>",
"Silence" : "Sessizlik",
"since_creation" : "tarih %s",
"Site_Name" : "Site adı",
"SMTP_Host" : "SMTP Sunucusu",
"SMTP_Password" : "SMTP Şifre",
"SMTP_Port" : "SMTP Bağlantı Noktası(Port)",
@ -214,6 +219,7 @@
"Stats_OS_Type" : "İşletim Sistemi Tipi",
"Stats_Total_Channels" : "Toplam Kanal",
"Stats_Total_Direct_Messages" : "Toplam Direkt Mesajlar",
"Stats_Total_Messages" : "Toplam İleti",
"Stats_Total_Private_Groups" : "Toplam Özel Gruplar",
"Stats_Total_Rooms" : "Toplam Kanal",
"Stats_Total_Users" : "Toplam Kullanıcı",

@ -121,7 +121,7 @@
"Layout_Sidenav_Footer" : "侧面导航页脚",
"Layout_Terms_of_Service" : "服务条款",
"LDAP" : "LDAP",
"LDAP_Dn" : "LDAP DN",
"LDAP_DN" : "LDAP DN",
"LDAP_Port" : "LDAP端口",
"LDAP_Url" : "LDAP URL",
"Leave_room" : "离开聊天室",

@ -58,8 +58,7 @@ SAML.prototype.generateUniqueID = function () {
};
SAML.prototype.generateInstant = function () {
var date = new Date();
return date.getUTCFullYear() + '-' + ('0' + (date.getUTCMonth() + 1)).slice(-2) + '-' + ('0' + date.getUTCDate()).slice(-2) + 'T' + ('0' + (date.getUTCHours() + 2)).slice(-2) + ":" + ('0' + date.getUTCMinutes()).slice(-2) + ":" + ('0' + date.getUTCSeconds()).slice(-2) + "Z";
return new Date().toISOString();
};
SAML.prototype.signRequest = function (xml) {
@ -105,7 +104,7 @@ SAML.prototype.generateLogoutRequest = function (options) {
// options should be of the form
// nameId: <nameId as submitted during SAML SSO>
// sessionIndex: sessionIndex
// --- NO SAMLsettings: <Meteor.setting.saml entry for the provider you want to SLO from
// --- NO SAMLsettings: <Meteor.setting.saml entry for the provider you want to SLO from
var id = "_" + this.generateUniqueID();
var instant = this.generateInstant();
@ -172,7 +171,7 @@ SAML.prototype.requestToUrl = function (request, operation, callback) {
samlRequest.Signature = self.signRequest(querystring.stringify(samlRequest));
}
// TBD. We should really include a proper RelayState here
// TBD. We should really include a proper RelayState here
if (operation === 'logout') {
// in case of logout we want to be redirected back to the Meteor app.
var relayState = Meteor.absoluteUrl();
@ -438,7 +437,7 @@ SAML.prototype.generateServiceProviderMetadata = function (callbackUrl) {
if (!decryptionCert) {
decryptionCert = this.options.privateCert;
}
}
if (this.options.privateKey) {
if (!decryptionCert) {

@ -16,11 +16,13 @@ RocketChat.authz.addUsersToRoles = (userIds, roleNames, scope ) ->
existingRoleNames = _.pluck(RocketChat.authz.getRoles().fetch(), 'name')
invalidRoleNames = _.difference( roleNames, existingRoleNames)
unless _.isEmpty(invalidRoleNames)
throw new Meteor.Error 'invalid-role'
# throw new Meteor.Error 'invalid-role'
for role in invalidRoleNames
Roles.createRole role
unless _.isString(scope)
scope = Roles.GLOBAL_GROUP
Roles.addUsersToRoles( userIds, roleNames, scope)
return true
return true

@ -1,4 +1,5 @@
{
"Chatops_Enabled" : "Ota käyttöön Chatops",
"Chatops_Title" : "Chatops paneeli"
"Chatops_Title" : "Chatops paneeli",
"Chatops_Username" : "Chatops käyttäjätunnus"
}

@ -1,3 +1,7 @@
{
"API_GitHub_Enterprise_URL" : "GitHub Enterprise"
"Accounts_OAuth_GitHub_Enterprise" : "OAuth Käytössä",
"API_GitHub_Enterprise_URL" : "Server URL",
"Accounts_OAuth_GitHub_Enterprise_id" : "Client ID",
"Accounts_OAuth_GitHub_Enterprise_secret" : "Client Secret",
"Github_Enterprise_Url_No_Trail" : "Huom: Älä syötä viimeistä kenoviivaa"
}

@ -1,3 +1,3 @@
{
"API_Gitlab_URL" : "Git"
"API_Gitlab_URL" : "GitLab URL"
}

@ -1,62 +1,116 @@
{
"dependencies": {
"ldapjs": {
"version": "0.7.1",
"version": "1.0.0",
"dependencies": {
"asn1": {
"version": "0.2.1"
"version": "0.2.3"
},
"assert-plus": {
"version": "0.1.5"
},
"bunyan": {
"version": "0.22.1",
"version": "1.5.1",
"dependencies": {
"mv": {
"version": "0.0.5"
}
}
},
"nopt": {
"version": "2.1.1",
"dependencies": {
"abbrev": {
"version": "1.0.7"
}
}
},
"pooling": {
"version": "0.4.6",
"dependencies": {
"once": {
"version": "1.3.0"
},
"vasync": {
"version": "1.4.0",
"version": "2.1.1",
"dependencies": {
"jsprim": {
"version": "0.3.0",
"mkdirp": {
"version": "0.5.1",
"dependencies": {
"extsprintf": {
"version": "1.0.0"
},
"json-schema": {
"version": "0.2.2"
},
"verror": {
"version": "1.3.3"
"minimist": {
"version": "0.0.8"
}
}
},
"verror": {
"version": "1.1.0",
"ncp": {
"version": "2.0.0"
},
"rimraf": {
"version": "2.4.3",
"dependencies": {
"extsprintf": {
"version": "1.0.0"
"glob": {
"version": "5.0.15",
"dependencies": {
"inflight": {
"version": "1.0.4",
"dependencies": {
"wrappy": {
"version": "1.0.1"
}
}
},
"inherits": {
"version": "2.0.1"
},
"minimatch": {
"version": "3.0.0",
"dependencies": {
"brace-expansion": {
"version": "1.1.1",
"dependencies": {
"balanced-match": {
"version": "0.2.1"
},
"concat-map": {
"version": "0.0.1"
}
}
}
}
},
"path-is-absolute": {
"version": "1.0.0"
}
}
}
}
}
}
},
"safe-json-stringify": {
"version": "1.0.3"
}
}
},
"dashdash": {
"version": "1.10.1"
},
"backoff": {
"version": "2.4.1",
"dependencies": {
"precond": {
"version": "0.2.3"
}
}
},
"ldap-filter": {
"version": "0.2.2"
},
"once": {
"version": "1.3.2",
"dependencies": {
"wrappy": {
"version": "1.0.1"
}
}
},
"vasync": {
"version": "1.6.3"
},
"verror": {
"version": "1.6.0",
"dependencies": {
"extsprintf": {
"version": "1.2.0"
}
}
},
"dtrace-provider": {
"version": "0.6.0",
"dependencies": {
"nan": {
"version": "2.1.0"
}
}
}

@ -2,11 +2,13 @@ MeteorWrapperLdapjs = Npm.require 'ldapjs'
Meteor.startup ->
RocketChat.settings.addGroup 'LDAP'
RocketChat.settings.add 'LDAP_Enable' , false , { type: 'boolean', group: 'LDAP', public: true }
RocketChat.settings.add 'LDAP_Url' , 'ldap://', { type: 'string' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_Port' , '389' , { type: 'string' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_DN' , '' , { type: 'string' , group: 'LDAP', i18nLabel: 'LDAP_Dn', public: true }
RocketChat.settings.add 'LDAP_Bind_Search', '' , { type: 'string' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_Enable', false, { type: 'boolean', group: 'LDAP', public: true }
RocketChat.settings.add 'LDAP_Url', 'ldap://', { type: 'string' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_Port', '389', { type: 'string' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_DN', '', { type: 'string' , group: 'LDAP', public: true }
RocketChat.settings.add 'LDAP_Bind_Search', '', { type: 'string' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_Sync_User_Data', false, { type: 'boolean' , group: 'LDAP' }
RocketChat.settings.add 'LDAP_Sync_User_Data_FieldMap', '{"cn":"name", "mail":"email"}', { type: 'string' , group: 'LDAP' }
timer = undefined

@ -3,7 +3,7 @@ Future = Npm.require('fibers/future');
var slug = function (text) {
text = slugify(text, '.');
return text.replace(/[^0-9a-z-_.]/g, '');
}
};
// At a minimum, set up LDAP_DEFAULTS.url and .dn according to
// your needs. url should appear as "ldap://your.url.here"
@ -86,7 +86,7 @@ LDAP.prototype.ldapCheck = function(options) {
var bind = function(dn) {
dn = dn.replace(/#{username}/g, options.username);
console.log('Attempt to bind', dn)
console.log('Attempt to bind', dn);
//Attempt to bind to ldap server with provided info
client.bind(dn, options.ldapPass, function(err) {
try {
@ -127,7 +127,7 @@ LDAP.prototype.ldapCheck = function(options) {
});
}
});
}
};
if (LDAP_DEFAULTS.bindSearch && LDAP_DEFAULTS.bindSearch.trim() != '') {
try {
@ -203,6 +203,9 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) {
// Instantiate LDAP with options
var userOptions = loginRequest.ldapOptions || {};
if (RocketChat.settings.get('LDAP_Sync_User_Data')) {
userOptions.searchResultsProfileMap = true;
}
// Don't allow overwriting url and port
delete userOptions.url;
@ -287,6 +290,51 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) {
throw new Meteor.Error("LDAP-login-error", "LDAP Authentication succeded, but no user exists in Mongo. Either create a user for this email or set LDAP_DEFAULTS.createNewUser to true");
}
// LDAP sync data logic
var syncUserData = RocketChat.settings.get('LDAP_Sync_User_Data');
var syncUserDataFieldMap = RocketChat.settings.get('LDAP_Sync_User_Data_FieldMap').trim();
if (userId && syncUserData && syncUserDataFieldMap) {
var userData = {};
var fieldMap = JSON.parse(syncUserDataFieldMap);
var emailList = [];
_.map(fieldMap, function(userField, ldapField) {
if (!ldapResponse.searchResults.hasOwnProperty(ldapField)) {
return;
}
// restrict field mapping to a known list of fields
switch (userField) {
case 'email':
if ('object' == typeof ldapResponse.searchResults[ldapField]) {
_.map(ldapResponse.searchResults[ldapField], function (item) {
emailList.push({ address: item, verified: true });
});
} else {
emailList.push({ address: ldapResponse.searchResults[ldapField], verified: true });
}
break;
case 'name':
userData.name = ldapResponse.searchResults[ldapField];
break;
default:
break;
}
});
if (emailList.length) {
userData.emails = emailList;
}
if (_.size(userData)) {
Meteor.users.update(userId, { $set: userData });
}
}
return {
userId: userId,
token: stampedToken.token

@ -6,7 +6,7 @@ Package.describe({
});
Npm.depends({
ldapjs: "0.7.1",
ldapjs: "1.0.0",
});
// Loads all i18n.json files into tapi18nFiles

@ -51,12 +51,12 @@ currentTracker = undefined
, 100
RocketChat.TabBar.resetButtons()
RocketChat.TabBar.addButton({ id: 'message-search', title: t('Search'), icon: 'octicon octicon-search', template: 'messageSearch', order: 1 })
RocketChat.TabBar.addButton({ id: 'message-search', i18nTitle: t('Search'), icon: 'octicon octicon-search', template: 'messageSearch', order: 1 })
if type is 'd'
RocketChat.TabBar.addButton({ id: 'members-list', title: t('User_Info'), icon: 'octicon octicon-person', template: 'membersList', order: 2 })
RocketChat.TabBar.addButton({ id: 'members-list', i18nTitle: t('User_Info'), icon: 'octicon octicon-person', template: 'membersList', order: 2 })
else
RocketChat.TabBar.addButton({ id: 'members-list', title: t('Members_List'), icon: 'octicon octicon-organization', template: 'membersList', order: 2 })
RocketChat.TabBar.addButton({ id: 'uploaded-files-list', title: t('Room_uploaded_file_list'), icon: 'octicon octicon-file-symlink-directory', template: 'uploadedFilesList', order: 3 })
RocketChat.TabBar.addButton({ id: 'members-list', i18nTitle: t('Members_List'), icon: 'octicon octicon-organization', template: 'membersList', order: 2 })
RocketChat.TabBar.addButton({ id: 'uploaded-files-list', i18nTitle: t('Room_uploaded_file_list'), icon: 'octicon octicon-file-symlink-directory', template: 'uploadedFilesList', order: 3 })
# update user's room subscription
if ChatSubscription.findOne({rid: room._id})?.open is false

@ -62,6 +62,7 @@ Package.onUse(function(api) {
api.addFiles('server/functions/setUsername.coffee', 'server');
api.addFiles('server/methods/joinDefaultChannels.coffee', 'server');
api.addFiles('server/methods/robotMethods.coffee', 'server');
api.addFiles('server/methods/sendInvitationEmail.coffee', 'server');
api.addFiles('server/methods/setAdminStatus.coffee', 'server');
api.addFiles('server/methods/setRealName.coffee', 'server');

@ -19,6 +19,7 @@ RocketChat.setUsername = (user, username) ->
# Username is available; if coming from old username, update all references
if previousUsername
RocketChat.models.Messages.updateAllUsernamesByUserId user._id, username
RocketChat.models.Messages.updateUsernameOfEditByUserId user._id, username
RocketChat.models.Messages.findByMention(previousUsername).forEach (msg) ->
updatedMsg = msg.msg.replace(new RegExp("@#{previousUsername}", "ig"), "@#{username}")

@ -0,0 +1,19 @@
Meteor.methods
'robot.modelCall': (model, method, args) ->
unless Meteor.userId()
throw new Meteor.Error 'invalid-user', '[methods] robot.modelCall -> Invalid user'
unless RocketChat.authz.hasRole Meteor.userId(), 'robot'
throw new Meteor.Error 'unauthorized', '[methods] robot.modelCall -> Unauthorized'
console.log '[method] robot.modelCall'.green, arguments
unless _.isFunction RocketChat.models[model]?[method]
throw new Meteor.Error 'invalid-method', '[methods] robot.modelCall -> Invalid method'
call = RocketChat.models[model][method].apply(RocketChat.models[model], args)
if call?.fetch?()?
return call.fetch()
else
return call

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save