Merge branch 'master' into settings-users

pull/502/head
Marcelo Schmidt 11 years ago
commit 6ed650410c
  1. 2
      .meteor/packages
  2. 2
      .meteor/versions
  3. 4
      .travis.yml
  4. 6
      client/lib/cordova/facebook-login.coffee
  5. 59
      client/lib/fileUpload.coffee
  6. 40
      client/lib/recorderjs/audioRecored.coffee
  7. 92
      client/lib/recorderjs/recorder.js
  8. 96
      client/stylesheets/base.less
  9. 17
      client/views/app/home.coffee
  10. 47
      client/views/app/home.html
  11. 6
      client/views/app/message.coffee
  12. 2
      client/views/app/messagePopup.coffee
  13. 14
      client/views/app/messagePopupConfig.coffee
  14. 61
      client/views/app/room.coffee
  15. 20
      client/views/app/room.html
  16. 4
      client/views/login/services.coffee
  17. 54
      client/views/main.coffee
  18. 44
      i18n/de.i18n.json
  19. 42
      i18n/el.i18n.json
  20. 29
      i18n/en.i18n.json
  21. 35
      i18n/fi.i18n.json
  22. 27
      i18n/hr.i18n.json
  23. 2
      i18n/km.i18n.json
  24. 18
      i18n/pl.i18n.json
  25. 2
      i18n/pt.i18n.json
  26. 5
      i18n/ru.i18n.json
  27. 1
      i18n/ta-IN.i18n.json
  28. 2
      lib/fileUpload.coffee
  29. 2
      mobile-config.js
  30. 2
      packages/rocketchat-external/app/client/views/message.coffee
  31. 4
      packages/rocketchat-external/app/client/views/room.coffee
  32. 6
      packages/rocketchat-ldap/i18n/fi.i18n.json
  33. 38
      packages/rocketchat-lib/server/sendMessage.coffee
  34. 4
      packages/rocketchat-lib/settings/server/startup.coffee
  35. 4
      packages/rocketchat-mentions/client.coffee
  36. 3
      packages/rocketchat-oembed/client/baseWidget.coffee
  37. 12
      packages/rocketchat-oembed/client/oembedAudioWidget.html
  38. 2
      packages/rocketchat-oembed/client/oembedImageWidget.html
  39. 2
      packages/rocketchat-oembed/package.js
  40. 3
      packages/rocketchat-oembed/server/server.coffee
  41. 7
      packages/rocketchat-webrtc-ib/i18n/de.i18n.json
  42. 7
      packages/rocketchat-webrtc-ib/i18n/fi.i18n.json
  43. 7
      packages/rocketchat-webrtc-ib/i18n/pl.i18n.json
  44. 147
      public/recorderWorker.js
  45. 1
      server/lib/accounts.coffee
  46. 2
      server/methods/canAccessRoom.coffee
  47. 1
      server/methods/registerUser.coffee

@ -70,7 +70,6 @@ pauli:accounts-linkedin
percolate:migrations
percolatestudio:synced-cron
raix:handlebar-helpers
raix:push
raix:ui-dropped-event
tap:i18n
tmeasday:crypto-md5
@ -80,3 +79,4 @@ underscorestring:underscore.string
yasaricli:slugify
yasinuslu:blaze-meta
rocketchat:colors
raix:push@2.6.13-rc.1

@ -103,7 +103,7 @@ qnub:emojione@0.0.3
raix:eventemitter@0.1.3
raix:eventstate@0.0.2
raix:handlebar-helpers@0.2.4
raix:push@2.6.12
raix:push@2.6.13-rc.1
raix:ui-dropped-event@0.0.7
random@1.0.3
reactive-dict@1.1.0

@ -7,4 +7,6 @@ before_install:
- "curl https://install.meteor.com | /bin/sh"
script:
- meteor build --server rocket.chat ./
- meteor add rocketchat:external
- meteor add rocketchat:hubot
- meteor build --server demo.rocket.chat ./

@ -16,12 +16,14 @@ Meteor.loginWithFacebookCordova = (options, callback) ->
facebookConnectPlugin.getLoginStatus (response) ->
if response.status isnt "connected"
facebookConnectPlugin.login ["public_profile", "email"], fbLoginSuccess, (error) ->
console.log("" + error)
console.log('login', JSON.stringify(error), error)
callback(error)
else
fbLoginSuccess(response)
, (error) ->
console.log("" + error)
console.log('getLoginStatus', JSON.stringify(error), error)
callback(error)
else
Facebook.requestCredential(options, credentialRequestCompleteCallback)

@ -0,0 +1,59 @@
@fileUpload = (files) ->
files = [].concat files
consume = ->
file = files.pop()
if not file?
swal.close()
return
reader = new FileReader()
reader.onload = (event) ->
fileContent = event.target.result
text = ''
if file.type is 'audio'
text = """
<div class='upload-preview'>
<audio style="width: 100%;" controls="controls">
<source src="#{fileContent}" type="audio/wav">
Your browser does not support the audio element.
</audio>
</div>
<div class='upload-preview-title'>#{file.name}</div>
"""
else
text = """
<div class='upload-preview'>
<div class='upload-preview-file' style='background-image: url(#{fileContent})'></div>
</div>
<div class='upload-preview-title'>#{file.name}</div>
"""
swal
title: t('Upload_file_question')
text: text
showCancelButton: true
closeOnConfirm: false
closeOnCancel: false
html: true
, (isConfirm) ->
consume()
if isConfirm isnt true
return
newFile = new (FS.File)(file.file)
if file.name?
newFile.name(file.name)
newFile.rid = Session.get('openedRoom')
newFile.recId = Random.id()
newFile.userId = Meteor.userId()
Files.insert newFile, (error, fileObj) ->
unless error
toastr.success 'Upload succeeded!'
reader.readAsDataURL(file.file)
consume()

@ -0,0 +1,40 @@
@AudioRecorder = new class
start: (cb) ->
window.AudioContext = window.AudioContext or window.webkitAudioContext
navigator.getUserMedia = navigator.getUserMedia or navigator.webkitGetUserMedia
window.URL = window.URL or window.webkitURL
@audio_context = new AudioContext
ok = (stream) =>
@startUserMedia(stream)
cb?.call(@)
if not navigator.getUserMedia?
return cb false
navigator.getUserMedia {audio: true}, ok, (e) ->
console.log('No live audio input: ' + e)
startUserMedia: (stream) ->
@stream = stream
input = @audio_context.createMediaStreamSource(stream)
@recorder = new Recorder(input, {workerPath: '/recorderWorker.js'})
@recorder.record()
stop: (cb) ->
@recorder.stop()
if cb?
@getBlob cb
@stream.stop()
@recorder.clear()
delete @audio_context
delete @recorder
delete @stream
getBlob: (cb) ->
@recorder.exportWAV cb

@ -0,0 +1,92 @@
(function(window){
var WORKER_PATH = 'recorderWorker.js';
var Recorder = function(source, cfg){
var config = cfg || {};
var bufferLen = config.bufferLen || 4096;
var numChannels = config.numChannels || 2;
this.context = source.context;
this.node = (this.context.createScriptProcessor ||
this.context.createJavaScriptNode).call(this.context,
bufferLen, numChannels, numChannels);
var worker = new Worker(config.workerPath || WORKER_PATH);
worker.postMessage({
command: 'init',
config: {
sampleRate: this.context.sampleRate,
numChannels: numChannels
}
});
var recording = false,
currCallback;
this.node.onaudioprocess = function(e){
if (!recording) return;
var buffer = [];
for (var channel = 0; channel < numChannels; channel++){
buffer.push(e.inputBuffer.getChannelData(channel));
}
worker.postMessage({
command: 'record',
buffer: buffer
});
}
this.configure = function(cfg){
for (var prop in cfg){
if (cfg.hasOwnProperty(prop)){
config[prop] = cfg[prop];
}
}
}
this.record = function(){
recording = true;
}
this.stop = function(){
recording = false;
}
this.clear = function(){
worker.postMessage({ command: 'clear' });
}
this.getBuffer = function(cb) {
currCallback = cb || config.callback;
worker.postMessage({ command: 'getBuffer' })
}
this.exportWAV = function(cb, type){
currCallback = cb || config.callback;
type = type || config.type || 'audio/wav';
if (!currCallback) throw new Error('Callback not set');
worker.postMessage({
command: 'exportWAV',
type: type
});
}
worker.onmessage = function(e){
var blob = e.data;
currCallback(blob);
}
source.connect(this.node);
this.node.connect(this.context.destination); //this should not be necessary
};
Recorder.forceDownload = function(blob, filename){
var url = (window.URL || window.webkitURL).createObjectURL(blob);
var link = window.document.createElement('a');
link.href = url;
link.download = filename || 'output.wav';
var click = document.createEvent("Event");
click.initEvent("click", true, true);
link.dispatchEvent(click);
}
window.Recorder = Recorder;
})(window);

@ -75,6 +75,22 @@ blockquote {
}
}
.upload-preview {
background-color: #f5f5f5;
.upload-preview-file {
height: 200px;
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
}
}
.upload-preview-title {
background-color: #eee;
padding: 3px;
border-radius: 0 0 5px 5px;
}
.flex-center {
display: -webkit-flex;
display: flex;
@ -132,6 +148,10 @@ blockquote {
display: none !important;
}
.hidden {
display: none;
}
.small-title {
font-size: 13px;
text-transform: uppercase;
@ -641,8 +661,8 @@ label.required:after {
cursor: pointer;
margin-left: 7px;
position: absolute;
top: 4px;
left: 5px;
top: 5px;
left: 0px;
.transition(transform .2s ease-out .1s);
i {
display: block;
@ -1936,12 +1956,67 @@ a.github-fork {
.message-form {
> div {
position: relative;
display: flex;
display: -webkit-flex;
.input-message-container {
width: 100%;
}
> .file {
width: 44px;
font-size: 22px;
padding: 6px 0;
text-align: center;
border: 1px solid #E7E7E7;
border-radius: 5px 0 0 5px;
border-right: none;
cursor: pointer;
color: #888;
background-color: #FCFCFC;
.transition(background-color 0.1s linear, color 0.1s linear);
&:hover {
background-color: #F1F1F1;
color: #666;
}
input {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: hidden;
width: 44px;
opacity: 0;
cursor: pointer;
}
input::-webkit-file-upload-button {
cursor: pointer;
}
}
> .mic, .stop-mic {
width: 40px;
font-size: 22px;
padding: 7px 0;
margin-left: 4px;
text-align: center;
cursor: pointer;
color: #888;
border-radius: 30px;
background-color: #FCFCFC;
.transition(background-color 0.1s linear, color 0.1s linear);
&:hover {
background-color: #F1F1F1;
color: #666;
}
}
}
textarea {
display: block;
padding-top: 9px;
padding-bottom: 9px;
padding-right: 38px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
overflow-y: hidden;
resize: none;
&.editing {
@ -1951,7 +2026,7 @@ a.github-fork {
.icon-paper-plane {
position: absolute;
top: 2px;
right: 10px;
margin-left: -44px;
cursor: pointer;
padding: 8px;
font-size: 16px;
@ -3310,12 +3385,18 @@ a.github-fork {
}
.side-nav {
top: 0;
.transform(translateX(-100%));
// .transform(translateX(-100%));
.transition(transform .3s ease-out);
}
.main-content {
left: 0;
.transition(transform .3s ease-out);
z-index: 1000;
background-color: white;
&.notransition {
.transition(transform .0s);
}
}
.fixed-title h2 {
margin-left: 45px;
@ -3424,3 +3505,10 @@ a.github-fork {
border-width: 0 0 1px 0;
}
}
.touch {
.footer {
padding-left: 10px;
padding-right: 10px;
}
}

@ -1,14 +1,5 @@
Template.home.helpers
arrowPosition: ->
return 'left' unless Session.equals('flexOpened', true)
flexOpened: ->
return 'opened' if Session.equals('flexOpened', true)
withParagraph: ->
return {
withParagraph: true
}
Template.home.events
"click .flex-tab .more": (event) ->
Session.set('flexOpened', !Session.get('flexOpened'))
title: ->
return RocketChat.settings.get 'Layout_Home_Title'
body: ->
return RocketChat.settings.get 'Layout_Home_Body'

@ -3,54 +3,11 @@
<header class="fixed-title">
{{> burger}}
<h2>
<span class="room-title">{{_ "Welcome_to_the"}} Rocket.Chat</span>
<span class="room-title">{{title}}</span>
</h2>
</header>
<div class="content">
<img class="logo" src="/images/logo/logo-dark.svg?v=3" />
<div class="info">
<p>{{_ "Have_your_own_chat"}}</p>
<p>&larr; {{_ "use_menu"}}.</p>
</div>
{{ > social withParagraph }}
<div class="rocket-team">
<h4>{{_ "Get_to_know_the_team" }}</h4>
<ul>
<li>
<a target="_blank" href="https://github.com/engelgabriel" style="background-image: url(https://avatars1.githubusercontent.com/u/1000217?v=3&s=460)" title="Gabriel Engel (Founder & CEO)"></a>
</li>
<li>
<a target="_blank" href="https://github.com/sampaiodiego" style="background-image: url(https://avatars3.githubusercontent.com/u/8591547?v=3&s=460)" title="Diego Sampaio (Developer)"></a>
</li>
<li>
<a target="_blank" href="https://github.com/marceloschmidt" style="background-image: url(https://avatars1.githubusercontent.com/u/1986378?v=3&s=460)" title="Marcelo Schmidt (Developer)"></a>
</li>
<li>
<a target="_blank" href="https://github.com/rodrigok" style="background-image:url(https://avatars2.githubusercontent.com/u/234261?v=3&s=460)" title="Rodrigo Nascimento (Developer)"></a>
</li>
<li>
<a target="_blank" href="https://github.com/rcaferati" style="background-image: url(https://avatars2.githubusercontent.com/u/8358797?v=3&s=460)" title="Rafael Caferati (UX Architect)"></a>
</li>
<li>
<a target="_blank" href="https://github.com/Sing-Li" style="background-image: url(https://avatars3.githubusercontent.com/u/122633?v=3&s=460)" title="Sing Li (Developer)"></a>
</li>
</ul>
</div>
{{{body}}}
</div>
</section>
<!-- <section class="flex-tab">
<div class="control">
<button class="more"><span class="arrow {{arrowPosition}}"></span></button>
</div>
<div class="content">
<div class="list-view">
<div class="status">
<h2>{{_ "Chat_Rooms"}}</h2>
<p>
{{{_ "Showing_online_users" total_online=1 total=1}}}
</p>
</div>
</div>
</div>
</section> -->
</template>

@ -19,9 +19,9 @@ Template.message.helpers
when 'r' then t('Room_name_changed', { room_name: this.msg, user_by: this.u.username })
when 'au' then t('User_added_by', { user_added: this.msg, user_by: this.u.username })
when 'ru' then t('User_removed_by', { user_removed: this.msg, user_by: this.u.username })
when 'ul' then tr('User_left', { context: this.u.gender }, { user_left: this.u.username })
when 'ul' then t('User_left', { user_left: this.u.username })
when 'nu' then t('User_added', { user_added: this.u.username })
when 'uj' then tr('User_joined_channel', { context: this.u.gender }, { user: this.u.username })
when 'uj' then t('User_joined_channel', { user: this.u.username })
when 'wm' then t('Welcome', { user: this.u.username })
when 'rtc' then RocketChat.callbacks.run 'renderRtcMessage', this
else
@ -59,7 +59,7 @@ Template.message.onViewRendered = (context) ->
ul = lastNode.parentElement
wrapper = ul.parentElement
if context.urls?.length > 0 and Template.oembedBaseWidget?
if context.urls?.length > 0 and Template.oembedBaseWidget? and RocketChat.settings.get 'API_Embed'
for item in context.urls
do (item) ->
urlNode = lastNode.querySelector('.body a[href="'+item.url+'"]')

@ -118,7 +118,7 @@ Template.messagePopup.onCreated ->
firstPartValue = value.substr 0, caret
lastPartValue = value.substr caret
firstPartValue = firstPartValue.replace(template.selectorRegex, template.prefix + this.getValue(template.value.curValue, template.data.collection) + template.suffix)
firstPartValue = firstPartValue.replace(template.selectorRegex, template.prefix + this.getValue(template.value.curValue, template.data.collection, firstPartValue) + template.suffix)
template.input.value = firstPartValue + lastPartValue

@ -21,11 +21,19 @@ Template.messagePopupConfig.helpers
items.unshift all
return items
getValue: (_id, collection) ->
getValue: (_id, collection, firstPartValue) ->
if _id is '@all'
return 'all'
if firstPartValue.indexOf(' ') > -1
return 'all'
return 'all:'
username = collection.findOne(_id)?.username
if firstPartValue.indexOf(' ') > -1
return username
return collection.findOne(_id)?.username
return username + ':'
return config

@ -295,6 +295,9 @@ Template.room.helpers
canJoin: ->
return !! ChatRoom.findOne { _id: @_id, t: 'c' }
canRecordAudio: ->
return navigator.getUserMedia? or navigator.webkitGetUserMedia?
Template.room.events
@ -353,20 +356,15 @@ Template.room.events
return
items = e.originalEvent.clipboardData.items
files = []
for item in items
if item.kind is 'file' and item.type.indexOf('image/') isnt -1
e.preventDefault()
files.push
file: item.getAsFile()
name: 'Clipboard'
blob = item.getAsFile()
newFile = new (FS.File)(blob)
newFile.name('Clipboard')
newFile.rid = Session.get('openedRoom')
newFile.recId = Random.id()
newFile.userId = Meteor.userId()
Files.insert newFile, (error, fileObj) ->
unless error
toastr.success 'Upload from clipboard succeeded!'
fileUpload files
'keydown .input-message': (event) ->
Template.instance().chatMessages.keydown(@_id, event, Template.instance())
@ -551,14 +549,43 @@ Template.room.events
'dropped .dropzone-overlay': (e) ->
e.currentTarget.parentNode.classList.remove 'over'
files = []
FS?.Utility?.eachFile e, (file) ->
newFile = new (FS.File)(file)
newFile.rid = Session.get('openedRoom')
newFile.recId = Random.id()
newFile.userId = Meteor.userId()
Files.insert newFile, (error, fileObj) ->
unless error
toastr.success 'Upload succeeded!'
files.push
file: file
name: file.name
fileUpload files
'change .message-form input[type=file]': (event, template) ->
e = event.originalEvent or event
files = e.target.files
if not files or files.length is 0
files = e.dataTransfer?.files or []
filesToUpload = []
for file in files
filesToUpload.push
file: file
name: file.name
fileUpload filesToUpload
'click .message-form .mic': (e, t) ->
AudioRecorder.start ->
t.$('.stop-mic').removeClass('hidden')
t.$('.mic').addClass('hidden')
'click .message-form .stop-mic': (e, t) ->
AudioRecorder.stop (blob) ->
fileUpload [{
file: blob
type: 'audio'
name: 'Audio record'
}]
t.$('.stop-mic').addClass('hidden')
t.$('.mic').removeClass('hidden')
'click .deactivate': ->
username = Session.get('showUserInfo')

@ -45,10 +45,24 @@
<footer class="footer">
{{#if subscribed}}
<form class="message-form" method="post" action="/">
<div>
{{> messagePopupConfig getPupupConfig}}
<textarea dir="auto" name="msg" maxlength="{{maxMessageLength}}" class="input-message" placeholder="{{_ 'Message'}}"></textarea>
<div style="display: flex">
<div class="file">
<i class="icon-attach"></i>
<input type="file" accept="image/*">
</div>
<div class="input-message-container">
{{> messagePopupConfig getPupupConfig}}
<textarea dir="auto" name="msg" maxlength="{{maxMessageLength}}" class="input-message" placeholder="{{_ 'Message'}}"></textarea>
</div>
<i class="icon-paper-plane" title="{{_ "Send_Message"}}"></i>
{{#if canRecordAudio}}
<div class="mic">
<i class="icon-mic"></i>
</div>
<div class="stop-mic hidden">
<i class="icon-stop"></i>
</div>
{{/if}}
</div>
<div class="users-typing">
{{#with usersTyping}}

@ -42,7 +42,7 @@ Template.loginServices.events
serviceIcon.removeClass 'hidden'
if error
console.log error
console.log JSON.stringify(error), error.message
toastr.error error.message
return
@ -61,7 +61,7 @@ Template.loginServices.events
return
if error
console.log error
console.log JSON.stringify(error), error.message
toastr.error error.message
return
FlowRouter.go 'index'

@ -102,6 +102,60 @@ Template.main.events
chatContainer = $("#rocket-chat")
menu.toggle()
'touchstart': (e, t) ->
if document.body.clientWidth > 780
return
t.touchstartX = undefined
t.touchstartY = undefined
t.movestarted = false
if $(e.currentTarget).closest('.main-content').length > 0
t.touchstartX = e.originalEvent.touches[0].clientX
t.touchstartY = e.originalEvent.touches[0].clientY
t.mainContent = $('.main-content')
'touchmove': (e, t) ->
if t.touchstartX?
touch = e.originalEvent.touches[0]
diffX = t.touchstartX - touch.clientX
diffY = t.touchstartY - touch.clientY
absX = Math.abs(diffX)
absY = Math.abs(diffY)
if t.movestarted is true or (absX > 20 and absY < 20)
t.movestarted = true
if menu.isOpen()
t.left = 260 - diffX
else
t.left = -diffX
if t.left > 260
t.left = 260
if t.left < 0
t.left = 0
t.mainContent.addClass('notransition')
t.mainContent.css('transform', 'translate('+t.left+'px)')
'touchend': (e, t) ->
t.touchstartX = undefined
if t.movestarted is true
t.mainContent.removeClass('notransition')
t.mainContent.css('transform', '');
if menu.isOpen()
if t.left >= 200
menu.open()
else
menu.close()
else
if t.left >= 60
menu.open()
else
menu.close()
Template.main.onRendered ->

@ -1,10 +1,15 @@
{
"Access_online_demo" : "Öffne die online demo",
"Access_Online_Demo" : "Öffne die Online Demo",
"Accounts_EmailVerification" : "E-Mail-Verifizierung",
"Accounts_RegistrationRequired" : "Anmeldung erforderlich",
"Add_Members" : "Mitglieder hinzufügen",
"Add_users" : "Benutzer hinzufügen",
"All_channels" : "Alle Kanäle",
"API_Analytics" : "Analytics",
"API_Embed" : "Einbetten",
"App_Settings" : "App-Einstellungen",
"Avatar_changed_successfully" : "Avatar erfolgreich geändert",
"and" : "und",
"are_also_typing" : "schreiben auch",
"are_typing" : "schreiben",
@ -40,13 +45,16 @@
"Created_at" : "Erstellt am",
"Direct_Messages" : "Private Nachrichten",
"Deleted" : "Gelöscht!",
"Drop_to_upload_file" : "Ablegen um Datei zu uploaden",
"Duplicate_private_group_name" : "Eine private Gruppe mit dem Namen, '%s', existiert",
"Duplicate_channel_name" : "Ein Kanal mit dem Namen, '%s', existiert",
"edited" : "bearbeitet",
"Email_or_username" : "Email oder Username",
"Email_verified" : "Email bestätigt",
"Email_already_exists" : "E-Mail existiert bereits",
"Enter_info" : "Geben Sie Ihre Anmeldedaten an",
"Error_changing_password" : "Passwort geändert",
"False" : "Falsch",
"Favorites" : "Favoriten",
"Follow_social_profiles" : "Folge uns in sozialen Netzen, fork uns auf github und teile deine Gedanken über die rocket.chat app auf unserem trello board.",
"Forgot_password" : "Passwort vergessen?",
@ -76,9 +84,11 @@
"Language" : "Sprache",
"Language_Version" : "Deutsche Version",
"Last_message" : "Letzte Nachricht",
"Last_login" : "Letztes login",
"Leave_room" : "Raum verlassen",
"line" : "Zeilen",
"Load_more" : "Mehr laden",
"Loading..." : "Wird geladen ...",
"Loading_suggestion" : "Vorschläge werden geladen...",
"Login" : "Login",
"Login_with" : "Login mit %s",
@ -87,9 +97,20 @@
"Members" : "Mitglieder",
"Members_List" : "Mitgliederliste",
"Members_placeholder" : "Mitglieder",
"Message" : "Nachricht",
"Message_Edit" : "Erlaube Bearbeitung von Nachrichten",
"Message_Delete" : "Erlaube Nachrichten zu löschen",
"Message_ShowEditedStatus" : "Zeige Bearbeitungsstatus",
"Message_ShowDeletedStatus" : "Zeige Löschstatus",
"Meta_language" : "Sprache",
"Meta_fb_app_id" : "Facebook APP ID",
"Meta_robots" : "Robots",
"Meta_google-site-verification" : "Google Seiten",
"Meta_msvalidate01" : "MSValidate.01",
"More_channels" : "Mehr Channels",
"Msgs" : "Mttl",
"multi" : "mehrere",
"My_Account" : "Mein Konto",
"n_messages" : "%s Nachrichten",
"Name" : "Name",
"New_messages" : "Neue Nachrichten",
@ -102,6 +123,7 @@
"Not_allowed" : "Nicht erlaubt",
"Not_found_or_not_allowed" : "Nicht gefunden oder erlaubt",
"Nothing_found" : "Nichts gefunden",
"Notify_all_in_this_room" : "Alle in diesem Raum benachrichtigen",
"Online" : "Online",
"Oops!" : "Oops",
"others" : "andere",
@ -111,7 +133,18 @@
"Powered_by" : "Powered by",
"Privacy" : "Datenschutz",
"Private_Groups" : "Private Gruppen",
"Profile" : "Profil",
"Profile_saved_successfully" : "Profil erfolgreich gespeichert",
"Proudly_developed" : "Stolz mit Meteor entwickelt",
"Push_debug" : "Debuggen",
"Push_enable" : "Aktivieren",
"Push_production" : "Produktion",
"Push_apn_passphrase" : "APN Passphrase",
"Push_apn_key" : "APN Key",
"Push_apn_cert" : "APN Cert",
"Push_apn_dev_passphrase" : "APN Dev Passphrase",
"Push_apn_dev_key" : "APN Dev Key",
"Push_apn_dev_cert" : "APN Dev Cert",
"Quick_Search" : "Schnellsuche",
"quote" : "Zitat",
"Recents" : "Aktuell",
@ -123,6 +156,7 @@
"Room_name_changed" : "Raumname geändert zu: <em>__room_name__</em> von <em>__user_by__</em>",
"Room_name_changed_successfully" : "Raumname erfolgreich umbenannt",
"Save" : "Speichern",
"Save_changes" : "Änderungen speichern",
"Search" : "Suche",
"Search_settings" : "Sucheinstellungen",
"See_all" : "Alle anzeigen",
@ -138,10 +172,17 @@
"Showing_results" : "<p>Zeige <b>%s</b> Ergebnisse</p>",
"Silence" : "Ruhe",
"since_creation" : "seit %s",
"SMTP_Host" : "SMTP Host",
"SMTP_Password" : "SMTP Passwort",
"SMTP_Port" : "SMTP Port",
"SMTP_Security" : "SMTP Sicherheit",
"SMTP_Username" : "SMTP Benutzername",
"Start_of_conversation" : "Beginn der Konversation",
"strike" : "durchgestrichen",
"Submit" : "Abschicken",
"The_field_is_required" : "Das Feld %s ist erforderlich.",
"True" : "Wahr",
"Unnamed" : "Unbenannt",
"Use_initials_avatar" : "Benutze deine Initialien",
"use_menu" : "Benutze das Seitenmenü um deine Chats zu öffnen",
"Use_service_avatar" : "Benutze %s avatar",
@ -149,6 +190,8 @@
"Use_uploaded_avatar" : "Benutze diesen Avatar",
"User_added" : "Benutzer <em>__user_added__</em> wurde hinzugefügt.",
"User_added_by" : "Benutzer <em>__user_added__</em> hinzugefügt von <em>__user_by__</em>.",
"User_has_been_activated" : "Benutzer wurde aktiviert",
"User_has_been_deactivated" : "Benutzer wurde deaktiviert",
"User_joined_channel" : "Ist dem Kanal beigetreten.",
"User_joined_channel_male" : "Ist dem Kanal beigetreten.",
"User_joined_channel_female" : "Ist dem Kanal beigetreten.",
@ -157,6 +200,7 @@
"User_left_female" : "Benutzer <em>__user_left__</em> ist gegangen.",
"User_logged_out" : "Benutzer ausgeloggt",
"User_removed_by" : "Benutzer <em>__user_removed__</em> entfernt von <em>__user_by__</em>.",
"User_Settings" : "Benutzereinstellungen",
"Username" : "Benutzername",
"Username_cant_be_empty" : "Der Benutzername darf nicht leer sein",
"Username_description" : "Der Benutzername wird dazu benutzt Sie in Nachtichten zu markieren.",

@ -1,10 +1,15 @@
{
"Access_online_demo" : "Δείτε το online demo",
"Access_Online_Demo" : "Δείτε το Online Demo",
"Accounts_EmailVerification" : "Επιβεβαίωση E-mail",
"Accounts_RegistrationRequired" : "Απαιτείται Εγγραφή",
"Add_Members" : "Προσθέστε Μέλη",
"Add_users" : "Προσθήκη χρηστών",
"All_channels" : "Όλα τα κανάλια",
"API_Analytics" : "Analytics",
"API_Embed" : "Embed",
"App_Settings" : "Ρυθμίσεις Εφαρμογής",
"Avatar_changed_successfully" : "Το Avatar άλλαξε με επιτυχία",
"and" : "και",
"are_also_typing" : "πληκτρολογεί επίσης",
"are_typing" : "πληκτρολογεί",
@ -40,6 +45,7 @@
"Created_at" : "Δημιουργήθηκε στις",
"Direct_Messages" : "Άμεσα μηνύματα",
"Deleted" : "Διαγράφηκε!",
"Drop_to_upload_file" : "Πετάξτε εδώ αρχεία για upload",
"Duplicate_private_group_name" : "Υπάρχει ήδη ΄κλειστή ομάδα με όνομα '%s'",
"Duplicate_channel_name" : "Υπάρχει ήδη κανάλι με όνομα '%s'",
"edited" : "επεξεργ.",
@ -48,6 +54,7 @@
"Email_already_exists" : "Το Email υπάρχει ήδη",
"Enter_info" : "Εισάγετε στοιχεία σύνδεσης",
"Error_changing_password" : "Ο κωδικός άλλαξε",
"False" : "Ψευδής",
"Favorites" : "Αγαπημενα",
"Follow_social_profiles" : "Ακολουθήστε μας στα κοινωνικά δίκτυα, κάντε μας fork στο github και μοιραστείτε τις σκέψεις σας για την εφαρμογή rocket.chat στον πίνακα trello.",
"Forgot_password" : "Ξέχασα τον κωδικό μου",
@ -77,9 +84,11 @@
"Language" : "Γλώσσα",
"Language_Version" : "Ελληνική Έκδοση",
"Last_message" : "Τελευταίο μήνυμα",
"Last_login" : "Τελευταία σύνδεση",
"Leave_room" : "Έξοδος από το δωμάτιο",
"line" : "γραμμές",
"Load_more" : "Φόρτωση περισσότερων",
"Loading..." : "Φορτώνει ...",
"Loading_suggestion" : "Φόρτωση προτάσεων...",
"Login" : "Είσοδος",
"Login_with" : "Είσοδος με %s",
@ -89,9 +98,20 @@
"Members_List" : "Λίστα μελών",
"Members_placeholder" : "Μέλη",
"Message" : "Μήνυμα",
"Message_Edit" : "Επιτρέπεται επεξεργασία μηνυμάτων",
"Message_Delete" : "Επιτρέπεται διαγραφή μηνυμάτων",
"Message_ShowEditedStatus" : "Εμφάνιση Επεξεργασμένης Κατάστασης",
"Message_ShowDeletedStatus" : "Εμφάνιση Διαγραμμένης Κατάστασης",
"Message_KeepStatusHistory" : "Κρατήστε ιστορικό κατάστασης",
"Meta_language" : "Γλώσσα",
"Meta_fb_app_id" : "Facebook APP ID",
"Meta_robots" : "Ρομπότ",
"Meta_google-site-verification" : "Επαλήθευση ιστότοπου Google",
"Meta_msvalidate01" : "MSValidate.01",
"More_channels" : "Περισσότερα κανάλια",
"Msgs" : "Μνμτα",
"multi" : "πολλαπλές",
"My_Account" : "Ο Λογαριασμός Μου",
"n_messages" : "%s μηνύματα",
"Name" : "Όνομα",
"New_messages" : "Νέα μηνύματα",
@ -114,7 +134,18 @@
"Powered_by" : "Powered by",
"Privacy" : "Ιδιωτικότητα",
"Private_Groups" : "Κλειστές Ομάδες",
"Profile" : "Προφίλ",
"Profile_saved_successfully" : "Το προφίλ αποθηκεύτηκε με επιτυχία",
"Proudly_developed" : "Αναπτύχθηκε με Meteor",
"Push_debug" : "Αποσφαλμάτωση",
"Push_enable" : "Ενεργοποίηση",
"Push_production" : "Παραγωγή",
"Push_apn_passphrase" : "APN Συνθηματικό",
"Push_apn_key" : "APN Κλειδί",
"Push_apn_cert" : "APN Πιστοποιητικό",
"Push_apn_dev_passphrase" : "APN Dev Συνθηματικό",
"Push_apn_dev_key" : "APN Dev Κλειδί",
"Push_apn_dev_cert" : "APN Dev Πιστοποιητικό",
"Quick_Search" : "Γρήγορη Αναζήτηση",
"quote" : "παράθεση",
"Recents" : "Πρόσφατα",
@ -126,6 +157,7 @@
"Room_name_changed" : "Το όνομα του δωματίου άλλαξε σε: <em>__room_name__</em> από τον χρήστη <em>__user_by__</em>",
"Room_name_changed_successfully" : "Το όνομα του δωματίου άλλαξε επιτυχώς",
"Save" : "Αποθήκευση",
"Save_changes" : "Αποθήκευση αλλαγών",
"Search" : "Αναζήτηση",
"Search_settings" : "Ρυθμίσεις αναζήτησης",
"See_all" : "Εμφάνιση όλων",
@ -141,10 +173,17 @@
"Showing_results" : "<p>Εμφανιζονται <b>%s</b> αποτελεσματα</p>",
"Silence" : "Ησυχία",
"since_creation" : "από %s",
"SMTP_Host" : "SMTP Host",
"SMTP_Password" : "SMTP Κωδικός",
"SMTP_Port" : "SMTP Θύρα",
"SMTP_Security" : "SMTP Ασφάλεια",
"SMTP_Username" : "SMTP Όνομα χρήστη",
"Start_of_conversation" : "Αρχή της συνομιλίας",
"strike" : "σβήσιμο",
"Submit" : "Υποβολή",
"The_field_is_required" : "Το πεδίο %s απαιτείται.",
"True" : "Αληθής",
"Unnamed" : "Ανώνυμο",
"Use_initials_avatar" : "Χρήση των αρχικών του username σας",
"use_menu" : "Χρησιμοποιήστε το πλευρικό μενου για πρόσβαση στα δωμάτια και τις συνομιλίες σας",
"Use_service_avatar" : "Χρήση %s avatar",
@ -152,6 +191,8 @@
"Use_uploaded_avatar" : "Χρηση ανεβασμένου avatar",
"User_added" : "Ο χρήστης <em>__user_added__</em> πρστέθηκε.",
"User_added_by" : "Ο χρήστης <em>__user_added__</em> πρστέθηκε από τον <em>__user_by__</em>.",
"User_has_been_activated" : "Ο χρήστης έχει ενεργοποιηθεί",
"User_has_been_deactivated" : "Ο χρήστης έχει απενεργοποιηθεί",
"User_joined_channel" : "Μπήκε στο κανάλι.",
"User_joined_channel_male" : "Μπήκε στο κανάλι.",
"User_joined_channel_female" : "Μπήκε στο κανάλι.",
@ -160,6 +201,7 @@
"User_left_female" : "Η χρήστης <em>__user_left__</em> αποχώρησε.",
"User_logged_out" : "Ο χρήστης έχει αποσυνδεθεί",
"User_removed_by" : "Ο χρήστης <em>__user_removed__</em> αφαιρέθηκε από τον <em>__user_by__</em>.",
"User_Settings" : "Ρυθμίσεις χρήστη",
"Username" : "Όνομα χρήστη",
"Username_cant_be_empty" : "Το όνομα χρήστη δε μπορεί να είναι κενό",
"Username_description" : "Το όνομα χρήστη χρησιμοποιείται για να επιτρέπεται σε άλλους να σας αναφέρουν στα μηνύματα.",

@ -1,8 +1,8 @@
{
"Access_online_demo" : "Access the online demo",
"Access_Online_Demo" : "Access the Online Demo",
"Accounts_EmailVerification": "E-mail Verification",
"Accounts_RegistrationRequired": "Registration Required",
"Accounts_EmailVerification" : "E-mail Verification",
"Accounts_RegistrationRequired" : "Registration Required",
"Add_Members" : "Add Members",
"Add_users" : "Add users",
"All_channels" : "All channels",
@ -137,15 +137,15 @@
"Profile" : "Profile",
"Profile_saved_successfully" : "Profile saved successfully",
"Proudly_developed" : "Proudly developed with Meteor",
"Push_debug": "Debug",
"Push_enable": "Enable",
"Push_production": "Production",
"Push_apn_passphrase": "APN Passphrase",
"Push_apn_key": "APN Key",
"Push_apn_cert": "APN Cert",
"Push_apn_dev_passphrase": "APN Dev Passphrase",
"Push_apn_dev_key": "APN Dev Key",
"Push_apn_dev_cert": "APN Dev Cert",
"Push_debug" : "Debug",
"Push_enable" : "Enable",
"Push_production" : "Production",
"Push_apn_passphrase" : "APN Passphrase",
"Push_apn_key" : "APN Key",
"Push_apn_cert" : "APN Cert",
"Push_apn_dev_passphrase" : "APN Dev Passphrase",
"Push_apn_dev_key" : "APN Dev Key",
"Push_apn_dev_cert" : "APN Dev Cert",
"Quick_Search" : "Quick Search",
"quote" : "quote",
"Recents" : "Recents",
@ -184,6 +184,7 @@
"The_field_is_required" : "The field %s is required.",
"True" : "True",
"Unnamed" : "Unnamed",
"Upload_file_question" : "Upload file?",
"Use_initials_avatar" : "Use your username initials",
"use_menu" : "Use the side menu to access your rooms and chats",
"Use_service_avatar" : "Use %s avatar",
@ -191,8 +192,8 @@
"Use_uploaded_avatar" : "Use uploaded avatar",
"User_added" : "User <em>__user_added__</em> added.",
"User_added_by" : "User <em>__user_added__</em> added by <em>__user_by__</em>.",
"User_has_been_activated": "User has been activated",
"User_has_been_deactivated": "User has been deactivated",
"User_has_been_activated" : "User has been activated",
"User_has_been_deactivated" : "User has been deactivated",
"User_joined_channel" : "Has joined the channel.",
"User_joined_channel_male" : "Has joined the channel.",
"User_joined_channel_female" : "Has joined the channel.",
@ -220,4 +221,4 @@
"You_will_not_be_able_to_recover" : "You will not be able to recover!",
"Yes_delete_it" : "Yes, delete it!",
"Your_entry_has_been_deleted" : "Your entry has been deleted."
}
}

@ -1,10 +1,15 @@
{
"Access_online_demo" : "Access the online demo",
"Access_Online_Demo" : "Access the Online Demo",
"Accounts_EmailVerification" : "Sähköpostiosoitteen varmistaminen",
"Accounts_RegistrationRequired" : "Rekisteröinti vaaditaan",
"Add_Members" : "Lisää osallistujia",
"Add_users" : "Lisää käyttäjiä",
"All_channels" : "Kaikki kanavat",
"API_Analytics" : "Analytics",
"API_Embed" : "Upota",
"App_Settings" : "Ohjelman asetukset",
"Avatar_changed_successfully" : "Avatar vaihdettu onnistuneesti",
"and" : "ja",
"are_also_typing" : "kirjoittavat myös",
"are_typing" : "kirjoittavat",
@ -40,6 +45,7 @@
"Created_at" : "Luotu",
"Direct_Messages" : "Yksityisviestit",
"Deleted" : "Poistettu!",
"Drop_to_upload_file" : "Vedä ja pudota lähettääksesi tiedoston",
"Duplicate_private_group_name" : "Privaattiryhmä '%s' on olemassa jo",
"Duplicate_channel_name" : "Kanava nimeltä '%s' on olemassa jo",
"edited" : "muokattu",
@ -48,6 +54,7 @@
"Email_already_exists" : "Sähköpostiosoite on jo olemassa",
"Enter_info" : "Syötä kirjautumistietosi",
"Error_changing_password" : "Salasana vaihdettu",
"False" : "Ei",
"Favorites" : "Suosikit",
"Follow_social_profiles" : "Seuraa someamme, forkkaa Githubissa ja jaa ajatuksiasi rocket.chatista trellossa.",
"Forgot_password" : "Unohditko salasanasi?",
@ -77,9 +84,11 @@
"Language" : "Kieli",
"Language_Version" : "Suomi",
"Last_message" : "Viimeinen viesti",
"Last_login" : "Viimeisin kirjautuminen",
"Leave_room" : "Poistu kanavalta",
"line" : "viiva",
"Load_more" : "Lataa lisää",
"Loading..." : "Ladataan...",
"Loading_suggestion" : "Ladataan ehdotuksia...",
"Login" : "Kirjaudu",
"Login_with" : "Kirjaudu käyttäen %s",
@ -89,9 +98,14 @@
"Members_List" : "Jäsenlista",
"Members_placeholder" : "Jäsenet",
"Message" : "Viesti",
"Message_Edit" : "Salli viestin muokkaus",
"Message_Delete" : "Salli viestin poisto",
"Meta_language" : "Kieli",
"Meta_fb_app_id" : "Facebook APP ID",
"More_channels" : "Lisää kanavia",
"Msgs" : "Viestit",
"multi" : "moni",
"My_Account" : "Käyttäjätilini",
"n_messages" : "%s viestiä",
"Name" : "Nimi",
"New_messages" : "Uusia viestejä",
@ -114,7 +128,17 @@
"Powered_by" : "Powered by",
"Privacy" : "Yksityisyys",
"Private_Groups" : "Yksityisviestikeskustelut",
"Profile" : "Profiili",
"Profile_saved_successfully" : "Profiili tallennettu onnistuneesti",
"Proudly_developed" : "Proudly developed with Meteor",
"Push_debug" : "Debug",
"Push_enable" : "Kytke päälle",
"Push_apn_passphrase" : "APN ",
"Push_apn_key" : "APN Avain",
"Push_apn_cert" : "APN ",
"Push_apn_dev_passphrase" : "APN Tunnuslause (kehitys)",
"Push_apn_dev_key" : "APN Avain (kehitys)",
"Push_apn_dev_cert" : "APN Cert (kehitys)",
"Quick_Search" : "Pikaetsintä",
"quote" : "lainaus",
"Recents" : "Viimeisimmät",
@ -126,6 +150,7 @@
"Room_name_changed" : "Huoneen nimi vaihdettu <em>__room_name__</em> <em>__user_by__</em> toimesta",
"Room_name_changed_successfully" : "Huoneen nimi vaihdettu",
"Save" : "Tallenna",
"Save_changes" : "Tallenna",
"Search" : "Etsi",
"Search_settings" : "Etsi asetuksista",
"See_all" : "Katso kaikki",
@ -141,10 +166,17 @@
"Showing_results" : "<p>Näytetään <b>%s</b> tulosta</p>",
"Silence" : "Hiljaisuus",
"since_creation" : "%s saakka",
"SMTP_Host" : "SMTP-palvelin",
"SMTP_Password" : "SMTP Salasana",
"SMTP_Port" : "SMTP-portti",
"SMTP_Security" : "SMTP Salaus",
"SMTP_Username" : "SMTP Käyttäjätunnus",
"Start_of_conversation" : "Keskustelun alku",
"strike" : "yliviivaa",
"Submit" : "Lähetä",
"The_field_is_required" : "Kenttä %s vaaditaan.",
"True" : "Kyllä",
"Unnamed" : "Nimetön",
"Use_initials_avatar" : "Käytä käyttäjätunnuksen nimikirjaimia",
"use_menu" : "Käytä sivuvalikkoa Use the side menu to access your rooms and chats",
"Use_service_avatar" : "Käytä %s avataria",
@ -152,6 +184,8 @@
"Use_uploaded_avatar" : "Käytä ladattua avataria",
"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_has_been_activated" : "Käyttäjä on aktivoitu",
"User_has_been_deactivated" : "Käyttäjä on deaktivoitu",
"User_joined_channel" : "Liittyi kanavalle.",
"User_joined_channel_male" : "Liittyi kanavalle.",
"User_joined_channel_female" : "Liittyi kanavalle.",
@ -160,6 +194,7 @@
"User_left_female" : "Käyttäjä <em>__user_left__</em> poistui.",
"User_logged_out" : "Käyttäjä on kirjautunut ulos",
"User_removed_by" : "Käyttäjä <em>__user_removed__</em> poistettu <em>__user_by__</em> toimesta.",
"User_Settings" : "Käyttäjä",
"Username" : "Käyttäjänimi",
"Username_cant_be_empty" : "Käyttäjänimi ei voi olla tyhjä",
"Username_description" : "Käyttäjänimeä käytetään sinun mainitsemiseen muiden viesteissä.",

@ -1,10 +1,14 @@
{
"Access_online_demo" : "Pristupi online demonstraciji",
"Access_Online_Demo" : "Pristupi Online demonstraciji",
"Accounts_EmailVerification" : "E-mail Verifikacija",
"Accounts_RegistrationRequired" : "Potrebna je registracija",
"Add_Members" : "Dodaj Članove",
"Add_users" : "Dodaj korisnike",
"All_channels" : "Svi kanali",
"API_Analytics" : "Analitika",
"App_Settings" : "Postavke Aplikacije",
"Avatar_changed_successfully" : "Avatar je uspješno promijenjen",
"and" : "i",
"are_also_typing" : "isto tipkaju",
"are_typing" : "tipkaju",
@ -77,9 +81,11 @@
"Language" : "Jezik",
"Language_Version" : "Engleska Verzija",
"Last_message" : "Posljednja poruka",
"Last_login" : "Zadnja prijava",
"Leave_room" : "Izađi iz sobe",
"line" : "linija",
"Load_more" : "Učitaj više",
"Loading..." : "Učitavanje ...",
"Loading_suggestion" : "Učitavam sugestije...",
"Login" : "Prijava",
"Login_with" : "Prijavi se sa %s",
@ -89,9 +95,16 @@
"Members_List" : "Lista Članova",
"Members_placeholder" : "Članovi",
"Message" : "Poruka",
"Message_Edit" : "Dopusti Uređivanje Poruka",
"Message_Delete" : "Dopusti Brisanje Poruka",
"Message_ShowDeletedStatus" : "Pokaži Izbrisan status",
"Meta_language" : "Jezik",
"Meta_fb_app_id" : "Facebook App-ID",
"Meta_robots" : "Roboti",
"More_channels" : "Više kanala",
"Msgs" : "Poruke",
"multi" : "više",
"My_Account" : "Moj Račun",
"n_messages" : "%s poruka",
"Name" : "Ime",
"New_messages" : "Nove Poruke",
@ -114,7 +127,12 @@
"Powered_by" : "Powered by",
"Privacy" : "Privatnost",
"Private_Groups" : "Privatne Grupe",
"Profile" : "Profil",
"Profile_saved_successfully" : "Profil je uspješno sačuvan",
"Proudly_developed" : "Proudly developed by Meteor",
"Push_enable" : "Omogući",
"Push_production" : "Produkcija",
"Push_apn_key" : "APN Ključ",
"Quick_Search" : "Brza Pretraga",
"quote" : "c",
"Recents" : "Nedavni",
@ -126,6 +144,7 @@
"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",
"Save" : "Sačuvaj",
"Save_changes" : "Spremi promjene",
"Search" : "Traži",
"Search_settings" : "Postavke pretraživanja",
"See_all" : "Vidi sve",
@ -141,10 +160,15 @@
"Showing_results" : "<p>Prikazujem <b>%s</b> rezultata</p>",
"Silence" : "Tišina",
"since_creation" : "%s",
"SMTP_Password" : "SMTP lozinka",
"SMTP_Port" : "SMTP port",
"SMTP_Security" : "SMTP sigurnost",
"SMTP_Username" : "SMTP korisničko ime",
"Start_of_conversation" : "Početak razgovora",
"strike" : "precrtaj",
"Submit" : "Pošalji",
"The_field_is_required" : "Polje% s je traženo.",
"Unnamed" : "Neimenovan",
"Use_initials_avatar" : "Koristi inicijale svog korisničkog imena",
"use_menu" : "Koristite izbornik kako bi pristupili svojim sobama i chatovima",
"Use_service_avatar" : "Koristi %s avatar",
@ -152,6 +176,8 @@
"Use_uploaded_avatar" : "Koristi uploadani avatar",
"User_added" : "Korisnik <em>__user_added__</em> je dodan.",
"User_added_by" : "Korisnik <em>__user_added__</em> dodan od <em>__user_by__</em>.",
"User_has_been_activated" : "Korisnik je aktiviran",
"User_has_been_deactivated" : "Korisnik je deaktiviran",
"User_joined_channel" : "se pridružio kanalu.",
"User_joined_channel_male" : "se pridružio kanalu.",
"User_joined_channel_female" : "se pridružila kanalu.",
@ -160,6 +186,7 @@
"User_left_female" : "Korisnica <em>__user_left__</em> je otišla.",
"User_logged_out" : "Korisnik je odjavljen",
"User_removed_by" : "Korisnik <em>__user_removed__</em> maknut od <em>__user_by__</em>.",
"User_Settings" : "Korisničke postavke",
"Username" : "Korisničko ime",
"Username_cant_be_empty" : "Korisničko ime ne može ostati prazno.",
"Username_description" : "Korisničko ime se koristi kako bi te drugi mogli spomenuti u porukama.",

@ -45,7 +45,7 @@
"edited" : "ប",
"Email_or_username" : "អល ឬឈសម",
"Email_verified" : "អបញ",
"Enter_info" : "បញ",
"Enter_info" : "បញរបសនក",
"Error_changing_password" : "ពសមរ",
"Favorites" : "ពត",
"Follow_social_profiles" : "តបណគណនបណសងគមរបស, ម github នបទពធនរបសនក rocket.chat app នរឃរបសង",

@ -1,10 +1,15 @@
{
"Access_online_demo" : "Uzyskaj dostęp do demo online",
"Access_Online_Demo" : "Uzyskaj dostęp do demo online",
"Accounts_EmailVerification" : "Weryfikacja adresu email",
"Accounts_RegistrationRequired" : "Wymagana rejestracja",
"Add_Members" : "Dodaj członków",
"Add_users" : "Dodaj użytkowników",
"All_channels" : "Wszystkie kanały",
"API_Analytics" : "Analityka",
"API_Embed" : "Osadź",
"App_Settings" : "Ustawienia aplikacji",
"Avatar_changed_successfully" : "Avatar zmieniony z powodzeniem",
"and" : "i",
"are_also_typing" : "również piszą",
"are_typing" : "piszą",
@ -40,6 +45,7 @@
"Created_at" : "Utworzono",
"Direct_Messages" : "Bezpośrednie wiadomości",
"Deleted" : "Usunięte!",
"Drop_to_upload_file" : "Przeciągnij, aby przesłać plik",
"Duplicate_private_group_name" : "Grupa Prywatna o nazwie '% s' istnieje",
"Duplicate_channel_name" : "Kanał o nazwie \"% s\" istnieje",
"edited" : "zmieniono",
@ -48,6 +54,7 @@
"Email_already_exists" : "Email już istnieje",
"Enter_info" : "Wpisz dane logowania",
"Error_changing_password" : "Hasło zostało zmienione",
"False" : "Fałsz",
"Favorites" : "Ulubione",
"Follow_social_profiles" : "Śledź nasze profile społeczne, widelec do nas na github i podziel się swoimi przemyśleniami na temat rocket.chat aplikacji na naszej trello pokładzie.",
"Forgot_password" : "Zapomniałeś hasła",
@ -88,9 +95,16 @@
"Members" : "Członkowie",
"Members_List" : "Lista użytkowników",
"Members_placeholder" : "Członkowie",
"Message" : "Wiadomość",
"Message_Edit" : "Pozwól edytować wiadomość",
"Message_Delete" : "Pozwól usunąć wiadomość",
"Message_ShowEditedStatus" : "Pokaż zmieniony status",
"Message_ShowDeletedStatus" : "Pokaż usunięty status",
"Message_KeepStatusHistory" : "Zachowaj historię statusu",
"More_channels" : "Więcej kanałów",
"Msgs" : "Wiadomości",
"multi" : "multi",
"My_Account" : "Moje konto",
"n_messages" : "%s wiadomości",
"Name" : "Nazwa",
"New_messages" : "Nowe wiadomości",
@ -113,6 +127,8 @@
"Powered_by" : "Wspierane przez",
"Privacy" : "Prywatność",
"Private_Groups" : "Prywatne grupy",
"Profile" : "Profil",
"Profile_saved_successfully" : "Profil został zapisany",
"Proudly_developed" : "Dumnie opracowane z Meteor",
"Quick_Search" : "Szybkie wyszukiwanie",
"quote" : "cytat",
@ -125,6 +141,7 @@
"Room_name_changed" : "Nazwa pokoju zmieniona na: <em>__room_name__</em>przez <em>__user_by__</em>",
"Room_name_changed_successfully" : "Nazwa pokoju zmieniona",
"Save" : "Zapisz",
"Save_changes" : "Zapisz zmiany",
"Search" : "Szukaj",
"Search_settings" : "Wyszukaj w ustawieniach",
"See_all" : "Zobacz wszystko",
@ -159,6 +176,7 @@
"User_left_female" : "Użytkownik <em>__user_left__</em> wyszła.",
"User_logged_out" : "Użytkownik jest wylogowany",
"User_removed_by" : "Użytkownik <em>__user_removed__</em>usunięty przez <em>__user_by__</em>.",
"User_Settings" : "Ustawienia użytkownika",
"Username" : "Nazwa użytkownika",
"Username_cant_be_empty" : "Nazwa użytkownika nie może być pusta",
"Username_description" : "Nazwa użytkownika jest używana, by inni mogli Cię wspomnieć w wiadomości.",

@ -40,6 +40,7 @@
"Created_at" : "Data criação",
"Direct_Messages" : "Mensagens Diretas",
"Deleted" : "Deletado!",
"Drop_to_upload_file" : "Largue para enviar arquivos",
"Duplicate_private_group_name" : "Já existe um Grupo Privado com nome '%s'",
"Duplicate_channel_name" : "Já existe um Canal com nome '%s'",
"edited" : "editado",
@ -145,6 +146,7 @@
"strike" : "tachado",
"Submit" : "Enviar",
"The_field_is_required" : "O campo %s é obrigatório.",
"Upload_file_question" : "Enviar arquivo?",
"Use_initials_avatar" : "Usar as iniciais do seu nome de usuário",
"use_menu" : "Utilize o menu à esquerda para acessar suas salas",
"Use_service_avatar" : "Use o avatar de %s",

@ -52,7 +52,7 @@
"github_no_public_email" : "В настройках GitHub отсутствует публично доступный e-mail",
"Hide_room" : "Скрыть чат",
"History" : "История",
"inline_code" : "inline_code",
"inline_code" : "внутренний код",
"Invalid_confirm_pass" : "Пароли не совпадают",
"Invalid_email" : "Неверный e-mail",
"Invalid_name" : "Имя не может быть пустым",
@ -75,6 +75,7 @@
"Leave_room" : "Покинуть чат",
"line" : "линия",
"Load_more" : "Загрузить еще",
"Loading..." : "Загрузка...",
"Loading_suggestion" : "Загрузка предпочтений...",
"Login" : "Войти",
"Login_with" : "Авторизация через %s",
@ -144,6 +145,8 @@
"Use_uploaded_avatar" : "Использовать загруженную аватарку",
"User_added" : "Пользователь <em>__user_added__</em> добавлен.",
"User_added_by" : "Пользователь <em>__user_added__</em> добавлен <em>__user_by__</em>.",
"User_has_been_activated" : "Пользователь активирован",
"User_has_been_deactivated" : "Пользователь деактивирован",
"User_joined_channel" : "Присоединился к чату.",
"User_joined_channel_male" : "Присоединился к чату.",
"User_joined_channel_female" : "Присоединилась к чату.",

@ -78,6 +78,7 @@
"Search" : "த",
"Search_settings" : "தடல அமகள",
"See_all" : "அனக",
"See_only_online" : "ஆன ",
"Selected_users" : "தகபபடடவரகள",
"Send_confirmation_email" : "உறிபடினஞசல அனபவ",
"Send_Message" : "சி அனபவ",

@ -20,7 +20,7 @@ if FS?
filter:
maxSize: 2097152,
allow:
contentTypes: ['image/*']
contentTypes: ['image/*', 'audio/*']
onInvalid: (message) ->
if Meteor.isClient
toastr.error message

@ -2,7 +2,7 @@
// the entire section is optional.
App.info({
id: 'com.konecty.rocket.chat',
version: '0.0.2',
version: '0.1.3',
name: 'Rocket.Chat',
description: 'Rocket.Chat',
author: 'Rocket.Chat Development Group',

@ -61,7 +61,7 @@ Template.message.onViewRendered = (context) ->
ul = lastNode.parentElement
wrapper = ul.parentElement
if context.urls?.length > 0 and Template.oembedBaseWidget?
if context.urls?.length > 0 and Template.oembedBaseWidget? and RocketChat.settings.get 'API_Embed'
for item in context.urls
do (item) ->
urlNode = lastNode.querySelector('.body a[href="'+item.url+'"]')

@ -11,8 +11,8 @@ Template.room.events
Template.instance().chatMessages.keydown(@_id, event, Template.instance())
Template.room.onCreated ->
this.subscribe 'visitorRoom'visitorId.get()
console.log 'visitor ->',visitorId.get()
this.subscribe 'visitorRoom', visitorId.get()
console.log 'visitor ->', visitorId.get()
Template.room.onRendered ->

@ -1 +1,5 @@
{ }
{
"LDAP_Url" : "LDAP URL",
"LDAP_Port" : "LDAP portti",
"LDAP_Dn" : "LDAP DN"
}

@ -3,8 +3,6 @@ RocketChat.sendMessage = (user, message, room) ->
if not user or not message or not room._id
return false
console.log '[functions] RocketChat.sendMessage -> '.green, 'arguments:', arguments
unless message.ts?
message.ts = new Date()
@ -78,8 +76,10 @@ RocketChat.sendMessage = (user, message, room) ->
if userOfMention?
Push.send
from: 'push'
title: userOfMention.username
text: "#{userOfMention.username}: #{message.msg}"
title: "@#{user.username}"
text: message.msg
apn:
text: "@#{user.username}:\n#{message.msg}"
badge: 1
sound: 'chime'
payload:
@ -136,20 +136,22 @@ RocketChat.sendMessage = (user, message, room) ->
query._id =
$in: mentionIds
usersOfMention = Meteor.users.find(query, {fields: {username: 1}}).fetch()
if usersOfMention.length > 0
for userOfMention in usersOfMention
Push.send
from: 'push'
title: userOfMention.username
text: message.msg
badge: 1
sound: 'chime'
payload:
rid: message.rid
sender: message.u
query:
userId: userOfMention._id
usersOfMention = Meteor.users.find(query, {fields: {_id: 1}}).fetch()
usersOfMentionIds = _.pluck(usersOfMention, '_id');
if usersOfMentionIds.length > 0
Push.send
from: 'push'
title: "##{room.name}"
text: message.msg
apn:
text: "##{room.name}:\n#{message.msg}"
badge: 1
sound: 'chime'
payload:
rid: message.rid
sender: message.u
query:
userId: $in: usersOfMentionIds
###
Update all other subscriptions to alert their owners but witout incrementing

@ -41,3 +41,7 @@ Meteor.startup ->
RocketChat.settings.add 'Push_apn_dev_cert', '', { type: 'string', multiline: true, group: 'Push' }
RocketChat.settings.add 'Push_gcm_api_key', '', { type: 'string', group: 'Push' }
RocketChat.settings.add 'Push_gcm_project_number', '', { type: 'string', group: 'Push', public: true }
RocketChat.settings.addGroup 'Layout'
RocketChat.settings.add 'Layout_Home_Title', 'Home', { type: 'string', group: 'Layout', public: true }
RocketChat.settings.add 'Layout_Home_Body', 'Welcome to Rocket.Chat <br> Go to APP SETTINGS -> Layout to customize this intro.', { type: 'string', multiline: true, group: 'Layout', public: true }

@ -15,7 +15,7 @@ class MentionsClient
if mentions.length isnt 0
mentions = _.unique mentions
mentions = mentions.join('|')
msg = msg.replace new RegExp("(?:^|\\s)(@(#{mentions}))(?:\\s|$)", 'g'), (match, mention, username) ->
msg = msg.replace new RegExp("(?:^|\\s|\\n)(@(#{mentions}))(?:[^A-Za-z0-9-_.])", 'g'), (match, mention, username) ->
if username is 'all'
return match.replace mention, "<a href=\"\" class=\"mention-link\">#{mention}</a>"
@ -32,7 +32,7 @@ class MentionsClient
if channels.length isnt 0
channels = _.unique channels
channels = channels.join('|')
msg = msg.replace new RegExp("(?:^|\\s)(#(#{channels}))(?:\\s|$)", 'g'), (match, mention, channel) ->
msg = msg.replace new RegExp("(?:^|\\s|\\n)(#(#{channels}))(?:[^A-Za-z0-9-_.])", 'g'), (match, mention, channel) ->
return match.replace mention, "<a href=\"\" class=\"mention-link\" data-channel=\"#{channel}\">#{mention}</a>"

@ -4,6 +4,9 @@ Template.oembedBaseWidget.helpers
if this.headers?.contentType?.match(/image\/.*/)?
return 'oembedImageWidget'
if this.headers?.contentType?.match(/audio\/.*/)?
return 'oembedAudioWidget'
if this.parsedUrl?.host is 'www.youtube.com' and this.meta?.twitterPlayer?
return 'oembedYoutubeWidget'

@ -0,0 +1,12 @@
<template name="oembedAudioWidget">
<a href="{{url}}" target="_blank">
{{#if parsedUrl}}
<blockquote>
<audio controls>
<source src="{{url}}" type="{{headers.contentType}}">
Your browser does not support the audio element.
</audio>
</blockquote>
{{/if}}
</a>
</template>

@ -2,7 +2,7 @@
<a href="{{url}}" target="_blank">
{{#if parsedUrl}}
<blockquote>
<img src="{{url}}" height="200" style="max-width: 100%" />
<img src="{{url}}" height="200" style="max-width: 100%" />
</blockquote>
{{/if}}
</a>

@ -19,6 +19,8 @@ Package.onUse(function(api) {
api.addFiles('client/oembedImageWidget.html', 'client');
api.addFiles('client/oembedAudioWidget.html', 'client');
api.addFiles('client/oembedYoutubeWidget.html', 'client');
api.addFiles('client/oembedUrlWidget.html', 'client');

@ -170,4 +170,5 @@ OEmbed.RocketUrlParser = (message) ->
return message
RocketChat.callbacks.add 'afterSaveMessage', OEmbed.RocketUrlParser, RocketChat.callbacks.priority.LOW
if RocketChat.settings.get 'API_Embed'
RocketChat.callbacks.add 'afterSaveMessage', OEmbed.RocketUrlParser, RocketChat.callbacks.priority.LOW

@ -1 +1,6 @@
{ }
{
"Video_Chat" : "Video-Chat",
"Remote" : "Entfernt",
"Setup" : "Einrichten",
"Stop_Video" : "Video stoppen"
}

@ -1 +1,6 @@
{ }
{
"Video_Chat" : "Videokeskustelu",
"Remote" : "Etä",
"Setup" : "Asennus",
"Stop_Video" : "Pysäytä video"
}

@ -1 +1,6 @@
{ }
{
"Video_Chat" : "Chat wideo",
"Remote" : "Zdalny",
"Setup" : "Opcje",
"Stop_Video" : "Zatrzymaj wideo"
}

@ -0,0 +1,147 @@
var recLength = 0,
recBuffers = [],
sampleRate,
numChannels;
this.onmessage = function(e){
switch(e.data.command){
case 'init':
init(e.data.config);
break;
case 'record':
record(e.data.buffer);
break;
case 'exportWAV':
exportWAV(e.data.type);
break;
case 'getBuffer':
getBuffer();
break;
case 'clear':
clear();
break;
}
};
function init(config){
sampleRate = config.sampleRate;
numChannels = config.numChannels;
initBuffers();
}
function record(inputBuffer){
for (var channel = 0; channel < numChannels; channel++){
recBuffers[channel].push(inputBuffer[channel]);
}
recLength += inputBuffer[0].length;
}
function exportWAV(type){
var buffers = [];
for (var channel = 0; channel < numChannels; channel++){
buffers.push(mergeBuffers(recBuffers[channel], recLength));
}
if (numChannels === 2){
var interleaved = interleave(buffers[0], buffers[1]);
} else {
var interleaved = buffers[0];
}
var dataview = encodeWAV(interleaved);
var audioBlob = new Blob([dataview], { type: type });
this.postMessage(audioBlob);
}
function getBuffer(){
var buffers = [];
for (var channel = 0; channel < numChannels; channel++){
buffers.push(mergeBuffers(recBuffers[channel], recLength));
}
this.postMessage(buffers);
}
function clear(){
recLength = 0;
recBuffers = [];
initBuffers();
}
function initBuffers(){
for (var channel = 0; channel < numChannels; channel++){
recBuffers[channel] = [];
}
}
function mergeBuffers(recBuffers, recLength){
var result = new Float32Array(recLength);
var offset = 0;
for (var i = 0; i < recBuffers.length; i++){
result.set(recBuffers[i], offset);
offset += recBuffers[i].length;
}
return result;
}
function interleave(inputL, inputR){
var length = inputL.length + inputR.length;
var result = new Float32Array(length);
var index = 0,
inputIndex = 0;
while (index < length){
result[index++] = inputL[inputIndex];
result[index++] = inputR[inputIndex];
inputIndex++;
}
return result;
}
function floatTo16BitPCM(output, offset, input){
for (var i = 0; i < input.length; i++, offset+=2){
var s = Math.max(-1, Math.min(1, input[i]));
output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
}
}
function writeString(view, offset, string){
for (var i = 0; i < string.length; i++){
view.setUint8(offset + i, string.charCodeAt(i));
}
}
function encodeWAV(samples){
var buffer = new ArrayBuffer(44 + samples.length * 2);
var view = new DataView(buffer);
/* RIFF identifier */
writeString(view, 0, 'RIFF');
/* RIFF chunk length */
view.setUint32(4, 36 + samples.length * 2, true);
/* RIFF type */
writeString(view, 8, 'WAVE');
/* format chunk identifier */
writeString(view, 12, 'fmt ');
/* format chunk length */
view.setUint32(16, 16, true);
/* sample format (raw) */
view.setUint16(20, 1, true);
/* channel count */
view.setUint16(22, numChannels, true);
/* sample rate */
view.setUint32(24, sampleRate, true);
/* byte rate (sample rate * block align) */
view.setUint32(28, sampleRate * 4, true);
/* block align (channel count * bytes per sample) */
view.setUint16(32, numChannels * 2, true);
/* bits per sample */
view.setUint16(34, 16, true);
/* data chunk identifier */
writeString(view, 36, 'data');
/* data chunk length */
view.setUint32(40, samples.length * 2, true);
floatTo16BitPCM(view, 44, samples);
return view;
}

@ -19,6 +19,7 @@ Accounts.onCreateUser (options, user) ->
# console.log 'user ->',JSON.stringify user, null, ' '
user.status = 'offline'
user.active = true
serviceName = null

@ -21,6 +21,6 @@ Meteor.methods
if canAccess isnt true
return false
else
return _.pick room, ['_id', 't', 'name']
return _.pick room, ['_id', 't', 'name', 'usernames']
else
throw new Meteor.Error 'invalid-room', '[methods] canAccessRoom -> Room ID is invalid'

@ -9,7 +9,6 @@ Meteor.methods
Meteor.users.update userId,
$set:
name: formData.name
active: true
if userData.email
Accounts.sendVerificationEmail(userId, userData.email);

Loading…
Cancel
Save