1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/jappix_ynh.git synced 2024-09-03 19:26:19 +02:00

Update sources to Jappix 1.1.2

This commit is contained in:
mbugeia 2014-11-25 23:42:38 +01:00
parent 88db60ddf9
commit 71db53b86c
132 changed files with 18072 additions and 15798 deletions

View file

@ -4,8 +4,22 @@ Jappix Changelog
Here's the log of what has changed over the Jappix releases. Here's the log of what has changed over the Jappix releases.
Primo, v1.1.0 (Jun 2014) Primo, v1.1.2 (October 2014)
------------------------ ----------------------------
* XEP-0353: Jingle Message Initiation @valeriansaliou
* Fixes Jingle calls in Chrome 38+ @valeriansaliou
Primo, v1.1.1 (September 2014)
------------------------------
* Ignore empty XHTML-IM messages @eijebong, @valeriansaliou
* Fix a bug with message markers @valeriansaliou
Primo, v1.1.0 (June 2014)
-------------------------
* XEP-0272: Multiparty Jingle (Muji) @valeriansaliou * XEP-0272: Multiparty Jingle (Muji) @valeriansaliou
* Prevent client crash on huge messages @valeriansaliou * Prevent client crash on huge messages @valeriansaliou

View file

@ -67,14 +67,15 @@ Here are listed the XMPP Protocol Extensions that Jappix supports, as well as th
* XEP-0334: Message Processing Hints *v0.1* * XEP-0334: Message Processing Hints *v0.1*
* XEP-0338: Jingle Grouping Framework *v0.1* * XEP-0338: Jingle Grouping Framework *v0.1*
* XEP-0339: Source-Specific Media Attributes in Jingle *v0.1* * XEP-0339: Source-Specific Media Attributes in Jingle *v0.1*
* XEP-0353: Jingle Message Initiation *v0.1*
# XMPP Extensions (Updated) # XMPP Extensions (Updated)
* XEP-0272: Multiparty Jingle (Muji) *v0.2* * XEP-0272: Multiparty Jingle (Muji) *v0.2*
* Alternate URL: https://demo.frenchtouch.pro/valerian.saliou/xmpp/extensions/xep-0272.html * Alternate URL: https://demo.hakuma.holdings/valerian.saliou/xmpp/extensions/xep-0272.html
* XEP-0313: Message Archive Management *v0.3* * XEP-0313: Message Archive Management *v0.3*
* Alternate URL: https://demo.frenchtouch.pro/valerian.saliou/xmpp/extensions/xep-0313.html * Alternate URL: https://demo.hakuma.holdings/valerian.saliou/xmpp/extensions/xep-0313.html
# XMPP Extensions (Proposed) # XMPP Extensions (Proposed)

View file

@ -6,7 +6,7 @@ Jappix is a fresh new open social platform which enables you to create your own
You can build your own Jappix installation for your own requirements: if you want to use it as a personal social client, you can download it and put it on your webserver. It's easy, fast and free. You can build your own Jappix installation for your own requirements: if you want to use it as a personal social client, you can download it and put it on your webserver. It's easy, fast and free.
[![build status](https://ci.frenchtouch.pro/projects/7/status.png?ref=master)](https://ci.frenchtouch.pro/projects/7?ref=master) [![build status](https://ci.hakuma.holdings/projects/7/status.png?ref=master)](https://ci.hakuma.holdings/projects/7?ref=master)
License License
@ -45,7 +45,7 @@ Mirrors
In case a master service is down (GitHub for Git access or Jappix.org for project download), here is a list of available mirrors: In case a master service is down (GitHub for Git access or Jappix.org for project download), here is a list of available mirrors:
* Project website mirror: https://project.jappix.com/ * Project website mirror: https://project.jappix.com/
* Development repository mirror: https://code.frenchtouch.pro/jappix/jappix * Development repository mirror: https://code.hakuma.holdings/jappix/jappix
MUC Links MUC Links

View file

@ -1 +1 @@
Primo [1.1.0] Primo [1.1.2]

View file

@ -6,9 +6,9 @@
var BrowserDetect = { var BrowserDetect = {
init: function () { init: function () {
this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
this.version = this.searchVersion(navigator.userAgent) this.version = this.searchVersion(navigator.userAgent) ||
|| this.searchVersion(navigator.appVersion) this.searchVersion(navigator.appVersion) ||
|| "an unknown version"; "an unknown version";
this.OS = this.searchString(this.dataOS) || "an unknown OS"; this.OS = this.searchString(this.dataOS) || "an unknown OS";
}, },

View file

@ -22,6 +22,10 @@ var Call = (function() {
/* Variables */ /* Variables */
self._start_stamp = 0; self._start_stamp = 0;
self.call_auto_accept = {
'from' : null,
'sid' : null
};
/** /**
@ -139,6 +143,123 @@ var Call = (function() {
} }
}, },
single_propose: function(stanza, proposed_medias) {
try {
var stanza_from = stanza.getFrom() || null;
var call_id = JSJaCJingleBroadcast.get_call_id(stanza);
// Request for Jingle session to be accepted
if(stanza_from && call_id) {
var call_media_main = 'audio';
if(JSJAC_JINGLE_MEDIA_VIDEO in proposed_medias) {
call_media_main = 'video';
}
Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
Common.bareXID(stanza_from),
('broadcast_' + call_media_main),
call_media_main,
null,
{
full_xid: stanza_from,
call_id: call_id,
medias: proposed_medias
}
);
Audio.play('incoming-call', true);
// Save initiator (security: don't save SID until it's accepted)
self.call_auto_accept.from = stanza_from;
self.call_auto_accept.sid = null;
}
} catch(e) {
Console.error('Call.init[single_propose]', e);
}
},
single_retract: function(stanza) {
try {
var stanza_from = stanza.getFrom() || null;
var call_id = JSJaCJingleBroadcast.get_call_id(stanza);
var call_medias = JSJaCJingleBroadcast.get_call_medias(call_id);
// Call retracted (from initiator)
if(self.call_auto_accept.from == stanza_from) {
Audio.stop('incoming-call');
Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
Common.bareXID(stanza_from),
'remote_canceled'
);
}
} catch(e) {
Console.error('Call.init[single_retract]', e);
}
},
single_accept: function(stanza) {
try {
var stanza_from = stanza.getFrom() || null;
var call_id = JSJaCJingleBroadcast.get_call_id(stanza);
// Another resource accepted the call
if(self.call_auto_accept.sid == call_id &&
stanza_from && Common.getFullXID() != stanza_from) {
self._unnotify();
Audio.stop('incoming-call');
}
} catch(e) {
Console.error('Call.init[single_accept]', e);
}
},
single_reject: function(stanza) {
try {
var stanza_from = stanza.getFrom() || null;
var call_id = JSJaCJingleBroadcast.get_call_id(stanza);
// Another resource rejected the call
if(self.call_auto_accept.sid == call_id &&
stanza_from && Common.getFullXID() != stanza_from) {
self._unnotify();
Audio.stop('incoming-call');
}
} catch(e) {
Console.error('Call.init[single_reject]', e);
}
},
single_proceed: function(stanza) {
try {
// Read broadcast parameters
var call_to = stanza.getFrom() || null;
var call_id = JSJaCJingleBroadcast.get_call_id(stanza);
var call_medias = JSJaCJingleBroadcast.get_call_medias(call_id);
// Check medias to include
var has_media_video = false;
for(var i = 0; i < call_medias.length; i++) {
if(call_medias[i] === JSJAC_JINGLE_MEDIA_VIDEO) {
has_media_video = true;
break;
}
}
var call_media_picked = has_media_video ? JSJAC_JINGLE_MEDIA_VIDEO : JSJAC_JINGLE_MEDIA_AUDIO;
// Follow up Jingle call
Jingle.follow_up(call_to, call_media_picked, call_id);
} catch(e) {
Console.error('Call.init[single_proceed]', e);
}
},
// Receive a multiparty (Muji) call // Receive a multiparty (Muji) call
muji_invite: function(stanza, args) { muji_invite: function(stanza, args) {
try { try {
@ -186,13 +307,14 @@ var Call = (function() {
/** /**
* Stops current call * Stops current call
* @public * @public
* @param {boolean} abort
* @return {boolean} * @return {boolean}
*/ */
self.stop = function() { self.stop = function(abort) {
try { try {
Jingle.stop(); Jingle.stop(abort);
Muji.stop(); Muji.stop(abort);
} catch(e) { } catch(e) {
Console.error('Call.stop', e); Console.error('Call.stop', e);
} finally { } finally {
@ -464,9 +586,10 @@ var Call = (function() {
* @param {string} xid * @param {string} xid
* @param {string} type * @param {string} type
* @param {string} mode * @param {string} mode
* @param {object} [options_arr]
* @return {boolean} * @return {boolean}
*/ */
self.notify = function(call_type, xid, type, mode, sender_xid) { self.notify = function(call_type, xid, type, mode, sender_xid, options_arr) {
try { try {
sender_xid = sender_xid || xid; sender_xid = sender_xid || xid;
@ -532,11 +655,11 @@ var Call = (function() {
call_tools_all_sel.find('a.reply-button[data-action="' + button + '"]').click(function() { call_tools_all_sel.find('a.reply-button[data-action="' + button + '"]').click(function() {
try { try {
// Remove notification // Remove notification
self._unnotify(xid); self._unnotify();
// Execute callback, if any // Execute callback, if any
if(typeof attrs.cb === 'function') { if(typeof attrs.cb === 'function') {
attrs.cb(xid, mode); attrs.cb(xid, mode, options_arr);
} }
Console.info('Closed call notification drawer'); Console.info('Closed call notification drawer');

View file

@ -234,9 +234,10 @@ var Chat = (function () {
* @private * @private
* @param {string} type * @param {string} type
* @param {string} id * @param {string} id
* @param {string} xid
* @return {object} * @return {object}
*/ */
self._generateChatCode = function(type, id) { self._generateChatCode = function(type, id, xid) {
var code_args = {}; var code_args = {};
@ -400,7 +401,7 @@ var Chat = (function () {
var escaped_xid = escape(xid); var escaped_xid = escape(xid);
// Special code // Special code
var chat_args = self._generateChatCode(type, id); var chat_args = self._generateChatCode(type, id, xid);
// Append the chat HTML code // Append the chat HTML code
$('#page-engine').append( $('#page-engine').append(

View file

@ -555,7 +555,7 @@ var Common = (function () {
/** /**
* Gets the full XID of the user * Gets the bare XID of the user
* @public * @public
* @return {string} * @return {string}
*/ */
@ -575,6 +575,29 @@ var Common = (function () {
}; };
/**
* Gets the full XID of the user
* @public
* @return {string}
*/
self.getFullXID = function() {
try {
var xid = self.getXID();
// Return the full XID of the user
if(xid) {
return xid + '/' + con.resource;
}
return '';
} catch(e) {
Console.error('Common.getFullXID', e);
}
};
/** /**
* Generates the colors for a given user XID * Generates the colors for a given user XID
* @public * @public

View file

@ -460,7 +460,7 @@ var Connection = (function () {
// Remove the waiting item // Remove the waiting item
Interface.removeGeneralWait(); Interface.removeGeneralWait();
// Init Jingle // Init call
Call.init(); Call.init();
} catch(e) { } catch(e) {
Console.error('Connection.handleConnected', e); Console.error('Connection.handleConnected', e);
@ -522,6 +522,9 @@ var Connection = (function () {
try { try {
Console.info('Jappix is now disconnected.'); Console.info('Jappix is now disconnected.');
// Abort ongoing call (if any)
Call.stop(true);
// Normal disconnection // Normal disconnection
if(!self.current_session && !self.connected) { if(!self.current_session && !self.connected) {
Talk.destroy(); Talk.destroy();

View file

@ -406,9 +406,10 @@ var DateUtils = (function () {
* Reads a message delay * Reads a message delay
* @public * @public
* @param {string} node * @param {string} node
* @return {string} * @param {boolean} return_date
* @return {string|Date}
*/ */
self.readMessageDelay = function(node) { self.readMessageDelay = function(node, return_date) {
try { try {
// Initialize // Initialize
@ -425,8 +426,14 @@ var DateUtils = (function () {
// Old delay (obsolete XEP!) // Old delay (obsolete XEP!)
var x_delay = jQuery(node).find('x[xmlns="' + NS_DELAY + '"]:first').attr('stamp'); var x_delay = jQuery(node).find('x[xmlns="' + NS_DELAY + '"]:first').attr('stamp');
if(x_delay) if(x_delay) {
delay = x_delay.replace(/^(\w{4})(\w{2})(\w{2})T(\w{2}):(\w{2}):(\w{2})Z?(\S+)?/, '$1-$2-$3T$4:$5:$6Z$7'); delay = x_delay.replace(/^(\w{4})(\w{2})(\w{2})T(\w{2}):(\w{2}):(\w{2})Z?(\S+)?/, '$1-$2-$3T$4:$5:$6Z$7');
}
}
// Return a date object?
if(return_date === true && delay) {
return Date.jab2date(delay);
} }
return delay; return delay;

View file

@ -401,6 +401,32 @@ var Filter = (function () {
}; };
/**
* Returns whether XHTML body exists or not
* @public
* @param {DOM} xhtml_sel
* @return {boolean}
*/
self.has_xhtml_body = function(xhtml_sel) {
var has_xhtml_body = false;
try {
xhtml_sel.find('*').each(function() {
if($(this).text()) {
has_xhtml_body = true;
return false;
}
});
} catch(e) {
Console.error('Filter.has_xhtml_body', e);
} finally {
return has_xhtml_body;
}
};
/** /**
* Filters a xHTML message to be displayed in Jappix * Filters a xHTML message to be displayed in Jappix
* @public * @public

View file

@ -21,7 +21,7 @@ var Groupchat = (function () {
/* Variables */ /* Variables */
var JOIN_SUGGEST = []; self.join_suggest = [];
/** /**
@ -197,7 +197,9 @@ var Groupchat = (function () {
// Store groupchats to join? // Store groupchats to join?
if(this_sel.is('.continue')) { if(this_sel.is('.continue')) {
$('#suggest .content a.one.active').each(function() { $('#suggest .content a.one.active').each(function() {
JOIN_SUGGEST.push(this_sel.attr('data-xid')); self.join_suggest.push(
$(this).attr('data-xid')
);
}); });
} }
@ -343,7 +345,6 @@ var Groupchat = (function () {
// Configure the new room // Configure the new room
if(affiliation == 'owner' || affiliation == 'admin') { if(affiliation == 'owner' || affiliation == 'admin') {
console.debug('presence', presence.xml());
self._initialConfiguration(id, room); self._initialConfiguration(id, room);
} }
@ -554,14 +555,14 @@ var Groupchat = (function () {
try { try {
// Nothing to join? // Nothing to join?
if(!JOIN_SUGGEST) { if(!self.join_suggest) {
return; return;
} }
// Join the chats // Join the chats
if(JOIN_SUGGEST.length) { if(self.join_suggest.length) {
for(var g in JOIN_SUGGEST) { for(var g in self.join_suggest) {
Chat.checkCreate(JOIN_SUGGEST[g], 'groupchat'); Chat.checkCreate(self.join_suggest[g], 'groupchat');
} }
} }
} catch(e) { } catch(e) {
@ -614,7 +615,7 @@ var Groupchat = (function () {
// Attach events // Attach events
self._suggestCheckEvents(); self._suggestCheckEvents();
} else { } else {
JOIN_SUGGEST = groupchat_arr; self.join_suggest = groupchat_arr;
Connection.triggerConnected(); Connection.triggerConnected();
} }

View file

@ -140,7 +140,7 @@ var addToHome = (function (w) {
options.message = ''; options.message = '';
} }
if ( options.message === '' ) { // We look for a suitable language (defaulted to en_us) if ( options.message === '' ) { // We look for a suitable language (defaulted to en_us)
options.message = language in intl ? intl[language] : intl['en_us']; options.message = language in intl ? intl[language] : intl.en_us;
} }
if ( options.touchIcon ) { if ( options.touchIcon ) {

View file

@ -63,9 +63,10 @@ var Jingle = (function() {
* @param hash * @param hash
* @param local_view * @param local_view
* @param remote_view * @param remote_view
* @param [sid]
* @return {object} * @return {object}
*/ */
self._args = function(connection, xid, hash, media, local_view, remote_view) { self._args = function(connection, xid, hash, media, local_view, remote_view, sid) {
args = {}; args = {};
@ -107,19 +108,30 @@ var Jingle = (function() {
} else { } else {
// Incoming call? // Incoming call?
if(jingle.is_responder()) { if(jingle.is_responder()) {
Call.notify( // Auto-accept (we previously accepted the associated broadcast request)
JSJAC_JINGLE_SESSION_SINGLE, if(Call.call_auto_accept.from == jingle.get_to() && Call.call_auto_accept.sid == jingle.get_sid()) {
Common.bareXID(jingle.get_to()), Call.call_auto_accept.from = null;
('call_' + jingle.get_media()), Call.call_auto_accept.sid = null;
jingle.get_media()
);
// Play ringtone // Delay acceptance (status change is delayed)
// Hard-fix: avoids the JSJaC packets group timer (that will delay success reply) setTimeout(function() {
setTimeout(function() { jingle.accept();
Audio.play('incoming-call', true); }, 250);
jingle.info(JSJAC_JINGLE_SESSION_INFO_RINGING); } else {
}, 250); Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
Common.bareXID(jingle.get_to()),
('call_' + jingle.get_media()),
jingle.get_media()
);
// Play ringtone
// Hard-fix: avoids the JSJaC packets group timer (that will delay success reply)
setTimeout(function() {
Audio.play('incoming-call', true);
jingle.info(JSJAC_JINGLE_SESSION_INFO_RINGING);
}, 250);
}
} else { } else {
Call.notify( Call.notify(
JSJAC_JINGLE_SESSION_SINGLE, JSJAC_JINGLE_SESSION_SINGLE,
@ -258,7 +270,11 @@ var Jingle = (function() {
}, },
session_terminate_error: function(jingle, stanza) { session_terminate_error: function(jingle, stanza) {
// Ensure we this is the same call session ID (SID) if(typeof jingle.parent != 'undefined') {
jingle = jingle.parent;
}
// Ensure we this is the same call session ID (SID)
if(self._session.get_sid() == jingle.get_sid()) { if(self._session.get_sid() == jingle.get_sid()) {
if(self._bypass_termination_notify !== true) { if(self._bypass_termination_notify !== true) {
self._reset(); self._reset();
@ -317,6 +333,10 @@ var Jingle = (function() {
Console.log('Jingle._args', 'session_terminate_request'); Console.log('Jingle._args', 'session_terminate_request');
} }
}; };
if(sid && typeof sid == 'string') {
args.sid = sid;
}
} catch(e) { } catch(e) {
Console.error('Jingle._args', e); Console.error('Jingle._args', e);
} finally { } finally {
@ -333,9 +353,10 @@ var Jingle = (function() {
* @param mode * @param mode
* @param is_callee * @param is_callee
* @param stanza * @param stanza
* @param [sid]
* @return {boolean} * @return {boolean}
*/ */
self._new = function(xid, mode, is_callee, stanza) { self._new = function(xid, mode, is_callee, stanza, sid) {
var status = false; var status = false;
@ -379,7 +400,8 @@ var Jingle = (function() {
bare_hash, bare_hash,
media, media,
jingle_sel.find('.local_video video')[0], jingle_sel.find('.local_video video')[0],
jingle_sel.find('.remote_video video')[0] jingle_sel.find('.remote_video video')[0],
sid
); );
self._session = new JSJaCJingle.session(JSJAC_JINGLE_SESSION_SINGLE, args); self._session = new JSJaCJingle.session(JSJAC_JINGLE_SESSION_SINGLE, args);
@ -462,8 +484,11 @@ var Jingle = (function() {
self.start = function(xid, mode) { self.start = function(xid, mode) {
try { try {
if(!Call.is_ongoing()) { // Remote user supports XEP-0353
self._new(xid, mode); if(Caps.getFeatureResource(xid, NS_JINGLE_MESSAGE)) {
Jingle.propose(xid, mode);
} else {
Jingle.initialize(xid, mode);
} }
} catch(e) { } catch(e) {
Console.error('Jingle.start', e); Console.error('Jingle.start', e);
@ -474,6 +499,115 @@ var Jingle = (function() {
}; };
/**
* Initializes a Jingle call
* @public
* @param {string} xid
* @param {string} mode
* @return {boolean}
*/
self.initialize = function(xid, mode) {
try {
if(!Call.is_ongoing()) {
Console.info('Jingle.initialize', 'Initiating call with: ' + xid);
self._new(xid, mode);
}
} catch(e) {
Console.error('Jingle.initialize', e);
} finally {
return false;
}
};
/**
* Proposes a Jingle call
* @public
* @param {string} xid
* @param {string} mode
* @return {boolean}
*/
self.propose = function(xid, mode) {
try {
if(!Call.is_ongoing()) {
Console.info('Jingle.propose', 'Proposing call to: ' + xid);
var medias = [JSJAC_JINGLE_MEDIA_AUDIO];
if(mode == 'video') {
medias.push(JSJAC_JINGLE_MEDIA_VIDEO);
}
var call_id = JSJaCJingleBroadcast.propose(
xid, medias,
function(id) {
// Timeout
Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
xid,
'broadcast_timeout',
mode
);
// Retract
JSJaCJingleBroadcast.retract(xid, id);
}
);
// Send directed presence? (for CAPS, XEP-compliant)
if(!Common.exists('#roster .buddy[data-xid="' + escape(xid) + '"]')) {
Presence.send(xid);
}
Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
xid,
'broadcast_proposing',
mode,
null,
{
call_id: call_id
}
);
}
} catch(e) {
Console.error('Jingle.propose', e);
} finally {
return false;
}
};
/**
* Follows up a Jingle call (from broadcast)
* @public
* @param {string} xid
* @param {string} mode
* @param {string} sid
* @return {boolean}
*/
self.follow_up = function(xid, mode, sid) {
try {
if(!Call.is_ongoing()) {
self._new(xid, mode, false, null, sid);
}
} catch(e) {
Console.error('Jingle.follow_up', e);
} finally {
return false;
}
};
/** /**
* Reset current Jingle call * Reset current Jingle call
* @public * @public
@ -503,9 +637,10 @@ var Jingle = (function() {
/** /**
* Stops current Jingle call * Stops current Jingle call
* @public * @public
* @param {boolean} abort
* @return {boolean} * @return {boolean}
*/ */
self.stop = function() { self.stop = function(abort) {
try { try {
// Reset interface // Reset interface
@ -514,7 +649,13 @@ var Jingle = (function() {
// Stop Jingle session // Stop Jingle session
if(self._session !== null) { if(self._session !== null) {
self._call_ender = 'local'; self._call_ender = 'local';
self._session.terminate();
if(abort === true) {
self._session.abort();
self._session.get_session_terminate_error(self._session, null);
} else {
self._session.terminate();
}
Console.debug('Stopping current Jingle call...'); Console.debug('Stopping current Jingle call...');
} else { } else {
@ -651,6 +792,55 @@ var Jingle = (function() {
self._notify_map = function() { self._notify_map = function() {
try { try {
var broadcast_media_fn = function(xid, mode, attrs) {
JSJaCJingleBroadcast.accept(
attrs.full_xid, attrs.call_id, attrs.medias
);
// Send directed presence? (for CAPS, XEP-compliant)
if(!Common.exists('#roster .buddy[data-xid="' + escape(xid) + '"]')) {
Presence.send(attrs.full_xid);
}
// Marker to auto-accept call later
Call.call_auto_accept.from = attrs.full_xid;
Call.call_auto_accept.sid = attrs.call_id;
var medias_arr = [];
for(var cur_media in attrs.medias) {
medias_arr.push(cur_media);
}
Audio.stop('incoming-call');
Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
xid,
'broadcast_wait',
medias_arr
);
// Schedule timeout (in case we don't receive the Jingle initialization stanza)
setTimeout(function() {
if(self._session !== null &&
Call.call_auto_accept.sid == self._session.get_sid() &&
self._session.get_status() !== JSJAC_JINGLE_STATUS_INACTIVE) {
// Call received
Call.call_auto_accept.from = null;
Call.call_auto_accept.sid = null;
} else {
// Reset UI (timeout)
Call.notify(
JSJAC_JINGLE_SESSION_SINGLE,
xid,
'broadcast_error',
medias_arr
);
}
}, (JSJAC_JINGLE_BROADCAST_TIMEOUT * 1000));
};
return { return {
'call_audio': { 'call_audio': {
'text': Common._e("Is calling you"), 'text': Common._e("Is calling you"),
@ -700,6 +890,104 @@ var Jingle = (function() {
} }
}, },
'broadcast_audio': {
'text': Common._e("Is calling you"),
'buttons': {
'accept': {
'text': Common._e("Accept"),
'color': 'green',
'cb': broadcast_media_fn
},
'decline': {
'text': Common._e("Decline"),
'color': 'red',
'cb': function(xid, mode, attrs) {
JSJaCJingleBroadcast.reject(
attrs.full_xid, attrs.call_id, attrs.medias
);
Audio.stop('incoming-call');
}
}
}
},
'broadcast_video': {
'text': Common._e("Is calling you"),
'buttons': {
'accept': {
'text': Common._e("Accept"),
'color': 'green',
'cb': broadcast_media_fn
},
'decline': {
'text': Common._e("Decline"),
'color': 'red',
'cb': function(xid, mode, attrs) {
JSJaCJingleBroadcast.reject(
attrs.full_xid, attrs.call_id, attrs.medias
);
Audio.stop('incoming-call');
}
}
}
},
'broadcast_wait': {
'text': Common._e("Waiting...")
},
'broadcast_proposing': {
'text': Common._e("Proposing call..."),
'buttons': {
'cancel': {
'text': Common._e("Cancel"),
'color': 'red',
'cb': function(xid, mode, attrs) {
// Retract from call
JSJaCJingleBroadcast.retract(
xid,
attrs.call_id
);
}
}
}
},
'broadcast_timeout': {
'text': Common._e("No answer"),
'buttons': {
'okay': {
'text': Common._e("Okay"),
'color': 'blue',
'cb': function(xid, mode) {
self._reset();
}
}
}
},
'broadcast_error': {
'text': Common._e("Call error"),
'buttons': {
'cancel': {
'text': Common._e("Cancel"),
'color': 'red',
'cb': function(xid, mode) {
self._reset();
}
}
}
},
'initiating': { 'initiating': {
'text': Common._e("Initiating call"), 'text': Common._e("Initiating call"),

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1227,7 +1227,7 @@ JSJAC_REGID_TIMEOUT = 20000; // time in msec until registered
JSJACHBC_MAX_HOLD = 1; // default for number of connctions JSJACHBC_MAX_HOLD = 1; // default for number of connctions
// held by connection manager // held by connection manager
JSJACHBC_MAX_WAIT = 300; // default 'wait' param - how long an JSJACHBC_MAX_WAIT = 20; // default 'wait' param - how long an
// idle connection should be held by // idle connection should be held by
// connection manager // connection manager

View file

@ -245,10 +245,10 @@ var Markers = (function () {
* @param {boolean} is_mam_marker * @param {boolean} is_mam_marker
* @return {undefined} * @return {undefined}
*/ */
self.handle = function(from, message, is_mam_marker) { self.handle = function(from, message, is_mam_marker, is_groupchat_user) {
try { try {
var xid = Common.bareXID(from); var xid = ((is_groupchat_user !== true && Common.bareXID(from)) || from);
var marker_sel = $(message).find('[xmlns="' + NS_URN_MARKERS + '"]'); var marker_sel = $(message).find('[xmlns="' + NS_URN_MARKERS + '"]');
if(marker_sel.size()) { if(marker_sel.size()) {

View file

@ -1354,9 +1354,13 @@ var Message = (function () {
var xid = Common.bareXID(from); var xid = Common.bareXID(from);
var resource = Common.thisResource(from); var resource = Common.thisResource(from);
var hash = hex_md5(xid); var hash = hex_md5(xid);
var xHTML = $(node).find('html body').size(); var xHTML_sel = $(node).find('html body');
var xHTML = xHTML_sel.size();
var is_groupchat_user = false; var is_groupchat_user = false;
// Check for non-empty body
var has_body = (((xHTML && Filter.has_xhtml_body(xHTML_sel)) || body) && true);
// This message comes from a Muji room (ignore) // This message comes from a Muji room (ignore)
if(Muji.is_room(xid)) { if(Muji.is_room(xid)) {
return false; return false;
@ -1441,7 +1445,7 @@ var Message = (function () {
} }
// If the message has a content // If the message has a content
if(xHTML || body) { if(has_body === true) {
var filteredMessage; var filteredMessage;
var html_escape = true; var html_escape = true;
@ -1508,7 +1512,7 @@ var Message = (function () {
// Message marker? // Message marker?
if(Markers.hasResponseMarker(node)) { if(Markers.hasResponseMarker(node)) {
return Markers.handle(from, node); return Markers.handle(from, node, false, is_groupchat_user);
} }
return false; return false;

View file

@ -20,6 +20,10 @@ var Muji = (function() {
var self = {}; var self = {};
/* Constants */
self.INVITE_MAX_DELAY = 60;
/* Variables */ /* Variables */
self._session = null; self._session = null;
self._caller_xid = null; self._caller_xid = null;
@ -1020,6 +1024,16 @@ var Muji = (function() {
try { try {
if(!Call.is_ongoing()) { if(!Call.is_ongoing()) {
// Outdated invite?
var invite_delay = DateUtils.readMessageDelay(stanza.getNode(), true);
var date_now = DateUtils.getTimeStamp();
if(invite_delay &&
(date_now - DateUtils.extractStamp(invite_delay)) >= self.INVITE_MAX_DELAY) {
Console.warn('Muji.receive', 'Discarded outdated invite from: ' + Common.getStanzaFrom(stanza));
return;
}
// Create call session // Create call session
self._new( self._new(
args.jid, args.jid,
@ -1102,9 +1116,10 @@ var Muji = (function() {
/** /**
* Stops current Muji call * Stops current Muji call
* @public * @public
* @param {boolean} abort
* @return {boolean} * @return {boolean}
*/ */
self.stop = function() { self.stop = function(abort) {
try { try {
// Reset interface // Reset interface
@ -1112,7 +1127,12 @@ var Muji = (function() {
// Stop Muji session // Stop Muji session
if(self._session !== null) { if(self._session !== null) {
self._session.leave(); if(abort === true) {
self._session.abort();
self._session.get_session_leave_error(self._session, null);
} else {
self._session.leave();
}
Console.debug('Stopping current Muji call...'); Console.debug('Stopping current Muji call...');
} else { } else {
@ -1326,7 +1346,7 @@ var Muji = (function() {
'text': Common._e("Decline"), 'text': Common._e("Decline"),
'color': 'red', 'color': 'red',
'cb': function(xid, mode) { 'cb': function(xid, mode) {
self._session.abort(); self.stop(true);
Audio.stop('incoming-call'); Audio.stop('incoming-call');
} }
} }
@ -1350,7 +1370,7 @@ var Muji = (function() {
'text': Common._e("Decline"), 'text': Common._e("Decline"),
'color': 'red', 'color': 'red',
'cb': function(xid, mode) { 'cb': function(xid, mode) {
self._session.abort(); self.stop(true);
Audio.stop('incoming-call'); Audio.stop('incoming-call');
} }
} }
@ -1365,7 +1385,7 @@ var Muji = (function() {
'text': Common._e("Cancel"), 'text': Common._e("Cancel"),
'color': 'red', 'color': 'red',
'cb': function(xid, mode) { 'cb': function(xid, mode) {
self._session.abort(); self.stop(true);
} }
} }
} }
@ -1510,8 +1530,10 @@ var Muji = (function() {
'<div class="chatroom">' + '<div class="chatroom">' +
'<div class="chatroom_participants">' + '<div class="chatroom_participants">' +
'<div class="participants_default_view">' + '<div class="participants_default_view">' +
'<span class="participants_counter">' + Common.printf(Common._e("%s participants"), 0) + '</span>' + '<div class="participants_default_details">' +
'<span class="participants_full">' + Common._e("(full)") + '</span>' + '<span class="participants_counter">' + Common.printf(Common._e("%s participants"), 0) + '</span>' +
'<span class="participants_full">' + Common._e("(full)") + '</span>' +
'</div>' +
'<a class="participants_invite call-images" href="#" title="' + Common._e("Invite people...") + '"></a>' + '<a class="participants_invite call-images" href="#" title="' + Common._e("Invite people...") + '"></a>' +
'</div>' + '</div>' +
@ -1524,10 +1546,9 @@ var Muji = (function() {
'<input class="invite_xid input-reset" name="xid" type="text" placeholder="' + Common._e("Enter people names...") + '" autocomplete="off" />' + '<input class="invite_xid input-reset" name="xid" type="text" placeholder="' + Common._e("Enter people names...") + '" autocomplete="off" />' +
'</div>' + '</div>' +
'<span class="invite_validate">' + '<a class="invite_validate" href="#">' +
'<span class="invite_separator"></span>' + '<span class="invite_validate_icon call-images"></span>' +
'<a class="invite_go call-images" href="#"></a>' + '</a>' +
'</span>' +
'</form>' + '</form>' +
'<div class="participants_invite_search"></div>' + '<div class="participants_invite_search"></div>' +
@ -1759,7 +1780,7 @@ var Muji = (function() {
}); });
// Invite form validate event // Invite form validate event
participants_invite_validate.find('.invite_go').click(function() { participants_invite_validate.click(function() {
try { try {
participants_invite_form.submit(); participants_invite_form.submit();
} catch(_e) { } catch(_e) {

View file

@ -311,7 +311,7 @@ var Talk = (function () {
Presence.first_sent = false; Presence.first_sent = false;
Search.search_filtered = false; Search.search_filtered = false;
Avatar.pending = []; Avatar.pending = [];
JOIN_SUGGEST = []; Groupchat.join_suggest = [];
// Kill all timers, exept the board ones // Kill all timers, exept the board ones
$('*:not(#board .one-board)').stopTime(); $('*:not(#board .one-board)').stopTime();

View file

@ -359,46 +359,31 @@ html[dir="rtl"] #muji .chatroom .chatroom_participants .participants_invite_box
} }
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate { #muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate {
background: #f9f9f9;
border: 1px solid #e7e7e7;
color: #94a6aa;
text-decoration: none;
padding: 4px 6px 5px 6px;
display: none; display: none;
position: absolute;
top: 4px;
right: 9px;
-moz-border-radius: 1px;
-webkit-border-radius: 1px;
border-radius: 1px;
} }
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_go { #muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate:active {
padding-top: 5px;
padding-bottom: 4px;
}
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_validate_icon {
background-position: 0 -329px; background-position: 0 -329px;
width: 14px; width: 14px;
height: 11px; height: 11px;
opacity: 0.6; margin-top: 2px;
display: block; display: block;
position: absolute;
top: 11px;
right: 16px;
}
html[dir="rtl"] #muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_go {
right: auto;
left: 8px;
}
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_go:hover,
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_go:active {
opacity: 1;
}
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_separator,
#muji .chatroom form.chatroom_form .message_separator {
background: #e9e9e9;
width: 1px;
position: absolute;
top: 6px;
bottom: 6px;
}
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_separator {
right: 40px;
}
html[dir="rtl"] #muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_validate .invite_separator {
right: auto;
left: 32px;
} }
#muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_input_container { #muji .chatroom .chatroom_participants .participants_invite_box form.participants_invite_form .invite_input_container {
@ -672,6 +657,11 @@ html[dir="rtl"] #muji .chatroom form.chatroom_form .message_icon {
} }
#muji .chatroom form.chatroom_form .message_separator { #muji .chatroom form.chatroom_form .message_separator {
background: #e9e9e9;
width: 1px;
position: absolute;
top: 6px;
bottom: 6px;
left: 40px; left: 40px;
} }

View file

@ -571,13 +571,15 @@ html[dir="rtl"] .call-content .call-notify .avatar-pane .avatar-container .avata
bottom: 8px; bottom: 8px;
} }
.call-content .call-notify.notify-call_audio .avatar-pane .icon { .call-content .call-notify.notify-call_audio .avatar-pane .icon,
.call-content .call-notify.notify-broadcast_audio .avatar-pane .icon {
background-position: 0 -120px; background-position: 0 -120px;
width: 33px; width: 33px;
height: 33px; height: 33px;
} }
.call-content .call-notify.notify-call_video .avatar-pane .icon { .call-content .call-notify.notify-call_video .avatar-pane .icon,
.call-content .call-notify.notify-broadcast_video .avatar-pane .icon {
background-position: 0 -154px; background-position: 0 -154px;
width: 33px; width: 33px;
height: 22px; height: 22px;

Binary file not shown.

View file

@ -4,10 +4,11 @@
# License: AGPL # License: AGPL
# Authors: Valérian Saliou, JanCBorchardt # Authors: Valérian Saliou, JanCBorchardt
# Translators: # Translators:
# sahwar <ve4ernik@gmail.com>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jappix\n" "Project-Id-Version: Jappix\n"
"PO-Revision-Date: 2014-05-08 10:20+0100\n" "PO-Revision-Date: 2014-10-13 10:45+0100\n"
"Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n" "Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n"
"Language-Team: Bulgarian (http://www.transifex.com/projects/p/jappix/" "Language-Team: Bulgarian (http://www.transifex.com/projects/p/jappix/"
"language/bg/)\n" "language/bg/)\n"
@ -17,7 +18,7 @@ msgstr ""
"Language: bg\n" "Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"X-Generator: Poedit 1.6.5\n" "X-Generator: Poedit 1.6.9\n"
msgid "default:LTR" msgid "default:LTR"
msgstr "default:LTR" msgstr "default:LTR"
@ -60,12 +61,12 @@ msgid "Find a public Jappix node."
msgstr "" msgstr ""
msgid "Credits" msgid "Credits"
msgstr "" msgstr "Благодарности"
msgid "Association" msgid "Association"
msgstr "" msgstr ""
msgid "Web agency" msgid "Company"
msgstr "" msgstr ""
msgid "Legal" msgid "Legal"
@ -84,10 +85,10 @@ msgid "Node owner"
msgstr "" msgstr ""
msgid "By using our service, you accept %s." msgid "By using our service, you accept %s."
msgstr "" msgstr "Като използвате нашата услуга, вие приемате %s."
msgid "our terms of use" msgid "our terms of use"
msgstr "" msgstr "нашите условия за ползване"
msgid "" msgid ""
"Jappix has been interrupted by a network issue, a bug or bad login (check " "Jappix has been interrupted by a network issue, a bug or bad login (check "
@ -199,6 +200,21 @@ msgstr "Добяване на приятел"
msgid "Your groupchats" msgid "Your groupchats"
msgstr "Вашите групови чатове" msgstr "Вашите групови чатове"
msgid "Audio/video conference"
msgstr ""
msgid "Launch a group call"
msgstr ""
msgid "Audio conference"
msgstr "Аудио конференция"
msgid "Video conference"
msgstr "Видео конференция"
msgid "Conference call"
msgstr "Конферетно обаждане"
msgid "Manage your favorite groupchats" msgid "Manage your favorite groupchats"
msgstr "Управление на любимите ви групови чатове" msgstr "Управление на любимите ви групови чатове"
@ -254,7 +270,7 @@ msgid "Busy"
msgstr "зает" msgstr "зает"
msgid "Offline" msgid "Offline"
msgstr "" msgstr "извън линия"
msgid "Mood" msgid "Mood"
msgstr "Настроение" msgstr "Настроение"
@ -457,22 +473,22 @@ msgid "Message archiving"
msgstr "Архивиране на съобщенията" msgstr "Архивиране на съобщенията"
msgid "Store an history of your chats" msgid "Store an history of your chats"
msgstr "" msgstr "Запис на историята на вашите чатове"
msgid "Geolocation" msgid "Geolocation"
msgstr "Геолокация" msgstr "Геолокация"
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Изключено"
msgid "Store all chats" msgid "Store all chats"
msgstr "" msgstr "Запис на всички чатове"
msgid "Store friend chats" msgid "Store friend chats"
msgstr "" msgstr ""
msgid "Remove all archives" msgid "Remove all archives"
msgstr "" msgstr "Премахване на всички архиви"
msgid "Empty" msgid "Empty"
msgstr "Празно" msgstr "Празно"
@ -571,7 +587,7 @@ msgid "Underlined text"
msgstr "Подчертан текст" msgstr "Подчертан текст"
msgid "Send a file" msgid "Send a file"
msgstr "" msgstr "Изпращане на файл"
msgid "" msgid ""
"Once uploaded, your friend will be prompted to download the file you sent." "Once uploaded, your friend will be prompted to download the file you sent."
@ -613,7 +629,7 @@ msgid "All tabs"
msgstr "Всички подпрозорци (табове)" msgstr "Всички подпрозорци (табове)"
msgid "Join groupchat" msgid "Join groupchat"
msgstr "" msgstr "Присъединяване към групов чат"
msgid "Close this tab" msgid "Close this tab"
msgstr "Затваряне на подпрозореца (таба)" msgstr "Затваряне на подпрозореца (таба)"
@ -817,10 +833,10 @@ msgid "left the chat room"
msgstr "напусна чат стаята" msgstr "напусна чат стаята"
msgid "%s left" msgid "%s left"
msgstr "" msgstr "%s напусна чата"
msgid "%s joined" msgid "%s joined"
msgstr "" msgstr "%s се присъедини към чата"
msgid "no status" msgid "no status"
msgstr "без статус" msgstr "без статус"
@ -841,6 +857,8 @@ msgid ""
"Jappix is an open social platform, that let's you easily get or keep in " "Jappix is an open social platform, that let's you easily get or keep in "
"touch with everyone." "touch with everyone."
msgstr "" msgstr ""
"Jappix е отворена социална платформа, която ви позволява лесно да поддържате "
"връзка с всекиго."
msgid "" msgid ""
"Join the millions of users who are currently using the XMPP Network (Google " "Join the millions of users who are currently using the XMPP Network (Google "
@ -855,7 +873,7 @@ msgid "Hi there!"
msgstr "Ей, ти там, здравей!" msgstr "Ей, ти там, здравей!"
msgid "Welcome to %1s, “%2s”." msgid "Welcome to %1s, “%2s”."
msgstr "" msgstr "Добре дошли в %1s, „%2s“."
msgid "Login to your existing XMPP account or create a new one for free!" msgid "Login to your existing XMPP account or create a new one for free!"
msgstr "" msgstr ""
@ -999,7 +1017,7 @@ msgid "would like to get authorization."
msgstr "желае да получи пълномощно." msgstr "желае да получи пълномощно."
msgid "would like to send you a file: “%s”." msgid "would like to send you a file: “%s”."
msgstr "" msgstr "желае да ви изпрати файл: „%s“."
msgid "has received a file exchange request: “%s”." msgid "has received a file exchange request: “%s”."
msgstr "" msgstr ""
@ -1053,13 +1071,13 @@ msgid ""
msgstr "" msgstr ""
msgid "Open" msgid "Open"
msgstr "" msgstr "Отваряне"
msgid "Show" msgid "Show"
msgstr "" msgstr "Показване"
msgid "Hide" msgid "Hide"
msgstr "" msgstr "Скриване"
msgid "Submit" msgid "Submit"
msgstr "Изпращане" msgstr "Изпращане"
@ -1194,7 +1212,7 @@ msgid "Media integration"
msgstr "Медийна интеграция" msgstr "Медийна интеграция"
msgid "Keep local chat archives" msgid "Keep local chat archives"
msgstr "" msgstr "Пазене на локални архиви на чата"
msgid "XMPP links" msgid "XMPP links"
msgstr "XMPP връзки" msgstr "XMPP връзки"
@ -2361,12 +2379,24 @@ msgstr ""
msgid "Stop" msgid "Stop"
msgstr "" msgstr ""
msgid "Leave"
msgstr ""
msgid "Mute" msgid "Mute"
msgstr "" msgstr ""
msgid "Unmute" msgid "Unmute"
msgstr "" msgstr ""
msgid "Nobody there. Invite some people!"
msgstr ""
msgid "Invite people..."
msgstr ""
msgid "Enter people names..."
msgstr ""
msgid "Is calling you" msgid "Is calling you"
msgstr "" msgstr ""
@ -2406,6 +2436,24 @@ msgstr ""
msgid "Ending call..." msgid "Ending call..."
msgstr "" msgstr ""
msgid "Incoming group call"
msgstr ""
msgid "Preparing group call..."
msgstr ""
msgid "Connecting to group call..."
msgstr ""
msgid "Group call error"
msgstr ""
msgid "Ending group call..."
msgstr ""
msgid "Group call ended"
msgstr ""
msgid "Accept" msgid "Accept"
msgstr "" msgstr ""
@ -2423,3 +2471,51 @@ msgstr ""
msgid "Video Call" msgid "Video Call"
msgstr "" msgstr ""
msgid "%s participant"
msgstr ""
msgid "%s participants"
msgstr ""
msgid "(full)"
msgstr ""
msgid "%s is able to receive group calls."
msgstr ""
msgid "%s may not support group calls."
msgstr ""
msgid "Send a message..."
msgstr ""
msgid "Edited"
msgstr ""
msgid "Edited (%s)"
msgstr ""
msgid "Editing"
msgstr ""
msgid "Being edited"
msgstr ""
msgid "Delivered"
msgstr ""
msgid "Read"
msgstr ""
msgid "Sending..."
msgstr ""
msgid "%s requested your attention to the conversation"
msgstr ""
msgid "You requested %s's attention to the conversation"
msgstr ""
msgid "Attention to conversation requested."
msgstr ""

View file

@ -54,7 +54,7 @@ msgstr ""
msgid "Association" msgid "Association"
msgstr "" msgstr ""
msgid "Web agency" msgid "Company"
msgstr "" msgstr ""
msgid "Legal" msgid "Legal"
@ -2091,6 +2091,12 @@ msgstr ""
msgid "Waiting..." msgid "Waiting..."
msgstr "" msgstr ""
msgid "Proposing call..."
msgstr ""
msgid "No answer"
msgstr ""
msgid "Ringing..." msgid "Ringing..."
msgstr "" msgstr ""

Binary file not shown.

View file

@ -11,7 +11,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jappix\n" "Project-Id-Version: Jappix\n"
"PO-Revision-Date: 2014-05-29 17:06+0100\n" "PO-Revision-Date: 2014-10-13 10:45+0100\n"
"Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n" "Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n"
"Language-Team: French (http://www.transifex.com/projects/p/jappix/language/" "Language-Team: French (http://www.transifex.com/projects/p/jappix/language/"
"fr/)\n" "fr/)\n"
@ -21,7 +21,7 @@ msgstr ""
"Language: fr\n" "Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"X-Generator: Poedit 1.6.5\n" "X-Generator: Poedit 1.6.9\n"
msgid "default:LTR" msgid "default:LTR"
msgstr "default:LTR" msgstr "default:LTR"
@ -69,8 +69,8 @@ msgstr "Crédits"
msgid "Association" msgid "Association"
msgstr "Association" msgstr "Association"
msgid "Web agency" msgid "Company"
msgstr "Agence Web" msgstr "Entreprise"
msgid "Legal" msgid "Legal"
msgstr "Légal" msgstr "Légal"
@ -198,6 +198,21 @@ msgstr "Ajouter un ami"
msgid "Your groupchats" msgid "Your groupchats"
msgstr "Vos salons de discussion" msgstr "Vos salons de discussion"
msgid "Audio/video conference"
msgstr "Conférence audio/vidéo"
msgid "Launch a group call"
msgstr "Lancer un appel de groupe"
msgid "Audio conference"
msgstr "Conférence audio"
msgid "Video conference"
msgstr "Conférence vidéo"
msgid "Conference call"
msgstr "Appel de groupe"
msgid "Manage your favorite groupchats" msgid "Manage your favorite groupchats"
msgstr "Gérer mes salons favoris" msgstr "Gérer mes salons favoris"
@ -2387,12 +2402,24 @@ msgstr "Slot AdSense"
msgid "Stop" msgid "Stop"
msgstr "Stop" msgstr "Stop"
msgid "Leave"
msgstr "Partir"
msgid "Mute" msgid "Mute"
msgstr "Muet" msgstr "Muet"
msgid "Unmute" msgid "Unmute"
msgstr "Audible" msgstr "Audible"
msgid "Nobody there. Invite some people!"
msgstr "Il n'y a personne. Invitez du monde !"
msgid "Invite people..."
msgstr "Inviter des personnes..."
msgid "Enter people names..."
msgstr "Entrez les noms..."
msgid "Is calling you" msgid "Is calling you"
msgstr "Vous appelle" msgstr "Vous appelle"
@ -2432,6 +2459,24 @@ msgstr "Est déjà en appel"
msgid "Ending call..." msgid "Ending call..."
msgstr "Fin de l'appel..." msgstr "Fin de l'appel..."
msgid "Incoming group call"
msgstr "Appel de groupe"
msgid "Preparing group call..."
msgstr "Préparation de l'appel..."
msgid "Connecting to group call..."
msgstr "Connexion à l'appel..."
msgid "Group call error"
msgstr "Erreur d'appel"
msgid "Ending group call..."
msgstr "Fin de l'appel..."
msgid "Group call ended"
msgstr "Appel terminé"
msgid "Accept" msgid "Accept"
msgstr "Accepter" msgstr "Accepter"
@ -2450,6 +2495,24 @@ msgstr "Appel Audio"
msgid "Video Call" msgid "Video Call"
msgstr "Appel Vidéo" msgstr "Appel Vidéo"
msgid "%s participant"
msgstr "%s participant"
msgid "%s participants"
msgstr "%s participants"
msgid "(full)"
msgstr "(maxi)"
msgid "%s is able to receive group calls."
msgstr "%s peut recevoir des appels de groupe."
msgid "%s may not support group calls."
msgstr "%s ne semble pas supporter les appels de groupe."
msgid "Send a message..."
msgstr "Envoyer un message..."
msgid "Edited" msgid "Edited"
msgstr "Édité" msgstr "Édité"

Binary file not shown.

View file

@ -10,7 +10,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jappix\n" "Project-Id-Version: Jappix\n"
"PO-Revision-Date: 2014-05-08 10:21+0100\n" "PO-Revision-Date: 2014-08-09 15:36+0100\n"
"Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n" "Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n"
"Language-Team: Hebrew (http://www.transifex.com/projects/p/jappix/language/" "Language-Team: Hebrew (http://www.transifex.com/projects/p/jappix/language/"
"he/)\n" "he/)\n"
@ -36,7 +36,7 @@ msgid "Social channel, chat and more."
msgstr "ערוץ חברתי, צ'אט ועוד." msgstr "ערוץ חברתי, צ'אט ועוד."
msgid "Create your public profile." msgid "Create your public profile."
msgstr "צור את הדיקן הפומבי שלך." msgstr "צור דיקן פומבי משלך."
msgid "A mini-chat for your website." msgid "A mini-chat for your website."
msgstr "מיני צ'אט עבור אתר הרשת שלך." msgstr "מיני צ'אט עבור אתר הרשת שלך."
@ -60,7 +60,7 @@ msgid "Jappix for your company."
msgstr "Jappix עבור הפירמה שלך." msgstr "Jappix עבור הפירמה שלך."
msgid "Find a public Jappix node." msgid "Find a public Jappix node."
msgstr "מצא נקודת ממסר Jappix פומבית." msgstr "מצא צומת Jappix פומבי."
msgid "Credits" msgid "Credits"
msgstr "תודות" msgstr "תודות"
@ -84,7 +84,7 @@ msgid "Owner"
msgstr "בעלים" msgstr "בעלים"
msgid "Node owner" msgid "Node owner"
msgstr "בעל הממסר" msgstr "בעל צומת"
msgid "By using our service, you accept %s." msgid "By using our service, you accept %s."
msgstr "על ידי שימוש בשירותנו, הינך מסכים/ה %s." msgstr "על ידי שימוש בשירותנו, הינך מסכים/ה %s."
@ -144,7 +144,7 @@ msgid "Register"
msgstr "הרשמה" msgstr "הרשמה"
msgid "Here we go!" msgid "Here we go!"
msgstr "קדימה לדרך!" msgstr "המשך!"
msgid "Server" msgid "Server"
msgstr "שרת" msgstr "שרת"
@ -186,6 +186,21 @@ msgstr "הוספת חברים"
msgid "Your groupchats" msgid "Your groupchats"
msgstr "שיחות הקבוצה שלך" msgstr "שיחות הקבוצה שלך"
msgid "Audio/video conference"
msgstr "ועידת אודיו/וידאו"
msgid "Launch a group call"
msgstr "שגר שיחה קבוצתית"
msgid "Audio conference"
msgstr "ועידה קולית"
msgid "Video conference"
msgstr "ועידה חזותית"
msgid "Conference call"
msgstr "שיחת ועידה"
msgid "Manage your favorite groupchats" msgid "Manage your favorite groupchats"
msgstr "ניהול שיחות הקבוצה המועדפות עליך" msgstr "ניהול שיחות הקבוצה המועדפות עליך"
@ -1571,7 +1586,7 @@ msgstr "משתמשים"
msgid "" msgid ""
"This is a restricted area: only the authorized users can manage this Jappix " "This is a restricted area: only the authorized users can manage this Jappix "
"node." "node."
msgstr "זהו אזור מוגבל: רק משתמשים מורשים יכולים לנהל את ממסר Jappix זה." msgstr "זהו אזור מוגבל: רק משתמשים מורשים יכולים לנהל את צומת Jappix זה."
msgid "Please use the form below to login to the administration panel." msgid "Please use the form below to login to the administration panel."
msgstr "אנא השתמש בתבנית שלמטה כדי להתחבר את לוח הניהול." msgstr "אנא השתמש בתבנית שלמטה כדי להתחבר את לוח הניהול."
@ -1602,16 +1617,16 @@ msgstr ""
"אותן למטה." "אותן למטה."
msgid "Change your Jappix node configuration with this tool." msgid "Change your Jappix node configuration with this tool."
msgstr "שינוי תצורת ממסר Jappix בעזרת כלי זה." msgstr "שינוי תצורת צומת Jappix בעזרת כלי זה."
msgid "Change the XMPP hosts that this Jappix node serves with this tool." msgid "Change the XMPP hosts that this Jappix node serves with this tool."
msgstr "שנה מארחי XMPP שממסר Jappix זה משרת, בעזרת כלי זה." msgstr "שנה מארחי XMPP אשר צומת Jappix זה משרת, בעזרת כלי זה."
msgid "" msgid ""
"All this Jappix node stored files can be managed with this tool: please " "All this Jappix node stored files can be managed with this tool: please "
"select a sub-folder and start editing its content!" "select a sub-folder and start editing its content!"
msgstr "" msgstr ""
"כל הקבצים אשר מאוחסנים בממסר Jappix זה יכולים להתנהל בעזרת כלי זה: אנא בחר " "כל הקבצים אשר מאוחסנים בצומת Jappix זה יכולים להתנהל בעזרת כלי זה: אנא בחר "
"תיקיית משנה ולאחר מכן תעמוד לרשותך האפשרות להתחיל לערוך את התוכן שלה!" "תיקיית משנה ולאחר מכן תעמוד לרשותך האפשרות להתחיל לערוך את התוכן שלה!"
msgid "Jappix is fully customisable: you can change its design right here." msgid "Jappix is fully customisable: you can change its design right here."
@ -1663,14 +1678,14 @@ msgid ""
"You can define more than one administrator for this Jappix node. You can " "You can define more than one administrator for this Jappix node. You can "
"also change a password with this tool." "also change a password with this tool."
msgstr "" msgstr ""
"ניתן לתחום יותר ממנהלן אחד עבור ממסר Jappix זה. ניתן גם לשנות את הסיסמה " "באפשרותך לתחום יותר מאשר מנהלן אחד עבור צומת Jappix זה. באפשרותך גם לשנות את "
"בעזרת כלי זה." "הסיסמה בעזרת כלי זה."
msgid "" msgid ""
"Update your Jappix node with this tool, or check if a new one is available. " "Update your Jappix node with this tool, or check if a new one is available. "
"Informations about the latest version are also displayed (in english)." "Informations about the latest version are also displayed (in english)."
msgstr "" msgstr ""
"עדכון ממסר Jappix בעזרת כלי זה, לחלופין ניתן לבדוק אם ממסר חדש זמין כעת. " "עדכון צומת Jappix בעזרת כלי זה, לחלופין ניתן לבדוק אם ממסר חדש זמין כעת. "
"מידע אודות הגרסה האחרונה גם כן מוצג (באנגלית)." "מידע אודות הגרסה האחרונה גם כן מוצג (באנגלית)."
msgid "Access statistics" msgid "Access statistics"
@ -1770,7 +1785,7 @@ msgid ""
"Change your Jappix node background with this tool. You can either set a " "Change your Jappix node background with this tool. You can either set a "
"custom color or an uploaded image. Let your creativity flow!" "custom color or an uploaded image. Let your creativity flow!"
msgstr "" msgstr ""
"שינוי רקע ממסר Jappix בעזרת כלי זה. ניתן להגדיר צבע מותאם או להעלות תמונה. " "שינוי רקע צומת Jappix בעזרת כלי זה. ניתן להגדיר צבע מותאם או להעלות תמונה. "
"התירו ליצירתיות לזרום!" "התירו ליצירתיות לזרום!"
msgid "Use default background" msgid "Use default background"
@ -1934,7 +1949,7 @@ msgstr "תיקיית האחסון שרצית לטהר, הינה ריקה כעת!
msgid "" msgid ""
"Keep your Jappix node fresh and fast, clean the storage folders regularly!" "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
msgstr "שמור על ממסר Jappix רענן ומהיר, על ידי טיהור תיקיות האחסון בקביעות!" msgstr "שמור על צומת Jappix רענן ומהיר, על ידי טיהור תיקיות האחסון בקביעות!"
msgid "" msgid ""
"Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in " "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in "
@ -2296,12 +2311,24 @@ msgstr "משבצת AdSense"
msgid "Stop" msgid "Stop"
msgstr "עצור" msgstr "עצור"
msgid "Leave"
msgstr ""
msgid "Mute" msgid "Mute"
msgstr "השתק" msgstr "השתק"
msgid "Unmute" msgid "Unmute"
msgstr "בטל השתקה" msgstr "בטל השתקה"
msgid "Nobody there. Invite some people!"
msgstr "אף אחד לא נמצא שם. הזמן כמה אנשים!"
msgid "Invite people..."
msgstr "הזמנת אנשים..."
msgid "Enter people names..."
msgstr "הזנת שמות אנשים..."
msgid "Is calling you" msgid "Is calling you"
msgstr "מחייג/ת אליך" msgstr "מחייג/ת אליך"
@ -2309,7 +2336,7 @@ msgid "Initiating call"
msgstr "מתחיל כעת קריאה" msgstr "מתחיל כעת קריאה"
msgid "Connecting to call..." msgid "Connecting to call..."
msgstr "כעת מתחבר אל קריאה..." msgstr "כעת מתחבר אל שיחה..."
msgid "Waiting..." msgid "Waiting..."
msgstr "כעת ממתין..." msgstr "כעת ממתין..."
@ -2341,6 +2368,24 @@ msgstr "כבר בעיצומה של שיחה"
msgid "Ending call..." msgid "Ending call..."
msgstr "כעת מסיים שיחה..." msgstr "כעת מסיים שיחה..."
msgid "Incoming group call"
msgstr "שיחת קבוצה נכנסת"
msgid "Preparing group call..."
msgstr "כעת מכין שיחת קבוצה..."
msgid "Connecting to group call..."
msgstr "כעת מתחבר אל שיחת קבוצה..."
msgid "Group call error"
msgstr "שגיאת שיחת קבוצה"
msgid "Ending group call..."
msgstr "כעת מסיים שיחת קבוצה..."
msgid "Group call ended"
msgstr "שיחת קבוצה הסתיימה"
msgid "Accept" msgid "Accept"
msgstr "קבל" msgstr "קבל"
@ -2354,7 +2399,55 @@ msgid "Retry"
msgstr "נסה שוב" msgstr "נסה שוב"
msgid "Audio Call" msgid "Audio Call"
msgstr "שיחה קולית (אודיו)" msgstr "שיחה קולית"
msgid "Video Call" msgid "Video Call"
msgstr "שיחה חזותית (וידאו)" msgstr "שיחה חזותית"
msgid "%s participant"
msgstr "משתתף %s"
msgid "%s participants"
msgstr "%s משתתפים"
msgid "(full)"
msgstr "(מלא)"
msgid "%s is able to receive group calls."
msgstr "%s מסוגל/ת לקבל שיחות קבוצתיות."
msgid "%s may not support group calls."
msgstr "%s עשוי שלא לתמוך בשיחות קבוצתיות."
msgid "Send a message..."
msgstr "שליחת הודעה..."
msgid "Edited"
msgstr ""
msgid "Edited (%s)"
msgstr ""
msgid "Editing"
msgstr ""
msgid "Being edited"
msgstr ""
msgid "Delivered"
msgstr ""
msgid "Read"
msgstr ""
msgid "Sending..."
msgstr "כעת שולח..."
msgid "%s requested your attention to the conversation"
msgstr "%s ביקש/ה את תשומת לבך אל הדיון"
msgid "You requested %s's attention to the conversation"
msgstr "ביקשת את הסבת צומת הלב של %s אל הדיון"
msgid "Attention to conversation requested."
msgstr "הסבת צומת לב אל הדיון התבקשה."

Binary file not shown.

View file

@ -4,13 +4,13 @@
# License: AGPL # License: AGPL
# Authors: Valérian Saliou, JanCBorchardt # Authors: Valérian Saliou, JanCBorchardt
# Translators: # Translators:
# DonIncognito <joe.brendel.ronck@gmail.com>, 2013 # Joé BRENDEL <joe.brendel.ronck@gmail.com>, 2013
# Kahr Patrick <patrick@nerds.lu>, 2013-2014 # Kahr Patrick <patrick@nerds.lu>, 2013-2014
# Tullius, 2013 # Thull Michel, 2013
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jappix\n" "Project-Id-Version: Jappix\n"
"PO-Revision-Date: 2014-05-08 10:21+0100\n" "PO-Revision-Date: 2014-08-09 15:36+0100\n"
"Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n" "Last-Translator: Valérian Saliou <valerian@valeriansaliou.name>\n"
"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/jappix/" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/jappix/"
"language/lb/)\n" "language/lb/)\n"
@ -190,6 +190,21 @@ msgstr "E Kolleg adden"
msgid "Your groupchats" msgid "Your groupchats"
msgstr "Deng Gruppenchats" msgstr "Deng Gruppenchats"
msgid "Audio/video conference"
msgstr ""
msgid "Launch a group call"
msgstr ""
msgid "Audio conference"
msgstr ""
msgid "Video conference"
msgstr ""
msgid "Conference call"
msgstr ""
msgid "Manage your favorite groupchats" msgid "Manage your favorite groupchats"
msgstr "Organiséier deng Gruppenchats" msgstr "Organiséier deng Gruppenchats"
@ -852,7 +867,7 @@ msgid "Hi there!"
msgstr "Moien!" msgstr "Moien!"
msgid "Welcome to %1s, “%2s”." msgid "Welcome to %1s, “%2s”."
msgstr "" msgstr "Wëllkomm op %1s, \"%2s\"."
msgid "Login to your existing XMPP account or create a new one for free!" msgid "Login to your existing XMPP account or create a new one for free!"
msgstr "" msgstr ""
@ -1215,7 +1230,7 @@ msgid "Friends"
msgstr "Kollegen" msgstr "Kollegen"
msgid "Welcome to Jappix, your own social cloud!" msgid "Welcome to Jappix, your own social cloud!"
msgstr "" msgstr "Wëllkomm op Jappix, denger eegener sozialer Cloud+"
msgid "" msgid ""
"Before you start using it, you will have to change some settings, search for " "Before you start using it, you will have to change some settings, search for "
@ -1250,10 +1265,10 @@ msgid ""
"When you will press the save button, the profile editor will be opened. " "When you will press the save button, the profile editor will be opened. "
"Happy socializing!" "Happy socializing!"
msgstr "" msgstr ""
"Wann dier op Späicheren dréckt geet den Profileditor op. Happy socializing!" "Wanns du op Späicheren drécks geet den Profileditor op. Happy socializing!"
msgid "Share Jappix on %s" msgid "Share Jappix on %s"
msgstr "Deelt Jappix op %s" msgstr "Deel Jappix op %s"
msgid "Follow Jappix topic on %s" msgid "Follow Jappix topic on %s"
msgstr "Jappix op %s followen" msgstr "Jappix op %s followen"
@ -1280,7 +1295,7 @@ msgid "Jappix installation"
msgstr "Jappix-Installatioun" msgstr "Jappix-Installatioun"
msgid "Welcome to the Jappix installation!" msgid "Welcome to the Jappix installation!"
msgstr "Moien fir d'Installatioun vun Jappix!" msgstr "Wëlkomm bei der Installatioun vun Jappix!"
msgid "" msgid ""
"This tool will help you installing Jappix, the first full-featured XMPP-" "This tool will help you installing Jappix, the first full-featured XMPP-"
@ -1296,7 +1311,7 @@ msgid "Welcome"
msgstr "Moien" msgstr "Moien"
msgid "Storage configuration" msgid "Storage configuration"
msgstr "Späicher Konfiguratioun" msgstr "Späicher-Konfiguratioun"
msgid "Administrator account" msgid "Administrator account"
msgstr "Administrator-Kont" msgstr "Administrator-Kont"
@ -1326,7 +1341,7 @@ msgstr ""
msgid "It's time to build your own social cloud: just go to the next step!" msgid "It's time to build your own social cloud: just go to the next step!"
msgstr "" msgstr ""
"Et as Zäit fier Äer eegen Social Cloud opzebauen: weider bei dee nächste " "Et as Zäit fier deng eegen Social Cloud opzebauen: weider bei dee nächste "
"Schrëtt!" "Schrëtt!"
msgid "" msgid ""
@ -1346,22 +1361,22 @@ msgstr ""
"Besëtzer vum Uerdner op %3s setzen (Hängt vun denger Konfiguratioun of)." "Besëtzer vum Uerdner op %3s setzen (Hängt vun denger Konfiguratioun of)."
msgid "The folder is writable, you can continue!" msgid "The folder is writable, you can continue!"
msgstr "An desen Uerdner kënnt Der schreiwen, Dier kënnt weidermaachen!" msgstr "Du hues d'Schreiwrechter fier dësen Uerdner, du kanns weidermaachen!"
msgid "" msgid ""
"Jappix offers you the possibility to manage your configuration, install new " "Jappix offers you the possibility to manage your configuration, install new "
"plugins or search for updates. That's why you must create an administrator " "plugins or search for updates. That's why you must create an administrator "
"account to access the manager." "account to access the manager."
msgstr "" msgstr ""
"Jappix gëtt Iech d'Méiglechkeet fier äer Astellungen ze geréieren, nei " "Jappix gëtt Dier d'Méiglechkeet fier deng Astellungen ze geréieren, nei "
"Plugins ze installéieren oder no Updates ze sichen. Dofier musst dier en " "Plugins ze installéieren oder no Updates ze sichen. Dofier musst de en "
"Administrator-Kont opmaachen fier un de Manager ze kommen." "Administrator-Kont opmaachen fier un de Manager ze kommen."
msgid "" msgid ""
"When Jappix will be installed, just click on the manager link on the home " "When Jappix will be installed, just click on the manager link on the home "
"page to access it." "page to access it."
msgstr "" msgstr ""
"Wann Jappix installéiert gëtt, klickt op de Manager-Link op der Haaptsäit " "Wann Jappix bis installéiert as, klick op de Manager-Link op der Haaptsäit "
"fier eranzekommen." "fier eranzekommen."
msgid "Oops, you missed something or the two passwords do not match!" msgid "Oops, you missed something or the two passwords do not match!"
@ -1527,7 +1542,7 @@ msgid "Finish"
msgstr "Fäerdeg" msgstr "Fäerdeg"
msgid "Check again" msgid "Check again"
msgstr "Nach eng Kéier préifen" msgstr "Nach eng Kéier iwwerpréifen"
msgid "" msgid ""
"The folder is not writable, set the right permissions to the %s directory." "The folder is not writable, set the right permissions to the %s directory."
@ -2376,12 +2391,24 @@ msgstr "AdSense slot"
msgid "Stop" msgid "Stop"
msgstr "Stop" msgstr "Stop"
msgid "Leave"
msgstr ""
msgid "Mute" msgid "Mute"
msgstr "Mute" msgstr "Mute"
msgid "Unmute" msgid "Unmute"
msgstr "Unmute" msgstr "Unmute"
msgid "Nobody there. Invite some people!"
msgstr ""
msgid "Invite people..."
msgstr ""
msgid "Enter people names..."
msgstr ""
msgid "Is calling you" msgid "Is calling you"
msgstr "Rifft dech un" msgstr "Rifft dech un"
@ -2421,6 +2448,24 @@ msgstr "As besat"
msgid "Ending call..." msgid "Ending call..."
msgstr "Uruff beendegen..." msgstr "Uruff beendegen..."
msgid "Incoming group call"
msgstr ""
msgid "Preparing group call..."
msgstr ""
msgid "Connecting to group call..."
msgstr ""
msgid "Group call error"
msgstr ""
msgid "Ending group call..."
msgstr ""
msgid "Group call ended"
msgstr ""
msgid "Accept" msgid "Accept"
msgstr "Unhuelen" msgstr "Unhuelen"
@ -2438,3 +2483,51 @@ msgstr "Uruff"
msgid "Video Call" msgid "Video Call"
msgstr "Video Konferenz" msgstr "Video Konferenz"
msgid "%s participant"
msgstr ""
msgid "%s participants"
msgstr ""
msgid "(full)"
msgstr ""
msgid "%s is able to receive group calls."
msgstr ""
msgid "%s may not support group calls."
msgstr ""
msgid "Send a message..."
msgstr ""
msgid "Edited"
msgstr "Editéiert"
msgid "Edited (%s)"
msgstr "editéiert (%s)"
msgid "Editing"
msgstr "editéiert"
msgid "Being edited"
msgstr "gëtt editéiert"
msgid "Delivered"
msgstr "verschéckt"
msgid "Read"
msgstr "liesen"
msgid "Sending..."
msgstr "fortschécken..."
msgid "%s requested your attention to the conversation"
msgstr ""
msgid "You requested %s's attention to the conversation"
msgstr ""
msgid "Attention to conversation requested."
msgstr ""

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -215,8 +215,8 @@ if(!anonymousMode() && !httpAuthEnabled()) { ?>
<a class="desc" href="http://www.post-pro.fr/"><?php _e("Association"); ?></a> <a class="desc" href="http://www.post-pro.fr/"><?php _e("Association"); ?></a>
</span> </span>
<span class="one"> <span class="one">
<a class="name" href="https://frenchtouch.pro/">FrenchTouch</a> <a class="name" href="https://hakuma.holdings/">Hakuma Holdings</a>
<a class="desc" href="https://frenchtouch.pro/"><?php _e("Web agency"); ?></a> <a class="desc" href="https://hakuma.holdings/"><?php _e("Company"); ?></a>
</span> </span>
<?php if(hasLegal()) { ?> <?php if(hasLegal()) { ?>

View file

@ -2,7 +2,7 @@
"name": "jappix", "name": "jappix",
"description": "Jappix test tools", "description": "Jappix test tools",
"version": "1.0.0", "version": "1.0.0",
"homepage": "http://jappix.org/", "homepage": "https://jappix.org/",
"repository": { "repository": {
"type": "git", "type": "git",