Merge mozilla-central to mozilla-inbound

This commit is contained in:
Carsten "Tomcat" Book 2016-02-16 12:20:11 +01:00
commit 484c632031
130 changed files with 4614 additions and 1542 deletions

View File

@ -1347,7 +1347,7 @@ var BookmarkingUI = {
let options = PlacesUtils.history.getNewQueryOptions();
options.excludeQueries = true;
options.queryType = options.QUERY_TYPE_BOOKMARKS;
options.sortingMode = options.SORT_BY_DATE_DESCENDING;
options.sortingMode = options.SORT_BY_DATEADDED_DESCENDING;
options.maxResults = kMaxResults;
let query = PlacesUtils.history.getNewQuery();
@ -1605,6 +1605,10 @@ var BookmarkingUI = {
},
onMainMenuPopupShowing: function BUI_onMainMenuPopupShowing(event) {
// Don't handle events for submenus.
if (event.target != event.currentTarget)
return;
this._updateBookmarkPageMenuItem();
PlacesCommandHook.updateBookmarkAllTabsCommand();
this._updateRecentBookmarks(document.getElementById("menu_recentBookmarks"));

View File

@ -87,6 +87,8 @@ var gSyncUI = {
sidebarBroadcaster.removeAttribute("hidden");
}
this.maybeMoveSyncedTabsButton();
this.updateUI();
},
@ -332,6 +334,28 @@ var gSyncUI = {
}
},
/* After Sync is initialized we perform a once-only check for the sync
button being in "customize purgatory" and if so, move it to the panel.
This is done primarily for profiles created before SyncedTabs landed,
where the button defaulted to being in that purgatory.
We use a preference to ensure we only do it once, so people can still
customize it away and have it stick.
*/
maybeMoveSyncedTabsButton() {
const prefName = "browser.migrated-sync-button";
let migrated = false;
try {
migrated = Services.prefs.getBoolPref(prefName);
} catch (_) {}
if (migrated) {
return;
}
if (!CustomizableUI.getPlacementOfWidget("sync-button")) {
CustomizableUI.addWidgetToArea("sync-button", CustomizableUI.AREA_PANEL);
}
Services.prefs.setBoolPref(prefName, true);
},
/* Update the tooltip for the sync-status broadcaster (which will update the
Sync Toolbar button and the Sync spinner in the FxA hamburger area.)
If Sync is configured, the tooltip is when the last sync occurred,

View File

@ -1020,37 +1020,15 @@ toolbar[mode="text"] > #downloads-button > .toolbarbutton-icon {
visibility: collapse;
}
/* full screen chat window support */
chatbar:-moz-full-screen-ancestor,
chatbox:-moz-full-screen-ancestor {
border: none;
position: fixed !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
bottom: 0 !important;
width: 100% !important;
height: 100% !important;
margin: 0 !important;
min-width: 0 !important;
max-width: none !important;
min-height: 0 !important;
max-height: none !important;
box-sizing: border-box !important;
}
/* hide chat chrome when chat is fullscreen */
chatbox:-moz-full-screen-ancestor > .chat-titlebar {
#chat-window[sizemode="fullscreen"] chatbox > .chat-titlebar {
display: none;
}
/* hide chatbar if browser tab is fullscreen */
*:-moz-full-screen-ancestor chatbar:not(:-moz-full-screen-ancestor) {
display: none;
}
/* hide sidebar when fullscreen */
*:-moz-full-screen-ancestor #social-sidebar-box:not(:-moz-full-screen-ancestor) {
/* hide chatbar and sidebar if browser tab is fullscreen */
#main-window[inFullscreen][inDOMFullscreen] chatbar,
#main-window[inFullscreen][inDOMFullscreen] #social-sidebar-box,
#main-window[inFullscreen][inDOMFullscreen] #social-sidebar-splitter {
display: none;
}

View File

@ -121,7 +121,7 @@ SocialErrorListener = {
.getInterface(Ci.nsIDOMWindowUtils);
dwu.allowScriptsToClose();
addEventListener("DOMWindowClose", function _mozSocialDOMWindowClose(evt) {
content.addEventListener("DOMWindowClose", function _mozSocialDOMWindowClose(evt) {
sendAsyncMessage("DOMWindowClose");
// preventDefault stops the default window.close() function being called,
// which doesn't actually close anything but causes things to get into
@ -135,7 +135,7 @@ SocialErrorListener = {
break;
case "Social:ListenForEvents":
for (let eventName of message.data.eventNames) {
addEventListener(eventName, this);
content.addEventListener(eventName, this);
}
break;
case "Social:SetDocumentTitle":

View File

@ -66,6 +66,19 @@ function test() {
testVal("<https://>mozilla.org</sub/file.ext?foo&bar>");
testVal("<https://>mozilla.org</sub/file.ext?foo&bar#top>");
testVal("<https://>mozilla.org</sub/file.ext?foo&bar#top>");
testVal("foo.bar<?q=test>");
testVal("foo.bar<#mozilla.org>");
testVal("foo.bar<?somewhere.mozilla.org>");
testVal("foo.bar<?@mozilla.org>");
testVal("foo.bar<#x@mozilla.org>");
testVal("foo.bar<#@x@mozilla.org>");
testVal("foo.bar<?x@mozilla.org>");
testVal("foo.bar<?@x@mozilla.org>");
testVal("<foo.bar@x@>mozilla.org");
testVal("<foo.bar@:baz@>mozilla.org");
testVal("<foo.bar:@baz@>mozilla.org");
testVal("<foo.bar@:ba:z@>mozilla.org");
testVal("<foo.:bar:@baz@>mozilla.org");
testVal("<https://sub.>mozilla.org<:666/file.ext>");
testVal("<sub.>mozilla.org<:666/file.ext>");

View File

@ -261,7 +261,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
trimmedLength = "http://".length;
}
let matchedURL = value.match(/^((?:[a-z]+:\/\/)?(?:[^\/]+@)?)(.+?)(?::\d+)?(?:\/|$)/);
let matchedURL = value.match(/^((?:[a-z]+:\/\/)(?:[^\/#?]+@)?)(.+?)(?::\d+)?(?:[\/#?]|$)/);
if (!matchedURL)
return;

View File

@ -17,7 +17,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<head>
<title>&restorepage.tabtitle;</title>
<title>&welcomeback2.tabtitle;</title>
<link rel="stylesheet" href="chrome://global/skin/in-content/info-pages.css" type="text/css" media="all"/>
<link rel="stylesheet" href="chrome://browser/skin/aboutWelcomeBack.css" type="text/css" media="all"/>
<link rel="icon" type="image/png" href="chrome://global/skin/icons/information-16.png"/>

View File

@ -34,13 +34,9 @@ const nsIDOMWindow = Components.interfaces.nsIDOMWindow;
const nsIFileURL = Components.interfaces.nsIFileURL;
const nsIInterfaceRequestor = Components.interfaces.nsIInterfaceRequestor;
const nsINetUtil = Components.interfaces.nsINetUtil;
const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
const nsIPrefLocalizedString = Components.interfaces.nsIPrefLocalizedString;
const nsISupportsString = Components.interfaces.nsISupportsString;
const nsIURIFixup = Components.interfaces.nsIURIFixup;
const nsIWebNavigation = Components.interfaces.nsIWebNavigation;
const nsIWindowMediator = Components.interfaces.nsIWindowMediator;
const nsIWindowWatcher = Components.interfaces.nsIWindowWatcher;
const nsIWebNavigationInfo = Components.interfaces.nsIWebNavigationInfo;
const nsICommandLineValidator = Components.interfaces.nsICommandLineValidator;
@ -59,12 +55,11 @@ function shouldLoadURI(aURI) {
function resolveURIInternal(aCmdLine, aArgument) {
var uri = aCmdLine.resolveURI(aArgument);
var urifixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
.getService(nsIURIFixup);
var uriFixup = Services.uriFixup;
if (!(uri instanceof nsIFileURL)) {
return urifixup.createFixupURI(aArgument,
urifixup.FIXUP_FLAG_FIX_SCHEME_TYPOS);
return uriFixup.createFixupURI(aArgument,
uriFixup.FIXUP_FLAG_FIX_SCHEME_TYPOS);
}
try {
@ -79,7 +74,7 @@ function resolveURIInternal(aCmdLine, aArgument) {
// doesn't exist. Try URI fixup heuristics: see bug 290782.
try {
uri = urifixup.createFixupURI(aArgument, 0);
uri = uriFixup.createFixupURI(aArgument, 0);
}
catch (e) {
Components.utils.reportError(e);
@ -181,9 +176,6 @@ function getPostUpdateOverridePage(defaultOverridePage) {
const NO_EXTERNAL_URIS = 1;
function openWindow(parent, url, target, features, args, noExternalArgs) {
var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(nsIWindowWatcher);
if (noExternalArgs == NO_EXTERNAL_URIS) {
// Just pass in the defaultArgs directly
var argstring;
@ -193,7 +185,7 @@ function openWindow(parent, url, target, features, args, noExternalArgs) {
argstring.data = args;
}
return wwatch.openWindow(parent, url, target, features, argstring);
return Services.ww.openWindow(parent, url, target, features, argstring);
}
// Pass an array to avoid the browser "|"-splitting behavior.
@ -230,7 +222,7 @@ function openWindow(parent, url, target, features, args, noExternalArgs) {
argArray.AppendElement(null); // postData
argArray.AppendElement(null); // allowThirdPartyFixup
return wwatch.openWindow(parent, url, target, features, argArray);
return Services.ww.openWindow(parent, url, target, features, argArray);
}
function openPreferences() {
@ -243,19 +235,10 @@ function openPreferences() {
sa.AppendElement(wuri);
var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(nsIWindowWatcher);
wwatch.openWindow(null, gBrowserContentHandler.chromeURL,
"_blank",
"chrome,dialog=no,all",
sa);
}
function getMostRecentWindow(aType) {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(nsIWindowMediator);
return wm.getMostRecentWindow(aType);
Services.ww.openWindow(null, gBrowserContentHandler.chromeURL,
"_blank",
"chrome,dialog=no,all",
sa);
}
function logSystemBasedSearch(engine) {
@ -286,14 +269,11 @@ function doSearch(searchTerm, cmdLine) {
// XXXbsmedberg: use handURIToExistingBrowser to obey tabbed-browsing
// preferences, but need nsIBrowserDOMWindow extensions
var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(nsIWindowWatcher);
return wwatch.openWindow(null, gBrowserContentHandler.chromeURL,
"_blank",
"chrome,dialog=no,all" +
gBrowserContentHandler.getFeatures(cmdLine),
sa);
return Services.ww.openWindow(null, gBrowserContentHandler.chromeURL,
"_blank",
"chrome,dialog=no,all" +
gBrowserContentHandler.getFeatures(cmdLine),
sa);
}
function nsBrowserContentHandler() {
@ -318,9 +298,7 @@ nsBrowserContentHandler.prototype = {
return this.mChromeURL;
}
var prefb = Components.classes["@mozilla.org/preferences-service;1"]
.getService(nsIPrefBranch);
this.mChromeURL = prefb.getCharPref("browser.chromeURL");
this.mChromeURL = Services.prefs.getCharPref("browser.chromeURL");
return this.mChromeURL;
},
@ -452,9 +430,7 @@ nsBrowserContentHandler.prototype = {
var fileParam = cmdLine.handleFlagWithParam("file", false);
if (fileParam) {
var file = cmdLine.resolveFile(fileParam);
var ios = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var fileURI = ios.newFileURI(file);
var fileURI = Services.io.newFileURI(file);
openWindow(null, this.chromeURL, "_blank",
"chrome,dialog=no,all" + this.getFeatures(cmdLine),
fileURI.spec);
@ -494,8 +470,7 @@ nsBrowserContentHandler.prototype = {
/* nsIBrowserHandler */
get defaultArgs() {
var prefb = Components.classes["@mozilla.org/preferences-service;1"]
.getService(nsIPrefBranch);
var prefb = Services.prefs;
if (!gFirstWindow) {
gFirstWindow = true;
@ -747,9 +722,7 @@ nsDefaultCommandLineHandler.prototype = {
if (!this._haveProfile) {
try {
// This will throw when a profile has not been selected.
var fl = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
var dir = fl.get("ProfD", Components.interfaces.nsILocalFile);
var dir = Services.dirsvc.get("ProfD", Components.interfaces.nsILocalFile);
this._haveProfile = true;
}
catch (e) {

View File

@ -24,11 +24,26 @@ XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
XPCOMUtils.defineLazyModuleGetter(this, "Task",
"resource://gre/modules/Task.jsm");
// See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
const PREF_LOG_LEVEL = "loop.debug.loglevel";
XPCOMUtils.defineLazyGetter(this, "log", () => {
let ConsoleAPI = Cu.import("resource://gre/modules/Console.jsm", {}).ConsoleAPI;
let consoleOptions = {
maxLogLevelPref: PREF_LOG_LEVEL,
prefix: "Loop"
};
return new ConsoleAPI(consoleOptions);
});
/**
* This window listener gets loaded into each browser.xul window and is used
* to provide the required loop functions for the window.
*/
var WindowListener = {
// Records the add-on version once we know it.
addonVersion: "unknown",
/**
* Sets up the chrome integration within browser windows for Loop.
*
@ -40,6 +55,7 @@ var WindowListener = {
let xhrClass = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"];
let FileReader = window.FileReader;
let menuItem = null;
let isSlideshowOpen = false;
// the "exported" symbols
var LoopUI = {
@ -74,6 +90,30 @@ var WindowListener = {
return browser;
},
get isSlideshowOpen() {
return isSlideshowOpen;
},
set isSlideshowOpen(aOpen) {
isSlideshowOpen = aOpen;
this.updateToolbarState();
},
/**
* @return {Object} Getter for the Loop constants
*/
get constants() {
if (!this._constants) {
// GetAllConstants is synchronous even though it's using a callback.
this.LoopAPI.sendMessageToHandler({
name: "GetAllConstants"
}, result => {
this._constants = result;
});
}
return this._constants;
},
/**
* @return {Promise}
*/
@ -114,6 +154,10 @@ var WindowListener = {
});
}
if (this.isSlideshowOpen) {
return Promise.resolve();
}
return this.openPanel(event).then(mm => {
if (mm) {
mm.sendAsyncMessage("Social:EnsureFocusElement");
@ -141,6 +185,12 @@ var WindowListener = {
mm.sendAsyncMessage("Social:WaitForDocumentVisible");
mm.addMessageListener("Social:DocumentVisible", () => resolve(mm));
let buckets = this.constants.LOOP_MAU_TYPE;
this.LoopAPI.sendMessageToHandler({
name: "TelemetryAddValue",
data: ["LOOP_MAU", buckets.OPEN_PANEL]
});
};
// Used to clear the temporary "login" state from the button.
@ -171,6 +221,17 @@ var WindowListener = {
});
},
/**
* Wrapper for openPanel - to support Firefox 46 and 45.
*
* @param {event} event The event opening the panel, used to anchor
* the panel to the button which triggers it.
* @return {Promise}
*/
openCallPanel: function(event) {
return this.openPanel(event);
},
/**
* Method to know whether actions to open the panel should instead resume the tour.
*
@ -229,7 +290,7 @@ var WindowListener = {
init: function() {
// This is a promise for test purposes, but we don't want to be logging
// expected errors to the console, so we catch them here.
this.MozLoopService.initialize().catch(ex => {
this.MozLoopService.initialize(WindowListener.addonVersion).catch(ex => {
if (!ex.message ||
(!ex.message.contains("not enabled") &&
!ex.message.contains("not needed"))) {
@ -313,6 +374,8 @@ var WindowListener = {
if (this.MozLoopService.errors.size) {
state = "error";
mozL10nId += "-error";
} else if (this.isSlideshowOpen) {
state = "slideshow";
} else if (this.MozLoopService.screenShareActive) {
state = "action";
mozL10nId += "-screensharing";
@ -481,8 +544,88 @@ var WindowListener = {
gBrowser.tabContainer.removeEventListener("TabSelect", this);
gBrowser.removeEventListener("DOMTitleChanged", this);
gBrowser.removeEventListener("mousemove", this);
this.removeRemoteCursor();
this._listeningToTabSelect = false;
this._browserSharePaused = false;
this._sendTelemetryEventsIfNeeded();
},
/**
* Sends telemetry events for pause/ resume buttons if needed.
*/
_sendTelemetryEventsIfNeeded: function() {
// The user can't click Resume button without clicking Pause button first.
if (!this._pauseButtonClicked) {
return;
}
let buckets = this.constants.SHARING_SCREEN;
this.LoopAPI.sendMessageToHandler({
name: "TelemetryAddValue",
data: [
"LOOP_INFOBAR_ACTION_BUTTONS",
buckets.PAUSED
]
});
if (this._resumeButtonClicked) {
this.LoopAPI.sendMessageToHandler({
name: "TelemetryAddValue",
data: [
"LOOP_INFOBAR_ACTION_BUTTONS",
buckets.RESUMED
]
});
}
this._pauseButtonClicked = false;
this._resumeButtonClicked = false;
},
/**
* If sharing is active, paints and positions the remote cursor
* over the screen
*
* @param cursorData Object with the correct position for the cursor
* {
* ratioX: position on the X axis (percentage value)
* ratioY: position on the Y axis (percentage value)
* }
*/
addRemoteCursor: function(cursorData) {
if (!this._listeningToTabSelect) {
return;
}
let browser = gBrowser.selectedBrowser;
let cursor = document.getElementById("loop-remote-cursor");
if (!cursor) {
cursor = document.createElement("image");
cursor.setAttribute("id", "loop-remote-cursor");
}
// Update the cursor's position.
cursor.setAttribute("left",
cursorData.ratioX * browser.boxObject.width);
cursor.setAttribute("top",
cursorData.ratioY * browser.boxObject.height);
// browser's parent is a xul:stack, so positioning with left/top works.
browser.parentNode.appendChild(cursor);
},
/**
* Removes the remote cursor from the screen
*
* @param browser OPT browser where the cursor should be removed from.
*/
removeRemoteCursor: function() {
let cursor = document.getElementById("loop-remote-cursor");
if (cursor) {
cursor.parentNode.removeChild(cursor);
}
},
/**
@ -539,6 +682,11 @@ var WindowListener = {
buttonNode.label = stringObj.label;
buttonNode.accessKey = stringObj.accesskey;
LoopUI.MozLoopService.toggleBrowserSharing(this._browserSharePaused);
if (this._browserSharePaused) {
this._pauseButtonClicked = true;
} else {
this._resumeButtonClicked = true;
}
return true;
},
type: "pause"
@ -605,7 +753,10 @@ var WindowListener = {
let wasVisible = false;
// Hide the infobar from the previous tab.
if (event.detail.previousTab) {
wasVisible = this._hideBrowserSharingInfoBar(event.detail.previousTab.linkedBrowser);
wasVisible = this._hideBrowserSharingInfoBar(
event.detail.previousTab.linkedBrowser);
// And remove the cursor.
this.removeRemoteCursor();
}
// We've changed the tab, so get the new window id.
@ -713,10 +864,18 @@ var WindowListener = {
window.LoopUI = LoopUI;
},
tearDownBrowserUI: function() {
// Take any steps to remove UI or anything from the browser window
// document.getElementById() etc. will work here
// XXX Add in tear-down of the panel.
/**
* Take any steps to remove UI or anything from the browser window
* document.getElementById() etc. will work here.
*
* @param {Object} window The window to remove the integration from.
*/
tearDownBrowserUI: function(window) {
if (window.LoopUI) {
window.LoopUI.removeMenuItem();
// XXX Bug 1229352 - Add in tear-down of the panel.
}
},
// nsIWindowMediatorListener functions.
@ -815,7 +974,10 @@ function loadDefaultPrefs() {
/**
* Called when the add-on is started, e.g. when installed or when Firefox starts.
*/
function startup() {
function startup(data) {
// Record the add-on version for when the UI is initialised.
WindowListener.addonVersion = data.version;
loadDefaultPrefs();
createLoopButton();

View File

@ -22,9 +22,6 @@ XPCOMUtils.defineLazyGetter(this, "eventEmitter", function() {
const { EventEmitter } = Cu.import("resource://devtools/shared/event-emitter.js", {});
return new EventEmitter();
});
XPCOMUtils.defineLazyGetter(this, "gLoopBundle", function() {
return Services.strings.createBundle("chrome://loop/locale/loop.properties");
});
XPCOMUtils.defineLazyModuleGetter(this, "LoopRoomsCache",
"chrome://loop/content/modules/LoopRoomsCache.jsm");
@ -772,19 +769,13 @@ var LoopRoomsInternal = {
* Joins a room. The sessionToken that is returned by the server will be stored
* locally, for future use.
*
* @param {String} roomToken The room token.
* @param {Function} callback Function that will be invoked once the operation
* finished. The first argument passed will be an
* `Error` object or `null`.
* @param {String} roomToken The room token.
* @param {String} displayName The user's display name.
* @param {Function} callback Function that will be invoked once the operation
* finished. The first argument passed will be an
* `Error` object or `null`.
*/
join: function(roomToken, callback) {
let displayName;
if (MozLoopService.userProfile && MozLoopService.userProfile.email) {
displayName = MozLoopService.userProfile.email;
} else {
displayName = gLoopBundle.GetStringFromName("display_name_guest");
}
join: function(roomToken, displayName, callback) {
this._postToRoom(roomToken, {
action: "join",
displayName: displayName,
@ -1067,8 +1058,8 @@ this.LoopRooms = {
return LoopRoomsInternal.delete(roomToken, callback);
},
join: function(roomToken, callback) {
return LoopRoomsInternal.join(roomToken, callback);
join: function(roomToken, displayName, callback) {
return LoopRoomsInternal.join(roomToken, displayName, callback);
},
refreshMembership: function(roomToken, sessionToken, callback) {

View File

@ -138,6 +138,12 @@ const kMessageName = "Loop:Message";
const kPushMessageName = "Loop:Message:Push";
const kPushSubscription = "pushSubscription";
const kRoomsPushPrefix = "Rooms:";
const kMauPrefMap = new Map(
Object.getOwnPropertyNames(LOOP_MAU_TYPE).map(name => {
let parts = name.toLowerCase().split("_");
return [LOOP_MAU_TYPE[name], parts[0] + parts[1].charAt(0).toUpperCase() + parts[1].substr(1)];
})
);
const kMessageHandlers = {
/**
* Start browser sharing, which basically means to start listening for tab
@ -185,6 +191,30 @@ const kMessageHandlers = {
reply();
},
/**
* Creates a layout for the remote cursor on the browser chrome,
* and positions it on the received coordinates.
*
* @param {Object} message Message meant for the handler function, containing
* the following parameters in its 'data' property:
* {
* ratioX: cursor's X position (between 0-1)
* ratioY: cursor's Y position (between 0-1)
* }
*
* @param {Function} reply Callback function, invoked with the result of the
* message handler. The result will be sent back to
* the senders' channel.
*/
AddRemoteCursorOverlay: function(message, reply) {
let win = Services.wm.getMostRecentWindow("navigator:browser");
if (win) {
win.LoopUI.addRemoteCursor(message.data[0]);
}
reply();
},
/**
* Associates a session-id and a call-id with a window for debugging.
*
@ -366,9 +396,11 @@ const kMessageHandlers = {
GetAllConstants: function(message, reply) {
reply({
LOOP_SESSION_TYPE: LOOP_SESSION_TYPE,
LOOP_MAU_TYPE: LOOP_MAU_TYPE,
ROOM_CREATE: ROOM_CREATE,
ROOM_DELETE: ROOM_DELETE,
SHARING_ROOM_URL: SHARING_ROOM_URL,
SHARING_SCREEN: SHARING_SCREEN,
TWO_WAY_MEDIA_CONN_LENGTH: TWO_WAY_MEDIA_CONN_LENGTH
});
},
@ -779,16 +811,13 @@ const kMessageHandlers = {
*
* @param {Object} message Message meant for the handler function, containing
* the following parameters in its `data` property:
* [
* {String} src Origin that starts or resumes the tour
* ]
* []
* @param {Function} reply Callback function, invoked with the result of this
* message handler. The result will be sent back to
* the senders' channel.
*/
OpenGettingStartedTour: function(message, reply) {
var src = message.data[0];
MozLoopService.openGettingStartedTour(src);
MozLoopService.openGettingStartedTour();
reply();
},
@ -1001,7 +1030,30 @@ const kMessageHandlers = {
*/
TelemetryAddValue: function(message, reply) {
let [histogramId, value] = message.data;
Services.telemetry.getHistogramById(histogramId).add(value);
if (histogramId === "LOOP_MAU") {
let pref = "mau." + kMauPrefMap.get(value);
let prefDate = MozLoopService.getLoopPref(pref) * 1000;
let delta = Date.now() - prefDate;
// Send telemetry event if period (30 days) passed.
// 0 is default value for pref.
// 2592000 seconds in 30 days
if (pref === 0 || delta >= 2592000 * 1000) {
try {
Services.telemetry.getHistogramById(histogramId).add(value);
} catch (ex) {
MozLoopService.log.error("TelemetryAddValue failed for histogram '" + histogramId + "'", ex);
}
MozLoopService.setLoopPref(pref, Math.floor(Date.now() / 1000));
}
} else {
try {
Services.telemetry.getHistogramById(histogramId).add(value);
} catch (ex) {
MozLoopService.log.error("TelemetryAddValue failed for histogram '" + histogramId + "'", ex);
}
}
reply();
}
};
@ -1020,7 +1072,11 @@ const LoopAPIInternal = {
Cu.import("resource://gre/modules/RemotePageManager.jsm");
gPageListeners = [new RemotePages("about:looppanel"), new RemotePages("about:loopconversation")];
gPageListeners = [new RemotePages("about:looppanel"),
new RemotePages("about:loopconversation"),
// Slideshow added here to expose the loop api to make L10n work.
// XXX Can remove once slideshow is made remote.
new RemotePages("chrome://loop/content/panels/slideshow.html")];
for (let page of gPageListeners) {
page.addMessageListener(kMessageName, this.handleMessage.bind(this));
}

View File

@ -59,6 +59,30 @@ const ROOM_DELETE = {
DELETE_FAIL: 1
};
/**
* Values that we segment sharing screen pause/ resume action telemetry probes into.
*
* @type {{PAUSED: Number, RESUMED: Number}}
*/
const SHARING_SCREEN = {
PAUSED: 0,
RESUMED: 1
};
/**
* Values that we segment MAUs telemetry probes into.
*
* @type {{OPEN_PANEL: Number, OPEN_CONVERSATION: Number,
* ROOM_OPEN: Number, ROOM_SHARE: Number, ROOM_DELETE: Number}}
*/
const LOOP_MAU_TYPE = {
OPEN_PANEL: 0,
OPEN_CONVERSATION: 1,
ROOM_OPEN: 2,
ROOM_SHARE: 3,
ROOM_DELETE: 4
};
// See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
const PREF_LOG_LEVEL = "loop.debug.loglevel";
@ -81,14 +105,17 @@ Cu.import("resource://gre/modules/FxAccountsOAuthClient.jsm");
Cu.importGlobalProperties(["URL"]);
this.EXPORTED_SYMBOLS = ["MozLoopService", "LOOP_SESSION_TYPE",
"TWO_WAY_MEDIA_CONN_LENGTH", "SHARING_ROOM_URL", "ROOM_CREATE", "ROOM_DELETE"];
this.EXPORTED_SYMBOLS = ["MozLoopService", "LOOP_SESSION_TYPE", "LOOP_MAU_TYPE",
"TWO_WAY_MEDIA_CONN_LENGTH", "SHARING_ROOM_URL", "SHARING_SCREEN",
"ROOM_CREATE", "ROOM_DELETE"];
XPCOMUtils.defineConstant(this, "LOOP_SESSION_TYPE", LOOP_SESSION_TYPE);
XPCOMUtils.defineConstant(this, "TWO_WAY_MEDIA_CONN_LENGTH", TWO_WAY_MEDIA_CONN_LENGTH);
XPCOMUtils.defineConstant(this, "SHARING_ROOM_URL", SHARING_ROOM_URL);
XPCOMUtils.defineConstant(this, "SHARING_SCREEN", SHARING_SCREEN);
XPCOMUtils.defineConstant(this, "ROOM_CREATE", ROOM_CREATE);
XPCOMUtils.defineConstant(this, "ROOM_DELETE", ROOM_DELETE);
XPCOMUtils.defineConstant(this, "LOOP_MAU_TYPE", LOOP_MAU_TYPE);
XPCOMUtils.defineLazyModuleGetter(this, "LoopAPI",
"chrome://loop/content/modules/MozLoopAPI.jsm");
@ -117,9 +144,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "HawkClient",
XPCOMUtils.defineLazyModuleGetter(this, "deriveHawkCredentials",
"resource://services-common/hawkrequest.js");
XPCOMUtils.defineLazyModuleGetter(this, "hookWindowCloseForPanelClose",
"resource://gre/modules/MozSocialAPI.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "LoopRooms",
"chrome://loop/content/modules/LoopRooms.jsm");
@ -171,6 +195,7 @@ var gFxAOAuthClientPromise = null;
var gFxAOAuthClient = null;
var gErrors = new Map();
var gConversationWindowData = new Map();
var gAddonVersion = "unknown";
/**
* Internal helper methods and state
@ -614,7 +639,11 @@ var MozLoopServiceInternal = {
throw error;
};
return gHawkClient.request(path, method, credentials, payloadObj).then(
var extraHeaders = {
"x-loop-addon-ver": gAddonVersion
};
return gHawkClient.request(path, method, credentials, payloadObj, extraHeaders).then(
(result) => {
this.clearError("network");
return result;
@ -904,157 +933,174 @@ var MozLoopServiceInternal = {
* window when it opens.
* @param {Function} windowCloseCallback Callback function that's invoked
* when the window closes.
* @returns {Number} The id of the window, null if a window could not
* be opened.
* @returns {Promise} That is resolved with the id of the window, null if a
* window could not be opened.
*/
openChatWindow: function(conversationWindowData, windowCloseCallback) {
// So I guess the origin is the loop server!?
let origin = this.loopServerUri;
let windowId = this.getChatWindowID(conversationWindowData);
return new Promise(resolve => {
// So I guess the origin is the loop server!?
let origin = this.loopServerUri;
let windowId = this.getChatWindowID(conversationWindowData);
gConversationWindowData.set(windowId, conversationWindowData);
gConversationWindowData.set(windowId, conversationWindowData);
let url = this.getChatURL(windowId);
let url = this.getChatURL(windowId);
Chat.registerButton(kChatboxHangupButton);
Chat.registerButton(kChatboxHangupButton);
let callback = chatbox => {
let mm = chatbox.content.messageManager;
let callback = chatbox => {
let mm = chatbox.content.messageManager;
let loaded = () => {
mm.removeMessageListener("DOMContentLoaded", loaded);
mm.sendAsyncMessage("Social:ListenForEvents", {
eventNames: ["LoopChatEnabled", "LoopChatMessageAppended",
"LoopChatDisabledMessageAppended", "socialFrameAttached",
"socialFrameDetached", "socialFrameHide", "socialFrameShow"]
});
let loaded = () => {
mm.removeMessageListener("DOMContentLoaded", loaded);
mm.sendAsyncMessage("Social:ListenForEvents", {
eventNames: ["LoopChatEnabled", "LoopChatMessageAppended",
"LoopChatDisabledMessageAppended", "socialFrameAttached",
"socialFrameDetached", "socialFrameHide", "socialFrameShow"]
});
let chatbar = chatbox.parentNode;
const kEventNamesMap = {
socialFrameAttached: "Loop:ChatWindowAttached",
socialFrameDetached: "Loop:ChatWindowDetached",
socialFrameHide: "Loop:ChatWindowHidden",
socialFrameShow: "Loop:ChatWindowShown",
unload: "Loop:ChatWindowClosed"
};
const kEventNamesMap = {
socialFrameAttached: "Loop:ChatWindowAttached",
socialFrameDetached: "Loop:ChatWindowDetached",
socialFrameHide: "Loop:ChatWindowHidden",
socialFrameShow: "Loop:ChatWindowShown",
unload: "Loop:ChatWindowClosed"
const kSizeMap = {
LoopChatEnabled: "loopChatEnabled",
LoopChatDisabledMessageAppended: "loopChatDisabledMessageAppended",
LoopChatMessageAppended: "loopChatMessageAppended"
};
let listeners = {};
let messageName = "Social:CustomEvent";
mm.addMessageListener(messageName, listeners[messageName] = message => {
let eventName = message.data.name;
if (kEventNamesMap[eventName]) {
eventName = kEventNamesMap[eventName];
UITour.clearAvailableTargetsCache();
UITour.notify(eventName);
} else {
// When the chat box or messages are shown, resize the panel or window
// to be slightly higher to accomodate them.
let customSize = kSizeMap[eventName];
let currSize = chatbox.getAttribute("customSize");
// If the size is already at the requested one or at the maximum size
// already, don't do anything. Especially don't make it shrink.
if (customSize && currSize != customSize && currSize != "loopChatMessageAppended") {
chatbox.setAttribute("customSize", customSize);
chatbox.parentNode.setAttribute("customSize", customSize);
}
}
});
// Handle window.close correctly on the chatbox.
mm.sendAsyncMessage("Social:HookWindowCloseForPanelClose");
messageName = "DOMWindowClose";
mm.addMessageListener(messageName, listeners[messageName] = () => {
// Remove message listeners.
for (let name of Object.getOwnPropertyNames(listeners)) {
mm.removeMessageListener(name, listeners[name]);
}
listeners = {};
windowCloseCallback();
if (conversationWindowData.type == "room") {
// NOTE: if you add something here, please also consider if something
// needs to be done on the content side as well (e.g.
// activeRoomStore#windowUnload).
LoopAPI.sendMessageToHandler({
name: "HangupNow",
data: [conversationWindowData.roomToken, windowId]
});
}
chatbox.close();
});
mm.sendAsyncMessage("Loop:MonitorPeerConnectionLifecycle");
messageName = "Loop:PeerConnectionLifecycleChange";
mm.addMessageListener(messageName, listeners[messageName] = message => {
// Chat Window Id, this is different that the internal winId
let chatWindowId = message.data.locationHash.slice(1);
var context = this.conversationContexts.get(chatWindowId);
var peerConnectionID = message.data.peerConnectionID;
var exists = peerConnectionID.match(/session=(\S+)/);
if (context && !exists) {
// Not ideal but insert our data amidst existing data like this:
// - 000 (id=00 url=http)
// + 000 (session=000 call=000 id=00 url=http)
var pair = peerConnectionID.split("(");
if (pair.length == 2) {
peerConnectionID = pair[0] + "(session=" + context.sessionId +
(context.callId ? " call=" + context.callId : "") + " " + pair[1];
}
}
if (message.data.type == "iceconnectionstatechange") {
switch (message.data.iceConnectionState) {
case "failed":
case "disconnected":
if (Services.telemetry.canRecordExtended) {
this.stageForTelemetryUpload(chatbox.content, message.data);
}
break;
}
}
});
// When a chat window is attached or detached, the docShells hosting
// about:loopconverstation is swapped to the newly created chat window.
// (Be it inside a popup or back inside a chatbox element attached to the
// chatbar.)
// Since a swapDocShells call does not swap the messageManager instances
// attached to a browser, we'll need to add the message listeners to
// the new messageManager. This is not a bug in swapDocShells, merely
// a design decision.
chatbox.content.addEventListener("SwapDocShells", function swapped(ev) {
chatbox.content.removeEventListener("SwapDocShells", swapped);
let otherBrowser = ev.detail;
chatbox = otherBrowser.ownerDocument.getBindingParent(otherBrowser);
mm = otherBrowser.messageManager;
otherBrowser.addEventListener("SwapDocShells", swapped);
for (let name of Object.getOwnPropertyNames(listeners)) {
mm.addMessageListener(name, listeners[name]);
}
});
UITour.notify("Loop:ChatWindowOpened");
resolve(windowId);
};
const kSizeMap = {
LoopChatEnabled: "loopChatEnabled",
LoopChatDisabledMessageAppended: "loopChatDisabledMessageAppended",
LoopChatMessageAppended: "loopChatMessageAppended"
};
let listeners = {};
let messageName = "Social:CustomEvent";
mm.addMessageListener(messageName, listeners[messageName] = message => {
let eventName = message.data.name;
if (kEventNamesMap[eventName]) {
eventName = kEventNamesMap[eventName];
UITour.clearAvailableTargetsCache();
UITour.notify(eventName);
if (eventName == "Loop:ChatWindowDetached" || eventName == "Loop:ChatWindowAttached") {
// After detach, re-attach of the chatbox, refresh its reference so
// we can keep using it here.
let ref = chatbar.chatboxForURL.get(chatbox.src);
chatbox = ref && ref.get() || chatbox;
}
} else {
// When the chat box or messages are shown, resize the panel or window
// to be slightly higher to accomodate them.
let customSize = kSizeMap[eventName];
let currSize = chatbox.getAttribute("customSize");
// If the size is already at the requested one or at the maximum size
// already, don't do anything. Especially don't make it shrink.
if (customSize && currSize != customSize && currSize != "loopChatMessageAppended") {
chatbox.setAttribute("customSize", customSize);
chatbox.parentNode.setAttribute("customSize", customSize);
}
}
});
// Handle window.close correctly on the chatbox.
hookWindowCloseForPanelClose(chatbox.content);
messageName = "DOMWindowClose";
mm.addMessageListener(messageName, listeners[messageName] = () => {
// Remove message listeners.
for (let name of Object.getOwnPropertyNames(listeners)) {
mm.removeMessageListener(name, listeners[name]);
}
listeners = {};
windowCloseCallback();
if (conversationWindowData.type == "room") {
// NOTE: if you add something here, please also consider if something
// needs to be done on the content side as well (e.g.
// activeRoomStore#windowUnload).
LoopAPI.sendMessageToHandler({
name: "HangupNow",
data: [conversationWindowData.roomToken, windowId]
});
}
});
mm.sendAsyncMessage("Loop:MonitorPeerConnectionLifecycle");
messageName = "Loop:PeerConnectionLifecycleChange";
mm.addMessageListener(messageName, listeners[messageName] = message => {
// Chat Window Id, this is different that the internal winId
let chatWindowId = message.data.locationHash.slice(1);
var context = this.conversationContexts.get(chatWindowId);
var peerConnectionID = message.data.peerConnectionID;
var exists = peerConnectionID.match(/session=(\S+)/);
if (context && !exists) {
// Not ideal but insert our data amidst existing data like this:
// - 000 (id=00 url=http)
// + 000 (session=000 call=000 id=00 url=http)
var pair = peerConnectionID.split("(");
if (pair.length == 2) {
peerConnectionID = pair[0] + "(session=" + context.sessionId +
(context.callId ? " call=" + context.callId : "") + " " + pair[1];
}
}
if (message.data.type == "iceconnectionstatechange") {
switch (message.data.iceConnectionState) {
case "failed":
case "disconnected":
if (Services.telemetry.canRecordExtended) {
this.stageForTelemetryUpload(chatbox.content, message.data);
}
break;
}
}
});
UITour.notify("Loop:ChatWindowOpened");
mm.sendAsyncMessage("WaitForDOMContentLoaded");
mm.addMessageListener("DOMContentLoaded", loaded);
};
mm.sendAsyncMessage("WaitForDOMContentLoaded");
mm.addMessageListener("DOMContentLoaded", loaded);
};
LoopAPI.initialize();
let chatboxInstance = Chat.open(null, {
origin: origin,
title: "",
url: url,
remote: MozLoopService.getLoopPref("remote.autostart")
}, callback);
if (!chatboxInstance) {
return null;
// It's common for unit tests to overload Chat.open.
} else if (chatboxInstance.setAttribute) {
// Set properties that influence visual appearance of the chatbox right
// away to circumvent glitches.
chatboxInstance.setAttribute("customSize", "loopDefault");
chatboxInstance.parentNode.setAttribute("customSize", "loopDefault");
Chat.loadButtonSet(chatboxInstance, "minimize,swap," + kChatboxHangupButton.id);
}
return windowId;
LoopAPI.initialize();
let chatboxInstance = Chat.open(null, {
origin: origin,
title: "",
url: url,
remote: MozLoopService.getLoopPref("remote.autostart")
}, callback);
if (!chatboxInstance) {
resolve(null);
// It's common for unit tests to overload Chat.open.
} else if (chatboxInstance.setAttribute) {
// Set properties that influence visual appearance of the chatbox right
// away to circumvent glitches.
chatboxInstance.setAttribute("customSize", "loopDefault");
chatboxInstance.parentNode.setAttribute("customSize", "loopDefault");
Chat.loadButtonSet(chatboxInstance, "minimize,swap," + kChatboxHangupButton.id);
resolve(windowId);
}
});
},
/**
@ -1247,14 +1293,18 @@ this.MozLoopService = {
*
* Note: this returns a promise for unit test purposes.
*
* @param {String} addonVersion The name of the add-on
*
* @return {Promise}
*/
initialize: Task.async(function*() {
initialize: Task.async(function*(addonVersion) {
// Ensure we don't setup things like listeners more than once.
if (gServiceInitialized) {
return Promise.resolve();
}
gAddonVersion = addonVersion;
gServiceInitialized = true;
// Do this here, rather than immediately after definition, so that we can
@ -1605,6 +1655,19 @@ this.MozLoopService = {
}
},
/*
* Returns current FTU version
*
* @return {Number}
*
* XXX must match number in panel.jsx; expose this via MozLoopAPI
* and kill that constant.
*/
get FTU_VERSION()
{
return 2;
},
/**
* Set any preference under "loop.".
*
@ -1868,20 +1931,65 @@ this.MozLoopService = {
/**
* Opens the Getting Started tour in the browser.
*
* @param {String} [aSrc] A string representing the entry point to begin the tour, optional.
*/
openGettingStartedTour: Task.async(function(aSrc = null) {
try {
let url = this.getTourURL(aSrc);
let win = Services.wm.getMostRecentWindow("navigator:browser");
win.switchToTabHavingURI(url, true, {
ignoreFragment: true,
replaceQueryString: true
});
} catch (ex) {
log.error("Error opening Getting Started tour", ex);
openGettingStartedTour: Task.async(function() {
const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
// User will have _just_ clicked the tour menu item or the FTU
// button in the panel, (or else it wouldn't be visible), so...
let xulWin = Services.wm.getMostRecentWindow("navigator:browser");
let xulDoc = xulWin.document;
let box = xulDoc.createElementNS(kNSXUL, "box");
box.setAttribute("id", "loop-slideshow-container");
let appContent = xulDoc.getElementById("appcontent");
let tabBrowser = xulDoc.getElementById("content");
appContent.insertBefore(box, tabBrowser);
var xulBrowser = xulDoc.createElementNS(kNSXUL, "browser");
xulBrowser.setAttribute("id", "loop-slideshow-browser");
xulBrowser.setAttribute("flex", "1");
xulBrowser.setAttribute("type", "content");
box.appendChild(xulBrowser);
// Notify the UI, which has the side effect of disabling panel opening
// and updating the toolbar icon to visually indicate difference.
xulWin.LoopUI.isSlideshowOpen = true;
var removeSlideshow = function() {
try {
appContent.removeChild(box);
} catch (ex) {
log.error(ex);
}
this.setLoopPref("gettingStarted.latestFTUVersion", this.FTU_VERSION);
// Notify the UI, which has the side effect of re-enabling panel opening
// and updating the toolbar.
xulWin.LoopUI.isSlideshowOpen = false;
xulWin.removeEventListener("CloseSlideshow", removeSlideshow);
log.info("slideshow removed");
}.bind(this);
function xulLoadListener() {
xulBrowser.contentWindow.addEventListener("CloseSlideshow",
removeSlideshow);
log.info("CloseSlideshow handler added");
xulBrowser.removeEventListener("load", xulLoadListener, true);
}
xulBrowser.addEventListener("load", xulLoadListener, true);
// XXX we are loading the slideshow page with chrome privs.
// To make this remote, we'll need to think through a better
// security model.
xulBrowser.setAttribute("src",
"chrome://loop/content/panels/slideshow.html");
}),
/**

View File

@ -28,22 +28,26 @@
<script type="text/javascript" src="shared/js/loopapi-client.js"></script>
<script type="text/javascript" src="shared/js/utils.js"></script>
<script type="text/javascript" src="shared/js/urlRegExps.js"></script>
<script type="text/javascript" src="shared/js/mixins.js"></script>
<script type="text/javascript" src="shared/js/actions.js"></script>
<script type="text/javascript" src="shared/js/validate.js"></script>
<script type="text/javascript" src="shared/js/dispatcher.js"></script>
<script type="text/javascript" src="shared/js/otSdkDriver.js"></script>
<!-- Stores need to be loaded before the views that uses them -->
<script type="text/javascript" src="shared/js/store.js"></script>
<script type="text/javascript" src="panels/js/roomStore.js"></script>
<script type="text/javascript" src="shared/js/activeRoomStore.js"></script>
<script type="text/javascript" src="shared/js/views.js"></script>
<script type="text/javascript" src="panels/js/conversationAppStore.js"></script>
<script type="text/javascript" src="shared/js/textChatStore.js"></script>
<script type="text/javascript" src="shared/js/remoteCursorStore.js"></script>
<!-- Views -->
<script type="text/javascript" src="shared/js/views.js"></script>
<script type="text/javascript" src="shared/js/textChatView.js"></script>
<script type="text/javascript" src="shared/js/linkifiedTextView.js"></script>
<script type="text/javascript" src="shared/js/urlRegExps.js"></script>
<script type="text/javascript" src="panels/js/conversationAppStore.js"></script>
<script type="text/javascript" src="panels/js/feedbackViews.js"></script>
<script type="text/javascript" src="panels/js/roomStore.js"></script>
<script type="text/javascript" src="shared/js/remoteCursorStore.js"></script>
<script type="text/javascript" src="panels/js/roomViews.js"></script>
<script type="text/javascript" src="panels/js/conversation.js"></script>
</body>

View File

@ -0,0 +1,97 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
.slideshow {
-moz-user-select: none;
cursor: default;
}
/* slide content */
.slide > div {
height: 100%;
width: 100%;
}
.slide-layout {
padding-top: 50px;
padding-left: 50px;
padding-bottom: 20px;
width: 600px;
}
.slide-layout > h2 {
font-family: sans-serif;
font-size: 3.0rem;
font-weight: 500;
white-space: normal;
color: #fff;
line-height: 3rem;
margin-bottom: 10px;
}
.slide-layout > .slide-text {
font-family: sans-serif;
font-size: 2.1rem;
font-weight: 300;
white-space: normal;
color: #fff;
line-height: 3.0rem;
}
.slide-layout > img {
display: block;
-moz-box-sizing: border-box;
box-sizing: border-box;
border: none;
background-color: transparent;
background-repeat: no-repeat;
background-position: center;
padding: 0;
float: right;
margin-top: -20px;
}
.slide1 {
background: #06a6e0;
}
.slide1-image {
background-image: url(../../shared/img/firefox-hello_tour-slide-01.svg);
height: 260px;
width: 295px;
background-size: 310px 310px;
}
.slide2 {
background: #0183b2;
}
.slide2-image {
background-image: url(../../shared/img/firefox-hello_tour-slide-02.svg);
height: 245px;
width: 245px;
background-size: 320px 320px;
}
.slide3 {
background: #005da5;
}
.slide3-image {
background-image: url(../../shared/img/firefox-hello_tour-slide-03.svg);
height: 260px;
width: 260px;
background-size: 310px 310px;
}
.slide4 {
background: #7ec24c;
}
.slide4-image {
background-image: url(../../shared/img/firefox-hello_tour-slide-04.svg);
height: 240px;
width: 240px;
background-size: 320px 320px;
}

View File

@ -24,10 +24,19 @@ loop.conversation = function (mozL10n) {
mixins: [Backbone.Events, loop.store.StoreMixin("conversationAppStore"), sharedMixins.DocumentTitleMixin, sharedMixins.WindowCloseMixin],
propTypes: {
cursorStore: React.PropTypes.instanceOf(loop.store.RemoteCursorStore).isRequired,
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired,
roomStore: React.PropTypes.instanceOf(loop.store.RoomStore)
},
componentWillMount: function () {
this.listenTo(this.props.cursorStore, "change:remoteCursorPosition", this._onRemoteCursorChange);
},
_onRemoteCursorChange: function () {
return loop.request("AddRemoteCursorOverlay", this.props.cursorStore.getStoreState("remoteCursorPosition"));
},
getInitialState: function () {
return this.getStoreState();
},
@ -66,6 +75,7 @@ loop.conversation = function (mozL10n) {
{
return React.createElement(DesktopRoomConversationView, {
chatWindowDetached: this.state.chatWindowDetached,
cursorStore: this.props.cursorStore,
dispatcher: this.props.dispatcher,
facebookEnabled: this.state.facebookEnabled,
onCallTerminated: this.handleCallTerminated,
@ -188,6 +198,7 @@ loop.conversation = function (mozL10n) {
});
React.render(React.createElement(AppControllerView, {
cursorStore: remoteCursorStore,
dispatcher: dispatcher,
roomStore: roomStore }), document.querySelector("#main"));
@ -198,6 +209,8 @@ loop.conversation = function (mozL10n) {
dispatcher.dispatch(new sharedActions.GetWindowData({
windowId: windowId
}));
loop.request("TelemetryAddValue", "LOOP_MAU", constants.LOOP_MAU_TYPE.OPEN_CONVERSATION);
});
}

View File

@ -12,7 +12,9 @@ loop.panel = function (_, mozL10n) {
var sharedActions = loop.shared.actions;
var Button = sharedViews.Button;
var FTU_VERSION = 1;
// XXX This must be kept in sync with the number in MozLoopService.jsm.
// We should expose that one through MozLoopAPI and kill this constant.
var FTU_VERSION = 2;
var GettingStartedView = React.createClass({
displayName: "GettingStartedView",
@ -20,10 +22,7 @@ loop.panel = function (_, mozL10n) {
mixins: [sharedMixins.WindowCloseMixin],
handleButtonClick: function () {
loop.requestMulti(["OpenGettingStartedTour", "getting-started"], ["SetLoopPref", "gettingStarted.latestFTUVersion", FTU_VERSION]).then(function () {
var event = new CustomEvent("GettingStartedSeen");
window.dispatchEvent(event);
}.bind(this));
loop.request("OpenGettingStartedTour");
this.closeWindow();
},
@ -292,7 +291,7 @@ loop.panel = function (_, mozL10n) {
},
openGettingStartedTour: function () {
loop.request("OpenGettingStartedTour", "settings-menu");
loop.request("OpenGettingStartedTour");
this.closeWindow();
},
@ -907,7 +906,6 @@ loop.panel = function (_, mozL10n) {
propTypes: {
onClick: React.PropTypes.func.isRequired
},
componentWillMount: function () {
loop.request("SetPanelHeight", 262);
},
@ -1003,26 +1001,32 @@ loop.panel = function (_, mozL10n) {
},
_onStatusChanged: function () {
loop.requestMulti(["GetUserProfile"], ["GetHasEncryptionKey"]).then(function (results) {
loop.requestMulti(["GetUserProfile"], ["GetHasEncryptionKey"], ["GetLoopPref", "gettingStarted.latestFTUVersion"]).then(function (results) {
var profile = results[0];
var hasEncryptionKey = results[1];
var prefFTUVersion = results[2];
var stateToUpdate = {};
// It's possible that this state change was slideshow related
// so update that if the pref has changed.
var prefGettingStartedSeen = prefFTUVersion >= FTU_VERSION;
if (prefGettingStartedSeen !== this.state.gettingStartedSeen) {
stateToUpdate.gettingStartedSeen = prefGettingStartedSeen;
}
var currUid = this.state.userProfile ? this.state.userProfile.uid : null;
var newUid = profile ? profile.uid : null;
if (currUid === newUid) {
// Update the state of hasEncryptionKey as this might have changed now.
this.setState({ hasEncryptionKey: hasEncryptionKey });
stateToUpdate.hasEncryptionKey = hasEncryptionKey;
} else {
this.setState({ userProfile: profile });
stateToUpdate.userProfile = profile;
}
this.updateServiceErrors();
}.bind(this));
},
_gettingStartedSeen: function () {
loop.request("GetLoopPref", "gettingStarted.latestFTUVersion").then(function (result) {
this.setState({
gettingStartedSeen: result >= FTU_VERSION
});
this.setState(stateToUpdate);
this.updateServiceErrors();
}.bind(this));
},
@ -1032,12 +1036,10 @@ loop.panel = function (_, mozL10n) {
componentDidMount: function () {
loop.subscribe("LoopStatusChanged", this._onStatusChanged);
window.addEventListener("GettingStartedSeen", this._gettingStartedSeen);
},
componentWillUnmount: function () {
loop.unsubscribe("LoopStatusChanged", this._onStatusChanged);
window.removeEventListener("GettingStartedSeen", this._gettingStartedSeen);
},
handleContextMenu: function (e) {

View File

@ -322,7 +322,10 @@ loop.store = loop.store || {};
console.error("No URL sharing type bucket found for '" + from + "'");
return;
}
loop.request("TelemetryAddValue", "LOOP_SHARING_ROOM_URL", bucket);
loop.requestMulti(
["TelemetryAddValue", "LOOP_SHARING_ROOM_URL", bucket],
["TelemetryAddValue", "LOOP_MAU", this._constants.LOOP_MAU_TYPE.ROOM_SHARE]
);
},
/**
@ -335,14 +338,18 @@ loop.store = loop.store || {};
loop.shared.utils.composeCallUrlEmail(actionData.roomUrl, null,
actionData.roomDescription);
var bucket = this._constants.SHARING_ROOM_URL["EMAIL_FROM_" + (from || "").toUpperCase()];
var bucket = this._constants.SHARING_ROOM_URL[
"EMAIL_FROM_" + (from || "").toUpperCase()
];
if (typeof bucket === "undefined") {
console.error("No URL sharing type bucket found for '" + from + "'");
return;
}
loop.requestMulti(
["NotifyUITour", "Loop:RoomURLEmailed"],
["TelemetryAddValue", "LOOP_SHARING_ROOM_URL", bucket]);
["TelemetryAddValue", "LOOP_SHARING_ROOM_URL", bucket],
["TelemetryAddValue", "LOOP_MAU", this._constants.LOOP_MAU_TYPE.ROOM_SHARE]
);
},
/**
@ -352,12 +359,25 @@ loop.store = loop.store || {};
*/
facebookShareRoomUrl: function(actionData) {
var encodedRoom = encodeURIComponent(actionData.roomUrl);
loop.request("GetLoopPref", "facebook.shareUrl")
.then(shareUrl => {
loop.request("OpenURL", shareUrl.replace("%ROOM_URL%", encodedRoom));
}).then(() => {
loop.request("NotifyUITour", "Loop:RoomURLShared");
});
loop.requestMulti(
["GetLoopPref", "facebook.appId"],
["GetLoopPref", "facebook.fallbackUrl"],
["GetLoopPref", "facebook.shareUrl"]
).then(results => {
var app_id = results[0];
var fallback_url = results[1];
var redirect_url = encodeURIComponent(actionData.originUrl ||
fallback_url);
var finalURL = results[2].replace("%ROOM_URL%", encodedRoom)
.replace("%APP_ID%", app_id)
.replace("%REDIRECT_URI%", redirect_url);
return loop.request("OpenURL", finalURL);
}).then(() => {
loop.request("NotifyUITour", "Loop:RoomURLShared");
});
var from = actionData.from;
var bucket = this._constants.SHARING_ROOM_URL["FACEBOOK_FROM_" + from.toUpperCase()];
@ -365,7 +385,10 @@ loop.store = loop.store || {};
console.error("No URL sharing type bucket found for '" + from + "'");
return;
}
loop.request("TelemetryAddValue", "LOOP_SHARING_ROOM_URL", bucket);
loop.requestMulti(
["TelemetryAddValue", "LOOP_SHARING_ROOM_URL", bucket],
["TelemetryAddValue", "LOOP_MAU", this._constants.LOOP_MAU_TYPE.ROOM_SHARE]
);
},
/**
@ -419,8 +442,11 @@ loop.store = loop.store || {};
this.dispatchAction(new sharedActions.DeleteRoomError({ error: result }));
}
var buckets = this._constants.ROOM_DELETE;
loop.request("TelemetryAddValue", "LOOP_ROOM_DELETE", buckets[isError ?
"DELETE_FAIL" : "DELETE_SUCCESS"]);
loop.requestMulti(
["TelemetryAddValue", "LOOP_ROOM_DELETE", buckets[isError ?
"DELETE_FAIL" : "DELETE_SUCCESS"]],
["TelemetryAddValue", "LOOP_MAU", this._constants.LOOP_MAU_TYPE.ROOM_DELETE]
);
}.bind(this));
},
@ -483,7 +509,10 @@ loop.store = loop.store || {};
* @param {sharedActions.OpenRoom} actionData The action data.
*/
openRoom: function(actionData) {
loop.request("Rooms:Open", actionData.roomToken);
loop.requestMulti(
["Rooms:Open", actionData.roomToken],
["TelemetryAddValue", "LOOP_MAU", this._constants.LOOP_MAU_TYPE.ROOM_OPEN]
);
},
/**

View File

@ -246,7 +246,7 @@ loop.roomViews = function (mozL10n) {
displayName: "DesktopRoomInvitationView",
statics: {
TRIGGERED_RESET_DELAY: 2000
TRIGGERED_RESET_DELAY: 3000
},
mixins: [sharedMixins.DropdownMenuMixin(".room-invitation-overlay")],
@ -324,6 +324,7 @@ loop.roomViews = function (mozL10n) {
}
var cx = classNames;
return React.createElement(
"div",
{ className: "room-invitation-overlay" },
@ -331,18 +332,43 @@ loop.roomViews = function (mozL10n) {
"div",
{ className: "room-invitation-content" },
React.createElement(
"p",
"div",
{ className: "room-context-header" },
mozL10n.get("invite_header_text_bold2")
),
React.createElement(
"div",
null,
mozL10n.get("invite_header_text4")
)
),
React.createElement(
"div",
{ className: "input-button-group" },
React.createElement(
"div",
{ className: "input-button-group-label" },
mozL10n.get("invite_your_link")
),
React.createElement(
"div",
{ className: "input-button-content" },
React.createElement(
"span",
{ className: "room-context-header" },
mozL10n.get("invite_header_text_bold")
"div",
{ className: "input-group group-item-top" },
React.createElement("input", { readOnly: true, type: "text", value: this.props.roomData.roomUrl })
),
" ",
React.createElement(
"span",
null,
mozL10n.get("invite_header_text3")
"div",
{ className: cx({
"group-item-bottom": true,
"btn": true,
"invite-button": true,
"btn-copy": true,
"triggered": this.state.copiedUrl
}),
onClick: this.handleCopyButtonClick },
mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")
)
)
),
@ -350,23 +376,8 @@ loop.roomViews = function (mozL10n) {
"div",
{ className: cx({
"btn-group": true,
"call-action-group": true
"share-action-group": true
}) },
React.createElement(
"div",
{ className: cx({
"btn-copy": true,
"invite-button": true,
"triggered": this.state.copiedUrl
}),
onClick: this.handleCopyButtonClick },
React.createElement("img", { src: "shared/img/glyph-link-16x16.svg" }),
React.createElement(
"p",
null,
mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")
)
),
React.createElement(
"div",
{ className: "btn-email invite-button",
@ -374,7 +385,7 @@ loop.roomViews = function (mozL10n) {
onMouseOver: this.resetTriggeredButtons },
React.createElement("img", { src: "shared/img/glyph-email-16x16.svg" }),
React.createElement(
"p",
"div",
null,
mozL10n.get("invite_email_link_button")
)
@ -388,7 +399,7 @@ loop.roomViews = function (mozL10n) {
onMouseOver: this.resetTriggeredButtons },
React.createElement("img", { src: "shared/img/glyph-facebook-16x16.svg" }),
React.createElement(
"p",
"div",
null,
mozL10n.get("invite_facebook_button3")
)
@ -416,6 +427,7 @@ loop.roomViews = function (mozL10n) {
propTypes: {
chatWindowDetached: React.PropTypes.bool.isRequired,
cursorStore: React.PropTypes.instanceOf(loop.store.RemoteCursorStore).isRequired,
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired,
facebookEnabled: React.PropTypes.bool.isRequired,
// The poster URLs are for UI-showcase testing and development.
@ -454,19 +466,6 @@ loop.roomViews = function (mozL10n) {
}
},
/**
* Used to control publishing a stream - i.e. to mute a stream
*
* @param {String} type The type of stream, e.g. "audio" or "video".
* @param {Boolean} enabled True to enable the stream, false otherwise.
*/
publishStream: function (type, enabled) {
this.props.dispatcher.dispatch(new sharedActions.SetMute({
type: type,
enabled: enabled
}));
},
/**
* Determine if the invitation controls should be shown.
*
@ -596,6 +595,7 @@ loop.roomViews = function (mozL10n) {
React.createElement(
sharedViews.MediaLayoutView,
{
cursorStore: this.props.cursorStore,
dispatcher: this.props.dispatcher,
displayScreenShare: false,
isLocalLoading: this._isLocalLoading(),
@ -616,7 +616,6 @@ loop.roomViews = function (mozL10n) {
audio: { enabled: !this.state.audioMuted, visible: true },
dispatcher: this.props.dispatcher,
hangup: this.leaveRoom,
publishStream: this.publishStream,
showHangup: this.props.chatWindowDetached,
video: { enabled: !this.state.videoMuted, visible: true } }),
React.createElement(DesktopRoomInvitationView, {

View File

@ -0,0 +1,81 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
var loop = loop || {};
loop.slideshow = function (mozL10n) {
"use strict";
/**
* Slideshow initialisation.
*/
function init() {
var requests = [["GetAllStrings"], ["GetLocale"], ["GetPluralRule"]];
return loop.requestMulti.apply(null, requests).then(function (results) {
// `requestIdx` is keyed off the order of the `requests`
// array. Be careful to update both when making changes.
var requestIdx = 0;
// Do the initial L10n setup, we do this before anything
// else to ensure the L10n environment is setup correctly.
var stringBundle = results[requestIdx];
var locale = results[++requestIdx];
var pluralRule = results[++requestIdx];
mozL10n.initialize({
locale: locale,
pluralRule: pluralRule,
getStrings: function (key) {
if (!(key in stringBundle)) {
return "{ textContent: '' }";
}
return JSON.stringify({
textContent: stringBundle[key]
});
}
});
document.documentElement.setAttribute("lang", mozL10n.language.code);
document.documentElement.setAttribute("dir", mozL10n.language.direction);
document.body.setAttribute("platform", loop.shared.utils.getPlatform());
var clientSuperShortname = mozL10n.get("clientSuperShortname");
var data = [{
id: "slide1",
imageClass: "slide1-image",
title: mozL10n.get("fte_slide_1_title"),
text: mozL10n.get("fte_slide_1_copy", {
clientShortname2: mozL10n.get("clientShortname2")
})
}, {
id: "slide2",
imageClass: "slide2-image",
title: mozL10n.get("fte_slide_2_title"),
text: mozL10n.get("fte_slide_2_copy")
}, {
id: "slide3",
imageClass: "slide3-image",
title: mozL10n.get("fte_slide_3_title"),
text: mozL10n.get("fte_slide_3_copy", {
clientSuperShortname: clientSuperShortname
})
}, {
id: "slide4",
imageClass: "slide4-image",
title: mozL10n.get("fte_slide_4_title", {
clientSuperShortname: clientSuperShortname
}),
text: mozL10n.get("fte_slide_4_copy", {
brandShortname: mozL10n.get("brandShortname")
})
}];
loop.SimpleSlideshow.init("#main", data);
});
}
return {
init: init
};
}(document.mozL10n);
document.addEventListener("DOMContentLoaded", loop.slideshow.init);

View File

@ -24,14 +24,18 @@
<script type="text/javascript" src="shared/js/utils.js"></script>
<script type="text/javascript" src="shared/js/models.js"></script>
<script type="text/javascript" src="shared/js/mixins.js"></script>
<script type="text/javascript" src="shared/js/store.js"></script>
<script type="text/javascript" src="shared/js/activeRoomStore.js"></script>
<script type="text/javascript" src="shared/js/remoteCursorStore.js"></script>
<script type="text/javascript" src="shared/js/views.js"></script>
<script type="text/javascript" src="shared/js/validate.js"></script>
<script type="text/javascript" src="shared/js/actions.js"></script>
<script type="text/javascript" src="shared/js/dispatcher.js"></script>
<!-- Stores need to be loaded before the views that uses them -->
<script type="text/javascript" src="shared/js/store.js"></script>
<script type="text/javascript" src="panels/js/roomStore.js"></script>
<script type="text/javascript" src="shared/js/activeRoomStore.js"></script>
<script type="text/javascript" src="shared/js/remoteCursorStore.js"></script>
<!-- Views -->
<script type="text/javascript" src="shared/js/views.js"></script>
<script type="text/javascript" src="shared/js/validate.js"></script>
<script type="text/javascript" src="panels/js/panel.js"></script>
</body>
</html>

View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<html>
<head>
<meta charset="utf-8">
<base href="chrome://loop/content">
<link rel="stylesheet" type="text/css" href="shared/css/reset.css">
<link rel="stylesheet" type="text/css" href="shared/css/common.css">
<link rel="stylesheet" type="text/css" href="panels/vendor/simpleSlideshow.css">
<link rel="stylesheet" type="text/css" href="panels/css/slideshow.css">
</head>
<body class="panel">
<div id="main"></div>
<script type="text/javascript" src="panels/vendor/l10n.js"></script>
<script type="text/javascript" src="shared/vendor/react.js"></script>
<script type="text/javascript" src="shared/vendor/lodash.js"></script>
<script type="text/javascript" src="shared/js/utils.js"></script>
<script type="text/javascript" src="shared/js/loopapi-client.js"></script>
<script type="text/javascript" src="shared/vendor/classnames.js"></script>
<script type="text/javascript" src="panels/vendor/simpleSlideshow.js"></script>
<script type="text/javascript" src="panels/js/slideshow.js"></script>
<script type="text/javascript">
function clickHandler() {
try {
var e = new CustomEvent("CloseSlideshow"); window.dispatchEvent(e);
} catch (ex) {
console.warn('CloseSlideshow dispatch exploded' + ex);
}
return;
}
</script>
<button onclick="clickHandler();" class="button-close" />
</body>
</html>

View File

@ -9,13 +9,14 @@ describe("loop.conversation", function() {
var expect = chai.expect;
var TestUtils = React.addons.TestUtils;
var sharedActions = loop.shared.actions;
var fakeWindow, sandbox, setLoopPrefStub, mozL10nGet, remoteCursorStore, dispatcher;
var fakeWindow, sandbox, setLoopPrefStub, mozL10nGet,
remoteCursorStore, dispatcher, requestStubs;
beforeEach(function() {
sandbox = LoopMochaUtils.createSandbox();
setLoopPrefStub = sandbox.stub();
LoopMochaUtils.stubLoopRequest({
LoopMochaUtils.stubLoopRequest(requestStubs = {
GetDoNotDisturb: function() { return true; },
GetAllStrings: function() {
return JSON.stringify({ textContent: "fakeText" });
@ -38,6 +39,13 @@ describe("loop.conversation", function() {
LOOP_SESSION_TYPE: {
GUEST: 1,
FXA: 2
},
LOOP_MAU_TYPE: {
OPEN_PANEL: 0,
OPEN_CONVERSATION: 1,
ROOM_OPEN: 2,
ROOM_SHARE: 3,
ROOM_DELETE: 4
}
};
},
@ -57,7 +65,8 @@ describe("loop.conversation", function() {
},
GetConversationWindowData: function() {
return {};
}
},
TelemetryAddValue: sinon.stub()
});
fakeWindow = {
@ -144,18 +153,30 @@ describe("loop.conversation", function() {
windowId: "42"
}));
});
it("should log a telemetry event when opening the conversation window", function() {
var constants = requestStubs.GetAllConstants();
loop.conversation.init();
sinon.assert.calledOnce(requestStubs["TelemetryAddValue"]);
sinon.assert.calledWithExactly(requestStubs["TelemetryAddValue"],
"LOOP_MAU", constants.LOOP_MAU_TYPE.OPEN_CONVERSATION);
});
});
describe("AppControllerView", function() {
var activeRoomStore, ccView;
var conversationAppStore, roomStore, feedbackPeriodMs = 15770000000;
var activeRoomStore, ccView, addRemoteCursorStub;
var conversationAppStore,
roomStore,
feedbackPeriodMs = 15770000000;
var ROOM_STATES = loop.store.ROOM_STATES;
function mountTestComponent() {
return TestUtils.renderIntoDocument(
React.createElement(loop.conversation.AppControllerView, {
roomStore: roomStore,
dispatcher: dispatcher
cursorStore: remoteCursorStore,
dispatcher: dispatcher,
roomStore: roomStore
}));
}
@ -168,6 +189,9 @@ describe("loop.conversation", function() {
activeRoomStore: activeRoomStore,
constants: {}
});
remoteCursorStore = new loop.store.RemoteCursorStore(dispatcher, {
sdkDriver: {}
});
conversationAppStore = new loop.store.ConversationAppStore({
activeRoomStore: activeRoomStore,
dispatcher: dispatcher,
@ -179,12 +203,43 @@ describe("loop.conversation", function() {
loop.store.StoreMixin.register({
conversationAppStore: conversationAppStore
});
addRemoteCursorStub = sandbox.stub();
LoopMochaUtils.stubLoopRequest({
AddRemoteCursorOverlay: addRemoteCursorStub
});
});
afterEach(function() {
ccView = undefined;
});
it("should request AddRemoteCursorOverlay when cursor position changes", function() {
mountTestComponent();
remoteCursorStore.setStoreState({
"remoteCursorPosition": {
"ratioX": 10,
"ratioY": 10
}
});
sinon.assert.calledOnce(addRemoteCursorStub);
});
it("should NOT request AddRemoteCursorOverlay when cursor position DOES NOT changes", function() {
mountTestComponent();
remoteCursorStore.setStoreState({
"realVideoSize": {
"height": 400,
"width": 600
}
});
sinon.assert.notCalled(addRemoteCursorStub);
});
it("should display the RoomView for rooms", function() {
conversationAppStore.setStoreState({ windowType: "room" });
activeRoomStore.setStoreState({ roomState: ROOM_STATES.READY });

View File

@ -49,18 +49,22 @@
<script src="/add-on/shared/js/validate.js"></script>
<script src="/add-on/shared/js/dispatcher.js"></script>
<script src="/add-on/shared/js/otSdkDriver.js"></script>
<!-- Stores need to be loaded before the views that uses them -->
<script src="/add-on/shared/js/store.js"></script>
<script src="/add-on/shared/js/activeRoomStore.js"></script>
<script src="/add-on/shared/js/views.js"></script>
<script src="/add-on/shared/js/textChatStore.js"></script>
<script src="/add-on/shared/js/textChatView.js"></script>
<script src="/add-on/panels/js/conversationAppStore.js"></script>
<script src="/add-on/panels/js/roomStore.js"></script>
<script src="/add-on/shared/js/activeRoomStore.js"></script>
<script src="/add-on/panels/js/conversationAppStore.js"></script>
<script src="/add-on/shared/js/textChatStore.js"></script>
<script src="/add-on/shared/js/remoteCursorStore.js"></script>
<!-- Views -->
<script src="/add-on/shared/js/views.js"></script>
<script src="/add-on/shared/js/textChatView.js"></script>
<script src="/add-on/panels/js/roomViews.js"></script>
<script src="/add-on/panels/js/feedbackViews.js"></script>
<script src="/add-on/panels/js/conversation.js"></script>
<script src="/add-on/panels/js/panel.js"></script>
<script src="/add-on/shared/js/remoteCursorStore.js"></script>
<!-- Test scripts -->
<script src="conversationAppStore_test.js"></script>

View File

@ -85,7 +85,7 @@ describe("loop.panel", function() {
GetHasEncryptionKey: true,
GetUserProfile: null,
GetDoNotDisturb: false,
"GetLoopPref|gettingStarted.latestFTUVersion": 1,
"GetLoopPref|gettingStarted.latestFTUVersion": 2,
"GetLoopPref|legal.ToS_url": "",
"GetLoopPref|legal.privacy_url": "",
"GetLoopPref|remote.autostart": false,

View File

@ -43,10 +43,18 @@ describe("loop.store.RoomStore", function() {
ROOM_DELETE: {
DELETE_SUCCESS: 0,
DELETE_FAIL: 1
},
LOOP_MAU_TYPE: {
OPEN_PANEL: 0,
OPEN_CONVERSATION: 1,
ROOM_OPEN: 2,
ROOM_SHARE: 3,
ROOM_DELETE: 4
}
};
},
CopyString: sinon.stub(),
ComposeEmail: sinon.stub(),
GetLoopPref: function(prefName) {
if (prefName === "debug.dispatcher") {
return false;
@ -60,6 +68,7 @@ describe("loop.store.RoomStore", function() {
"Rooms:Open": sinon.stub(),
"Rooms:Rename": sinon.stub(),
"Rooms:PushSubscription": sinon.stub(),
"SetLoopPref": sinon.stub(),
TelemetryAddValue: sinon.stub()
});
@ -433,8 +442,8 @@ describe("loop.store.RoomStore", function() {
roomToken: fakeRoomToken
}));
sinon.assert.calledOnce(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue,
sinon.assert.calledTwice(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue.getCall(0),
"LOOP_ROOM_DELETE", 0);
});
@ -447,8 +456,8 @@ describe("loop.store.RoomStore", function() {
roomToken: fakeRoomToken
}));
sinon.assert.calledOnce(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue,
sinon.assert.calledTwice(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue.getCall(0),
"LOOP_ROOM_DELETE", 1);
});
});
@ -470,8 +479,8 @@ describe("loop.store.RoomStore", function() {
from: "panel"
}));
sinon.assert.calledOnce(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue,
sinon.assert.calledTwice(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue.getCall(0),
"LOOP_SHARING_ROOM_URL", 0);
});
@ -481,8 +490,8 @@ describe("loop.store.RoomStore", function() {
from: "conversation"
}));
sinon.assert.calledOnce(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue,
sinon.assert.calledTwice(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue.getCall(0),
"LOOP_SHARING_ROOM_URL", 1);
});
});
@ -520,26 +529,53 @@ describe("loop.store.RoomStore", function() {
describe("#facebookShareRoomUrl", function() {
var getLoopPrefStub;
var sharingSite = "www.sharing-site.com",
shareURL = sharingSite +
"?app_id=%APP_ID%" +
"&link=%ROOM_URL%" +
"&redirect_uri=%REDIRECT_URI%",
appId = "1234567890",
fallback = "www.fallback.com";
beforeEach(function() {
getLoopPrefStub = function() {
return "https://shared.site/?u=%ROOM_URL%";
};
getLoopPrefStub = sinon.stub();
getLoopPrefStub.withArgs("facebook.appId").returns(appId);
getLoopPrefStub.withArgs("facebook.shareUrl").returns(shareURL);
getLoopPrefStub.withArgs("facebook.fallbackUrl").returns(fallback);
LoopMochaUtils.stubLoopRequest({
GetLoopPref: getLoopPrefStub
});
});
it("should open the facebook url with room URL", function() {
it("should open the facebook share url with correct room and redirection", function() {
var room = "invalid.room",
origin = "origin.url";
store.facebookShareRoomUrl(new sharedActions.FacebookShareRoomUrl({
from: "conversation",
roomUrl: "http://invalid"
originUrl: origin,
roomUrl: room
}));
sinon.assert.calledOnce(requestStubs.OpenURL);
sinon.assert.calledWithExactly(requestStubs.OpenURL, "https://shared.site/?u=http%3A%2F%2Finvalid");
sinon.assert.calledWithMatch(requestStubs.OpenURL, sharingSite);
sinon.assert.calledWithMatch(requestStubs.OpenURL, room);
sinon.assert.calledWithMatch(requestStubs.OpenURL, origin);
});
it("if no origin URL, send fallback URL", function() {
var room = "invalid.room";
store.facebookShareRoomUrl(new sharedActions.FacebookShareRoomUrl({
from: "conversation",
roomUrl: room
}));
sinon.assert.calledOnce(requestStubs.OpenURL);
sinon.assert.calledWithMatch(requestStubs.OpenURL, sharingSite);
sinon.assert.calledWithMatch(requestStubs.OpenURL, room);
sinon.assert.calledWithMatch(requestStubs.OpenURL, fallback);
});
it("should send a telemetry event for facebook share from conversation", function() {
@ -548,8 +584,8 @@ describe("loop.store.RoomStore", function() {
roomUrl: "http://invalid"
}));
sinon.assert.calledOnce(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue,
sinon.assert.calledTwice(requestStubs.TelemetryAddValue);
sinon.assert.calledWithExactly(requestStubs.TelemetryAddValue.getCall(0),
"LOOP_SHARING_ROOM_URL", 4);
});
@ -731,7 +767,9 @@ describe("loop.store.RoomStore", function() {
var store;
beforeEach(function() {
store = new loop.store.RoomStore(dispatcher, { constants: {} });
store = new loop.store.RoomStore(dispatcher, {
constants: requestStubs.GetAllConstants()
});
});
it("should open the room via mozLoop", function() {
@ -881,4 +919,76 @@ describe("loop.store.RoomStore", function() {
expect(store.getStoreState().savingContext).to.eql(false);
});
});
describe("MAU telemetry events", function() {
var getLoopPrefStub, store;
beforeEach(function() {
getLoopPrefStub = function(pref) {
if (pref === "facebook.shareUrl") {
return "https://shared.site/?u=%ROOM_URL%";
}
return 0;
};
LoopMochaUtils.stubLoopRequest({
GetLoopPref: getLoopPrefStub
});
store = new loop.store.RoomStore(dispatcher, {
constants: requestStubs.GetAllConstants()
});
});
it("should log telemetry event when opening a room", function() {
store.openRoom(new sharedActions.OpenRoom({ roomToken: "42abc" }));
sinon.assert.calledOnce(requestStubs["TelemetryAddValue"]);
sinon.assert.calledWithExactly(requestStubs["TelemetryAddValue"],
"LOOP_MAU", store._constants.LOOP_MAU_TYPE.ROOM_OPEN);
});
it("should log telemetry event when sharing a room (copy link)", function() {
store.copyRoomUrl(new sharedActions.CopyRoomUrl({
roomUrl: "http://invalid",
from: "conversation"
}));
sinon.assert.calledTwice(requestStubs["TelemetryAddValue"]);
sinon.assert.calledWithExactly(requestStubs["TelemetryAddValue"].getCall(1),
"LOOP_MAU", store._constants.LOOP_MAU_TYPE.ROOM_SHARE);
});
it("should log telemetry event when sharing a room (email)", function() {
store.emailRoomUrl(new sharedActions.EmailRoomUrl({
roomUrl: "http://invalid",
from: "conversation"
}));
sinon.assert.calledTwice(requestStubs["TelemetryAddValue"]);
sinon.assert.calledWithExactly(requestStubs["TelemetryAddValue"].getCall(1),
"LOOP_MAU", store._constants.LOOP_MAU_TYPE.ROOM_SHARE);
});
it("should log telemetry event when sharing a room (facebook)", function() {
store.facebookShareRoomUrl(new sharedActions.FacebookShareRoomUrl({
roomUrl: "http://invalid",
from: "conversation"
}));
sinon.assert.calledTwice(requestStubs["TelemetryAddValue"]);
sinon.assert.calledWithExactly(requestStubs["TelemetryAddValue"].getCall(1),
"LOOP_MAU", store._constants.LOOP_MAU_TYPE.ROOM_SHARE);
});
it("should log telemetry event when deleting a room", function() {
store.deleteRoom(new sharedActions.DeleteRoom({
roomToken: "42abc"
}));
sinon.assert.calledTwice(requestStubs["TelemetryAddValue"]);
sinon.assert.calledWithExactly(requestStubs["TelemetryAddValue"].getCall(1),
"LOOP_MAU", store._constants.LOOP_MAU_TYPE.ROOM_DELETE);
});
});
});

View File

@ -11,7 +11,12 @@ describe("loop.roomViews", function() {
var ROOM_STATES = loop.store.ROOM_STATES;
var FAILURE_DETAILS = loop.shared.utils.FAILURE_DETAILS;
var sandbox, dispatcher, roomStore, activeRoomStore, view;
var sandbox,
dispatcher,
roomStore,
activeRoomStore,
remoteCursorStore,
view;
var clock, fakeWindow, requestStubs;
var favicon = "data:image/x-icon;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
@ -69,6 +74,9 @@ describe("loop.roomViews", function() {
constants: {},
activeRoomStore: activeRoomStore
});
remoteCursorStore = new loop.store.RemoteCursorStore(dispatcher, {
sdkDriver: {}
});
var textChatStore = new loop.store.TextChatStore(dispatcher, {
sdkDriver: {}
});
@ -352,6 +360,7 @@ describe("loop.roomViews", function() {
function mountTestComponent(props) {
props = _.extend({
chatWindowDetached: false,
cursorStore: remoteCursorStore,
dispatcher: dispatcher,
facebookEnabled: false,
roomStore: roomStore,

View File

@ -0,0 +1,109 @@
/* This is derived from PIOTR F's code,
currently available at https://github.com/piotrf/simple-react-slideshow
Simple React Slideshow Example
Original Author: PIOTR F.
License: MIT
Copyright (c) 2015 Piotr
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
html {
font-size: 10px;
font-family: menu;
color: #fff;
}
body {
background: none;
}
* {
box-sizing: border-box;
padding: 0;
margin: 0;
line-height: 2.4rem; /* or 1.3rem original*/
}
.slides {
display: block;
width: 100%;
height: 390px;
overflow: hidden;
white-space: nowrap;
}
.slide {
display: none;
height: 100%;
width: 100%;
}
.slide.slide--active {
display: block;
}
.control-panel {
height: 60px;
background: #fff;
width: 100%;
}
.toggle {
color: white;
display: block;
padding: 0px;
position: absolute;
bottom: 20px;
background-color: transparent;
background-image: url(../../shared/img/arrow-01.svg);
background-repeat: no-repeat;
background-size: 20px 20px;
border: none;
/*padding: 0;*/
height: 20px;
width: 20px;
}
.toggle-prev {
left: 20px;
transform: scaleX(-1);
}
.toggle-next {
right: 20px;
}
.button-close {
display: block;
position: absolute;
background-color: transparent;
background-image: url(../../shared/img/close-02.svg);
background-repeat: no-repeat;
background-size: 20px 20px;
border: none;
padding: 0;
height: 20px;
width: 20px;
top: 20px;
right: 20px;
}

View File

@ -0,0 +1,217 @@
// This is derived from PIOTR F's code,
// currently available at https://github.com/piotrf/simple-react-slideshow
// Simple React Slideshow Example
//
// Original Author: PIOTR F.
// License: MIT
//
// Copyright (c) 2015 Piotr
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
var loop = loop || {};
loop.SimpleSlideshow = function () {
"use strict";
// App state
var state = {
currentSlide: 0,
data: []
};
// State transitions
var actions = {
toggleNext: function () {
var current = state.currentSlide;
var next = current + 1;
if (next < state.data.length) {
state.currentSlide = next;
}
render();
},
togglePrev: function () {
var current = state.currentSlide;
var prev = current - 1;
if (prev >= 0) {
state.currentSlide = prev;
}
render();
},
toggleSlide: function (id) {
var index = state.data.map(function (el) {
return el.id;
});
var currentIndex = index.indexOf(id);
state.currentSlide = currentIndex;
render();
}
};
var Slideshow = React.createClass({
displayName: "Slideshow",
propTypes: {
data: React.PropTypes.array.isRequired
},
render: function () {
return React.createElement(
"div",
{ className: "slideshow" },
React.createElement(Slides, { data: this.props.data }),
React.createElement(
"div",
{ className: "control-panel" },
React.createElement(Controls, null)
)
);
}
});
var Slides = React.createClass({
displayName: "Slides",
propTypes: {
data: React.PropTypes.array.isRequired
},
render: function () {
var slidesNodes = this.props.data.map(function (slideNode, index) {
var isActive = state.currentSlide === index;
return React.createElement(Slide, { active: isActive,
imageAlt: slideNode.imageAlt,
imageClass: slideNode.imageClass,
indexClass: slideNode.id,
key: slideNode.id,
text: slideNode.text,
title: slideNode.title });
});
return React.createElement(
"div",
{ className: "slides" },
slidesNodes
);
}
});
var Slide = React.createClass({
displayName: "Slide",
propTypes: {
active: React.PropTypes.bool.isRequired,
imageClass: React.PropTypes.string.isRequired,
indexClass: React.PropTypes.string.isRequired,
text: React.PropTypes.string.isRequired,
title: React.PropTypes.string.isRequired
},
render: function () {
var classes = classNames({
"slide": true,
"slide--active": this.props.active
});
return React.createElement(
"div",
{ className: classes },
React.createElement(
"div",
{ className: this.props.indexClass },
React.createElement(
"div",
{ className: "slide-layout" },
React.createElement("img", { className: this.props.imageClass }),
React.createElement(
"h2",
null,
this.props.title
),
React.createElement(
"div",
{ className: "slide-text" },
this.props.text
)
)
)
);
}
});
var Controls = React.createClass({
displayName: "Controls",
togglePrev: function () {
actions.togglePrev();
},
toggleNext: function () {
actions.toggleNext();
},
render: function () {
var showPrev, showNext;
var current = state.currentSlide;
var last = state.data.length;
if (current > 0) {
showPrev = React.createElement("div", { className: "toggle toggle-prev", onClick: this.togglePrev });
}
if (current < last - 1) {
showNext = React.createElement("div", { className: "toggle toggle-next", onClick: this.toggleNext });
}
return React.createElement(
"div",
{ className: "controls" },
showPrev,
showNext
);
}
});
var EmptyMessage = React.createClass({
displayName: "EmptyMessage",
render: function () {
return React.createElement(
"div",
{ className: "empty-message" },
"No Data"
);
}
});
function render(renderTo) {
var hasData = state.data.length > 0;
var component;
if (hasData) {
component = React.createElement(Slideshow, { data: state.data });
} else {
component = React.createElement(EmptyMessage, null);
}
React.render(component, document.querySelector(renderTo ? renderTo : "#main"));
}
function init(renderTo, data) {
state.data = data;
render(renderTo);
}
return {
init: init
};
}();

View File

@ -3,7 +3,6 @@ pref("loop.remote.autostart", false);
pref("loop.server", "https://loop.services.mozilla.com/v0");
pref("loop.linkClicker.url", "https://hello.firefox.com/");
pref("loop.gettingStarted.latestFTUVersion", 1);
pref("loop.facebook.shareUrl", "https://www.facebook.com/sharer/sharer.php?u=%ROOM_URL%");
pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/");
pref("loop.gettingStarted.resumeOnFirstJoin", false);
pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/");
@ -21,6 +20,11 @@ pref("loop.feedback.dateLastSeenSec", 0);
pref("loop.feedback.periodSec", 15770000); // 6 months.
pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/");
pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/");
pref("loop.mau.openPanel", 0);
pref("loop.mau.openConversation", 0);
pref("loop.mau.roomOpen", 0);
pref("loop.mau.roomShare", 0);
pref("loop.mau.roomDelete", 0);
#ifdef DEBUG
pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:");
#else
@ -29,8 +33,7 @@ pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font
pref("loop.fxa_oauth.tokendata", "");
pref("loop.fxa_oauth.profile", "");
pref("loop.support_url", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/cobrowsing");
#ifdef LOOP_BETA
pref("loop.facebook.enabled", true);
#else
pref("loop.facebook.enabled", false);
#endif
pref("loop.facebook.appId", "1519239075036718");
pref("loop.facebook.shareUrl", "https://www.facebook.com/dialog/send?app_id=%APP_ID%&link=%ROOM_URL%&redirect_uri=%REDIRECT_URI%");
pref("loop.facebook.fallbackUrl", "https://hello.firefox.com/");

View File

@ -181,43 +181,6 @@ html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:h
width: 100%;
}
.call-action-group > .invite-button {
cursor: pointer;
margin: 0 4px;
position: relative;
}
.call-action-group > .invite-button > img {
background-color: #00a9dc;
border-radius: 100%;
height: 28px;
width: 28px;
}
.call-action-group > .invite-button:hover > img {
background-color: #5cccee;
}
.call-action-group > .invite-button.triggered > img {
background-color: #56b397;
}
.call-action-group > .invite-button > p {
display: none;
/* Position the text under the button while centering it without impacting the
* rest of the layout */
left: -10rem;
margin: .5rem 0 0;
position: absolute;
right: -10rem;
font-size: 0.8rem;
}
.call-action-group > .invite-button.triggered > p,
.call-action-group > .invite-button:hover > p {
display: block;
}
.room-failure {
/* This flex allows us to not calculate the height of the logo area
versus the buttons */
@ -443,22 +406,133 @@ html, .fx-embedded, #main,
height: 100%;
right: 0;
left: 0;
text-align: center;
color: #000;
z-index: 1010;
display: flex;
flex-flow: column nowrap;
justify-content: center;
align-items: stretch;
}
.room-invitation-content {
display: flex;
flex-flow: column nowrap;
margin: 12px 0;
font-size: 1.4rem;
}
.room-invitation-content > * {
width: 100%;
margin: 0 15px;
}
.room-context-header {
font-weight: bold;
font-size: 1.6rem;
margin-bottom: 10px;
text-align: center;
}
/* Input Button Combo group */
.input-button-content {
margin: 0 15px 10px 15px;
min-width: 64px;
border-radius: 4px;
border: 1px solid #d2cece;;
}
.input-button-group-label {
color: #898a8a;
margin: 0 15px;
margin-bottom: 2px;
font-size: 1.2rem;
}
.input-button-content > * {
width: 100%;
padding: 0 4px;
}
.input-button-content > .input-group input {
font-size: 1.4rem;
padding: 0.7rem;
width: 100%;
border: 0;
}
.input-button-content > .group-item-top {
border-radius: 4px 4px 0 0;
}
.input-button-content > .group-item-bottom {
border-radius: 0 0 4px 4px;
}
.input-button-content > .input-group {
background: #FFF;
}
.input-button-content > .invite-button {
background: #00a9dc;
height: 34px;
text-align: center;
display: flex;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
}
.input-button-content > .invite-button.triggered {
background-color: #00a9dc;
}
.input-button-content > .invite-button:hover {
background-color: #008ACB;
}
.share-action-group {
display: flex;
padding: 0 15px;
width: 100%;
flex-wrap: nowrap;
flex-direction: row;
justify-content: center;
}
.share-action-group > .invite-button {
cursor: pointer;
height: 34px;
border-radius: 4px;
background-color: #ebebeb;
display: flex;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
flex-grow: 1;
margin-right: 20px;
}
.share-action-group > .invite-button:last-child {
margin-right: 0;
}
.share-action-group > .invite-button:hover {
background-color: #d4d4d4;
}
.share-action-group > .invite-button.triggered {
background-color: #d4d4d4;
}
.share-action-group > .invite-button > img {
height: 28px;
width: 28px;
}
.share-action-group > .invite-button > div {
display: inline;
color: #4a4a4a;
}
.share-service-dropdown {
color: #000;
text-align: start;
@ -500,17 +574,6 @@ body[platform="win"] .share-service-dropdown.overflow > .dropdown-menu-item {
margin: 0 1rem 1.5rem 1rem;
}
.room-invitation-content {
color: #333;
font-size: 1rem;
margin: 1rem auto;
}
.room-invitation-content > p {
margin-left: 10px;
margin-right: 10px;
}
.media-layout {
height: 100%;
}
@ -796,7 +859,7 @@ body[platform="win"] .share-service-dropdown.overflow > .dropdown-menu-item {
.text-chat-view > .text-chat-entries {
width: 100%;
overflow: auto;
padding-top: .6rem;
padding-top: 15px;
/* 40px is the height of .text-chat-box. */
height: calc(100% - 40px);
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><path fill="#55565A" d="M47,25c0-1-0.4-2-1.1-2.7L26.4,2.9c-0.7-0.7-1.7-1.1-2.7-1.1c-1,0-2,0.4-2.7,1.1l-2.2,2.2 c-0.7,0.7-1.1,1.7-1.1,2.7s0.4,2,1.1,2.7l8.8,8.8h-21c-2.2,0-3.5,1.8-3.5,3.8v3.8c0,2,1.3,3.8,3.5,3.8h21l-8.8,8.8 c-0.7,0.7-1.1,1.7-1.1,2.7c0,1,0.4,2,1.1,2.7l2.2,2.2c0.7,0.7,1.7,1.1,2.7,1.1c1,0,2-0.4,2.7-1.1l19.5-19.5C46.6,27,47,26,47,25z"/></svg>

After

Width:  |  Height:  |  Size: 415 B

View File

@ -0,0 +1 @@
<svg width="31" height="24" viewBox="0 0 31 24" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="M9.07 17.683l.644.644c.056.042.112.07.182.07.071 0 .126-.027.182-.07l1.975-1.989c.574.35 1.191.56 1.849.63v1.037h-2.003c-.14 0-.252.042-.35.154-.098.098-.154.21-.154.336 0 .14.056.252.154.35.098.098.21.154.35.154h5.001c.14 0 .252-.056.35-.154.098-.098.154-.21.154-.35 0-.126-.056-.238-.154-.336-.098-.112-.21-.154-.35-.154h-2.003v-1.037c1.135-.126 2.088-.602 2.858-1.457.771-.855 1.149-1.864 1.149-3.012v-.995c0-.14-.056-.252-.154-.35-.098-.098-.21-.154-.336-.154-.14 0-.252.056-.35.154-.098.098-.154.21-.154.35v.995c0 .967-.35 1.793-1.037 2.48-.687.687-1.513 1.022-2.465 1.022-.574 0-1.107-.126-1.611-.392l.757-.756c.28.098.56.154.854.154.687 0 1.274-.252 1.765-.743.49-.491.728-1.078.728-1.765v-.995l2.83-2.83c.042-.042.07-.112.07-.182 0-.056-.028-.126-.07-.168l-.644-.644c-.056-.056-.112-.084-.182-.084-.07 0-.126.028-.182.084l-9.652 9.637c-.042.056-.07.112-.07.182 0 .07.028.126.07.182zm1.149-3.502l.784-.798c-.07-.308-.112-.602-.112-.882v-.995c0-.14-.056-.252-.154-.35-.098-.098-.21-.154-.336-.154-.14 0-.252.056-.35.154-.098.098-.154.21-.154.35v.995c0 .574.112 1.135.323 1.681zm6.542-6.527c-.182-.491-.491-.882-.911-1.191-.434-.308-.911-.462-1.443-.462-.701 0-1.289.238-1.779.728-.49.491-.728 1.079-.728 1.765v4.007l4.861-4.847z" fill="#333"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1 +1 @@
<svg width="31" height="24" viewBox="0 0 31 24" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="M19.002 11.5c0-.273-.226-.5-.5-.5-.273 0-.5.226-.5.5v1c0 1.93-1.57 3.5-3.5 3.5s-3.5-1.57-3.5-3.5v-1c0-.273-.226-.5-.5-.5-.273 0-.5.226-.5.5v1c0 2.312 1.75 4.219 4 4.468v1.031h-2c-.273 0-.5.226-.5.5 0 .273.226.5.5.5h5c.273 0 .5-.226.5-.5 0-.273-.226-.5-.5-.5h-2v-1.031c2.25-.25 4-2.156 4-4.468v-1zm-2-2.999c0-1.375-1.125-2.5-2.5-2.5s-2.5 1.125-2.5 2.5v4c0 1.375 1.125 2.5 2.5 2.5s2.5-1.125 2.5-2.5v-4z" fill="#00A9DC"/></g></svg>
<svg width="31" height="24" viewBox="0 0 31 24" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="M19.002 11.5c0-.273-.226-.5-.5-.5-.273 0-.5.226-.5.5v1c0 1.93-1.57 3.5-3.5 3.5s-3.5-1.57-3.5-3.5v-1c0-.273-.226-.5-.5-.5-.273 0-.5.226-.5.5v1c0 2.312 1.75 4.219 4 4.468v1.031h-2c-.273 0-.5.226-.5.5 0 .273.226.5.5.5h5c.273 0 .5-.226.5-.5 0-.273-.226-.5-.5-.5h-2v-1.031c2.25-.25 4-2.156 4-4.468v-1zm-2-2.999c0-1.375-1.125-2.5-2.5-2.5s-2.5 1.125-2.5 2.5v4c0 1.375 1.125 2.5 2.5 2.5s2.5-1.125 2.5-2.5v-4z" fill="#00A9DC"/></g></svg>

Before

Width:  |  Height:  |  Size: 535 B

After

Width:  |  Height:  |  Size: 536 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><path fill="#ffffff" d="M47.3,38.6c0-0.9-0.4-1.9-1.1-2.6l-11-11l11-11c0.7-0.7,1.1-1.6,1.1-2.6c0-0.9-0.4-1.9-1.1-2.6l-5.1-5.1 c-0.7-0.7-1.6-1.1-2.6-1.1c-0.9,0-1.9,0.4-2.6,1.1l-11,11l-11-11c-0.7-0.7-1.6-1.1-2.6-1.1c-0.9,0-1.9,0.4-2.6,1.1L3.8,8.9 c-0.7,0.7-1.1,1.6-1.1,2.6c0,0.9,0.4,1.9,1.1,2.6l11,11l-11,11c-0.7,0.7-1.1,1.6-1.1,2.6c0,0.9,0.4,1.9,1.1,2.6l5.1,5.1 c0.7,0.7,1.6,1.1,2.6,1.1c0.9,0,1.9-0.4,2.6-1.1l11-11l11,11c0.7,0.7,1.6,1.1,2.6,1.1c0.9,0,1.9-0.4,2.6-1.1l5.1-5.1 C46.9,40.5,47.3,39.5,47.3,38.6z"/></svg>

After

Width:  |  Height:  |  Size: 573 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 225 50"><path fill="#1E92CE" d="M146.3,20.2c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2,0-0.3,0-0.5,0.1 c-0.2,0.1-0.3,0.2-0.4,0.3c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.2-0.1,0.3-0.1,0.5c0,0.2,0,0.4,0.1,0.5c0.1,0.2,0.2,0.3,0.3,0.4 c0.1,0.1,0.2,0.2,0.4,0.3c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.3,0,0.5-0.1c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.4 c0.1-0.2,0.1-0.3,0.1-0.5c0-0.2,0-0.3-0.1-0.5C146.5,20.4,146.4,20.3,146.3,20.2z M146.3,21.5c-0.1,0.1-0.1,0.2-0.2,0.3 c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0.1-0.3,0.1-0.4,0.1c-0.1,0-0.3,0-0.4-0.1c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1-0.1-0.2-0.2-0.2-0.3 c-0.1-0.1-0.1-0.3-0.1-0.4c0-0.2,0-0.3,0.1-0.4c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.2c0.1-0.1,0.3-0.1,0.4-0.1 c0.1,0,0.3,0,0.4,0.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.2,0.2,0.2,0.3c0.1,0.1,0.1,0.3,0.1,0.4C146.4,21.2,146.4,21.4,146.3,21.5 z M145.7,21.4C145.7,21.3,145.6,21.3,145.7,21.4c-0.1-0.1-0.1-0.1-0.1-0.2c0,0,0,0,0,0c0.1,0,0.2,0,0.3-0.1 c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.1,0-0.2c0,0,0-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c-0.1,0-0.1,0-0.2,0H145v1.4h0.2v-0.6 c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0.1,0.1,0.1c0,0.1,0.1,0.1,0.1,0.2l0.1,0.2h0.3L145.7,21.4C145.7,21.4,145.7,21.4,145.7,21.4z M145.3,21h-0.1v-0.5h0.1c0.1,0,0.2,0,0.2,0.1c0,0,0.1,0.1,0.1,0.2c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0-0.1,0.1 C145.4,21,145.4,21,145.3,21z M54.4,37.8h4.1V26.5h6.8v-3.3h-6.8v-6.7h8.4l0.5-3.3h-13V37.8z M71.6,11.9c-1.5,0-2.6,1.2-2.6,2.6 c0,1.4,1.1,2.6,2.5,2.6c1.5,0,2.6-1.2,2.6-2.6C74.1,13.1,73,11.9,71.6,11.9z M69.5,37.8h3.9V19.4l-3.9,0.7V37.8z M85.4,19.3 c-1.7,0-3.2,0.9-4.6,2.9c0-1-0.2-2-0.7-2.8l-3.6,0.9c0.4,1.1,0.6,2.6,0.6,4.8v12.7h3.9V25.6c0.4-1.5,1.7-2.7,3.4-2.7 c0.4,0,0.7,0.1,1.1,0.2l1.2-3.6C86.3,19.4,86,19.3,85.4,19.3z M94,19.4c-2.3,0-4,0.7-5.5,2.4c-1.6,1.8-2.2,3.9-2.2,7 c0,5.7,3.2,9.4,8.3,9.4c2.4,0,4.6-0.8,6.4-2.4l-1.5-2.4c-1.3,1.2-2.8,1.8-4.5,1.8c-3.5,0-4.4-2.6-4.4-5.1v-0.3h10.7V29 c0-4.2-0.8-6.4-2.3-7.8C97.4,19.9,95.7,19.4,94,19.4z M90.6,27c0-2.9,1.2-4.6,3.4-4.6c1.9,0,3.2,1.7,3.2,4.6H90.6z M108,19.8v-2.7 c0-1.6,0.9-2.5,2.2-2.5c0.7,0,1.3,0.2,2.2,0.6l1.3-2.5c-1.2-0.7-2.5-1-4-1c-3.2,0-5.5,1.7-5.5,5.5c0,1.7,0.1,2.7,0.1,2.7h-1.7v2.7 h1.7v15.3h3.9V22.5h3.7l1-2.7H108z M119.9,19.4c-4.7,0-7.8,3.7-7.8,9.4c0,5.7,3,9.4,7.9,9.4c4.9,0,7.9-3.6,7.9-9.4 C127.9,23.2,125,19.4,119.9,19.4z M120.1,35.3c-2.3,0-3.6-1.5-3.6-6.7c0-4.4,1.1-6.2,3.5-6.2c2.3,0,3.7,1.5,3.7,6.6 C123.6,33.4,122.4,35.3,120.1,35.3z M143.2,19.8h-4.5c-0.5,0.7-2.3,4.3-2.8,5.5c-0.9-1.7-2.4-4.5-3.3-5.8l-4.2,0.9l5.2,7.7 l-6.7,9.7h4.9c0.7-1,3.2-5.4,3.9-6.7c0.4,0.6,3.3,5.7,3.9,6.7h4.9L138,28L143.2,19.8z M165.8,23.6h-10.3V13.3h-2.9v24.6h2.9V26 h10.3v11.9h2.9V13.3h-2.9V23.6z M179,19.5c-2.1,0-3.9,0.8-5.3,2.5c-1.5,1.8-2.1,3.7-2.1,6.7c0,5.9,3,9.5,7.9,9.5 c2.3,0,4.4-0.8,6-2.2l-1.1-1.8c-1.3,1.1-2.6,1.7-4.4,1.7c-1.8,0-3.4-0.6-4.4-2.2c-0.6-0.9-0.8-2.2-0.8-3.9v-0.4h11.1V29 c-0.1-4.3-0.5-5.9-2-7.5C182.6,20.2,181,19.5,179,19.5z M174.8,27.3c0.1-3.7,1.6-5.6,4.1-5.6c1.4,0,2.6,0.6,3.2,1.6 c0.5,0.9,0.8,2,0.8,4H174.8z M193.1,36.1c-0.8,0-1-0.4-1-1.8V16c0-2.7-0.5-4.2-0.5-4.2l-2.8,0.5c0,0,0.4,1.3,0.4,3.7v18.9 c0,1.3,0.3,2,0.9,2.5c0.5,0.5,1.3,0.8,2.1,0.8c0.8,0,1.1-0.1,1.8-0.4l-0.6-1.8C193.4,36,193.2,36.1,193.1,36.1z M200.3,36.1 c-0.8,0-1-0.4-1-1.8V16c0-2.7-0.5-4.2-0.5-4.2l-2.8,0.5c0,0,0.4,1.3,0.4,3.7v18.9c0,1.3,0.3,2,0.9,2.5c0.5,0.5,1.2,0.8,2.1,0.8 c0.7,0,1.1-0.1,1.8-0.4l-0.6-1.8C200.6,36,200.4,36.1,200.3,36.1z M216.3,22.6c-1.2-1.8-3.1-3.1-6.1-3.1c-4.7,0-7.6,3.5-7.6,9.4 c0,5.9,2.8,9.5,7.7,9.5c4.5,0,7.7-3.2,7.7-9.1C218,26.3,217.5,24.2,216.3,22.6z M214.3,33.3c-0.6,1.7-2,2.7-3.9,2.7 c-1.5,0-3-0.7-3.6-1.8c-0.7-1.1-1.1-3.3-1.1-5.8c0-2.1,0.3-3.5,0.9-4.7c0.6-1.2,2.1-1.9,3.6-1.9c1.5,0,3,0.7,3.8,2.3 c0.6,1.2,0.8,2.9,0.8,5.4C214.8,31.2,214.7,32.2,214.3,33.3z M26.1,7.7C16.1,7.7,8,14.9,8,23.6c0,4.4,2,8.3,5.2,11.2 c-0.6,2-1.7,4.7-3.9,7.3c0.4,0.7,6.6-1.7,11-3.4c1.8,0.5,3.7,0.8,5.7,0.8c10,0,18.1-7.1,18.1-15.9C44.1,14.9,36,7.7,26.1,7.7z M31.5,17.3c1.3,0,2.4,1.1,2.4,2.4c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4C29.1,18.3,30.2,17.3,31.5,17.3z M20.6,17.3 c1.3,0,2.4,1.1,2.4,2.4c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4C18.2,18.3,19.3,17.3,20.6,17.3z M26.1,34.7 C26.1,34.7,26,34.7,26.1,34.7c-0.1,0-0.1,0-0.1,0c-4.8,0-10.2-3.1-11.5-8.4c3.3,1.5,7.8,2.2,11.5,2.2c3.7,0,8.3-0.7,11.5-2.2 C36.3,31.6,30.9,34.7,26.1,34.7z"/></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 310 310"><defs><path id="a" d="M155,63.5c55.2,0,100,44.8,100,100s-44.8,100-100,100c-55.2,0-100-44.8-100-100S99.8,63.5,155,63.5z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><path fill="#FFF" fill-rule="evenodd" d="M155,63.5c55.2,0,100,44.8,100,100 s-44.8,100-100,100c-55.2,0-100-44.8-100-100S99.8,63.5,155,63.5z" clip-path="url(#b)" clip-rule="evenodd"/><g fill="#E7C1A8" clip-path="url(#b)"><path d="M80.3 199.7H123.3V254.7H80.3z" transform="rotate(71.16 101.822 227.175)"/><path d="M84.6,163c7.1-1,13.8,1.9,15,11.4l3,22.5c0.1,0.9,1.5,1.5,2.4,1.4c0.9-0.1,1.6-1,1.4-1.9l-10-74.2l0,0 l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1c3.5-0.5,6.7,1.9,7.1,5.4l0.5,3.5l5.8,42.7l3-0.4l-7-51.6l0,0l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1 c3.5-0.5,6.7,1.9,7.1,5.4l0.5,3.5l0,0l7,51.6l4.1-0.6l-5.8-42.7l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1c3.5-0.5,6.7,1.9,7.1,5.4 l0.5,3.5l0,0l5.8,42.7l3.9-0.5L147,130l0,0l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1c3.5-0.5,6.7,1.9,7.1,5.4l0.5,3.5c0,0,0,0,0,0 c1.2,9.3,8.9,65.7,9.1,67.8c2.9,21.5-12.3,41.3-33.9,44.2c-21.6,2.9-41.5-12.2-44.4-33.7C90.1,205.1,84.6,163,84.6,163z"/></g><g clip-path="url(#b)"><defs><path id="c" d="M84.6,163c7.1-1,13.8,1.9,15,11.4l3,22.5c0.1,0.9,1.5,1.5,2.4,1.4c0.9-0.1,1.6-1,1.4-1.9l-10-74.2l0,0 l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1c3.5-0.5,6.7,1.9,7.1,5.4l0.5,3.5l5.8,42.7l3-0.4l-7-51.6l0,0l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1 c3.5-0.5,6.7,1.9,7.1,5.4l0.5,3.5l0,0l7,51.6l4.1-0.6l-5.8-42.7l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1c3.5-0.5,6.7,1.9,7.1,5.4 l0.5,3.5l0,0l5.8,42.7l3.9-0.5L147,130l0,0l-0.5-3.5c-0.5-3.4,2-6.6,5.4-7.1c3.5-0.5,6.7,1.9,7.1,5.4l0.5,3.5c0,0,0,0,0,0 c1.2,9.3,8.9,65.7,9.1,67.8c2.9,21.5-12.3,41.3-33.9,44.2c-21.6,2.9-41.5-12.2-44.4-33.7C90.1,205.1,84.6,163,84.6,163z"/></defs><clipPath id="d"><use xlink:href="#c" overflow="visible"/></clipPath><path fill="#F4D2BB" d="M104.7,196.9c-0.2,0-0.3,0.1-0.5,0.1l-6.4-47.6L78,152.1l7.1,52.8 c-12,8.9-19,23.9-16.8,39.8c3.1,23.3,24.5,39.6,47.8,36.4s39.6-24.5,36.4-47.8S127.9,193.8,104.7,196.9z" clip-path="url(#d)"/></g><path fill="#CE7C32" d="M215.7,212.9c0.8-2.7,1.4-5.5,1.6-8.5c0.2-2,4.4-58.9,5.1-68.2c0,0,0,0,0,0 l0.3-3.6c0.3-3.5-2.4-6.5-5.8-6.7c-3.5-0.3-6.5,2.3-6.8,5.8l-0.3,3.6l0,0l-2.1,28.5l-3.9-0.3l3.2-43l0,0l0.3-3.6 c0.3-3.5-2.4-6.5-5.8-6.7c-3.5-0.3-6.5,2.3-6.8,5.8l-0.3,3.6l-3.2,43l-4.1-0.3l3.9-52l0,0l0.3-3.6c0.3-3.5-2.4-6.5-5.8-6.7 c-3.5-0.3-6.5,2.3-6.8,5.8l-0.3,3.6l0,0l-3.9,52l-3-0.2l3.2-43l0.3-3.6c0.3-3.5-2.4-6.5-5.8-6.7c-3.5-0.3-6.5,2.3-6.8,5.8 l-0.3,3.6l0,0l-5.6,74.7c-0.1,0.9-0.9,1.6-1.8,1.6c-0.9-0.1-2.1-0.9-2.1-1.8l1.7-22.7c0.7-9.6-5.2-13.7-12.4-14.3 c0,0-3.3,42.3-3.4,43.9c-1.5,19.8,12.1,37.2,31,41.3l0,0.1l50.6,21.6l16.9-39.6L215.7,212.9z" clip-path="url(#b)"/><g fill="#71C4EA"><path d="M153.8,79.4c0,1.5,1.2,2.6,2.6,2.6c1.5,0,2.6-1.2,2.6-2.6V49.1c0-1.5-1.2-2.6-2.6-2.6 c-1.5,0-2.6,1.2-2.6,2.6V79.4z"/><path d="M174.7,86.4c-0.8,1.2-0.6,2.8,0.6,3.7c1.2,0.8,2.8,0.6,3.7-0.6l17.5-24.7c0.8-1.2,0.6-2.8-0.6-3.7 c-1.2-0.8-2.8-0.6-3.7,0.6L174.7,86.4z"/><path d="M138.1,86.4c0.8,1.2,0.6,2.8-0.6,3.7c-1.2,0.8-2.8,0.6-3.7-0.6l-17.5-24.7c-0.8-1.2-0.6-2.8,0.6-3.7 c1.2-0.8,2.8-0.6,3.7,0.6L138.1,86.4z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 310 310"><path fill="#71C4EA" d="M265.5,53.9c0-2.6-2.1-3.7-4.7-3.7h-79.6c-2.6,0-4.7,2.1-4.7,4.7V64h89V53.9z"/><circle cx="184.1" cy="56.9" r="1.6" fill="#FFF"/><circle cx="190.2" cy="56.9" r="1.6" fill="#FFF"/><circle cx="196.3" cy="56.9" r="1.6" fill="#FFF"/><path fill="#FFF" d="M181.2,118h79.6c2.6,0,4.7-2.1,4.7-4.7V64h-89v49.3C176.5,115.9,178.6,118,181.2,118z"/><path fill="#D6DCE5" d="M176.5 64H265.5V73H176.5z"/><path fill="#06A6E0" fill-rule="evenodd" d="M153.5,59.9c55.2,0,100,44.8,100,100s-44.8,100-100,100 c-55.2,0-100-44.8-100-100S98.3,59.9,153.5,59.9z" clip-rule="evenodd"/><path fill="none" d="M153.5,59.9c55.2,0,100,44.8,100,100s-44.8,100-100,100 c-55.2,0-100-44.8-100-100S98.3,59.9,153.5,59.9z" clip-rule="evenodd"/><defs><path id="a" d="M153.5,59.9c55.2,0,100,44.8,100,100s-44.8,100-100,100c-55.2,0-100-44.8-100-100S98.3,59.9,153.5,59.9z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><g clip-path="url(#b)"><path fill="#0283B1" d="M259.4,134.6L259.4,134.6C259.4,134.6,259.4,134.6,259.4,134.6c0-0.1,0-0.2-0.1-0.2h0 c-4.3-13.9-11.2-26.9-20.1-38.1l-2.2,0.8l-1.8,3.9L223,98l-6.8,5.9l1.8,3.4l-11.2-6.9l5.5-5.8l9.7-3.4l-1.5-3.4L210.3,92 l-7.3,7.5l6.3,7.2l-9.4,0l-14.2,9.3l-4.8-5l7.3,0.7l3.3-5.1l-18.5-4.3l-12.4,3l-11.2,15.1l-0.4,5.8l6.8-0.8l1.5,3.9l6.4-1.8 l0.4-5.1l-2.3-1.9l6.4-8.3l2.9,3l-5,3.9l2,4.3l6.8-2.4l1.9,2.4l-10.8,4.1l-0.4,2.8l-9.9,0.5l-1.9-2.9l-2.9,1.4l1.5,3.9l-1.6,1.6 l-4,3.6l-2.9,0.4l-5,3.9l2.9,3l-1.4,3.4l-7.9-0.5l4,11l11.2-10.4l2,1.1l3.3-3l5.9,4.4l1.4,5.8l3.4-4.8l-5.3-7.3l1.2-1.3l6.6,7.6 l1,5.8l5.5,4l-1-7.9l5.8,7.9l4.4-5.9v5.9l-2,2l-10.7-0.5l-3-2.5l-3.9,3.4l-7.9-2.5l0.5-2.5l-2.5-2.8l-9.8,0.9l-17.7,15.3 l0.4,15.1l8,7l13.7,0.4l6.8,4.4l-2.9,1.9l7,8.3v5.8l-2.6,3.4l8.3,22.6l9.4,0.5l11.7-14.2l0.5-5.5l4.5-3.4l-0.6-7.3l-1.8-1.9 l15.2-22.1l-8.4,0.6l-5.5-4.1l-7.2-14.6l0.4-4h2.9l10.8,20.7l10.3-3.9l4.4-5.5l-4.4-4.3l-4,1.4l-3.9-6.4l23.6,4.3l-0.4,6.6 l2.8,0.9l4,11.2l6.5-1.8v-5.9l8.2-6.4l1.1-4.5h2.4v5l8.4,18.2l-5.9-0.4l9.9,10.8c0.6-1.9,1.2-3.8,1.7-5.7l-1.8-0.2l-1-3l3.4,0.9 c0.3-1,0.5-2.1,0.7-3.1l-4.1-2.7l-1.5-6.4l1.5-0.4l3,5.7l2.1-1.2c0.5-2.9,0.9-5.9,1.2-8.9c0-0.3,0.1-0.6,0.1-0.9 c0.3-3.5,0.5-7,0.5-10.5C264.5,156.8,262.7,145.4,259.4,134.6z M181.9,149.5h-3l-3.9,3l-0.9-3.4l4.4-5.5l2.5,3.2l2.9-0.3 l-0.2-2.6l3.3,0.6l3.6,5.7L181.9,149.5z M201.7,157.9l-0.6-10.4l2.8-2.2l1.4,1.5l-2.7,3.7l3.2,6.4L201.7,157.9z M211.9,150.8 l-0.3-4l2.5-0.3l0.5,4L211.9,150.8z M192.3,219.7l-1.8,6.4l6.4,4.4l4.4-14.1l-2.6-1.6L192.3,219.7z M130.3,134.4l-0.2,0.4l0,0 l-0.3,0.5l3.3,3l3-3.3l-0.5-0.6h0l-3-3.8L130.3,134.4L130.3,134.4z M86.9,200.7l-0.9-7h-7.4l-0.6-6l-9.2-0.3l-4.8-1.8l-6.8,2.9 h-7l-1-5.9l-3.9-0.4l1-5.5l-2.6-1.4l-3.9,2.4H38l-4.1-3.9l4.1-7.3h10.8l2.9,4.4h3.4l-2-6.5l7-5.9l-0.6-3.9l2.9-2.9l3,0.4v-5.3 l17.2-9.8l-2.1-2.5h0l-10-12.1l-15.2-2.5l0,7.3l1.4,1.5l-1.9,5.8h-0.1l-0.5,1.5l-1.3-1.5h-0.1l-5-5.8l-6.4-1.9 c-1,2.5-1.9,5.1-2.7,7.8h0c-3.3,10.8-5.1,22.3-5.1,34.2c0,4.9,0.3,9.7,0.9,14.4l6.5,3.7l3.9-0.4l3,5.9h6.8v5l-2.9,4.4l6.8,17 l6.5,3l-3.8,22c3.1,3.6,6.4,7,9.9,10.2l29.1-31.1l1.1-8.8l3.9-4.5L92,200.7H86.9z M155.8,156.2l3,1.1l-1.2-4L155.8,156.2z M76.3,182.5l-13.9-5.9l-0.9,2.5l12.3,4.4L76.3,182.5z M50.5,176.6l7.5,1.6l1-3l-7.8-2.3L50.5,176.6z M58.1,167.7v3.4l3.9,1.9 L58.1,167.7z M126.9,110.6l-9.8,2.5l5.3,7.9l8.8-6.3L126.9,110.6z M138.8,134.8l-1.4,2.7h6.9l0.3-2.6l0.2-1.7l-4.3-3.5l-2-4.8 l-3.3,3.4l4.5,4.9L138.8,134.8z M123.5,83.7l5.8-4.9l-10.7-8.8l-36.4,4.4c-6.4,4.5-12.2,9.7-17.5,15.4l2.4,3.3l6.5-2l5.9,4.4 l2.9,15.2l7.3,11.3l6.4,0.4l3.5-8.4l14.1-4.3l8.9-13.7L123.5,83.7z M50.9,112.5l1.9-5.5l4.5,0l-1.6,8l12.8,2.3l6.8-7.3 L58.8,96.4c-5,6.3-9.4,13.1-13,20.3l6.5,0.6L50.9,112.5z"/></g><g fill="none" stroke="#F5C825" stroke-width="4" stroke-miterlimit="10" stroke-linecap="round"><path d="M128.5 57L128.5 57"/><path d="M117,53.3c-22.1-6-41.2-4-52.7,7.5c-25.5,25.5-4.4,87.8,47,139.3s113.8,72.5,139.3,47c11.6-11.6,13.6-30.9,7.3-53.4" stroke-dasharray="0,12.1246"/><path d="M256.2 187.9L256.2 187.9"/></g><path fill="#7DC14C" d="M166.5,172.1c0-3.5-2.9-5.1-6.4-5.1H50.9c-3.5,0-6.4,2.9-6.4,6.4V186h122V172.1z"/><circle cx="54.6" cy="176.2" r="2.2" fill="#FFF"/><circle cx="62.9" cy="176.2" r="2.2" fill="#FFF"/><circle cx="71.3" cy="176.2" r="2.2" fill="#FFF"/><path fill="#FFF" d="M50.9,260h109.2c3.5,0,6.4-2.9,6.4-6.4V186h-122v67.6C44.5,257.1,47.4,260,50.9,260z"/><path fill="#D6DCE5" d="M44.5 186H166.5V199H44.5z"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 310 310"><path fill="#A3D189" fill-rule="evenodd" d="M142.5,55c55.2,0,100,44.8,100,100s-44.8,100-100,100 c-55.2,0-100-44.8-100-100S87.3,55,142.5,55z" clip-rule="evenodd"/><defs><path id="a" d="M267.5,66h-79.4c-13.7-7-29.2-11-45.6-11c-55.2,0-100,44.8-100,100c0,55.2,44.8,100,100,100 c20.7,0,39.9-6.3,55.8-17h69.2V66z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><g clip-path="url(#b)"><path fill="#D6DCE5" d="M14.5 111H234.5V142H14.5z"/><path fill="#383F44" d="M234.5,90c0-5.5-4.5-10-10-10h-200c-5.5,0-10,4.5-10,10v21h220V90z"/><path fill="#FFF" d="M14.5,219c0,5.5,4.5,10,10,10h200c5.5,0,10-4.5,10-10v-77h-220V219z"/><path fill="#D6DCE5" fill-rule="evenodd" d="M92.5,101c-0.8-4.2-2.1-12-12.6-12H54.1 c-10.4,0-11.8,7.8-12.6,12c-1.2,6.6-3.8,10.1-10.7,10.1c4.6,0,67.8,0,72.5,0C96.3,111.1,93.7,107.6,92.5,101z" clip-rule="evenodd"/><path fill="#FFF" d="M29.5 118H165.5V135H29.5z"/><circle cx="32" cy="126.5" r="10.5" fill="#41484E"/><path fill="#FFF" d="M210.5 119.5c0 .8.7 1.5 1.5 1.5h14c.8 0 1.5-.7 1.5-1.5 0-.8-.7-1.5-1.5-1.5h-14C211.2 118 210.5 118.7 210.5 119.5 210.5 119.5 210.5 118.7 210.5 119.5zM210.5 126.5c0 .8.7 1.5 1.5 1.5h14c.8 0 1.5-.7 1.5-1.5 0-.8-.7-1.5-1.5-1.5h-14C211.2 125 210.5 125.7 210.5 126.5 210.5 126.5 210.5 125.7 210.5 126.5zM210.5 133.5c0 .8.7 1.5 1.5 1.5h14c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5h-14C211.2 132 210.5 132.7 210.5 133.5 210.5 133.5 210.5 132.7 210.5 133.5z"/><path fill="#FFF" fill-rule="evenodd" d="M35.7,125.1h-4.4l2-2c0.3-0.3,0.4-0.8,0.1-1l-0.9-0.9 c-0.2-0.2-0.7-0.2-1,0.1l-4.6,4.7c-0.1,0.1-0.1,0.1-0.1,0.2l0,0c0,0,0,0,0,0c0,0,0,0.1-0.1,0.1c0,0.1-0.1,0.1-0.1,0.2 c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0.1,0,0.1,0.1,0.2c0,0,0,0.1,0.1,0.1c0,0,0,0,0,0l0,0c0,0.1,0.1,0.1,0.1,0.2l4.6,4.7 c0.3,0.3,0.8,0.4,1,0.1l0.9-0.9c0.2-0.2,0.2-0.7-0.1-1l-2-2h4.5c0.4,0,0.7-0.3,0.7-0.7v-1.5C36.4,125.4,36.1,125.1,35.7,125.1z" clip-rule="evenodd"/><circle cx="187.5" cy="127" r="9" fill="#FFF"/><path fill="#0283B1" d="M187.5,114.4c-7.2,0-13,5.1-13,11.3c0,3.1,1.4,5.9,3.8,8c-0.4,1.4-1.2,3.3-2.8,5.2 c0.3,0.5,4.7-1.2,7.9-2.5c1.3,0.4,2.7,0.6,4.1,0.6c7.2,0,13-5.1,13-11.3C200.5,119.5,194.7,114.4,187.5,114.4z M191.4,121.2 c0.9,0,1.7,0.8,1.7,1.7c0,0.9-0.8,1.7-1.7,1.7c-0.9,0-1.7-0.8-1.7-1.7C189.7,121.9,190.4,121.2,191.4,121.2z M183.5,121.2 c0.9,0,1.7,0.8,1.7,1.7c0,0.9-0.8,1.7-1.7,1.7c-1,0-1.7-0.8-1.7-1.7C181.8,121.9,182.6,121.2,183.5,121.2z M187.5,133.6 C187.5,133.6,187.5,133.6,187.5,133.6c-0.1,0-0.1,0-0.1,0c-3.5,0-7.3-2.2-8.2-6c2.3,1.1,5.6,1.5,8.3,1.5c2.7,0,5.9-0.5,8.3-1.5 C194.9,131.4,191,133.6,187.5,133.6z"/></g><path fill="#383F44" d="M195.5,155.8v-19.5l17,12.5l-7.4,1.2l3,7.6l-3.3,1.4l-3.9-6.8L195.5,155.8z"/></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#FFF" d="M12 10.4c0 .2-.1.4-.2.5-.1.1-.3.2-.5.2H4.7c-.2 0-.4-.1-.5-.2-.1-.1-.2-.3-.2-.5V6.9c.1.1.3.3.5.4 1 .7 1.8 1.2 2.2 1.5.1.1.3.2.4.3.1.1.2.1.4.2s.3.1.5.1.3 0 .5-.1.3-.1.4-.2c.1-.1.3-.2.4-.3.5-.4 1.2-.9 2.2-1.5.2-.1.4-.3.5-.4v3.5zm-.2-4.2c-.1.2-.3.4-.5.5-1.1.8-1.8 1.3-2.1 1.5 0 0-.1.1-.2.1-.1.2-.2.2-.3.3-.1 0-.1.1-.2.1-.1.1-.2.1-.3.1h-.4c-.1 0-.2-.1-.3-.1-.1-.1-.2-.1-.2-.1-.1-.1-.2-.1-.3-.2-.1-.1-.1-.1-.1-.2-.3-.1-.7-.4-1.2-.8-.5-.3-.8-.5-.9-.6-.2-.1-.4-.3-.6-.5S4 5.9 4 5.7c0-.2.1-.4.2-.6.1-.2.3-.2.5-.2h6.6c.2 0 .4.1.5.2.1.1.2.3.2.5s-.1.4-.2.6z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#4a4a4a" d="M12 10.4c0 .2-.1.4-.2.5-.1.1-.3.2-.5.2H4.7c-.2 0-.4-.1-.5-.2-.1-.1-.2-.3-.2-.5V6.9c.1.1.3.3.5.4 1 .7 1.8 1.2 2.2 1.5.1.1.3.2.4.3.1.1.2.1.4.2s.3.1.5.1.3 0 .5-.1.3-.1.4-.2c.1-.1.3-.2.4-.3.5-.4 1.2-.9 2.2-1.5.2-.1.4-.3.5-.4v3.5zm-.2-4.2c-.1.2-.3.4-.5.5-1.1.8-1.8 1.3-2.1 1.5 0 0-.1.1-.2.1-.1.2-.2.2-.3.3-.1 0-.1.1-.2.1-.1.1-.2.1-.3.1h-.4c-.1 0-.2-.1-.3-.1-.1-.1-.2-.1-.2-.1-.1-.1-.2-.1-.3-.2-.1-.1-.1-.1-.1-.2-.3-.1-.7-.4-1.2-.8-.5-.3-.8-.5-.9-.6-.2-.1-.4-.3-.6-.5S4 5.9 4 5.7c0-.2.1-.4.2-.6.1-.2.3-.2.5-.2h6.6c.2 0 .4.1.5.2.1.1.2.3.2.5s-.1.4-.2.6z"/></svg>

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 638 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#FFF" d="M12 11.6c0 .1 0 .2-.1.3s-.2.1-.3.1h-2V8.9h1l.2-1.2H9.5v-.8c0-.2 0-.3.1-.4.1-.1.2-.1.5-.1h.6V5.3h-.9c-.4-.1-.8 0-1.1.3-.3.3-.4.7-.4 1.2v.9h-1v1.2h1V12H4.4c-.1 0-.2 0-.3-.1-.1-.1-.1-.2-.1-.3V4.4c0-.1 0-.2.1-.3.1-.1.2-.1.3-.1h7.1c.1 0 .2 0 .3.1.2.1.2.2.2.3v7.2z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#4a4a4a" d="M12 11.6c0 .1 0 .2-.1.3s-.2.1-.3.1h-2V8.9h1l.2-1.2H9.5v-.8c0-.2 0-.3.1-.4.1-.1.2-.1.5-.1h.6V5.3h-.9c-.4-.1-.8 0-1.1.3-.3.3-.4.7-.4 1.2v.9h-1v1.2h1V12H4.4c-.1 0-.2 0-.3-.1-.1-.1-.1-.2-.1-.3V4.4c0-.1 0-.2.1-.3.1-.1.2-.1.3-.1h7.1c.1 0 .2 0 .3.1.2.1.2.2.2.3v7.2z"/></svg>

Before

Width:  |  Height:  |  Size: 348 B

After

Width:  |  Height:  |  Size: 351 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="#5a5a5a" d="M10.716 5.643c0 1.943-2.158 1.812-2.158 3.154v.3H6.83v-.37C6.83 6.65 8.74 6.793 8.74 5.81c0-.43-.312-.683-.84-.683-.49 0-.972.24-1.403.73l-1.21-.934C5.966 4.12 6.854 3.64 8.09 3.64c1.75 0 2.626.936 2.626 2.003zm-1.92 5.625c0 .6-.478 1.092-1.078 1.092s-1.08-.492-1.08-1.092c0-.588.48-1.08 1.08-1.08s1.08.492 1.08 1.08z"/></svg>

After

Width:  |  Height:  |  Size: 411 B

View File

@ -0,0 +1 @@
<svg width="13" height="10" viewBox="0 0 13 10" xmlns="http://www.w3.org/2000/svg" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"><title>Shape Copy</title><desc>Created with Sketch.</desc><path d="M6.302 2.225h-3.067c-.602 0-1.095.49-1.095 1.095v3.287c0 .609.49 1.095 1.095 1.095h3.067v1.55c0 .617.397.811.887.449l5.458-4.036c.498-.368.49-.949 0-1.312l-5.458-4.036c-.498-.368-.887-.161-.887.449v1.46zm-6.302-2.191h5.348v1.095h-4.278v7.668h4.278v1.106h-5.348v-9.869z" sketch:type="MSShapeGroup" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 521 B

View File

@ -0,0 +1 @@
<svg width="31" height="24" viewBox="0 0 31 24" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="M13.506 17.003h4.478c.554 0 1.033-.202 1.424-.592.404-.403.592-.87.592-1.437v-1.16l2.836 2.836c.089.089.189.126.316.126l.176-.038c.189-.076.277-.215.277-.416v-7.652c0-.189-.088-.327-.277-.416l-.176-.025c-.126 0-.227.038-.316.126l-2.836 2.824v-.671l1.83-1.83c.042-.042.07-.112.07-.182 0-.056-.028-.126-.07-.168l-.644-.644c-.056-.056-.112-.084-.182-.084-.07 0-.126.028-.182.084l-9.652 9.637c-.042.056-.07.112-.07.182 0 .07.028.126.07.182l.644.644c.056.042.112.07.182.07.071 0 .126-.027.182-.07l1.327-1.327zm4.948-8.95c-.15-.034-.307-.05-.471-.05h-4.954c-.567 0-1.034.189-1.437.592-.391.391-.592.869-.592 1.424v4.954c0 .165.017.322.051.471l7.403-7.392z" fill="#333"/></g></svg>

After

Width:  |  Height:  |  Size: 782 B

View File

@ -130,6 +130,15 @@ loop.shared.actions = (function() {
// sentTimestamp: String (optional)
}),
/**
* Used to send cursor data to the other peer
*/
SendCursorData: Action.define("sendCursorData", {
ratioX: Number,
ratioY: Number,
type: String
}),
/**
* Notifies that cursor data has been received from the other peer.
*/
@ -396,11 +405,13 @@ loop.shared.actions = (function() {
* XXX: should move to some roomActions module - refs bug 1079284
* @from: where the invitation is shared from.
* Possible values ['panel', 'conversation']
* @roomUrl: the URL that is shared
* @roomUrl: the URL that is shared.
* @roomOrigin: the URL browsed when the sharing is started - Optional.
*/
FacebookShareRoomUrl: Action.define("facebookShareRoomUrl", {
from: String,
roomUrl: String
// roomOrigin: String
}),
/**

View File

@ -32,7 +32,7 @@ loop.store.ROOM_STATES = {
CLOSING: "room-closing"
};
loop.store.ActiveRoomStore = (function() {
loop.store.ActiveRoomStore = (function(mozL10n) {
"use strict";
var sharedActions = loop.shared.actions;
@ -693,7 +693,8 @@ loop.store.ActiveRoomStore = (function() {
gotMediaPermission: function() {
this.setStoreState({ roomState: ROOM_STATES.JOINING });
loop.request("Rooms:Join", this._storeState.roomToken).then(function(result) {
loop.request("Rooms:Join", this._storeState.roomToken,
mozL10n.get("display_name_guest")).then(function(result) {
if (result.isError) {
this.dispatchAction(new sharedActions.RoomFailure({
error: result,
@ -1243,4 +1244,4 @@ loop.store.ActiveRoomStore = (function() {
});
return ActiveRoomStore;
})();
})(navigator.mozL10n || document.mozL10n);

View File

@ -4,7 +4,7 @@
var loop = loop || {};
loop.shared = loop.shared || {};
loop.shared.models = (function(l10n) {
loop.shared.models = (function() {
"use strict";
/**
@ -24,71 +24,11 @@ loop.shared.models = (function(l10n) {
* Notification collection
*/
var NotificationCollection = Backbone.Collection.extend({
model: NotificationModel,
/**
* Adds a warning notification to the stack and renders it.
*
* @return {String} message
*/
warn: function(message) {
this.add({ level: "warning", message: message });
},
/**
* Adds a l10n warning notification to the stack and renders it.
*
* @param {String} messageId L10n message id
*/
warnL10n: function(messageId) {
this.warn(l10n.get(messageId));
},
/**
* Adds an error notification to the stack and renders it.
*
* @return {String} message
*/
error: function(message) {
this.add({ level: "error", message: message });
},
/**
* Adds a l10n error notification to the stack and renders it.
*
* @param {String} messageId L10n message id
* @param {Object} [l10nProps] An object with variables to be interpolated
* into the translation. All members' values must be
* strings or numbers.
*/
errorL10n: function(messageId, l10nProps) {
this.error(l10n.get(messageId, l10nProps));
},
/**
* Adds a success notification to the stack and renders it.
*
* @return {String} message
*/
success: function(message) {
this.add({ level: "success", message: message });
},
/**
* Adds a l10n success notification to the stack and renders it.
*
* @param {String} messageId L10n message id
* @param {Object} [l10nProps] An object with variables to be interpolated
* into the translation. All members' values must be
* strings or numbers.
*/
successL10n: function(messageId, l10nProps) {
this.success(l10n.get(messageId, l10nProps));
}
model: NotificationModel
});
return {
NotificationCollection: NotificationCollection,
NotificationModel: NotificationModel
};
})(navigator.mozL10n || document.mozL10n);
})();

View File

@ -5,6 +5,9 @@
var loop = loop || {};
loop.store = loop.store || {};
/**
* Manages the different cursors' events being exchanged between the parts.
*/
loop.store.RemoteCursorStore = (function() {
"use strict";
@ -15,6 +18,7 @@ loop.store.RemoteCursorStore = (function() {
*/
var RemoteCursorStore = loop.store.createStore({
actions: [
"sendCursorData",
"receivedCursorData",
"videoDimensionsChanged",
"videoScreenStreamChanged"
@ -36,7 +40,9 @@ loop.store.RemoteCursorStore = (function() {
}
this._sdkDriver = options.sdkDriver;
loop.subscribe("CursorPositionChange", this._cursorPositionChangeListener.bind(this));
loop.subscribe("CursorPositionChange",
this._cursorPositionChangeListener.bind(this));
},
/**
@ -52,13 +58,13 @@ loop.store.RemoteCursorStore = (function() {
/**
* Sends cursor position through the sdk.
*
* @param {Object} event An object containing the cursor position and stream dimensions
* It should contains:
* @param {Object} event An object containing the cursor position and
* stream dimensions. It should contain:
* - ratioX: Left position. Number between 0 and 1.
* - ratioY: Top position. Number between 0 and 1.
*/
_cursorPositionChangeListener: function(event) {
this._sdkDriver.sendCursorMessage({
this.sendCursorData({
ratioX: event.ratioX,
ratioY: event.ratioY,
type: CURSOR_MESSAGE_TYPES.POSITION
@ -66,14 +72,32 @@ loop.store.RemoteCursorStore = (function() {
},
/**
* Receives cursor data.
* Sends the cursor data to the SDK for broadcasting.
*
* @param {sharedActions.SendCursorData}
* actionData Contains the updated information for the cursor's position
* {
* ratioX {[0-1]} Cursor's position on the X axis
* ratioY {[0-1]} Cursor's position on the Y axis
* type {String} Type of the data being sent
* }
*/
sendCursorData: function(actionData) {
switch (actionData.type) {
case CURSOR_MESSAGE_TYPES.POSITION:
this._sdkDriver.sendCursorMessage(actionData);
break;
}
},
/**
* Receives cursor data and updates the store.
*
* @param {sharedActions.receivedCursorData} actionData
*/
receivedCursorData: function(actionData) {
switch (actionData.type) {
case CURSOR_MESSAGE_TYPES.POSITION:
// TODO: handle cursor position if it's desktop instead of standalone
this.setStoreState({
remoteCursorPosition: {
ratioX: actionData.ratioX,
@ -103,8 +127,10 @@ loop.store.RemoteCursorStore = (function() {
},
/**
* Listen to screen stream changes.
*
* Listen to screen stream changes. Because the cursor's position is likely
* to be different respect to the new screen size, it's better to delete the
* previous position and keep waiting for the next one.
* @param {sharedActions.VideoScreenStreamChanged} actionData
*/
videoScreenStreamChanged: function(actionData) {

View File

@ -6,7 +6,19 @@
var loop = loop || {};
loop.shared = loop.shared || {};
var inChrome = typeof Components != "undefined" && "utils" in Components;
var inChrome = typeof Components != "undefined" &&
"utils" in Components;
// The slideshow is special, and currently loads with chrome privs, but
// needs to use this module like the rest of the content does. Once we make
// it load remotely, this can go away.
if (inChrome) {
if (typeof window != "undefined" &&
window.location.href === "chrome://loop/content/panels/slideshow.html") {
inChrome = false;
}
}
(function() {
"use strict";
@ -191,6 +203,13 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
return "blackberry";
}
// Checks if the platform is Android. Due to the difficulties of detecting an
// android device, we need to rely on window.navigator.userAgent instead of
// using window.navigator.platform.
if (rootNavigator.userAgent.toLowerCase().indexOf("android") > -1) {
return "android";
}
return null;
}

View File

@ -47,14 +47,14 @@ loop.shared.views = function (_, mozL10n) {
* - {String} scope Media scope, can be "local" or "remote".
* - {String} type Media type, can be "audio" or "video".
* - {Function} action Function to be executed on click.
* - {Enabled} enabled Stream activation status (default: true).
* - {Bool} muted Stream activation status (default: false).
*/
var MediaControlButton = React.createClass({
displayName: "MediaControlButton",
propTypes: {
action: React.PropTypes.func.isRequired,
enabled: React.PropTypes.bool.isRequired,
muted: React.PropTypes.bool.isRequired,
scope: React.PropTypes.string.isRequired,
title: React.PropTypes.string,
type: React.PropTypes.string.isRequired,
@ -62,7 +62,7 @@ loop.shared.views = function (_, mozL10n) {
},
getDefaultProps: function () {
return { enabled: true, visible: true };
return { muted: false, visible: true };
},
handleClick: function () {
@ -77,7 +77,7 @@ loop.shared.views = function (_, mozL10n) {
"media-control": true,
"transparent-button": true,
"local-media": this.props.scope === "local",
"muted": !this.props.enabled,
"muted": this.props.muted,
"hide": !this.props.visible
};
classesObj["btn-mute-" + this.props.type] = true;
@ -89,7 +89,7 @@ loop.shared.views = function (_, mozL10n) {
return this.props.title;
}
var prefix = this.props.enabled ? "mute" : "unmute";
var prefix = this.props.muted ? "unmute" : "mute";
var suffix = this.props.type === "video" ? "button_title2" : "button_title";
var msgId = [prefix, this.props.scope, this.props.type, suffix].join("_");
return mozL10n.get(msgId);
@ -126,7 +126,6 @@ loop.shared.views = function (_, mozL10n) {
audio: React.PropTypes.object.isRequired,
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired,
hangup: React.PropTypes.func.isRequired,
publishStream: React.PropTypes.func.isRequired,
showHangup: React.PropTypes.bool,
video: React.PropTypes.object.isRequired
},
@ -135,14 +134,6 @@ loop.shared.views = function (_, mozL10n) {
this.props.hangup();
},
handleToggleVideo: function () {
this.props.publishStream("video", !this.props.video.enabled);
},
handleToggleAudio: function () {
this.props.publishStream("audio", !this.props.audio.enabled);
},
componentDidMount: function () {
this.userActivity = false;
this.startIdleCountDown();
@ -230,20 +221,56 @@ loop.shared.views = function (_, mozL10n) {
React.createElement(
"div",
{ className: mediaButtonGroupCssClasses },
React.createElement(MediaControlButton, { action: this.handleToggleVideo,
enabled: this.props.video.enabled,
scope: "local", type: "video",
visible: this.props.video.visible }),
React.createElement(MediaControlButton, { action: this.handleToggleAudio,
enabled: this.props.audio.enabled,
scope: "local", type: "audio",
visible: this.props.audio.visible })
React.createElement(VideoMuteButton, { dispatcher: this.props.dispatcher,
muted: !this.props.video.enabled }),
React.createElement(AudioMuteButton, { dispatcher: this.props.dispatcher,
muted: !this.props.audio.enabled })
)
)
);
}
});
var AudioMuteButton = React.createClass({
displayName: "AudioMuteButton",
propTypes: {
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher),
muted: React.PropTypes.bool.isRequired
},
toggleAudio: function () {
this.props.dispatcher.dispatch(new sharedActions.SetMute({ type: "audio", enabled: this.props.muted }));
},
render: function () {
return React.createElement(MediaControlButton, { action: this.toggleAudio,
muted: this.props.muted,
scope: "local",
type: "audio" });
}
});
var VideoMuteButton = React.createClass({
displayName: "VideoMuteButton",
propTypes: {
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher),
muted: React.PropTypes.bool.isRequired
},
toggleVideo: function () {
this.props.dispatcher.dispatch(new sharedActions.SetMute({ type: "video", enabled: this.props.muted }));
},
render: function () {
return React.createElement(MediaControlButton, { action: this.toggleVideo,
muted: this.props.muted,
scope: "local",
type: "video" });
}
});
/**
* Notification view.
*/
@ -633,11 +660,13 @@ loop.shared.views = function (_, mozL10n) {
mixins: [React.addons.PureRenderMixin],
propTypes: {
cursorStore: React.PropTypes.instanceOf(loop.store.RemoteCursorStore),
dispatcher: React.PropTypes.object,
displayAvatar: React.PropTypes.bool.isRequired,
isLoading: React.PropTypes.bool.isRequired,
mediaType: React.PropTypes.string.isRequired,
posterUrl: React.PropTypes.string,
shouldRenderRemoteCursor: React.PropTypes.bool,
shareCursor: React.PropTypes.bool,
// Expecting "local" or "remote".
srcMediaElement: React.PropTypes.object
},
@ -653,7 +682,7 @@ loop.shared.views = function (_, mozL10n) {
this.attachVideo(this.props.srcMediaElement);
}
if (this.props.shouldRenderRemoteCursor) {
if (this.props.shareCursor) {
this.handleVideoDimensions();
window.addEventListener("resize", this.handleVideoDimensions);
}
@ -661,12 +690,13 @@ loop.shared.views = function (_, mozL10n) {
componentWillUnmount: function () {
var videoElement = this.getDOMNode().querySelector("video");
if (!this.props.shouldRenderRemoteCursor || !videoElement) {
if (!this.props.shareCursor || !videoElement) {
return;
}
window.removeEventListener("resize", this.handleVideoDimensions);
videoElement.removeEventListener("loadeddata", this.handleVideoDimensions);
videoElement.removeEventListener("mousemove", this.handleMousemove);
},
componentDidUpdate: function () {
@ -689,6 +719,42 @@ loop.shared.views = function (_, mozL10n) {
});
},
MIN_CURSOR_DELTA: 3,
MIN_CURSOR_INTERVAL: 100,
lastCursorTime: 0,
lastCursorX: -1,
lastCursorY: -1,
handleMouseMove: function (event) {
// Only update every so often.
var now = Date.now();
if (now - this.lastCursorTime < this.MIN_CURSOR_INTERVAL) {
return;
}
this.lastCursorTime = now;
var storeState = this.props.cursorStore.getStoreState();
var deltaX = event.clientX - storeState.videoLetterboxing.left;
var deltaY = event.clientY - storeState.videoLetterboxing.top;
// Skip the update if cursor is out of bounds
if (deltaX < 0 || deltaX > storeState.streamVideoWidth || deltaY < 0 || deltaY > storeState.streamVideoHeight ||
// or the cursor didn't move the minimum.
Math.abs(deltaX - this.lastCursorX) < this.MIN_CURSOR_DELTA && Math.abs(deltaY - this.lastCursorY) < this.MIN_CURSOR_DELTA) {
return;
}
this.lastCursorX = deltaX;
this.lastCursorY = deltaY;
this.props.dispatcher.dispatch(new sharedActions.SendCursorData({
ratioX: deltaX / storeState.streamVideoWidth,
ratioY: deltaY / storeState.streamVideoHeight,
type: loop.shared.utils.CURSOR_MESSAGE_TYPES.POSITION
}));
},
/**
* Attaches a video stream from a donor video element to this component's
* video element if the component is displaying one.
@ -706,16 +772,16 @@ loop.shared.views = function (_, mozL10n) {
}
var videoElement = this.getDOMNode().querySelector("video");
if (this.props.shouldRenderRemoteCursor) {
videoElement.addEventListener("loadeddata", this.handleVideoDimensions);
}
if (!videoElement || videoElement.tagName.toLowerCase() !== "video") {
// Must be displaying the avatar view, so don't try and attach video.
return;
}
if (this.props.shareCursor) {
videoElement.addEventListener("loadeddata", this.handleVideoDimensions);
videoElement.addEventListener("mousemove", this.handleMouseMove);
}
// Set the src of our video element
var attrName = "";
if ("srcObject" in videoElement) {
@ -736,6 +802,7 @@ loop.shared.views = function (_, mozL10n) {
if (videoElement[attrName] !== srcMediaElement[attrName]) {
videoElement[attrName] = srcMediaElement[attrName];
}
videoElement.play();
},
@ -769,7 +836,7 @@ loop.shared.views = function (_, mozL10n) {
return React.createElement(
"div",
{ className: "remote-video-box" },
this.state.videoElementSize && this.props.shouldRenderRemoteCursor ? React.createElement(RemoteCursorView, {
this.state.videoElementSize && this.props.shareCursor ? React.createElement(RemoteCursorView, {
videoElementSize: this.state.videoElementSize }) : null,
React.createElement("video", _extends({}, optionalProps, {
className: this.props.mediaType + "-video",
@ -783,6 +850,7 @@ loop.shared.views = function (_, mozL10n) {
propTypes: {
children: React.PropTypes.node,
cursorStore: React.PropTypes.instanceOf(loop.store.RemoteCursorStore).isRequired,
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired,
displayScreenShare: React.PropTypes.bool.isRequired,
isLocalLoading: React.PropTypes.bool.isRequired,
@ -903,11 +971,13 @@ loop.shared.views = function (_, mozL10n) {
"div",
{ className: screenShareStreamClasses },
React.createElement(MediaView, {
cursorStore: this.props.cursorStore,
dispatcher: this.props.dispatcher,
displayAvatar: false,
isLoading: this.props.isScreenShareLoading,
mediaType: "screen-share",
posterUrl: this.props.screenSharePosterUrl,
shouldRenderRemoteCursor: true,
shareCursor: true,
srcMediaElement: this.props.screenShareMediaElement }),
this.props.displayScreenShare ? this.props.children : null
),
@ -931,10 +1001,7 @@ loop.shared.views = function (_, mozL10n) {
},
getInitialState: function () {
return {
realVideoSize: null,
videoLetterboxing: null
};
return this.getStoreState();
},
componentWillMount: function () {
@ -963,7 +1030,7 @@ loop.shared.views = function (_, mozL10n) {
if (!this.state.videoLetterboxing) {
// If this is the first time we receive the event, we must calculate the
// video letterboxing.
this._calculateVideoLetterboxing();
this._calculateVideoLetterboxing(nextState.realVideoSize);
return;
}
@ -992,7 +1059,7 @@ loop.shared.views = function (_, mozL10n) {
var streamVideoHeight = isWider ? clientHeight : clientWidth / realVideoRatio;
var streamVideoWidth = isWider ? clientHeight * realVideoRatio : clientWidth;
this.setState({
this.getStore().setStoreState({
videoLetterboxing: {
left: (clientWidth - streamVideoWidth) / 2,
top: (clientHeight - streamVideoHeight) / 2
@ -1028,17 +1095,20 @@ loop.shared.views = function (_, mozL10n) {
});
return {
AudioMuteButton: AudioMuteButton,
AvatarView: AvatarView,
Button: Button,
ButtonGroup: ButtonGroup,
Checkbox: Checkbox,
ContextUrlView: ContextUrlView,
ConversationToolbar: ConversationToolbar,
HangUpControlButton: HangUpControlButton,
MediaControlButton: MediaControlButton,
MediaLayoutView: MediaLayoutView,
MediaView: MediaView,
LoadingView: LoadingView,
NotificationListView: NotificationListView,
RemoteCursorView: RemoteCursorView
RemoteCursorView: RemoteCursorView,
VideoMuteButton: VideoMuteButton
};
}(_, navigator.mozL10n || document.mozL10n);

View File

@ -68,6 +68,10 @@ describe("loop.store.ActiveRoomStore", function() {
store = new loop.store.ActiveRoomStore(dispatcher, {
sdkDriver: fakeSdkDriver
});
sandbox.stub(document.mozL10n ? document.mozL10n : navigator.mozL10n, "get", function(x) {
return x;
});
});
afterEach(function() {
@ -1003,7 +1007,7 @@ describe("loop.store.ActiveRoomStore", function() {
store.gotMediaPermission();
sinon.assert.calledOnce(requestStubs["Rooms:Join"]);
sinon.assert.calledWith(requestStubs["Rooms:Join"], "tokenFake");
sinon.assert.calledWith(requestStubs["Rooms:Join"], "tokenFake", "display_name_guest");
});
it("should dispatch `JoinedRoom` on success", function() {

View File

@ -43,6 +43,7 @@
<!-- App scripts -->
<script src="/shared/js/loopapi-client.js"></script>
<script src="/shared/js/utils.js"></script>
<script src="/shared/js/urlRegExps.js"></script>
<script src="/shared/js/models.js"></script>
<script src="/shared/js/mixins.js"></script>
<script src="/shared/js/crypto.js"></script>
@ -50,31 +51,33 @@
<script src="/shared/js/actions.js"></script>
<script src="/shared/js/dispatcher.js"></script>
<script src="/shared/js/otSdkDriver.js"></script>
<!-- Stores need to be loaded before the views that uses them -->
<script src="/shared/js/store.js"></script>
<script src="/shared/js/activeRoomStore.js"></script>
<script src="/shared/js/views.js"></script>
<script src="/shared/js/textChatStore.js"></script>
<script src="/shared/js/textChatView.js"></script>
<script src="/shared/js/urlRegExps.js"></script>
<script src="/shared/js/linkifiedTextView.js"></script>
<script src="/shared/js/remoteCursorStore.js"></script>
<!-- Views -->
<script src="/shared/js/views.js"></script>
<script src="/shared/js/textChatView.js"></script>
<script src="/shared/js/linkifiedTextView.js"></script>
<!-- Test scripts -->
<script src="models_test.js"></script>
<script src="mixins_test.js"></script>
<script src="utils_test.js"></script>
<script src="crypto_test.js"></script>
<script src="views_test.js"></script>
<script src="validate_test.js"></script>
<script src="dispatcher_test.js"></script>
<script src="activeRoomStore_test.js"></script>
<script src="otSdkDriver_test.js"></script>
<script src="store_test.js"></script>
<script src="activeRoomStore_test.js"></script>
<script src="textChatStore_test.js"></script>
<script src="remoteCursorStore_test.js"></script>
<script src="views_test.js"></script>
<script src="textChatView_test.js"></script>
<script src="linkifiedTextView_test.js"></script>
<script src="loopapi-client_test.js"></script>
<script src="remoteCursorStore_test.js"></script>
<script>
LoopMochaUtils.addErrorCheckingTests();

View File

@ -1,80 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
describe("loop.shared.models", function() {
"use strict";
var expect = chai.expect;
var l10n = navigator.mozL10n || document.mozL10n;
var sharedModels = loop.shared.models;
var sandbox;
beforeEach(function() {
sandbox = sinon.sandbox.create();
});
afterEach(function() {
sandbox.restore();
});
describe("NotificationCollection", function() {
var collection;
beforeEach(function() {
collection = new sharedModels.NotificationCollection();
sandbox.stub(l10n, "get", function(x, y) {
return "translated:" + x + (y ? ":" + y : "");
});
});
describe("#warn", function() {
it("should add a warning notification to the stack", function() {
collection.warn("watch out");
expect(collection).to.have.length.of(1);
expect(collection.at(0).get("level")).eql("warning");
expect(collection.at(0).get("message")).eql("watch out");
});
});
describe("#warnL10n", function() {
it("should warn using a l10n string id", function() {
collection.warnL10n("fakeId");
expect(collection).to.have.length.of(1);
expect(collection.at(0).get("level")).eql("warning");
expect(collection.at(0).get("message")).eql("translated:fakeId");
});
});
describe("#error", function() {
it("should add an error notification to the stack", function() {
collection.error("wrong");
expect(collection).to.have.length.of(1);
expect(collection.at(0).get("level")).eql("error");
expect(collection.at(0).get("message")).eql("wrong");
});
});
describe("#errorL10n", function() {
it("should notify an error using a l10n string id", function() {
collection.errorL10n("fakeId");
expect(collection).to.have.length.of(1);
expect(collection.at(0).get("level")).eql("error");
expect(collection.at(0).get("message")).eql("translated:fakeId");
});
it("should notify an error using a l10n string id + l10n properties",
function() {
collection.errorL10n("fakeId", "fakeProp");
expect(collection).to.have.length.of(1);
expect(collection.at(0).get("level")).eql("error");
expect(collection.at(0).get("message")).eql("translated:fakeId:fakeProp");
});
});
});
});

View File

@ -66,7 +66,52 @@ describe("loop.store.RemoteCursorStore", function() {
});
});
describe("#sendCursorData", function() {
it("should do nothing if not a proper event", function() {
var fakeData = {
ratioX: 10,
ratioY: 10,
type: "not-a-position-event"
};
store.sendCursorData(new sharedActions.SendCursorData(fakeData));
sinon.assert.notCalled(fakeSdkDriver.sendCursorMessage);
});
it("should send cursor data through the sdk", function() {
var fakeData = {
ratioX: 10,
ratioY: 10,
type: CURSOR_MESSAGE_TYPES.POSITION
};
store.sendCursorData(new sharedActions.SendCursorData(fakeData));
sinon.assert.calledOnce(fakeSdkDriver.sendCursorMessage);
sinon.assert.calledWith(fakeSdkDriver.sendCursorMessage, {
name: "sendCursorData",
type: fakeData.type,
ratioX: fakeData.ratioX,
ratioY: fakeData.ratioY
});
});
});
describe("#receivedCursorData", function() {
it("should do nothing if not a proper event", function() {
sandbox.stub(store, "setStoreState");
store.receivedCursorData(new sharedActions.ReceivedCursorData({
ratioX: 10,
ratioY: 10,
type: "not-a-position-event"
}));
sinon.assert.notCalled(store.setStoreState);
});
it("should save the state", function() {
store.receivedCursorData(new sharedActions.ReceivedCursorData({
type: CURSOR_MESSAGE_TYPES.POSITION,

View File

@ -50,7 +50,7 @@ describe("loop.shared.views", function() {
scope: "local",
type: "audio",
action: function() {},
enabled: true
muted: false
}));
expect(comp.getDOMNode().classList.contains("muted")).eql(false);
@ -62,7 +62,7 @@ describe("loop.shared.views", function() {
scope: "local",
type: "audio",
action: function() {},
enabled: false
muted: true
}));
expect(comp.getDOMNode().classList.contains("muted")).eql(true);
@ -74,7 +74,7 @@ describe("loop.shared.views", function() {
scope: "local",
type: "video",
action: function() {},
enabled: true
muted: false
}));
expect(comp.getDOMNode().classList.contains("muted")).eql(false);
@ -86,15 +86,123 @@ describe("loop.shared.views", function() {
scope: "local",
type: "video",
action: function() {},
enabled: false
muted: true
}));
expect(comp.getDOMNode().classList.contains("muted")).eql(true);
});
});
describe("AudioMuteButton", function() {
it("should set the muted class when not enabled", function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.AudioMuteButton, {
muted: true
}));
var node = comp.getDOMNode();
expect(node.classList.contains("muted")).eql(true);
});
it("should not set the muted class when enabled", function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.AudioMuteButton, {
muted: false
}));
var node = comp.getDOMNode();
expect(node.classList.contains("muted")).eql(false);
});
it("should dispatch SetMute('audio', false) if clicked when audio is disabled",
function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.AudioMuteButton, {
dispatcher: dispatcher,
muted: false
}));
TestUtils.Simulate.click(comp.getDOMNode());
sinon.assert.calledOnce(dispatcher.dispatch);
sinon.assert.calledWithExactly(dispatcher.dispatch,
new sharedActions.SetMute({ type: "audio", enabled: false })
);
});
it("should dispatch SetMute('audio', true) if clicked when audio is enabled",
function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.AudioMuteButton, {
dispatcher: dispatcher,
muted: true
}));
TestUtils.Simulate.click(comp.getDOMNode());
sinon.assert.calledOnce(dispatcher.dispatch);
sinon.assert.calledWithExactly(dispatcher.dispatch,
new sharedActions.SetMute({ type: "audio", enabled: true })
);
});
});
describe("VideoMuteButton", function() {
it("should set the muted class when not enabled", function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.VideoMuteButton, {
muted: true
}));
var node = comp.getDOMNode();
expect(node.classList.contains("muted")).eql(true);
});
it("should not set the muted class when enabled", function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.VideoMuteButton, {
muted: false
}));
var node = comp.getDOMNode();
expect(node.classList.contains("muted")).eql(false);
});
it("should dispatch SetMute('audio', false) if clicked when audio is disabled",
function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.VideoMuteButton, {
dispatcher: dispatcher,
muted: false
}));
TestUtils.Simulate.click(comp.getDOMNode());
sinon.assert.calledOnce(dispatcher.dispatch);
sinon.assert.calledWithExactly(dispatcher.dispatch,
new sharedActions.SetMute({ type: "video", enabled: false })
);
});
it("should dispatch SetMute('audio', true) if clicked when audio is enabled",
function() {
var comp = TestUtils.renderIntoDocument(
React.createElement(sharedViews.VideoMuteButton, {
dispatcher: dispatcher,
muted: true
}));
TestUtils.Simulate.click(comp.getDOMNode());
sinon.assert.calledOnce(dispatcher.dispatch);
sinon.assert.calledWithExactly(dispatcher.dispatch,
new sharedActions.SetMute({ type: "video", enabled: true })
);
});
});
describe("ConversationToolbar", function() {
var hangup, publishStream;
var hangup;
function mountTestComponent(props) {
props = _.extend({
@ -106,14 +214,12 @@ describe("loop.shared.views", function() {
beforeEach(function() {
hangup = sandbox.stub();
publishStream = sandbox.stub();
});
it("should start no idle", function() {
var comp = mountTestComponent({
hangupButtonLabel: "foo",
hangup: hangup,
publishStream: publishStream
hangup: hangup
});
expect(comp.getDOMNode().classList.contains("idle")).eql(false);
});
@ -121,8 +227,7 @@ describe("loop.shared.views", function() {
it("should be on idle state after 6 seconds", function() {
var comp = mountTestComponent({
hangupButtonLabel: "foo",
hangup: hangup,
publishStream: publishStream
hangup: hangup
});
expect(comp.getDOMNode().classList.contains("idle")).eql(false);
@ -133,8 +238,7 @@ describe("loop.shared.views", function() {
it("should remove idle state when the user moves the mouse", function() {
var comp = mountTestComponent({
hangupButtonLabel: "foo",
hangup: hangup,
publishStream: publishStream
hangup: hangup
});
clock.tick(6001);
@ -148,8 +252,7 @@ describe("loop.shared.views", function() {
it("should accept a showHangup optional prop", function() {
var comp = mountTestComponent({
showHangup: false,
hangup: hangup,
publishStream: publishStream
hangup: hangup
});
expect(comp.getDOMNode().querySelector(".btn-hangup-entry")).to.eql(null);
@ -158,7 +261,6 @@ describe("loop.shared.views", function() {
it("should hangup when hangup button is clicked", function() {
var comp = mountTestComponent({
hangup: hangup,
publishStream: publishStream,
audio: { enabled: true }
});
@ -168,62 +270,6 @@ describe("loop.shared.views", function() {
sinon.assert.calledOnce(hangup);
sinon.assert.calledWithExactly(hangup);
});
it("should unpublish audio when audio mute btn is clicked", function() {
var comp = mountTestComponent({
hangup: hangup,
publishStream: publishStream,
audio: { enabled: true }
});
TestUtils.Simulate.click(
comp.getDOMNode().querySelector(".btn-mute-audio"));
sinon.assert.calledOnce(publishStream);
sinon.assert.calledWithExactly(publishStream, "audio", false);
});
it("should publish audio when audio mute btn is clicked", function() {
var comp = mountTestComponent({
hangup: hangup,
publishStream: publishStream,
audio: { enabled: false }
});
TestUtils.Simulate.click(
comp.getDOMNode().querySelector(".btn-mute-audio"));
sinon.assert.calledOnce(publishStream);
sinon.assert.calledWithExactly(publishStream, "audio", true);
});
it("should unpublish video when video mute btn is clicked", function() {
var comp = mountTestComponent({
hangup: hangup,
publishStream: publishStream,
video: { enabled: true }
});
TestUtils.Simulate.click(
comp.getDOMNode().querySelector(".btn-mute-video"));
sinon.assert.calledOnce(publishStream);
sinon.assert.calledWithExactly(publishStream, "video", false);
});
it("should publish video when video mute btn is clicked", function() {
var comp = mountTestComponent({
hangup: hangup,
publishStream: publishStream,
video: { enabled: false }
});
TestUtils.Simulate.click(
comp.getDOMNode().querySelector(".btn-mute-video"));
sinon.assert.calledOnce(publishStream);
sinon.assert.calledWithExactly(publishStream, "video", true);
});
});
describe("NotificationListView", function() {
@ -518,6 +564,7 @@ describe("loop.shared.views", function() {
describe("MediaView", function() {
var view;
var remoteCursorStore;
function mountTestComponent(props) {
props = _.extend({
@ -527,6 +574,13 @@ describe("loop.shared.views", function() {
React.createElement(sharedViews.MediaView, props));
}
beforeEach(function() {
remoteCursorStore = new loop.store.RemoteCursorStore(dispatcher, {
sdkDriver: {}
});
loop.store.StoreMixin.register({ remoteCursorStore: remoteCursorStore });
});
it("should display an avatar view", function() {
view = mountTestComponent({
displayAvatar: true,
@ -580,13 +634,14 @@ describe("loop.shared.views", function() {
// We test this function by itself, as otherwise we'd be into creating fake
// streams etc.
describe("#attachVideo", function() {
var fakeViewElement, fakeVideoElement;
var fakeViewElement,
fakeVideoElement;
beforeEach(function() {
fakeVideoElement = {
play: sinon.stub(),
tagName: "VIDEO",
addEventListener: function() {}
addEventListener: sinon.stub()
};
fakeViewElement = {
@ -597,8 +652,10 @@ describe("loop.shared.views", function() {
};
view = mountTestComponent({
cursorStore: remoteCursorStore,
displayAvatar: false,
mediaType: "local",
shareCursor: true,
srcMediaElement: {
fake: 1
}
@ -616,7 +673,8 @@ describe("loop.shared.views", function() {
tagName: "DIV",
querySelector: function() {
return {
tagName: "DIV"
tagName: "DIV",
addEventListener: sinon.stub()
};
}
});
@ -638,6 +696,18 @@ describe("loop.shared.views", function() {
expect(fakeVideoElement.srcObject).eql({ fake: 1 });
});
it("should attach events to the video", function() {
fakeVideoElement.srcObject = null;
sinon.stub(view, "getDOMNode").returns(fakeViewElement);
view.attachVideo({
src: { fake: 1 }
});
sinon.assert.calledTwice(fakeVideoElement.addEventListener);
sinon.assert.calledWith(fakeVideoElement.addEventListener, "loadeddata");
sinon.assert.calledWith(fakeVideoElement.addEventListener, "mousemove");
});
it("should attach a video object for Firefox", function() {
fakeVideoElement.mozSrcObject = null;
@ -705,10 +775,13 @@ describe("loop.shared.views", function() {
});
describe("MediaLayoutView", function() {
var textChatStore, view;
var textChatStore,
remoteCursorStore,
view;
function mountTestComponent(extraProps) {
var defaultProps = {
cursorStore: remoteCursorStore,
dispatcher: dispatcher,
displayScreenShare: false,
isLocalLoading: false,
@ -730,6 +803,9 @@ describe("loop.shared.views", function() {
textChatStore = new loop.store.TextChatStore(dispatcher, {
sdkDriver: {}
});
remoteCursorStore = new loop.store.RemoteCursorStore(dispatcher, {
sdkDriver: {}
});
loop.store.StoreMixin.register({ textChatStore: textChatStore });
});

View File

@ -26,19 +26,41 @@ sign_in_again_button=Daxil ol
sign_in_again_use_as_guest_button2={{clientSuperShortname}} səyyahını Qonaq kimi işlət
panel_browse_with_friend_button=Bu səhifəni yoldaşınla gəz
panel_stop_sharing_tabs_button=Vərəqlərinizi paylaşmağı durdurun
panel_disconnect_button=Ayrıl
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Web səhifələri yoldaşlarınızla birlikdə gəzmək üçün Hello düyməsinə klikləyin.
first_time_experience_subheading_button_above=Web səhifələri yoldaşlarınızla birlikdə gəzmək üçün yuxarıdakı düyməyə klikləyin.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Birlikdə planlayın, işləyin, əylənin.
first_time_experience_content2=İşləri birlikdə görmək üçün işlədin: planlayın, gülün, işləyin.
first_time_experience_button_label2=Necə işlədiyini görün
## First Time Experience Slides
fte_slide_1_title=Web səhifələrini yoldaşlarınızla birlikdə gəzin
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=İstər səyahət planlayın, istərsə də hədiyyə alın, {{clientShortname2}} daha tez seçim etməyinizə kömək edəcək.
fte_slide_2_title=Eyni səhifədə olun
fte_slide_2_copy=Daxili yazı və video söhbəti işlədərək fikirləri paylaşın, seçimləri qarşılaşdırın və razılığa gəlin.
fte_slide_3_title=Keçid göndərməklə yoldaşınızı dəvət edin
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} əksər masaüstü səyyahları ilə işləyir. Hesabın olması vacib deyil və hər kəs pulsuz qoşula bilər.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Başlamaq üçün {{clientSuperShortname}} ikonunu tapın
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Müzakirə etmək istədiyiniz səhifəni tapdığınızda keçidi yaratmaq üçün {{brandShortname}} səyyahındakı ikona klikləyin. Daha sonra istədiyiniz yöntəmlə yoldaşınıza göndərin!
invite_header_text_bold=Birilərini bu səhifəyi sizinlə gəzməyə dəvət edin!
invite_header_text_bold2=Yoldaşınızı sizə qoşulmağa dəvət edin!
invite_header_text3=Firefox Hello-nu işlətmək 2 addımdan ibarətdir, yoldaşınıza keçidi göndərin və Web-də bərabər səyahət edin!
invite_header_text4=Keçidi paylaşın və Web-i birlikdə gəzməyə başlayın.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Keçidi e-poçtla göndər
invite_facebook_button3=Facebook
invite_your_link=Keçidiniz:
# Status text
display_name_guest=Qonaq
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,29 +200,16 @@ door_hanger_button=Tamam
# Infobar strings
infobar_screenshare_no_guest_message=Yoldaşınız daxil olduqda üzərinə kliklədiyiniz hər bir vərəqi görəcəklər.
infobar_screenshare_browser_message2=Vərəqlərinizi paylaşırsınız. Üzərinə kliklədiyiniz hər vərəq yoldaşlarınız tərəfindən görünəcək
infobar_screenshare_paused_browser_message=Vərəq paylaşımına fasilə verildi
infobar_button_gotit_label=Bildin!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Fasilə ver
infobar_button_pause_accesskey=P
infobar_button_restart_label=Yenidən başlat
infobar_screenshare_browser_message3=Artıq vərəqlərinizi paylaşırsınız. Yoldaşınız üzərinə kliklədiyiniz hər bir vərəqi görə biləcək.
infobar_screenshare_stop_sharing_message=Artıq vərəqlərinizi paylaşmırsınız
infobar_button_restart_label2=Paylaşmanı yenidən başlat
infobar_button_restart_accesskey=e
infobar_button_resume_label=Davam et
infobar_button_resume_accesskey=R
infobar_button_stop_label=Dayandır
infobar_button_stop_label2=Paylaşmanı dayandır
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Bunu bir daha göstərmə
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Hələlik söhbət yoxdur.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Yenisini başlat!
infobar_button_disconnect_label=Ayrıl
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,10 +252,13 @@ rooms_room_full_call_to_action_label={{clientShortname}} haqqında ətraflı öy
rooms_room_full_call_to_action_nonFx_label=Öz söhbətinizi başlatmaq üçün {{brandShortname}} endirin
rooms_room_full_label=Bu söhbətdə artıq 2 nəfər var.
rooms_room_join_label=Söhbətə qoşul
rooms_room_joined_label=Kimsə söhbətə qoşuldu!
rooms_room_joined_owner_connected_label2=Yoldaşınız artıq qoşuludur və vərəqlərinizi görə biləcəklər.
rooms_room_joined_owner_not_connected_label=Yoldaşınız {{roomURLHostname}} ünvanını sizində gəzmək üçün gözləyir.
self_view_hidden_message=Özünü göstərmə gizlədilib amma hələ də göndərilir. göstərmək üçün pəncərə ölçülərini dəyişin
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} sizin ölkədə icazə verilmir.
display_name_guest=Qonaq

View File

@ -4,6 +4,7 @@
# Panel Strings
clientSuperShortname=Hello
## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
@ -15,28 +16,39 @@
## and this is displayed in slightly larger font. Please arrange as necessary for
## your locale.
## {{clientShortname2}} will be replaced by the brand name for either string.
sign_in_again_button=Вписване
## LOCALIZATION_NOTE(sign_in_again_use_as_guest_button2): {{clientSuperShortname}}
## will be replaced by the super short brandname.
panel_disconnect_button=Изключване
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
## First Time Experience Slides
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
# Status text
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
## LOCALIZATION NOTE(retry_button): Displayed when there is an error to retry
## the appropriate action.
retry_button=Нов опит
## LOCALIZATION NOTE (share_email_body7): In this item, don't translate the
## part between {{..}} and leave the \n\n part alone
@ -97,13 +109,8 @@ hangup_button_caption2=Изход
# Infobar strings
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
infobar_button_disconnect_label=Изключване
infobar_button_disconnect_accesskey=И
# E10s not supported strings
@ -144,10 +151,13 @@ rooms_room_full_call_to_action_label=Научете още за {{clientShortnam
rooms_room_full_call_to_action_nonFx_label=Изтеглете {{brandShortname}}, за да започнете свой
rooms_room_full_label=Вече има двама души в този разговор.
rooms_room_join_label=Включване в разговора
rooms_room_joined_label=Някой се присъедини към разговора!
rooms_room_joined_owner_connected_label2=Ваш приятел е вече свързан и може да вижда подпрозорците ви.
rooms_room_joined_owner_not_connected_label=Ваш приятел ви чака да посетите {{roomURLHostname}} заедно.
self_view_hidden_message=Какво виждат другите е скрито, но се изпраща; преоразмерете прозореца, за да го видите
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} е недостъпен във вашата държава.
display_name_guest=Гост

View File

@ -25,13 +25,37 @@ sign_in_again_button=সাইন ইন
## will be replaced by the super short brandname.
sign_in_again_use_as_guest_button2=অতিথি হিসেবে {{clientSuperShortname}} ব্যবহার করুন
panel_browse_with_friend_button=বন্ধুর সাথে পাতাটি ব্রাউজ করুন।
panel_disconnect_button=বিচ্ছিন্ন
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=বন্ধুর সাথে ওয়েব পেজ ব্রাউজ করতে Hello বোতাম চাপুন।
first_time_experience_subheading_button_above=বন্ধুর সাথে ওয়েব পেজ ব্রাউজ করতে Hello বোতাম চাপুন।
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=একসাথে পরিকল্পনা করতে, কাজ করতে, আনন্দ করতে - এটি ব্যবহার করুন।
first_time_experience_content2=একসাথে পরিকল্পনা করতে, কাজ করতে, আনন্দ করতে - এটি ব্যবহার করুন।
first_time_experience_button_label2=দেখুন এটা কিভাবে কাজ করে
## First Time Experience Slides
fte_slide_1_title=বন্ধুর সাথে পাতাটি ব্রাউজ করুন
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_2_title=একই পাতায় পেতে
fte_slide_2_copy=কোন আইডিয়া শেয়ার করতে, বিকল্পগুলো তুলনা করছে এবং একটি সিধান্তে আসতে বিল্ট-ইন টেক্সট অথবা ভিডিও চ্যাট ব্যবহার করুন।
fte_slide_3_title=লিঙ্ক শেয়ার করে বন্ধুদের আলাপে আমন্ত্রণ জানান
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
invite_header_text_bold=আপনার সাথে এই পাতা ব্রাউজে যোগদানে কাউকে আমন্ত্রণ জানান!
invite_header_text_bold2=কাউকে আমন্ত্রণ জানান আপনার সাথে যোগ দিতে ।
invite_header_text3=ফায়ারফক্স হ্যালো ব্যবহার করতে দুজনের প্রয়োজন হয়, আপনার সাথে ওয়েব ব্রাউজ করতে আপনার বন্ধুকে লিঙ্ক পাঠান।
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -41,18 +65,18 @@ invite_email_link_button=ইমেইল লিঙ্ক
invite_facebook_button3=ফেসবুক
invite_your_link=আপনার লিঙ্ক:
# Status text
display_name_guest=অতিথি
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
session_expired_error_description=সেশন মেয়াদ উত্তীর্ণ হয়েছে। পূর্বে আপনার তৈরী এবং শেয়ারকৃত সকল URLs আর কাজ করবে না।
could_not_authenticate=প্রমাণ করা যায়নি
password_changed_question=আপনি আপনার পাসওয়ার্ড পরিবর্তন করেছিলেন?
try_again_later=অনুগ্রহ করে পরে আবার চেষ্টা করুন
could_not_connect=সার্ভারে সংযোগ করা যাচ্ছেনা
check_internet_connection=আপনার ইন্টারনেট সংযোগ পরীক্ষা করুন
login_expired=আপনার লগইন মেয়াদ উত্তীর্ণ হয়েছে
service_not_available=এই সময়ে পরিষেবা সেবাটি পাওয়া যাচ্ছে না
problem_accessing_account=আপনার অ্যাকাউন্ট ব্যবহার করতে সমস্যা হয়েছে
## LOCALIZATION NOTE(retry_button): Displayed when there is an error to retry
## the appropriate action.
@ -66,6 +90,7 @@ share_email_body7=ফায়ারফক্স হ্যালোতে আপন
## the part between {{..}} and leave the \n\n part alone.
share_email_body_context3=ফায়ারফক্স হ্যালোতে আপনার কোন বন্ধু অপেক্ষা করছে। সংযুক্ত হতে এবং একসাথে {{title}} ব্রাউজ করতে লিঙ্কটি ক্লিক করুনঃ {{callUrl}}
## LOCALIZATION NOTE (share_email_footer2): Common footer content for both email types
share_email_footer2=\n\n____________\nFirefox Hello আপনাকে বন্ধুর সাথে মিলে ওয়েব ব্রাউজ করতে দেয়। এটি ব্যবহার করুন যা কিছু আপনি সম্পন্ন করতে : একত্রে পরিকল্পনা করুন, একত্রে কাজ করুন, একত্রে আনন্দ করুন। আরও জানতে দেখুন http://www.firefox.com/hello
## LOCALIZATION NOTE (share_tweeet): In this item, don't translate the part
## between {{..}}. Please keep the text below 117 characters to make sure it fits
## in a tweet.
@ -127,11 +152,17 @@ call_timeout_notification_text=আপনার কলটি হয়নি।
cancel_button=বাতিল
rejoin_button=আলাপে পুনরায় যুক্ত হন
cannot_start_call_session_not_ready=কলটি শুরু করা যাবে না, সেশন প্রস্তুত নয়।
network_disconnected=আকস্মিকভাবে নেটওয়ার্ক সংযোগটি বিচ্ছিন্ন হয়েছে।
connection_error_see_console_notification=কল ব্যর্থ; বিস্তারিত জানতে কনসোল দেখুন।
no_media_failure_message=কোন ক্যামেরা বা মাইক্রোফোন খুঁজে পাওয়া যায়নি।
ice_failure_message=সংযোগে ব্যর্থ। আপনার ফায়ারওয়াল হয়তো কল ব্লক করছে।
## LOCALIZATION NOTE (legal_text_and_links3): In this item, don't translate the
## parts between {{..}} because these will be replaced with links with the labels
## from legal_text_tos and legal_text_privacy. clientShortname will be replaced
## by the brand name.
legal_text_and_links3={{clientShortname}} ব্যবহার করে অাপনি {{terms_of_use}} অার {{privacy_notice}} সাথে একমত হবেন।
legal_text_tos=ব্যবহারের শর্তাবলী
legal_text_privacy=গোপনীয়তা ঘোষণা
@ -147,23 +178,36 @@ feedback_rejoin_button=পুনরায় যোগ দিন
## LOCALIZATION NOTE (feedback_report_user_button): Used to report a user in the case of
## an abusive user.
feedback_report_user_button=ব্যবহারকারীকে রিপোর্ট করুন
feedback_window_heading=কেমন ছিল আপনার আলাপ?
feedback_request_button=মতামত প্রদান করুন
tour_label=ভ্রমণ
rooms_list_recently_browsed2=সম্প্রতি ব্রাউজকৃত
rooms_list_currently_browsing2=বর্তমানে ব্রাউজরত
rooms_signout_alert=উন্মুক্ত কথোপকথন বন্ধ করে দেওয়া হবে
room_name_untitled_page=শিরোনামহীন পাতা
## LOCALIZATION NOTE (door_hanger_return, door_hanger_prompt_name, door_hanger_button): Dialog message on leaving conversation
door_hanger_return=আবার দেখা হবে! Hello প্যানেলের মাধ্যমে আপনি এই শেয়ারকৃত সেশনে যেকোন সময় ফিরে আসতে পারবেন।
door_hanger_prompt_name=সহজভাবে মনে রাখার জন্য কোনো নাম দিতে চান? বর্তমান নাম:
door_hanger_button=ঠিক আছে
# Infobar strings
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
infobar_screenshare_browser_message2=আপনি আপনার ট্যাব শেয়ার করছেন। যেকোনো ট্যাব ক্লিক করলে তা আপনার বন্ধু দেখতে পারবে।
infobar_screenshare_stop_sharing_message=আপনি আপনার ট্যাব আর শেয়ার করছেন না
infobar_button_restart_label2=শেয়ার করা পুনরায় শুরু করুন
infobar_button_restart_accesskey=R
infobar_button_stop_label2=শেয়ার করা বন্ধ করুন
infobar_button_stop_accesskey=S
infobar_button_disconnect_label=বিচ্ছিন্ন
infobar_button_disconnect_accesskey=D
# E10s not supported strings
e10s_not_supported_button_label=নতুন উইন্ডো খুলুন
e10s_not_supported_subheading={{brandShortname}} মাল্টি-প্রসেস উইন্ডোতে কাজ করে না।
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
@ -201,7 +245,8 @@ rooms_room_full_call_to_action_label={{clientShortname}} সম্বন্ধ
rooms_room_full_call_to_action_nonFx_label=আপনিও শুরু করতে ডাউনলোড করুন {{brandShortname}}
rooms_room_full_label=এই আলাপে ইতিমধ্যে দুইজন ব্যক্তি আছেন।
rooms_room_join_label=আালাপে যোগ দিন
rooms_room_joined_label=কেউ একজন আলাপে যুক্ত হয়েছেন!
rooms_room_joined_owner_connected_label2=আপনার বন্ধু এখন সংযুক্ত হয়েছেন এবং আপনার ট্যাব দেখতে পারবেন।
rooms_room_joined_owner_not_connected_label=আপনার বন্ধু আপনার সাথে {{roomURLHostname}} ব্রাউজ করতে অপেক্ষা করছেন।
self_view_hidden_message=সেলফ-ভিউ লুকানো কিন্তু এখনো ছবি পাঠাবে; দেখাতে উইন্ডোর আকার পরিবর্তন করুন

View File

@ -28,15 +28,26 @@ sign_in_again_use_as_guest_button2=Použít {{clientSuperShortname}} jako host
panel_browse_with_friend_button=Prohlédnout si tuto stránku spolu s přítelem
panel_disconnect_button=Odpojit
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klepněte na tlačítko Hello a prohlížejte si web spolu s přítelem.
first_time_experience_subheading_button_above=Klepněte na tlačítko výše a prohlížejte si web s přítelem.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Použijte jej pro společné plánování, práci i zábavu.
first_time_experience_button_label2=Podívejte se, jak to funguje
## First Time Experience Slides
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
invite_header_text_bold=Pozvěte někoho, kdo bude prohlížet tuto stránku s vámi!
invite_header_text3=K používání Firefox Hello jsou potřeba dva, takže pošlete kamarádovi odkaz, aby si prohlížel web s vámi!
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
@ -48,9 +59,6 @@ invite_email_link_button=Poslat odkaz e-mailem
invite_facebook_button3=Facebook
invite_your_link=Váš odkaz:
# Status text
display_name_guest=Host
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,10 +190,16 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Jakmile se vaší přátelé připojí, budou moci vidět všechny panely, na které klepnete.
infobar_screenshare_browser_message2=Sdílíte své panely. Jakýkoliv panel, na který klepnete, může být viděn vašimi přáteli
infobar_screenshare_browser_message3=Nyní spolu sdílíte své panely. Váš přítel uvidí každý panel, na který klepnete.
infobar_screenshare_stop_sharing_message=Už nadále nesdílíte své panely
infobar_button_restart_label2=Restartovat sdílení
infobar_button_restart_accesskey=e
infobar_button_stop_label2=Zastavit sdílení
infobar_button_stop_accesskey=s
infobar_button_disconnect_label=Odpojit
infobar_button_disconnect_accesskey=O
# E10s not supported strings
@ -198,7 +212,7 @@ e10s_not_supported_subheading={{brandShortname}} nefunguje v multiprocesovém ok
## LOCALIZATION NOTE: In this file, don't translate the part between {{..}}
# Text chat strings
chat_textbox_placeholder=Pište zde
chat_textbox_placeholder=Pište sem
## LOCALIZATION NOTE(clientShortname2): This should not be localized and
## should remain "Firefox Hello" for all locales.
@ -228,7 +242,8 @@ rooms_room_full_call_to_action_label=Zjistit více o {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Stáhněte si {{brandShortname}} a začněte svou vlastní
rooms_room_full_label=V této konverzaci jsou již dvě osoby.
rooms_room_join_label=Připojit ke konverzaci
rooms_room_joined_label=Někdo se připojil ke konverzaci!
rooms_room_joined_owner_connected_label2=Váš přítel je nyní připojen a může tak vidět vaše panely.
rooms_room_joined_owner_not_connected_label=Váš přítel čeká na prohlížení s vámi v místnosti {{roomURLHostname}}.
self_view_hidden_message=Váš obraz byl skryt, ale je nadále odesílán; pro jeho zobrazení změňte velikost okna

View File

@ -10,7 +10,7 @@ clientSuperShortname=Hello
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
## use "..." if \u2026 doesn't suit traditions in your locale.
loopMenuItem_label=Start en samtale…
loopMenuItem_accesskey=t
loopMenuItem_accesskey=a
## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
## These are displayed together at the top of the panel when a user is needed to
@ -240,3 +240,5 @@ self_view_hidden_message=Billedet fra eget kamera er skjult, men sendes stadig t
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} er ikke tilgængelig i dit land.
display_name_guest=Gæst

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2={{clientSuperShortname}} als Gast verwenden
panel_browse_with_friend_button=Seite mit einem Freund besuchen
panel_disconnect_button=Verbindung trennen
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klicken Sie auf die Hello-Schaltfläche, um Webseiten zusammen mit einem Freund zu besuchen.
first_time_experience_subheading_button_above=Klicken Sie auf die obige Schaltfläche, um mit einem Freund zusammen Webseiten anzusehen.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Verwenden Sie die Funktion, um gemeinsam zu planen, zu arbeiten und zu lachen.
first_time_experience_content2=Nutzen Sie es für gemeinsame Aktivitäten: gemeinsam planen, gemeinsam lachen, gemeinsam arbeiten.
first_time_experience_button_label2=Sehen Sie sich an, wie es funktioniert
## First Time Experience Slides
fte_slide_1_title=Surfen Sie gemeinsam mit einem Freund
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Egal ob Sie eine Reise planen oder ein Geschenk einkaufen, mit {{clientShortname2}} können Sie schnellere Entscheidungen in Echtzeit treffen.
fte_slide_2_title=Rufen Sie die gleiche Seite auf
fte_slide_2_copy=Verwenden Sie den integrierten Text- oder Videochat, um Ideen auszutauschen, Optionen zu vergleichen und zu einer Einigung zu kommen.
fte_slide_3_title=Laden Sie einen Freund ein, indem Sie ihm einen Link senden
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} funktioniert mit den meisten Desktop-Browsern. Es sind keine Benutzerkonten notwendig und die Nutzung ist kostenlos.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Über das {{clientSuperShortname}}-Symbol geht es los.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Wenn Sie eine Seite gefunden haben, die Sie diskutieren möchten, klicken Sie auf das Symbol in {{brandShortname}}, um einen Link zu erstellen. Schicken Sie diesen dann auf beliebige Weise an Ihren Freund.
invite_header_text_bold=Laden Sie jemanden dazu ein, gemeinsam mit Ihnen auf der Seite zu surfen!
invite_header_text_bold2=Laden Sie einen Freund ein!
invite_header_text3=Firefox Hello ist für die Nutzung durch zwei Personen, also senden Sie einem Freund einen Link, um gemeinsam im Web zu surfen!
invite_header_text4=Teilen Sie diesen Link, damit Sie gemeinsam im Internet surfen können.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Link per E-Mail versenden
invite_facebook_button3=Facebook
invite_your_link=Ihr Link:
# Status text
display_name_guest=Gast
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,7 +201,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Sobald Ihr Freund dabei ist, kann er jeden Tab sehen, den Sie anklicken.
infobar_screenshare_browser_message2=Sie geben Ihre Tabs weiter. Jeder von Ihnen angeklickte Tab wird von Ihren Freunden gesehen.
infobar_screenshare_browser_message3=Sie geben jetzt Ihre Tabs weiter. Ihr Freund kann alle Tabs sehen, die Sie anklicken.
infobar_screenshare_stop_sharing_message=Sie geben Ihre Tabs nicht mehr weiter.
infobar_button_restart_label2=Wieder weitergeben
infobar_button_restart_accesskey=s
@ -240,3 +261,5 @@ self_view_hidden_message=Eigenes Kamerabild ist ausgeblendet, wird aber gesendet
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} ist in Ihrem Land nicht verfügbar.
display_name_guest=Gast

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2={{clientSuperShortname}} ako gósć wužywaś
panel_browse_with_friend_button=Toś ten bok se z pśijaśelom woglědaś
panel_disconnect_button=Zwisk źěliś
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klikniśo na tłocašk Hello, aby webboki z pśijaśelom pśeglědował.
first_time_experience_subheading_button_above=Klikniśo na tłocašk, aby webboki z pśijaśelom pśeglědował.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Wužywajštej jen, aby gromaźe planowałej, gromaźe źěłałej, gromaźe se smjali.
first_time_experience_content2=Wužywajštej jen, aby něco gromaźe cyniłej: planowaś, se smjaś, źěłaś.
first_time_experience_button_label2=Woglědajśo se, kak funkcioněrujo
## First Time Experience Slides
fte_slide_1_title=Woglědajśo se webboki se z pśijaśelom
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Lěc drogowanje planujośo abo dar nakupujośo, {{clientShortname2}} wam pomaga, w napšawdnem casu malsnjej rozsuźiś.
fte_slide_2_title=Buźćo togo samskego měnjenja
fte_slide_2_copy=Wužywajśo zatwarjony tekst abo wideowy chat, aby ideje źělili, móžnosći pśirownali a něco dojadnali.
fte_slide_3_title=Pósćelśo pśijaśeloju wótkaz, aby jogo pśepšosył
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} funkcioněrujo z nejwěcej desktopowymi wobglědowakami. Konta njejsu trěbne a kuždy zwisk jo dermotny.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Klikniśo na symbol {{clientSuperShortname}}, aby zachopił
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Gaž sćo bok namakał, wó kótaremž cośo diskutěrowaś, klikniśo na symbol {{brandShortname}}, aby wótkaz napórał. Pósćelśo jen pótom swójomu pśijaśeloju, wšojadno kak se wam spódoba!
invite_header_text_bold=Pśepšosćo někogo, aby toś ten bok z wami pśeglědował!
invite_header_text_bold2=Pśepšosćo pśijaśela, aby se wam pśizamknuł!
invite_header_text3=Stej dwě wósobje trěbnej, aby Firefox Hello wužywałej, pósćelśo pótakem pśijaśeloju wótkaz, aby z wami web pśeglědował!
invite_header_text4=Źělśo toś ten wótkaz, aby mógłej web zgromadnje pśeglědowaś.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Wótkaz e-mailowaś
invite_facebook_button3=Facebook
invite_your_link=Waš wótkaz:
# Status text
display_name_guest=Gósć
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=W pórěźe
# Infobar strings
infobar_screenshare_no_guest_message=Gaž se waš pśijaśel pśizamkujo, móžotej rejtark wiźeś, na kótaryž kliknjośo.
infobar_screenshare_browser_message2=Źěliśo swóje rejtarki. Waše pśijaśele mógu kuždy rejtark wiźeś, na kótaryž kliknjośo
infobar_screenshare_browser_message3=Źělitej něnto swóje rejtarki. Waš pśijaśel buźo rejtark wiźeś, na kótaryž kliknjośo.
infobar_screenshare_stop_sharing_message=Njeźěliśo wěcej swóje rejtarki
infobar_button_restart_label2=Źělenje znowego startowaś
infobar_button_restart_accesskey=n
@ -239,3 +260,5 @@ self_view_hidden_message=Samonaglěd schowany, ale sćelo se hyšći; změńśo
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} njestoj we wašom kraju k dispoziciji.
display_name_guest=Gósć

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Use {{clientSuperShortname}} as a Guest
panel_browse_with_friend_button=Browse this page with a friend
panel_disconnect_button=Disconnect
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Click the Hello button to browse Web pages with a friend.
first_time_experience_subheading_button_above=Click on the button above to browse Web pages with a friend.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Use it to plan together, work together, laugh together.
first_time_experience_content2=Use it to get things done: plan together, laugh together, work together.
first_time_experience_button_label2=See how it works
## First Time Experience Slides
fte_slide_1_title=Browse Web pages with a friend
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Whether youre planning a trip or shopping for a gift, {{clientShortname2}} lets you make faster decisions in real time.
fte_slide_2_title=Get on the same page
fte_slide_2_copy=Use the built-in text or video chat to share ideas, compare options and come to an agreement.
fte_slide_3_title=Invite a friend by sending a link
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} works with most desktop browsers. No accounts are necessary and everyone connects for free.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Find the {{clientSuperShortname}} icon to get started
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Once youve found a page you want to discuss, click the icon in {{brandShortname}} to create a link. Then send it to your friend however you like!
invite_header_text_bold=Invite someone to browse this page with you!
invite_header_text_bold2=Invite a friend to join you!
invite_header_text3=It takes two to use Firefox Hello, so send a friend a link to browse the Web with you!
invite_header_text4=Share this link so you can start browsing the Web together.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Email Link
invite_facebook_button3=Facebook
invite_your_link=Your link:
# Status text
display_name_guest=Guest
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=As soon as your friend joins, they will be able to see any tab you click on.
infobar_screenshare_browser_message2=You are sharing your tabs. Any tab you click on can be seen by your friends
infobar_screenshare_browser_message3=You are now sharing your tabs. Your friend will see any tab you click on.
infobar_screenshare_stop_sharing_message=You are no longer sharing your tabs
infobar_button_restart_label2=Restart sharing
infobar_button_restart_accesskey=e
@ -239,3 +260,5 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window \\
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} is not available in your country.
display_name_guest=Guest

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Use {{clientSuperShortname}} as a Guest
panel_browse_with_friend_button=Browse this page with a friend
panel_disconnect_button=Disconnect
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Click the Hello button to browse Web pages with a friend.
first_time_experience_subheading_button_above=Click on the button above to browse Web pages with a friend.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Use it to plan together, work together, laugh together.
first_time_experience_content2=Use it to get things done: plan together, laugh together, work together.
first_time_experience_button_label2=See how it works
## First Time Experience Slides
fte_slide_1_title=Browse Web pages with a friend
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Whether youre planning a trip or shopping for a gift, {{clientShortname2}} lets you make faster decisions in real time.
fte_slide_2_title=Get on the same page
fte_slide_2_copy=Use the built-in text or video chat to share ideas, compare options and come to an agreement.
fte_slide_3_title=Invite a friend by sending a link
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} works with most desktop browsers. No accounts are necessary and everyone connects for free.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Find the {{clientSuperShortname}} icon to get started
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Once youve found a page you want to discuss, click the icon in {{brandShortname}} to create a link. Then send it to your friend however you like!
invite_header_text_bold=Invite someone to browse this page with you!
invite_header_text_bold2=Invite a friend to join you!
invite_header_text3=It takes two to use Firefox Hello, so send a friend a link to browse the Web with you!
invite_header_text4=Share this link so you can start browsing the Web together.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Email Link
invite_facebook_button3=Facebook
invite_your_link=Your link:
# Status text
display_name_guest=Guest
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=As soon as your friend joins, they will be able to see any tab you click on.
infobar_screenshare_browser_message2=You are sharing your tabs. Any tab you click on can be seen by your friends
infobar_screenshare_browser_message3=You are now sharing your tabs. Your friend will see any tab you click on.
infobar_screenshare_stop_sharing_message=You are no longer sharing your tabs
infobar_button_restart_label2=Restart sharing
infobar_button_restart_accesskey=R
@ -239,3 +260,5 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} is not available in your country.
display_name_guest=Guest

View File

@ -26,19 +26,41 @@ sign_in_again_button=Conectarse
sign_in_again_use_as_guest_button2=Usar {{clientSuperShortname}} como invitado
panel_browse_with_friend_button=Navegar por esta página con un amigo
panel_stop_sharing_tabs_button=Dejar de compartir pestañas
panel_disconnect_button=Desconectarse
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Haz clic en el botón Hello para navegar por páginas Web con un amigo.
first_time_experience_subheading_button_above=Haz clic en el botón de arriba para navegar por páginas Web con un amigo.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Úsalo para planear, trabajar o reír con quien quieras.
first_time_experience_content2=Úsalo para hacer cosas: planear, reír y trabajar en conjunto.
first_time_experience_button_label2=Mira cómo funciona
## First Time Experience Slides
fte_slide_1_title=Navega por páginas Web con un amigo
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Si estás planeando un viaje o comprar un regalo, {{clientShortname2}} te permite tomar decisiones más rápido en tiempo real.
fte_slide_2_title=Usa la misma página
fte_slide_2_copy=Usa el chat de texto o video integrado para compartir ideas, comparar opiniones y llegar a un acuerdo.
fte_slide_3_title=Invita un amigo enviándole un enlace
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} funciona con la mayoría de los navegadores de escritorio. No se requieren cuentas y todos se conectan gratis.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Encuentra el ícono de {{clientSuperShortname}} para empezar
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Una vez que has encontrado una página sobre la que quieras discutir, aprieta el ícono en {{brandShortname}} para crear un enlace. Luego, ¡envíalo a tu amigo de la forma en que desees!
invite_header_text_bold=¡Invita a alguien a navegar esta página contigo!
invite_header_text_bold2=¡Invita a un amigo a unirse!
invite_header_text3=¡Se requieren dos para usar Firefox Hello, así que envía un enlace a un amigo para que navegue la Web contigo!
invite_header_text4=Comparte este enlace para que puedan navegar la Web juntos.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Enviar enlace
invite_facebook_button3=Facebook
invite_your_link=Tu enlace:
# Status text
display_name_guest=Invitado
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,29 +201,16 @@ door_hanger_button=Aceptar
# Infobar strings
infobar_screenshare_no_guest_message=Tan pronto como se una tu amigo, podrá ver cualquier pestaña en la que hagas clic.
infobar_screenshare_browser_message2=Estás compartiendo sus pestañas. Cualquier pestaña en la que hagas clic podrá ser vista por tus amigos
infobar_screenshare_paused_browser_message=La compartición de pestañas está pausada
infobar_button_gotit_label=¡Entendido!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Pausar
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reiniciar
infobar_button_restart_accesskey=e
infobar_button_resume_label=Continuar
infobar_button_resume_accesskey=R
infobar_button_stop_label=Detener
infobar_screenshare_browser_message3=Ahora estás compartiendo tus pestañas. Tu amigo verá cualquier pestaña en la que hagas clic.
infobar_screenshare_stop_sharing_message=Ya no estás compartiendo tus pestañas
infobar_button_restart_label2=Reanudar la compartición
infobar_button_restart_accesskey=R
infobar_button_stop_label2=Dejar de compartir
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=No volver a mostrar este mensaje
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Aún no tienes conversaciones
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=¡Iniciar una!
infobar_button_disconnect_label=Desconectarse
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -247,10 +253,13 @@ rooms_room_full_call_to_action_label=Aprender más acerca de {{clientShortname}}
rooms_room_full_call_to_action_nonFx_label=Descargar {{brandShortname}} para iniciar la tuya
rooms_room_full_label=Ya hay dos personas en esta conversación.
rooms_room_join_label=Unirse a la conversación
rooms_room_joined_label=¡Alguien se ha unido a la conversación!
rooms_room_joined_owner_connected_label2=Tu amigo está ahora conectado y podrá ver tus pestañas.
rooms_room_joined_owner_not_connected_label=Tu amigo está esperando para navegar {{roomURLHostname}} contigo.
self_view_hidden_message=La vista local está oculta pero continúa siendo enviada; redimensione la ventana para mostrarla
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} no está disponible en tu país.
display_name_guest=Invitado

View File

@ -26,19 +26,41 @@ sign_in_again_button=Iniciar sesión
sign_in_again_use_as_guest_button2=Utiliza {{clientSuperShortname}} como Invitado
panel_browse_with_friend_button=Navega por la página con un amigo
panel_stop_sharing_tabs_button=Dejar de compartir tus pestañas
panel_disconnect_button=Desconectar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Haz clic en el botón de Hello para navegar por la Web con un amigo.
first_time_experience_subheading_button_above=Pulse en el botón de arriba para navegar por páginas web con un amigo.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Utilízalo para hacer planes, trabajar y reír juntos.
first_time_experience_content2=Úselo para llevar a cabo tareas; planear juntos, divertirse juntos, trabajar juntos.
first_time_experience_button_label2=Aprende cómo funciona
## First Time Experience Slides
fte_slide_1_title=Navegue por páginas web con un amigo
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Tanto si está planeando un viaje o buscando un regalo para comprarlo, {{clientShortname2}} le permite tomar decisiones más rápidas en tiempo real.
fte_slide_2_title=Reúnanse en la misma página
fte_slide_2_copy=Use los chats incluidos de texto o vídeo para compartir ideas, comparar opciones o llegar a acuerdos.
fte_slide_3_title=Invite a un amigo enviando un enlace
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortnae}} funciona con la mayoría de los navegadores de escritorio. No es necesario tener cuenta y todo el mundo se conecta gratuitamente.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Encuentre el icono de {{clientSuperShortname}} para comenzar
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Cuando encuentre una página sobre la que conversar, pulse el icono en {{brandShortname}} para crear un enlace. ¡Luego envíela a su amigo como mejor le parezca!
invite_header_text_bold=¡Invita a alguien a navegar por la página contigo!
invite_header_text_bold2=¡Invite a un amigo a unirse a usted!
invite_header_text3=Se necesitan dos personas para utilizar Firefox Hello. ¡Envíale el enlace a un amigo y navegad juntos!
invite_header_text4=Comparta este enlace para que puedan comenzar a navegar juntos por la web.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Enviar enlace
invite_facebook_button3=Facebook
invite_your_link=Tu enlace:
# Status text
display_name_guest=Invitado
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,29 +200,16 @@ door_hanger_button=Aceptar
# Infobar strings
infobar_screenshare_no_guest_message=Tan pronto se una su amigo, podrá ver cualquier pestaña en la que pulse usted.
infobar_screenshare_browser_message2=Estás compartiendo tus pestañas. Si haces clic en una de ellas, tus amigos también la verán
infobar_screenshare_paused_browser_message=Has pausado la acción de compartir pestañas
infobar_button_gotit_label=¡Conseguido!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Pausar
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reiniciar
infobar_screenshare_browser_message3=Ahora está compartiendo sus pestañas. Su amigo verá cualquier pestaña en la que pulse usted.
infobar_screenshare_stop_sharing_message=Ya no compartes tus pestañas
infobar_button_restart_label2=Volver a compartir
infobar_button_restart_accesskey=e
infobar_button_resume_label=Resumen
infobar_button_resume_accesskey=R
infobar_button_stop_label=Detener
infobar_button_stop_label2=Dejar de compartir
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=No volver a mostrar
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Aún no hay conversaciones.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=¡Inicia una nueva!
infobar_button_disconnect_label=Desconectar
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,10 +252,13 @@ rooms_room_full_call_to_action_label=Obtén más información sobre {{clientShor
rooms_room_full_call_to_action_nonFx_label=Descarga {{brandShortname}} para iniciar la tuya
rooms_room_full_label=Ya hay dos personas en esta conversación.
rooms_room_join_label=Únete a la conversación
rooms_room_joined_label=¡Alguien se ha unido a la conversación!
rooms_room_joined_owner_connected_label2=Tu amigo ya está conectado y podrá ver tus pestañas.
rooms_room_joined_owner_not_connected_label=Tu amigo está esperando para navegar contigo por {{roomURLHostname}}.
self_view_hidden_message=Se está enviando la vista propia aunque esté oculta; ajusta la ventana para verla
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} no está disponible en tu país.
display_name_guest=Invitado

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Usar {{clientSuperShortname}} como un Invitad
panel_browse_with_friend_button=Navegar esta página con un amigo
panel_disconnect_button=Desconectar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Haz clic en el botón de Hello para para navegar las páginas Web con un amigo.
first_time_experience_subheading_button_above=Haz clic en el botón de arriba para navegar la Web con un amigo.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Úsalo para planear cosas juntos, trabajar juntos, reír juntos.
first_time_experience_content2=Úsalo para hacer las cosas bien: planear algo juntos, reír juntos, trabajar juntos.
first_time_experience_button_label2=Ver como trabaja
## First Time Experience Slides
fte_slide_1_title=Navega páginas Web con un amigo
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Ya sea que estés planeando un viaje o comprar un regalo, {{clientShortname2}} te permite tomar decisiones más rápido en tiempo real.
fte_slide_2_title=Estar en la misma página
fte_slide_2_copy=Usa el texto incorporado o el videochat para compartir ideas, comparar opciones y llegar a acuerdos.
fte_slide_3_title=Invita a un amigo enviándole un enlace
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} trabaja con la mayoría de los navegadores de escritorio. No se necesita cuentas y todos se pueden conectar gratis.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Encuentra el ícono de {{clientSuperShortname}} para comenzar
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Una vez que encuentres una página que quieras discutir, haz clic en el ícono de {{brandShortname}} para crear un enlace. ¡Entonces envíalo al amigo que quieras!
invite_header_text_bold=Invita a alguien para navegar esta página contigo.
invite_header_text_bold2=¡Invita a un amigo a unirse!
invite_header_text3=Es muy fácil usar Firefox Hello, ¡simplemente envía a tu amigo un enlace para navegar la Web contigo!
invite_header_text4=Compartir este enlace para que así puedan iniciar a navegar la Web juntos.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Enviar enlace
invite_facebook_button3=Facebook
invite_your_link=Tu enlace:
# Status text
display_name_guest=Invitado
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=Aceptar
# Infobar strings
infobar_screenshare_no_guest_message=Tan pronto como tus amigos se vayan uniendo, serán capaces de ver cualquier pestaña en la que hagas clic.
infobar_screenshare_browser_message2=Estás compartiendo tus pestañas. Cualquier pestaña en la que des clic puede ser vista por tus amigos
infobar_screenshare_browser_message3=Estás compartiendo tus pestañas. Tu amigo podrá ver cualquier pestaña en la que hagas clic.
infobar_screenshare_stop_sharing_message=Ya no estás compartiendo tus pestañas
infobar_button_restart_label2=Volver a compartir
infobar_button_restart_accesskey=e
@ -239,3 +260,5 @@ self_view_hidden_message=Auto-vista oculta pero enviándose; redimensiona ventan
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} no está disponible en tu país.
display_name_guest=Invitado

View File

@ -26,7 +26,7 @@ sign_in_again_button=Logi sisse
sign_in_again_use_as_guest_button2=Kasuta {{clientSuperShortname}}i külalisena
panel_browse_with_friend_button=Lehitse seda lehte koos sõbraga
panel_stop_sharing_tabs_button=Lõpeta kaartide jagamine
panel_disconnect_button=Lõpeta ühendus
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -183,28 +183,13 @@ door_hanger_button=Olgu
# Infobar strings
infobar_screenshare_browser_message2=Jagad enda kaarte. Sinu sõbrad näevad kaarti, mille oled valinud.
infobar_screenshare_paused_browser_message=Kaartide jagamine on peatatud.
infobar_button_gotit_label=Selge!
infobar_button_gotit_accesskey=S
infobar_button_pause_label=Peata
infobar_button_pause_accesskey=P
infobar_button_restart_label=Taaskäivita
infobar_screenshare_stop_sharing_message=Sa ei jaga enam kaarte.
infobar_button_restart_label2=Alusta jagamist uuesti
infobar_button_restart_accesskey=s
infobar_button_resume_label=Jätka
infobar_button_resume_accesskey=J
infobar_button_stop_label=Lõpeta
infobar_button_stop_label2=Lõpeta jagamine
infobar_button_stop_accesskey=L
infobar_menuitem_dontshowagain_label=Rohkem seda teadet ei kuvata
infobar_menuitem_dontshowagain_accesskey=R
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Vestlusi pole veel.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Alusta uuega!
infobar_button_disconnect_label=Lõpeta ühendus
infobar_button_disconnect_accesskey=L
# E10s not supported strings
@ -247,7 +232,8 @@ rooms_room_full_call_to_action_label=Rohkem teavet {{clientShortname}} kohta »
rooms_room_full_call_to_action_nonFx_label=Enda vestluse alustamiseks laadi alla {{brandShortname}}
rooms_room_full_label=Selles vestluses on juba kaks inimest.
rooms_room_join_label=Liitu vestlusega
rooms_room_joined_label=Keegi liitus vestlusega!
rooms_room_joined_owner_connected_label2=Sinu sõbraga on ühendus olemas ja ta saab sinu kaarte näha.
rooms_room_joined_owner_not_connected_label=Sinu sõber ootab, et sinuga {{roomURLHostname}} sirvida.
self_view_hidden_message=Sinu pilti edastatakse, kuid see on praegu peidetud. Pildi kuvamiseks muuda akna suurust.

View File

@ -25,20 +25,42 @@ sign_in_again_button=Se connecter
## will be replaced by the super short brandname.
sign_in_again_use_as_guest_button2=Utiliser {{clientSuperShortname}} en tant qu'invité
panel_browse_with_friend_button=Consulter cette page avec un ami
panel_stop_sharing_tabs_button=Arrêter de partager les onglets
panel_browse_with_friend_button=Consulter cette page avec une autre personne
panel_disconnect_button=Déconnexion
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Cliquez sur le bouton Hello pour consulter des pages web avec un ami.
first_time_experience_subheading2=Cliquez sur le bouton Hello pour consulter des pages web avec une autre personne.
first_time_experience_subheading_button_above=Cliquez sur le bouton ci-dessus pour naviguer sur le Web avec une autre personne.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Utilisez-le pour vous organiser, travailler et rire ensemble.
first_time_experience_content2=Utilisez vous pour réaliser vos projets : vous organiser, travailler et rire ensemble.
first_time_experience_button_label2=Principe de fonctionnement
## First Time Experience Slides
fte_slide_1_title=Naviguer sur le Web avec une autre personne
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Que ce soit pour planifier un voyage ou l'achat d'un cadeau, {{clientShortname2}} vous permet de prendre des décisions plus rapidement.
fte_slide_2_title=Sur la même page au même moment
fte_slide_2_copy=Utilisez la conversation texte ou vidéo pour partager vos idées, comparer vos choix et vous mettre d'accord.
fte_slide_3_title=Invitez votre interlocuteur en lui envoyant un lien
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} fonctionne avec la plupart des navigateurs de bureau. Aucun compte n'est nécessaire et tout le monde peut l'utiliser gratuitement.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Cherchez l'icône {{clientSuperShortname}} pour commencer
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Une fois sur la page à propos de laquelle vous souhaitez discuter, cliquez sur l'icône dans {{brandShortname}} pour créer un lien. Vous pouvez alors l'envoyer à votre interlocuteur de la manière que vous voulez.
invite_header_text_bold=Invitez quelqu'un à consulter cette page avec vous !
invite_header_text3=Vous devez être deux pour utiliser Firefox Hello, alors envoyez un lien à un ami pour naviguer sur le Web ensemble !
invite_header_text_bold2=Invitez quelqu'un à vous rejoindre !
invite_header_text3=Utiliser Firefox Hello est très simple, envoyez simplement un lien à votre interlocuteur et vous pourrez naviguer sur le Web ensemble !
invite_header_text4=Partagez ce lien pour surfer sur le Web ensemble.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Envoyer le lien
invite_facebook_button3=Facebook
invite_your_link=Votre lien :
# Status text
display_name_guest=Invité
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -68,15 +87,15 @@ problem_accessing_account=Une erreur s'est produite lors de l'accès à votre co
## the appropriate action.
retry_button=Réessayer
share_email_subject7=Invitation à naviguer sur une page web avec un ami
share_email_subject7=Votre invitation à naviguer sur le Web avec une autre personne
## LOCALIZATION NOTE (share_email_body7): In this item, don't translate the
## part between {{..}} and leave the \n\n part alone
share_email_body7=Un ami vous attend sur Firefox Hello. Cliquez sur le lien pour vous connecter et naviguer sur une page web ensemble : {{callUrl}}
share_email_body7=Une autre personne vous attend sur Firefox Hello. Cliquez sur le lien pour vous connecter et naviguer sur une page web ensemble : {{callUrl}}
## LOCALIZATION NOTE (share_email_body_context3): In this item, don't translate
## the part between {{..}} and leave the \n\n part alone.
share_email_body_context3=Un ami vous attend sur Firefox Hello. Cliquez sur le lien pour vous connecter et naviguer sur {{title}} ensemble : {{callUrl}}
share_email_body_context3=Une autre personne vous attend sur Firefox Hello. Cliquez sur le lien pour vous connecter et naviguer sur {{title}} ensemble : {{callUrl}}
## LOCALIZATION NOTE (share_email_footer2): Common footer content for both email types
share_email_footer2=\n\n____________\nFirefox Hello vous permet de naviguer sur le Web avec vos amis. Utilisez-le lorsque vous voulez faire des choses comme : planifier quelque chose ensemble, travailler ensemble, rire ensemble. Apprenez-en davantage sur http://www.firefox.com/hello
share_email_footer2=\n\n____________\nFirefox Hello vous permet de naviguer sur le Web avec vos amis. Vous pouvez faire des tas de choses : planifier, travailler ou rire ensemble. Apprenez-en davantage sur http://www.firefox.com/hello
## LOCALIZATION NOTE (share_tweeet): In this item, don't translate the part
## between {{..}}. Please keep the text below 117 characters to make sure it fits
## in a tweet.
@ -182,29 +201,16 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Dès que l'autre personne suivra le lien, elle pourra voir tous les onglets sur lesquels vous cliquerez.
infobar_screenshare_browser_message2=Vous partagez vos onglets. Vos amis pourront voir tous les onglets sur lesquels vous cliquez.
infobar_screenshare_paused_browser_message=Le partage d'onglets a été mis en pause
infobar_button_gotit_label=J'ai compris
infobar_button_gotit_accesskey=J
infobar_button_pause_label=Pause
infobar_button_pause_accesskey=P
infobar_button_restart_label=Redémarrer
infobar_screenshare_browser_message3=Vous partagez à présent vos onglets. Votre contact verra tous les onglets sur lesquels vous cliquerez.
infobar_screenshare_stop_sharing_message=Vous ne partagez plus vos onglets
infobar_button_restart_label2=Recommencer à partager
infobar_button_restart_accesskey=e
infobar_button_resume_label=Reprendre
infobar_button_resume_accesskey=R
infobar_button_stop_label=Arrêter
infobar_button_stop_label2=Arrêter le partage
infobar_button_stop_accesskey=A
infobar_menuitem_dontshowagain_label=Ne plus afficher à l'avenir
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Aucune conversation pour l'instant.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Lancez-en une nouvelle !
infobar_button_disconnect_label=Déconnexion
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -226,7 +232,7 @@ clientShortname2=Firefox Hello
conversation_has_ended=Votre conversation est terminée.
generic_failure_message=Nous rencontrons des problèmes techniques…
generic_failure_no_reason2=Voulez-vous essayer à nouveau ?
generic_failure_no_reason2=Voulez-vous essayer ?
help_label=Aide
@ -247,10 +253,13 @@ rooms_room_full_call_to_action_label=En savoir plus sur {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Téléchargez {{brandShortname}} pour lancer la vôtre
rooms_room_full_label=Il y a deux personnes dans cette conversation.
rooms_room_join_label=Rejoindre la conversation
rooms_room_joined_label=Quelqu'un a rejoint la conversation.
rooms_room_joined_owner_connected_label2=Votre interlocuteur est connecté et peut à présent voir vos onglets.
rooms_room_joined_owner_not_connected_label=Votre interlocuteur attend pour parcourir {{roomURLHostname}} avec vous.
self_view_hidden_message=Retour vidéo masqué, mais la vidéo est toujours transmise. Redimensionnez la fenêtre pour l'afficher.
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} n'est pas disponible dans votre pays.
display_name_guest=Invité

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2={{clientSuperShortname}} as gast brûke
panel_browse_with_friend_button=Dizze side mei in freon besjen
panel_disconnect_button=Ferbining ferbrekke
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klik op de Hello-knop om websites te besjen mei in freon.
first_time_experience_subheading_button_above=Klik op de boppesteande knop om websiden mei in freon te besjen.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Brûk it om tegearre te plannen, te wurkjen en te laitsjen.
first_time_experience_content2=Brûk it om saken dien te krijen: tegearre planne, tegearre laitsje, tegearre wurkje.
first_time_experience_button_label2=Besjoch hoe't it wurket
## First Time Experience Slides
fte_slide_1_title=Besjoch websiden mei in freon
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Oft jo no in reis planne of in kado sykje, mei {{clientShortname2}} meitsje jo yn realtime fluggere beslissingen.
fte_slide_2_title=Besjoch deselde side
fte_slide_2_copy=Brûk de ynboude tekst- of fideochat om ideeën út te wikseljen, opsjes te fergelykjen en oerienstimming te berikjen.
fte_slide_3_title=Noegje in freon út troch in keppeling te dielen
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} wurket mei de measte desktopbrowsers. Der binne gjin accounts nedich en eltsenien makket fergees ferbining.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Sykje it {{clientSuperShortname}}-piktogram om te begjinnen
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=As jo in side fûn hawwe dy't jo besprekke wolle, klikke jo op it piktogram yn {{brandShortname}} om in keppeling te meitsjen. Stjoer dizze dêrnei nei jo freon lykas jo wolle!
invite_header_text_bold=Noegje ien út om tegearre dizze website te besjen!
invite_header_text_bold2=Noegje in freon út om diel te nimmen!
invite_header_text3=Der binne twa nedich om Firefox Hello te brûken, dus stjoer in freon in keppeling om tegearre op it web te sneupjen!
invite_header_text4=Diel dizze keppeling, sadat jo tegearre it web besjen kinne.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Keppeling e-maile
invite_facebook_button3=Facebook
invite_your_link=Jo keppeling:
# Status text
display_name_guest=Gast
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,10 +200,12 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Sa gau as jo freon dielnimt, kin dizze elts ljepblêd sjen wêrop jo klikke.
infobar_screenshare_browser_message2=Jo diele jo ljepblêden. Elts ljepblêd dat jo oanklikke kin sjoen wurde troch jo freonen
infobar_screenshare_browser_message3=Jo diele no jo ljepblêden. Jo freon sjocht elts ljepblêd wêrop jo klikke.
infobar_screenshare_stop_sharing_message=Jo diele net langer jo ljepblêden
infobar_button_restart_label2=Dielen ferfetsje
infobar_button_restart_accesskey=O
infobar_button_restart_accesskey=D
infobar_button_stop_label2=Dielen stopje
infobar_button_stop_accesskey=S
infobar_button_disconnect_label=Ferbining ferbrekke
@ -239,3 +260,5 @@ self_view_hidden_message=Eigen werjefte ferburgen, mar wurdt noch hieltyd ferstj
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} is net beskikber yn jo lân.
display_name_guest=Gast

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2={{clientSuperShortname}} as gast brûke
panel_browse_with_friend_button=Dizze side mei in freon besjen
panel_disconnect_button=Ferbining ferbrekke
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klik op de Hello-knop om websites te besjen mei in freon.
first_time_experience_subheading_button_above=Klik op de boppesteande knop om websiden mei in freon te besjen.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Brûk it om tegearre te plannen, te wurkjen en te laitsjen.
first_time_experience_content2=Brûk it om saken dien te krijen: tegearre planne, tegearre laitsje, tegearre wurkje.
first_time_experience_button_label2=Besjoch hoe't it wurket
## First Time Experience Slides
fte_slide_1_title=Besjoch websiden mei in freon
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Oft jo no in reis planne of in kado sykje, mei {{clientShortname2}} meitsje jo yn realtime fluggere beslissingen.
fte_slide_2_title=Besjoch deselde side
fte_slide_2_copy=Brûk de ynboude tekst- of fideochat om ideeën út te wikseljen, opsjes te fergelykjen en oerienstimming te berikjen.
fte_slide_3_title=Noegje in freon út troch in keppeling te dielen
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} wurket mei de measte desktopbrowsers. Der binne gjin accounts nedich en eltsenien makket fergees ferbining.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Sykje it {{clientSuperShortname}}-piktogram om te begjinnen
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=As jo in side fûn hawwe dy't jo besprekke wolle, klikke jo op it piktogram yn {{brandShortname}} om in keppeling te meitsjen. Stjoer dizze dêrnei nei jo freon lykas jo wolle!
invite_header_text_bold=Noegje ien út om tegearre dizze website te besjen!
invite_header_text_bold2=Noegje in freon út om diel te nimmen!
invite_header_text3=Der binne twa nedich om Firefox Hello te brûken, dus stjoer in freon in keppeling om tegearre op it web te sneupjen!
invite_header_text4=Diel dizze keppeling, sadat jo tegearre it web besjen kinne.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Keppeling e-maile
invite_facebook_button3=Facebook
invite_your_link=Jo keppeling:
# Status text
display_name_guest=Gast
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,10 +200,12 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Sa gau as jo freon dielnimt, kin dizze elts ljepblêd sjen wêrop jo klikke.
infobar_screenshare_browser_message2=Jo diele jo ljepblêden. Elts ljepblêd dat jo oanklikke kin sjoen wurde troch jo freonen
infobar_screenshare_browser_message3=Jo diele no jo ljepblêden. Jo freon sjocht elts ljepblêd wêrop jo klikke.
infobar_screenshare_stop_sharing_message=Jo diele net langer jo ljepblêden
infobar_button_restart_label2=Dielen ferfetsje
infobar_button_restart_accesskey=O
infobar_button_restart_accesskey=D
infobar_button_stop_label2=Dielen stopje
infobar_button_stop_accesskey=S
infobar_button_disconnect_label=Ferbining ferbrekke
@ -239,3 +260,5 @@ self_view_hidden_message=Eigen werjefte ferburgen, mar wurdt noch hieltyd ferstj
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} is net beskikber yn jo lân.
display_name_guest=Gast

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2={{clientSuperShortname}} jako hósć wužiwa
panel_browse_with_friend_button=Tutu stronu z přećelom přehladować
panel_disconnect_button=Zwisk dźělić
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klikńće na tłóčatko Hello, zo byšće webstrony z přećelom přehladował.
first_time_experience_subheading_button_above=Klikńće na tłóčatko, zo byšće webstrony z přećelom přehladował.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Wužiwajtej jón, zo byštej zhromadnje planowałoj, dźěłałoj a so smjałoj.
first_time_experience_content2=Wužiwajtej jón, zo byštej zhromadnje činiłoj: planować, so smjeć a dźěłać.
first_time_experience_button_label2=Hladajće, kak wón funguje
## First Time Experience Slides
fte_slide_1_title=Tutu stronu z přećelom přehladować
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Hač pućowanje planujeće abo dar nakupujeće, {{clientShortname2}} wam pomha, we woprawdźitym času spěšnišo rozsudźić.
fte_slide_2_title=Budźće samsneho měnjenja
fte_slide_2_copy=Wužiwajće zatwarjeny tekst abo widejowy chat, zo byšće ideje dźělili, móžnosće přirunali a něšto dojednali.
fte_slide_3_title=Pósćelće přećelej wotkaz, zo byšće jeho přeprosył
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} z najwjace desktopowymi wobhladowakami funguje. Konta trěbne njejsu a kóždy zwisk je darmotny.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Klikńće na symbol {{clientSuperShortname}}, zo byšće započał
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Hdyž sće stronu namakał, wo kotrejž chceće diskutować, klikńće na symbol {{brandShortname}}, zo byšće wotkaz wutworił. Pósćelće jón potom swojemu přećelej, wšojedne kak so wam spodoba!
invite_header_text_bold=Přeprošće někoho, zo by z wami tutu stronu přehladował!
invite_header_text_bold2=Přeprošće přećela, zo by so wam přidružił!
invite_header_text3=Stej dwě wosobje trěbnej, zo byštej Firefox Hello wužiwałoj, pósćelće tuž přećelej wotkaz, zo by z wami web přehladował!
invite_header_text4=Dźělće tutón wotkaz, zo byštaj móhłoj web zhromadnje přehladować.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Wotkaz e-mejlować
invite_facebook_button3=Facebook
invite_your_link=Waš wotkaz:
# Status text
display_name_guest=Hósć
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=W porjadku
# Infobar strings
infobar_screenshare_no_guest_message=Tak ruče kaž so waš přećel přidruža, móžetaj rajtark widźeć, na kotryž kliknjeće.
infobar_screenshare_browser_message2=Dźěliće swoje rajtarki. Waši přećeljo móža kóždy rajtark widźeć, na kotryž kliknjeće
infobar_screenshare_browser_message3=Dźělitaj nětko swoje rajtarki. Waš přećel budźe rajtark widźeć, na kotryž kliknjeće.
infobar_screenshare_stop_sharing_message=Hižo swoje rajtarki njedźěliće
infobar_button_restart_label2=Dźělenje znowa startować
infobar_button_restart_accesskey=n
@ -239,3 +260,5 @@ self_view_hidden_message=Samonapohlad schowany, ale sćele so hišće; změńće
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} we wašim kraju k dispoziciji njesteji.
display_name_guest=Hósć

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Օգտագործել {{clientSuperShortname}}
panel_browse_with_friend_button=Դիտել էջը ընկերոջ հետ
panel_disconnect_button=Կապախզել
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Սեղմեք Hello կոճակը՝ վեբ էջերը ընկեոջ հետ դիտելու համար
first_time_experience_subheading_button_above=Սեղմեք կոճակը՝ վեբ ընկերոջ հետ դիտարկելու համար:
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Օգտագործեք այն՝ միասին պլանավորելու, աշխատելու և ծիծաղելու համար:
first_time_experience_content2=Օգտագործեք այն՝ միասին պլանավորելու, միասին ծիծաղելու, միասին աշխատելու համար:
first_time_experience_button_label2=Տեսեք, թե ինչպես է աշխատում
## First Time Experience Slides
fte_slide_1_title=Դիտարկել վեբ էջերը ընկերների հետ
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Անկախ նրանից, թե պլանավորում եք ուղևորություն կամ գնումներ նվերի համար՝ {{clientShortname2}}-ը կօգնի արագ որոշումներ կայացնել իրական ժամանակում:
fte_slide_2_title=Ստանալ նույն էջում
fte_slide_2_copy=Օգտագործեք ներկառուցված տեքստային զրույց կամ տեսազանգ՝ մտքեր փոխանակելու, ընտրանքներ համեմատելու և համաձայնության գալու համար:
fte_slide_3_title=Հրավիրեք ընկերոջը՝ ուղարկելով հղումը
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}}-ը աշխատում է գրեթե բոլոր դիտարկիչների հետ: Հաշիվ պետք չէ և անվճար է:
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Գտեք {{clientSuperShortname}} պատկերակը՝ սկսելու համար:
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Երբ գտնեք այն էջը, որ ցանկանում եք քննարկել՝ սեղմեք {{brandShortname}}-ի պատկերակին՝ հղում ստեղծելու համար: Ուղարկեք այն ձեր ընկերներին:
invite_header_text_bold=Հրավիրել որևէ մեկին՝ դիտարկելու էջը ձեզ հետ:
invite_header_text_bold2=Հրավիրել ընկերոջը միանալու ձեզ:
invite_header_text3=Այն զբաղեցնում է երկու՝ օգտագործելու Firefox Hello-ն և ուղարկելու ընկերներին հղում` վեբը ձեզ հետ դիտարկելու համար:
invite_header_text4=Համաօգտագործեք այս հղումը, որպեսզի կարողանաք դիտարկել այս էջը միասին:
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Ուղարկել հղումը
invite_facebook_button3=Facebook
invite_your_link=Ձեր հղումը.
# Status text
display_name_guest=Հյուր
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=Լավ
# Infobar strings
infobar_screenshare_no_guest_message=Երբ ձեր ընկերը միանա՝ կկարողանա տեսնել բոլոր այն ներդիրները, որոնց դուք կսեղմեք:
infobar_screenshare_browser_message2=Դուք համաօգտագործում եք ձեր ներդիրները: Ցանկացած ներդիր, որ սեղմում եք կտեսնեն ձեր ընկերները:
infobar_screenshare_browser_message3=Այժմ դուք համաօգտագործում եք ձեր ներդիրները: Ձեր ընկերը կտեսնի բոլոր այն ներդիրները, որոնց դուք կսեղմեք:
infobar_screenshare_stop_sharing_message=Դուք այլևս չեք համաօգտագործում ձեր ներդիրները
infobar_button_restart_label2=Վերսկսել համաօգտագործումը
infobar_button_restart_accesskey=e
@ -231,10 +252,13 @@ rooms_room_full_call_to_action_label=Իմանալ ավելին {{clientShortname
rooms_room_full_call_to_action_nonFx_label=Ներբեռնեք {{brandShortname}}-ը՝ սկսելու համար ձեր սեփականը
rooms_room_full_label=Արդեն երկու անձ կա զրույցում:
rooms_room_join_label=Միանալ զրույցի
rooms_room_joined_label=Ինչ-որ մեկը միացել է ձեր զրույցին:
rooms_room_joined_owner_connected_label2=Ձեր ընկերը արդեն կապակցված է և կկարողանա տեսնել ձեր ներդիրները:
rooms_room_joined_owner_not_connected_label=Ձեր ընկերը սպասում է՝ {{roomURLHostname}}-ը ձեզ հետ դիտարկելու համար:
self_view_hidden_message=Ինքնադիտումը թաքցված է, բայց դեռ ուղարկվում է. չափափոխել պատուհանը՝ ցուցադրելու համար
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}}-ը հասանելի չէ ձեր երկրում:
display_name_guest=Հյուր

View File

@ -26,17 +26,26 @@ sign_in_again_button=Accedi
sign_in_again_use_as_guest_button2=Utilizza {{clientSuperShortname}} come ospite
panel_browse_with_friend_button=Naviga in questa pagina insieme a un amico
panel_stop_sharing_tabs_button=Interrompi la condivisione delle schede
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Fai clic sul pulsante Hello per navigare sul Web con un amico.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Utilizzalo per fare progetti, lavorare o semplicemente fare una risata in compagnia.
first_time_experience_button_label2=Scopri come funziona
## First Time Experience Slides
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
invite_header_text_bold=Invita un amico e visita questa pagina insieme a lui.
invite_header_text3=Servono due persone per utilizzare Firefox Hello: invita un amico e naviga sul Web insieme a lui!
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
@ -48,9 +57,6 @@ invite_email_link_button=Invia link per email
invite_facebook_button3=Facebook
invite_your_link=Link:
# Status text
display_name_guest=Ospite
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,28 +188,8 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Le schede sono attualmente condivise. Seleziona una qualsiasi delle schede per condividerla
infobar_screenshare_paused_browser_message=La condivisione schede è in pausa
infobar_button_gotit_label=Ricevuto!
infobar_button_gotit_accesskey=c
infobar_button_pause_label=Pausa
infobar_button_pause_accesskey=P
infobar_button_restart_label=Riavvia
infobar_button_restart_accesskey=v
infobar_button_resume_label=Riprendi
infobar_button_resume_accesskey=R
infobar_button_stop_label=Interrompi
infobar_button_stop_accesskey=I
infobar_menuitem_dontshowagain_label=Non mostrare nuovamente
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Nessuna conversazione disponibile
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Avviane una nuova
# E10s not supported strings

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=ゲストとして {{clientSuperShortname}}
panel_browse_with_friend_button=このページを友だちと一緒に見る
panel_disconnect_button=接続中止
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Web ページを友だちと一緒に見るには Hello ボタンをクリックしてください。
first_time_experience_subheading_button_above=上のボタンをクリックして、友達と Web ページをブラウズしましょう。
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Hello を使って、一緒に計画を立てたり、作業をしたり、おしゃべりしたりしましょう。
first_time_experience_content2=このアドオンは、一緒に計画を立てたり、おしゃべりしたり、仕事したり、様々なことに活用できます。
first_time_experience_button_label2=使い方を見る
## First Time Experience Slides
fte_slide_1_title=友達と Web ページをブラウズ
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=旅行の計画を立てるときも、何かプレゼントを買うときも、{{clientShortname2}} を使えばリアルタイムにより速く物事を決められます。
fte_slide_2_title=同じページを見る
fte_slide_2_copy=組み込みのテキスト・動画チャットを使って、アイデアを共有したり、意見を比較したり、話し合いをまとめたりしましょう。
fte_slide_3_title=リンクを送って友達を招待
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} はほとんどのデスクトップ向けブラウザに対応しています。アカウント不要で、誰とでも無料で会話できます。
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=始めるには {{clientSuperShortname}} アイコンを見つけてください
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=話し合いたいページを見つけたら、{{brandShortname}} 内のアイコンをクリックしてリンクを作成します。それからそのリンクを好きな友達に送りましょう。
invite_header_text_bold=このページを一緒に見る友だちを招待しましょう!
invite_header_text_bold2=会話に参加する友達を招待しましょう!
invite_header_text3=Firefox Hello は 2 人で使うので、友だちにリンクを送って一緒に Web をブラウズしましょう!
invite_header_text4=このリンクを送って、一緒に Web ブラウジングを始めましょう。
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=リンクをメールで送る
invite_facebook_button3=Facebook
invite_your_link=あなたのリンク:
# Status text
display_name_guest=ゲスト
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=友達が参加すると、その友達はあなたがクリックしたタブを見ることができます。
infobar_screenshare_browser_message2=あなたはウィンドウを共有しています。開いているタブはすべて友だちによって見られます
infobar_screenshare_browser_message3=あなたはタブを共有しています。友達はあなたがクリックしたタブを見ることができます。
infobar_screenshare_stop_sharing_message=タブの共有を中止しました
infobar_button_restart_label2=共有を再開
infobar_button_restart_accesskey=e
@ -239,3 +260,5 @@ self_view_hidden_message=セルフビューは隠れていますが送信され
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} はあなたがお住まいの国では利用できません。
display_name_guest=ゲスト

View File

@ -9,6 +9,8 @@ clientSuperShortname=Hello
## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
## use "..." if \u2026 doesn't suit traditions in your locale.
loopMenuItem_label=Сөйлесуді бастау…
loopMenuItem_accesskey=т
## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
## These are displayed together at the top of the panel when a user is needed to
@ -16,25 +18,56 @@ clientSuperShortname=Hello
## and this is displayed in slightly larger font. Please arrange as necessary for
## your locale.
## {{clientShortname2}} will be replaced by the brand name for either string.
sign_in_again_title_line_one=Жүйеге қайта кіріңіз
sign_in_again_title_line_two2={{clientShortname2}} қолдануды жалғастыру үшін
sign_in_again_button=Кіру
## LOCALIZATION_NOTE(sign_in_again_use_as_guest_button2): {{clientSuperShortname}}
## will be replaced by the super short brandname.
sign_in_again_use_as_guest_button2={{clientSuperShortname}} қоңақ ретінде қолдану
panel_browse_with_friend_button=Бұл парақты досыңызбен бірге шолу
panel_disconnect_button=Байланысты үзу
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Веб парақтарды достармен бірге қарау үшін Hello батырмасын басыңыз.
first_time_experience_subheading_button_above=Веб парақтарды достармен бірге қарау үшін жоғарыдағы батырманы басыңыз.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Оны достармен бірге жоспарлау, жұмыс жасау және бірге күлу үшін қолданыңыз.
first_time_experience_content2=Оны істерді бітіру үшін қолданыңыз: достармен бірге жоспарлау, жұмыс жасау және бірге күлу.
first_time_experience_button_label2=Бұл қалай жұмыс жасайтынын қарау
## First Time Experience Slides
fte_slide_1_title=Веб парақтарды досыңызбен бірге шолу
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
invite_header_text_bold=Біреуді бұл парақты сізбен бірге шолуға шақырыңыз!
invite_header_text3=Firefox Hello қолдану үшін екі адам керек, сондықтан, досыңызға интернетті бірге шолуға сілтемені жіберіңіз!
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
# Status text
invite_copy_link_button=Сілтемені көшіріп алу
invite_copied_link_button=Көшірілген!
invite_email_link_button=Сілтемені эл. поштамен жіберу
invite_facebook_button3=Facebook
invite_your_link=Сіздің сілтемеңіз:
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
session_expired_error_description=Сессия мерзімі аяқталған. Алдында жасалған және бөліскен барлық сілтемелер енді жасамайды.
could_not_authenticate=Аутентификация мүмкін емес
password_changed_question=Пароліңізді өзгерттіңіз бе?
try_again_later=Кейінірек қайталап көріңіз
## LOCALIZATION NOTE(retry_button): Displayed when there is an error to retry
## the appropriate action.
@ -48,15 +81,31 @@ clientSuperShortname=Hello
## between {{..}}. Please keep the text below 117 characters to make sure it fits
## in a tweet.
share_add_service_button=Қызметті қосу
## LOCALIZATION NOTE (copy_link_menuitem, email_link_menuitem, delete_conversation_menuitem):
## These menu items are displayed from a panel's context menu for a conversation.
copy_link_menuitem=Сілтемені көшіріп алу
email_link_menuitem=Сілтемені эл. поштамен жіберу
delete_conversation_menuitem2=Өшіру
panel_footer_signin_or_signup_link=Кіру немесе тіркелгіні жасау
settings_menu_item_account=Тіркелгі
settings_menu_item_settings=Баптаулар
settings_menu_item_signout=Шығу
settings_menu_item_signin=Кіру
settings_menu_item_turnnotificationson=Хабарламаларды іске қосу
settings_menu_item_turnnotificationsoff=Хабарламаларды сөндіру
settings_menu_item_feedback=Кері байланыс хабарламасын жіберу
settings_menu_button_tooltip=Баптаулар
# Conversation Window Strings
initiate_call_button_label2=Сөйлесуді бастауға дайынсыз ба?
incoming_call_title2=Сөйлесуге сұраным
incoming_call_block_button=Блоктау
hangup_button_title=Іле салу
hangup_button_caption2=Шығу
@ -64,9 +113,14 @@ hangup_button_caption2=Шығу
## LOCALIZATION NOTE (call_with_contact_title): The title displayed
## when calling a contact. Don't translate the part between {{..}} because
## this will be replaced by the contact's name.
call_with_contact_title={{contactName}} контактымен сөйлесу
# Outgoing conversation
outgoing_call_title=Сөйлесуді бастау керек пе?
initiate_audio_video_call_button2=Бастау
initiate_audio_video_call_tooltip2=Видео сөйлесуін бастау
initiate_audio_call_button2=Дауыстық сөйлесу
## LOCALIZATION NOTE (contact_offline_title): Title which is displayed when the
@ -99,13 +153,6 @@ hangup_button_caption2=Шығу
# Infobar strings
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
# E10s not supported strings
# This Source Code Form is subject to the terms of the Mozilla Public
@ -145,10 +192,13 @@ rooms_room_full_call_to_action_label={{clientShortname}} туралы көбір
rooms_room_full_call_to_action_nonFx_label=Өз сөйлесуіңізді бастау үшін {{brandShortname}} жүктеп алыңыз
rooms_room_full_label=Бұл сөйлесуге екі адам қатысуда.
rooms_room_join_label=Сөйлесуге қосылу
rooms_room_joined_label=Біреу сөйлесуге қосылды!
rooms_room_joined_owner_connected_label2=Сіздің досыңыз енді байланысқан, және сіздің браузер беттерін көре алады.
rooms_room_joined_owner_not_connected_label=Сіздің досыңыз {{roomURLHostname}} сайтын бірге қарауға сізді күтіп тұр.
self_view_hidden_message=Өздік көрініс жасырылған, бірақ, жіберілуде; көрсету үшін терезе өлшемін өзгертіңіз
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} сіздің еліңізде қолжетерсіз.
display_name_guest=Қонақ

View File

@ -26,19 +26,41 @@ sign_in_again_button=Aanmelden
sign_in_again_use_as_guest_button2={{clientSuperShortname}} als gast gebruiken
panel_browse_with_friend_button=Deze pagina met een vriend bekijken
panel_stop_sharing_tabs_button=Delen van uw tabbladen stoppen
panel_disconnect_button=Verbreken
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klik op de Hello-knop om webpaginas met een vriend te bekijken.
first_time_experience_subheading_button_above=Klik op de bovenstaande knop om webpaginas met een vriend te bekijken.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Gebruik het om samen te plannen, samen te werken en samen te lachen.
first_time_experience_content2=Gebruik het om dingen gedaan te krijgen: samen plannen, samen lachen, samen werken.
first_time_experience_button_label2=Zien hoe het werkt
## First Time Experience Slides
fte_slide_1_title=Bekijk webpaginas met een vriend
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Of u nu een reis plant of een cadeau zoekt, met {{clientShortname2}} maakt u in realtime snellere beslissingen.
fte_slide_2_title=Bekijk dezelfde pagina
fte_slide_2_copy=Gebruik de ingebouwde tekst- of videochat om ideeën uit te wisselen, opties te vergelijken en overeenstemming te bereiken.
fte_slide_3_title=Nodig een vriend uit door een koppeling te delen
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} werkt met de meeste desktopbrowsers. Er zijn geen accounts nodig en iedereen maakt gratis verbinding.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Zoek het {{clientSuperShortname}}-pictogram om te beginnen
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Als u een pagina hebt gevonden die u wilt bespreken, klikt u op het pictogram in {{brandShortname}} om een koppeling te maken. Stuur deze daarna naar uw vriend zoals u wilt!
invite_header_text_bold=Nodig iemand uit om deze pagina met u te bekijken!
invite_header_text_bold2=Nodig een vriend uit om deel te nemen!
invite_header_text3=Er zijn twee personen nodig om Firefox Hello te gebruiken, dus stuur een koppeling naar een vriend om samen op het web te bladeren!
invite_header_text4=Deel deze koppeling, zodat u samen het web kunt bekijken.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Koppeling e-mailen
invite_facebook_button3=Facebook
invite_your_link=Uw koppeling:
# Status text
display_name_guest=Gast
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,29 +200,16 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Zodra uw vriend deelneemt, kan deze elk tabblad zien waarop u klikt.
infobar_screenshare_browser_message2=U deelt uw tabbladen. Tabbladen waarop u klikt kunnen door uw vrienden worden gezien
infobar_screenshare_paused_browser_message=Tabbladen delen is gepauzeerd
infobar_button_gotit_label=Begrepen!
infobar_button_gotit_accesskey=e
infobar_button_pause_label=Pauzeren
infobar_button_pause_accesskey=P
infobar_button_restart_label=Herstarten
infobar_screenshare_browser_message3=U deelt nu uw tabbladen. Uw vriend ziet elk tabblad waarop u klikt.
infobar_screenshare_stop_sharing_message=Uw tabbladen worden niet meer gedeeld
infobar_button_restart_label2=Delen herstarten
infobar_button_restart_accesskey=e
infobar_button_resume_label=Hervatten
infobar_button_resume_accesskey=r
infobar_button_stop_label=Stoppen
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Dit niet meer tonen
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Nog geen gesprekken.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Begin een nieuw gesprek!
infobar_button_stop_label2=Delen stoppen
infobar_button_stop_accesskey=s
infobar_button_disconnect_label=Verbreken
infobar_button_disconnect_accesskey=v
# E10s not supported strings
@ -246,10 +252,13 @@ rooms_room_full_call_to_action_label=Meer info over {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Download {{brandShortname}} om zelf een gesprek te beginnen
rooms_room_full_label=Er zijn al twee personen in dit gesprek.
rooms_room_join_label=Deelnemen aan het gesprek
rooms_room_joined_label=Iemand neemt deel aan het gesprek!
rooms_room_joined_owner_connected_label2=Uw vriend is nu verbonden en kan uw tabbladen zien.
rooms_room_joined_owner_not_connected_label=Uw vriend wacht en wil samen met u {{roomURLHostname}} bekijken.
self_view_hidden_message=Eigen weergave verborgen maar wordt nog steeds verzonden; wijzig vensterformaat om te tonen
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} is niet in uw land beschikbaar.
display_name_guest=Gast

View File

@ -2,56 +2,174 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
initiate_call_button_label2=Gotowi do rozmowy?
hangup_button_title=Rozłącz
hangup_button_caption2=Rozłącz
clientSuperShortname=Firefox Hello
call_with_contact_title=Połączenie z {{incomingCallIdentity}}
loopMenuItem_label=Rozpocznij rozmowę…
loopMenuItem_accesskey=R
sign_in_again_title_line_one=Zaloguj się ponownie,
sign_in_again_title_line_two2=aby dalej używać {{clientShortname2}}
sign_in_again_button=Zaloguj się
sign_in_again_use_as_guest_button2=Używaj {{clientSuperShortname}} jako gość
panel_browse_with_friend_button=Udostępnij rozmówcy obraz tej karty
panel_disconnect_button=Rozłącz
first_time_experience_subheading2=Kliknij przycisk Hello, aby przeglądać strony ze znajomymi.
first_time_experience_subheading_button_above=Kliknij przycisk powyżej, aby przeglądać strony WWW ze znajomymi.
first_time_experience_content=Używaj Firefox Hello do wspólnego planowania, pracy i zabawy.
first_time_experience_content2=Używaj Firefox Hello do wspólnego planowania, pracy i zabawy.
first_time_experience_button_label2=Przekonaj się, jak to działa
fte_slide_1_title=Przeglądaj strony WWW wspólnie ze znajomymi
fte_slide_1_copy=Niezależnie czy planujesz wycieczkę, zakup prezentu, {{clientShortname2}} pozwala podejmować decyzje szybciej.
fte_slide_2_title=Przeglądaj tę samą stronę
fte_slide_2_copy=Wbudowany czat tekstowy i wideo umożliwia łatwe dzielenie się pomysłami, porównywanie opcji i podejmowanie decyzji.
fte_slide_3_title=Zaproś znajomego wysyłając odnośnik
fte_slide_3_copy={{clientSuperShortname}} działa w większości przeglądarek na komputery. Nie jest wymagane zakładnie kont i wszyscy łączą się bez opłat.
fte_slide_4_title=Odszukaj ikonę {{clientSuperShortname}}, aby rozpocząć
fte_slide_4_copy=Po znalezieniu strony do omówienia, kliknij ikonę w {{brandShortname}}, aby utworzyć odnośnik. Wyślij go znajomemu jakkolwiek chcesz!
invite_header_text_bold=Zaproś kogoś do wspólnego przeglądania strony
invite_header_text_bold2=Zaproś znajomego, aby dołączył do Ciebie!
invite_header_text3=Do używania Firefox Hello potrzeba dwóch osób, prześlij znajomemu odnośnik do wspólnego przeglądania sieci.
invite_header_text4=Udostępnij ten odnośnik, aby przeglądać wspólnie sieć.
invite_copy_link_button=Kopiuj odnośnik
invite_copied_link_button=Skopiowano
invite_email_link_button=Wyślij odnośnik
invite_facebook_button3=Udostępnij na Facebooku
invite_your_link=Odnośnik:
session_expired_error_description=Sesja wygasła. Żadne adresy URL utworzone wcześniej nie będą działać.
could_not_authenticate=Uwierzytelnianie nie powiodło się
password_changed_question=Może hasło zostało zmienione?
try_again_later=Proszę spróbować ponownie
could_not_connect=Nie można połączyć z serwerem
check_internet_connection=Proszę sprawdzić połączenie z Internetem
login_expired=Sesja wygasła
service_not_available=Serwis tymczasowo niedostępny
problem_accessing_account=Wystąpił problem z dostępem do konta
retry_button=Spróbuj ponownie
share_email_subject7=Zaproszenie do wspólnego przeglądania sieci
share_email_body7=Ktoś czeka, aby połączyć się z Tobą poprzez Firefox Hello. Kliknij odnośnik, aby wspólnie przeglądać sieć: {{callUrl}}
share_email_body_context3=Ktoś czeka, aby połączyć się z Tobą poprzez Firefox Hello. Kliknij odnośnik, aby przeglądać „{{title}}” razem: {{callUrl}}
share_email_footer2=\n\n____________\nFirefox Hello pozwala przeglądać sieć ze znajomymi. Użyj go, gdy chcesz coś wspólnie załatwić, zaplanować, popracować czy pośmiać się. Więcej informacji można znaleźć pod adresem https://www.firefox.com/hello
share_tweet=Dołącz do rozmowy wideo ze mną, używając {{clientShortname2}}!
share_add_service_button=Dodaj serwis
copy_link_menuitem=Kopiuj odnośnik
email_link_menuitem=Wyślij odnośnik
delete_conversation_menuitem2=Usuń
panel_footer_signin_or_signup_link=Zaloguj się lub utwórz konto
settings_menu_item_account=Konto
settings_menu_item_settings=Ustawienia
settings_menu_item_signout=Wyloguj się
settings_menu_item_signin=Zaloguj się
settings_menu_item_turnnotificationson=Włącz powiadomienia
settings_menu_item_turnnotificationsoff=Wyłącz powiadomienia
settings_menu_item_feedback=Prześlij swoją opinię…
settings_menu_button_tooltip=Ustawienia
initiate_call_button_label2=Rozpocząć rozmowę?
incoming_call_title2=Rozmowa przychodząca
incoming_call_block_button=Zablokuj
hangup_button_title=Rozłącz
hangup_button_caption2=Zakończ rozmowę
call_with_contact_title=Rozmowa z {{incomingCallIdentity}}
outgoing_call_title=Rozpocząć rozmowę?
initiate_audio_video_call_button2=Zacznij
initiate_audio_video_call_tooltip2=Zacznij wideorozmowę
initiate_audio_call_button2=Rozmowa
initiate_audio_video_call_button2=Rozpocznij
initiate_audio_video_call_tooltip2=Rozpocznij (dźwięk i obraz)
initiate_audio_call_button2=Rozpocznij (tylko dźwięk)
peer_ended_conversation2=Rozmówca się rozłączył.
restart_call=Połącz ponownie
call_timeout_notification_text=Połączenie nieudane.
contact_offline_title=Kontakt offline
call_timeout_notification_text=Nieudane połączenie.
network_disconnected=Połączenie sieciowe nagle rozłączone.
connection_error_see_console_notification=Rozmowa przerwana; sprawdź szczegóły w konsoli.
cancel_button=Anuluj
rejoin_button=Połącz ponownie
feedback_rejoin_button=Połącz
cannot_start_call_session_not_ready=Nie można rozpocząć rozmowy, sesja nie jest gotowa.
network_disconnected=Połączenie sieciowe niespodziewanie zakończone.
connection_error_see_console_notification=Nieudane połączenie (szczegóły można znaleźć w konsoli).
no_media_failure_message=Nie znaleziono kamery ani mikrofonu.
ice_failure_message=Nieudane połączenie. Zapora sieciowa może blokować połączenia.
legal_text_and_links3=Używając {{clientShortname}}, zgadzasz się na {{terms_of_use}} oraz {{privacy_notice}}.
legal_text_tos=warunki korzystania z usługi
legal_text_privacy=politykę prywatności
powered_by_beforeLogo=Obsługiwane przez
powered_by_afterLogo=
feedback_rejoin_button=Połącz ponownie
feedback_report_user_button=Zgłoś użytkownika
feedback_window_heading=Jak oceniasz rozmowę?
feedback_request_button=Prześlij swoją opinię
tour_label=Przewodnik
rooms_list_recently_browsed2=Ostatnio otwierane
rooms_list_currently_browsing2=Obecnie aktywne
rooms_signout_alert=Otwarte rozmowy zostaną zamknięte
room_name_untitled_page=Strona bez tytułu
door_hanger_return=Do zobaczenia! Do tej współdzielonej sesji można zawsze wrócić przez panel Hello.
door_hanger_prompt_name=Czy nadać jej nazwę ułatwiającą jej zapamiętanie? Obecna nazwa to:
door_hanger_button=OK
infobar_screenshare_no_guest_message=Jak tylko znajomy dołączy, będzie mógł oglądać zawartość każdej karty, którą klikniesz.
infobar_screenshare_browser_message2=Udostępniasz obraz kart. Rozmówcy mogą oglądać zawartość każdej karty, którą klikniesz.
infobar_screenshare_browser_message3=Udostępniasz obraz kart. Rozmówcy mogą oglądać zawartość każdej karty, którą klikniesz.
infobar_screenshare_stop_sharing_message=Udostępnianie obrazu kart zostało wstrzymane
infobar_button_restart_label2=Wznów udostępnianie
infobar_button_restart_accesskey=W
infobar_button_stop_label2=Nie udostępniaj dłużej
infobar_button_stop_accesskey=N
infobar_button_disconnect_label=Rozłącz
infobar_button_disconnect_accesskey=R
e10s_not_supported_button_label=Otwórz nowe okno
e10s_not_supported_subheading={{brandShortname}} nie działa w oknach wieloprocesowych.
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
chat_textbox_placeholder=Wiadomość
chat_textbox_placeholder=Wprowadź tekst wiadomości
clientShortname2=Firefox Hello
conversation_has_ended=Rozmowa zakończona.
conversation_has_ended=Rozmowa zakończona
generic_failure_message=Wystąpiły problemy techniczne…
generic_failure_no_reason2=Spróbować ponownie?
help_label=Pomoc
mute_local_audio_button_title=Wycisz audio
unmute_local_audio_button_title=Włącz audio
mute_local_audio_button_title=Wycisz
unmute_local_audio_button_title=Włącz dźwięk
mute_local_video_button_title2=Wyłącz wysyłanie obrazu
unmute_local_video_button_title2=Włącz wysyłanie obrazu
retry_call_button=Połącz ponownie
retry_call_button=Spróbuj ponownie
rooms_leave_button_label=Opuść
rooms_panel_title=Wybierz lub zacznij rozmowę
rooms_room_full_call_to_action_label=Dowiedz się więcej o {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Ściągnij {{brandShortname}} i zacznij własne rozmowy
rooms_room_full_label=Dwie inne osoby już tu są.
rooms_leave_button_label=Rozłącz
rooms_panel_title=Wybierz rozmowę lub rozpocznij nową
rooms_room_full_call_to_action_label=Więcej informacji o {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Pobierz program {{brandShortname}}, aby rozpocząć własną
rooms_room_full_label=Dwoje innych uczestników bierze już udział w tej rozmowie
rooms_room_join_label=Dołącz do rozmowy
rooms_room_joined_label=Ktoś właśnie dołączył do rozmowy!
rooms_room_joined_owner_connected_label2=Zestawiono połączenie, druga osoba będzie od teraz mogła widzieć Twoje karty.
rooms_room_joined_owner_not_connected_label=Ktoś czeka, aby wspólnie przeglądać {{roomURLHostname}}.
self_view_hidden_message=Obraz z własnej kamery ukryty, ale nadal wysyłany; aby go zobaczyć, zmień rozmiar okna
self_view_hidden_message=Obraz z kamery jest ukryty ale nadal wysyłany (powiększenie okna ukaże go)
tos_failure_message=Usługa {{clientShortname}} nie jest dostępna w tym kraju.
display_name_guest=Gość

View File

@ -28,15 +28,29 @@ sign_in_again_use_as_guest_button2=Usar o {{clientSuperShortname}} como um convi
panel_browse_with_friend_button=Navegue nesta página com um amigo
panel_disconnect_button=Desconectar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Clique no botão Hello para navegar com um amigo.
first_time_experience_subheading_button_above=Clique no botão acima para navegar na web com um amigo.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Use para planejar junto, trabalhar junto, rir junto.
first_time_experience_content2=Use para fazer coisas: planejar juntos, rir juntos, trabalhar juntos.
first_time_experience_button_label2=Veja como funciona
## First Time Experience Slides
fte_slide_1_title=Navegue na web com um amigo
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Se está planejando uma viagem ou comprar um presente, {{clientShortname2}} te deixa tomar decisões mais rápidas em tempo real.
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
invite_header_text_bold=Convide alguém para navegar nessa página com você!
invite_header_text3=É preciso de dois para usar o Firefox Hello, então envie um link para um amigo navegar na web com você!
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
@ -48,9 +62,6 @@ invite_email_link_button=Enviar link por email
invite_facebook_button3=Facebook
invite_your_link=Seu link:
# Status text
display_name_guest=Convidado
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -239,3 +250,5 @@ self_view_hidden_message=A visualização da sua câmera está oculta, mas ainda
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} não está disponível no seu país.
display_name_guest=Convidado

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Utilizar {{clientSuperShortname}} como um Con
panel_browse_with_friend_button=Navegue nesta página com um amigo
panel_disconnect_button=Desligar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Clique no botão Hello para navegar páginas Web com um amigo.
first_time_experience_subheading_button_above=Clique no botão acima para navegar em páginas Web com um amigo.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Use-o para planear, trabalhar e rir em conjunto.
first_time_experience_content2=Use-o para fazer coisas: planear em conjunto, rir em conjunto, trabalhar em conjunto.
first_time_experience_button_label2=Ver como funciona
## First Time Experience Slides
fte_slide_1_title=Navegue em páginas Web com um amigo
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Se estiver a planear uma viagem ou a fazer compras para um presente, o {{clientShortname2}} deixa-o fazer decisões mais rápidas em tempo real.
fte_slide_2_title=Esteja na mesma página
fte_slide_2_copy=Utilize o texto embutido ou conversa por vídeo para partilhar ideias, comparar opções e chegar a um acordo.
fte_slide_3_title=Convide um amigo ao enviar esta ligação
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy=O {{clientSuperShortname}} funciona com a maioria dos navegadores de computador. Não são necessárias contas e todos se ligam de graça.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Encontre o ícone {{clientSuperShortname}} para começar
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Assim que encontrar uma página que queira discutir, clique no ícone no {{brandShortname}} para criar uma ligação. Depois, envie-a a um amigo como quiser!
invite_header_text_bold=Convide alguém para navegar nesta página consigo!
invite_header_text_bold2=Convide um amigo para se juntar a si!
invite_header_text3=São necessárias duas pessoas para utilizar o Firefox Hello, pelo que, envie uma ligação a um amigo para navegar na Web consigo!
invite_header_text4=Partilhe esta ligação para que possa começar a navegar na Web em conjunto.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Enviar por email
invite_facebook_button3=Facebook
invite_your_link=A sua ligação:
# Status text
display_name_guest=Convidado
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Assim que o seu amigo se juntar, o mesmo poderá ver qualquer separador que você clique.
infobar_screenshare_browser_message2=Está a partilhar os seus separadores. Qualquer separador que clicar poderá será ser visto pelos seus amigos
infobar_screenshare_browser_message3=Está agora a partilhar os seus separadores. O seu amigo poderá ver qualquer separador que você clicar.
infobar_screenshare_stop_sharing_message=Já não está a partilhar os seus separadores
infobar_button_restart_label2=Reiniciar a partilha
infobar_button_restart_accesskey=e
@ -239,3 +260,5 @@ self_view_hidden_message=Vista própria oculta mas ainda a ser enviada; redimens
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} não está disponível no seu país.
display_name_guest=Visitante

View File

@ -26,7 +26,7 @@ sign_in_again_button=S'annunziar
sign_in_again_use_as_guest_button2=Utilisar {{clientSuperShortname}} sco giast
panel_browse_with_friend_button=Navigar cun in ami en questa pagina
panel_stop_sharing_tabs_button=Chalar da cundivider tes tabs
panel_disconnect_button=Deconnectar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -183,28 +183,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Ti cundividas tes tabs. Mintga tab che ti avras vesan era tes amis
infobar_screenshare_paused_browser_message=La cundivisiun da tabs paussa
infobar_button_gotit_label=Chapì!
infobar_button_gotit_accesskey=C
infobar_button_pause_label=Pausa
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reaviar
infobar_screenshare_stop_sharing_message=Ti na cundividas betg pli tes tabs
infobar_button_restart_label2=Puspè cundivider
infobar_button_restart_accesskey=e
infobar_button_resume_label=Cuntinuar
infobar_button_resume_accesskey=r
infobar_button_stop_label=Stop
infobar_button_stop_label2=Chalar da cundivider
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Betg pli mussar
infobar_menuitem_dontshowagain_accesskey=p
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Anc naginas conversaziuns.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Cumenza uss ina nova!
infobar_button_disconnect_label=Deconnectar
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -247,7 +232,8 @@ rooms_room_full_call_to_action_label=Ulteriuras infurmaziuns davart {{clientShor
rooms_room_full_call_to_action_nonFx_label=Telechargiar {{brandShortname}} per cumenzar in'atgna
rooms_room_full_label=Igl ha gia duas persunas en questa conversaziun.
rooms_room_join_label=Entrar en la conversaziun
rooms_room_joined_label=Insatgi è entrà en la conversaziun!
rooms_room_joined_owner_connected_label2=Tia amia u tes ami è ussa connectà e po vesair tes tabs.
rooms_room_joined_owner_not_connected_label=Tia amia u tes ami spetga per navigar cun tai sin {{roomURLHostname}}.
self_view_hidden_message=Tes video è zuppentà, ma vegn anc adina transmess; engrondir la fanestra per al mussar

View File

@ -26,19 +26,41 @@ sign_in_again_button=Войти
sign_in_again_use_as_guest_button2=Использовать {{clientSuperShortname}} как Гость
panel_browse_with_friend_button=Просмотрите эту страницу со своим другом
panel_stop_sharing_tabs_button=Прекратить доступ к вашим вкладкам
panel_disconnect_button=Отсоединить
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Щёлкните по кнопке Hello, чтобы вместе с другом посёрфить по Интернету.
first_time_experience_subheading_button_above=Щёлкните на кнопку ниже, чтобы просмотреть веб-страницы с другом.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Используйте это, чтобы вместе планировать, вместе работать, вместе смеяться.
first_time_experience_content2=Используйте, чтобы добиться цели: планируйте вместе, смейтесь вместе, работайте вместе.
first_time_experience_button_label2=Посмотреть, как это работает
## First Time Experience Slides
fte_slide_1_title=Просматривайте веб-страницы с другом
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Бу то планирование поездки или покупка подарка, {{clientShortname2}} позволяет вам принимать решения быстрее в реальном времени.
fte_slide_2_title=Смотрите одну страницу
fte_slide_2_copy=Используйте встроенные текстовые и видео чаты для обмена идеями, сравнения мнений и прихода к соглашению.
fte_slide_3_title=Пригласите друга, отправив ему ссылку
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} работает с множеством настольных браузеров. Не нужны аккаунты и каждый может подключаться бесплатно.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Найдите иконку {{clientSuperShortname}}, чтобы начать
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Когда вы найдете страницу, которую захотите обсудить, нажмите иконку {{brandShortname}}, чтобы создать ссылку. Затем отправьте её другу, любым удобным для вас способом!
invite_header_text_bold=Пригласите кого-нибудь, чтобы посмотреть эту страницу вместе!
invite_header_text_bold2=Пригласить друга присоединиться к вам!
invite_header_text3=Firefox Hello создан для общения, так что отправьте другу ссылку, чтобы вместе посёрфить по Интернету!
invite_header_text4=Поделитесь этой ссылкой и вы сможете просматривать Веб вместе.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Послать ссылку по эл. почте
invite_facebook_button3=Фейсбук
invite_your_link=Ваша ссылка:
# Status text
display_name_guest=Гость
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,29 +201,16 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Как только ваши друзья присоединятся, они смогут увидеть любую текущую вкладку.
infobar_screenshare_browser_message2=Вы делитесь своими вкладками. Ваши друзья могут видеть содержимое любой вкладки, по которой вы щёлкнули.
infobar_screenshare_paused_browser_message=Доступ к вкладкам приостановлен
infobar_button_gotit_label=Понятно!
infobar_button_gotit_accesskey=о
infobar_button_pause_label=Приостановить
infobar_button_pause_accesskey=и
infobar_button_restart_label=Перезапустить
infobar_screenshare_browser_message3=Сейчас вы делитесь своими вкладками. Ваш друг увидит любую вкладку, на которую вы нажмёте.
infobar_screenshare_stop_sharing_message=Вы больше не можете обмениваться своими вкладками
infobar_button_restart_label2=Перезапустить обмен
infobar_button_restart_accesskey=е
infobar_button_resume_label=Возобновить
infobar_button_resume_accesskey=о
infobar_button_stop_label=Остановить
infobar_button_stop_label2=Остановить обмен
infobar_button_stop_accesskey=н
infobar_menuitem_dontshowagain_label=Не показывать в следующий раз
infobar_menuitem_dontshowagain_accesskey=ы
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Пока звонков не было
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Сделайте звонок!
infobar_button_disconnect_label=Отсоединить
infobar_button_disconnect_accesskey=о
# E10s not supported strings
@ -247,10 +253,13 @@ rooms_room_full_call_to_action_label=Узнайте больше о {{clientShor
rooms_room_full_call_to_action_nonFx_label=Загрузите {{brandShortname}}, чтобы сделать звонок
rooms_room_full_label=В этом звонке уже участвуют два человека.
rooms_room_join_label=Присоединиться к звонку
rooms_room_joined_label=Кто-то присоединился к звонку!
rooms_room_joined_owner_connected_label2=Ваш друг сейчас подключен и сможет увидеть ваши вкладки.
rooms_room_joined_owner_not_connected_label=Ваш друг ожидает просмотра {{roomURLHostname}} с вами.
self_view_hidden_message=Вид самого себя скрыт, но всё же отправляется; измените размер окна для показа
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} не доступен в вашей стране.
display_name_guest=Гость

View File

@ -26,19 +26,41 @@ sign_in_again_button=Prihlásiť sa
sign_in_again_use_as_guest_button2=Používať {{clientSuperShortname}} ako hosť
panel_browse_with_friend_button=Prehliadať túto stránku s priateľom
panel_stop_sharing_tabs_button=Ukončiť zdieľanie vašich kariet
panel_disconnect_button=Odpojiť
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Kliknite na tlačidlo Hello a prehliadajte webové stránky spolu s priateľom.
first_time_experience_subheading_button_above=Kliknite na tlačidlo Hello a prehliadajte webové stránky spolu s priateľom.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Používajte ho na spoločné plánovanie, spoločnú prácu a spoločnú zábavu.
first_time_experience_content2=Používajte ho, aby sa veci pohli: plánujte spolu, pracujte spolu, zabávajte sa spolu.
first_time_experience_button_label2=Pozrite sa, ako to funguje
## First Time Experience Slides
fte_slide_1_title=Prehliadajte webové stránky s priateľom
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Či plánujete cestu alebo nakupujete darček, {{clientShortname2}} vám umožní sa rýchlejšie rozhodnúť.
fte_slide_2_title=Ujasnite si to
fte_slide_2_copy=Použite zabudovaný textový alebo video rozhovor a zdieľajte svoje nápady, porovnávajte možnosti a dospejte k dohode.
fte_slide_3_title=Pozvite priateľa odoslaním odkazu
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} funguje s väčšinou prehliadačov pre počítače. Nie sú potrebné žiadne registrácie, pre všetkých je to zadarmo.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Nájdite ikonu {{clientSuperShortname}} a začnite
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Keď nájdete stránku, o ktorej sa chcete porozprávať, kliknite na ikonu v prehliadači {{brandShortname}} a vytvorí sa odkaz. Tento následne doručte vášmu priateľovi.
invite_header_text_bold=Pozvite niekoho na spoločné prehliadanie tejto stránky!
invite_header_text_bold2=Pozvite priateľa, aby sa k vám pripojil
invite_header_text3=Na používanie Firefox Hello treba dvoch, takže pošlite kamarátovi odkaz, aby si web prehliadal s vami!
invite_header_text4=Zdieľajte tento odkaz, aby ste mohli začať prehliadať web spolu.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Odoslať odkaz
invite_facebook_button3=Facebook
invite_your_link=Váš odkaz:
# Status text
display_name_guest=Hosť
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,29 +201,16 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Akonáhle sa váš priateľ pripojí, bude môcť vidieť akúkoľvek kartu, na ktorú kliknete.
infobar_screenshare_browser_message2=Zdieľajte svoje karty. Akúkoľvek kartu prehliadača, na ktorú kliknete, môžu vidieť vaši priatelia
infobar_screenshare_paused_browser_message=Zdieľanie karty je pozastavené
infobar_button_gotit_label=Rozumiem
infobar_button_gotit_accesskey=o
infobar_button_pause_label=Pozastaviť
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reštartovať
infobar_screenshare_browser_message3=Práve zdieľate svoje karty. Váš priateľ uvidí každú kartu, na ktorú kliknete.
infobar_screenshare_stop_sharing_message=Svoje karty už viac nezdieľate
infobar_button_restart_label2=Znova spustiť zdieľanie
infobar_button_restart_accesskey=R
infobar_button_resume_label=Pokračovať
infobar_button_resume_accesskey=P
infobar_button_stop_label=Zastaviť
infobar_button_stop_label2=Zastaviť zdieľanie
infobar_button_stop_accesskey=Z
infobar_menuitem_dontshowagain_label=Nabudúce nezobrazovať
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Zatiaľ žiadne rozhovory
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Začnite nový rozhovor
infobar_button_disconnect_label=Odpojiť
infobar_button_disconnect_accesskey=O
# E10s not supported strings
@ -247,10 +253,13 @@ rooms_room_full_call_to_action_label=Zistiť viac o {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Prevezmite si {{brandShortname}} a začnite svoju vlastnú
rooms_room_full_label=V tejto konverzácii sú už dve osoby.
rooms_room_join_label=Pripojiť ku konverzácii
rooms_room_joined_label=Niekto sa pripojil ku konverzácii!
rooms_room_joined_owner_connected_label2=Váš priateľ je teraz pripojený a môže vidieť vaše karty.
rooms_room_joined_owner_not_connected_label=Váš priateľ čaká na prehľadávanie {{roomURLHostname}} s vami.
self_view_hidden_message=Záber z kamery je skrytý, napriek tomu sa stále odosiela; pre zobrazenie upravte veľkosť okna
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} nie je vo vašej krajine dostupný.
display_name_guest=Hosť

View File

@ -26,19 +26,41 @@ sign_in_again_button=Hyni
sign_in_again_use_as_guest_button2=Përdoreni {{clientSuperShortname}}-në si I ftuar
panel_browse_with_friend_button=Shfletojeni këtë faqe me një shok
panel_stop_sharing_tabs_button=Reshtni së ndari me të tjerët skedat tuaja
panel_disconnect_button=Shkëputuni
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klikoni butonin Hello që të shfletoni faqe Web me një shok.
first_time_experience_subheading_button_above=Klikoni butonin më sipër që të shfletoni faqen në Internet tok me një shok.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Përdoreni që të planifikoni së bashku, punoni tok, të qeshni tok.
first_time_experience_content2=Përdoreni që të mbaroni punë: planifikoni tok, qeshni tok, punoni tok.
first_time_experience_button_label2=Shihni se si funksionon
## First Time Experience Slides
fte_slide_1_title=Shfletoni faqe në Internet me një shok
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Qoftë kur bëni plane për një udhëtim apo për të blerë një dhuratë, {{clientShortname2}} ju lejon të merrni vendime më shpejt, aty për aty.
fte_slide_2_title=Merruni me të njëjtën faqe
fte_slide_2_copy=Përdorni fjalosjen me tekst ose video, të vetë programit, për të ndarë me të tjerët ide, për të krahasuar mundësi të ndryshme dhe për të arritur në të njëjtin mendim.
fte_slide_3_title=Ftoni një shok duke i dërguar një lidhje
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} funksionon me shumicën e shfletuesve për desktop. Ska nevojë për llogari dhe gjithkush mund të lidhet falas.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Që tia filloni, gjeni ikonën {{clientSuperShortname}}
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Pasi të keni gjetur një faqe mbi të cilën doni të diskutoni, klikoni mbi ikonën te {{brandShortname}} që të krijoni një lidhje. Mandej dërgojani shokut tuaj kur të doni!
invite_header_text_bold=Ftoni dikë ta shfletojë këtë faqe tok me ju!
invite_header_text_bold2=Ftoni të vijë një shok!
invite_header_text3=Duhen dy vetë që të përdorni Firefox Hello-në, ndaj dërgojini një shoku një lidhje që të shfletoni Web-in së bashku!
invite_header_text4=Ndajeni me ta këtë lidhje që të filloni të shfletoni në internet tok.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Dërgojeni Lidhjen Me Email
invite_facebook_button3=Facebook
invite_your_link=Lidhja juaj:
# Status text
display_name_guest=I ftuar
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,29 +201,16 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Sapo të vijnë, shokët tuaj do të jenë në gjendje të shohin cilëndo skedë mbi të cilën klikoni.
infobar_screenshare_browser_message2=Po ndani skeda me të tjerët. Çfarëdo skede mbi të cilën klikoni mund të shihet nga shokët tuaj
infobar_screenshare_paused_browser_message=Ndarja e skedave me të tjerët është e ndalur
infobar_button_gotit_label=E mora vesh!
infobar_button_gotit_accesskey=v
infobar_button_pause_label=Pushim
infobar_button_pause_accesskey=P
infobar_button_restart_label=Rinise
infobar_screenshare_browser_message3=Tani jeni duke ndarë skeda me të tjerët. Shoku juaj do të shohë cilëndo skedë mbi të cilën klikoni.
infobar_screenshare_stop_sharing_message=Sjeni më duke ndarë skedat tuaja
infobar_button_restart_label2=Rinisni ndarjen me të tjerë
infobar_button_restart_accesskey=e
infobar_button_resume_label=Rimerre
infobar_button_resume_accesskey=R
infobar_button_stop_label=Ndale
infobar_button_stop_label2=Reshtni së ndari me të tjerë
infobar_button_stop_accesskey=N
infobar_menuitem_dontshowagain_label=Mos e shfaq më këtë
infobar_menuitem_dontshowagain_accesskey=M
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Ende pa biseda.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Filloni një të re!
infobar_button_disconnect_label=Shkëputuni
infobar_button_disconnect_accesskey=S
# E10s not supported strings
@ -247,10 +253,13 @@ rooms_room_full_call_to_action_label=Mësoni më tepër rreth {{clientShortname}
rooms_room_full_call_to_action_nonFx_label=Shkarkoni {{brandShortname}}-in që të filloni tuajën
rooms_room_full_label=Ka tashmë dy vetë në këtë bisedë.
rooms_room_join_label=Hyni në bisedë
rooms_room_joined_label=Dikush erdhi në bisedë!
rooms_room_joined_owner_connected_label2=Shoku juaj tani është i lidhur dhe do të jetë në gjendje të shohë skedat tuaja.
rooms_room_joined_owner_not_connected_label=Shoku juaj po pret të shfletojë {{roomURLHostname}} me ju.
self_view_hidden_message=I vetëfshehur, por prapë i dukshëm; ripërmasoni dritaren që të shfaqet
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} sështë i passhëm në vendin tuaj.
display_name_guest=Mysafir

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Använd {{clientSuperShortname}} som gäst
panel_browse_with_friend_button=Surfa på denna sida med en vän
panel_disconnect_button=Koppla från
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klicka på knappen Hello för att surfa på webben med en vän.
first_time_experience_subheading_button_above=Klicka på knappen ovan för att surfa webbsidor tillsammans med en vän.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Använd den för att planera tillsammans, arbeta tillsammans, skratta tillsammans.
first_time_experience_content2=Använd den för att få saker gjorda: planera tillsammans, skratta tillsammans, arbeta tillsammans.
first_time_experience_button_label2=Se hur det fungerar
## First Time Experience Slides
fte_slide_1_title=Surfa på hemsidor med en vän
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Vare sig du planerar en resa eller letar efter en present, låter {{clientShortname2}} dig fatta snabbare beslut i realtid.
fte_slide_2_title=Hamna på samma sida
fte_slide_2_copy=Använd den inbyggda text eller videochatten för att utbyta idéer, jämföra olika alternativ och komma överens.
fte_slide_3_title=Bjuda in en vän genom att skicka en länk
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} fungerar med de flesta webbläsare. Inga konton är nödvändiga och alla ansluter gratis.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Hitta ikonen för {{clientSuperShortname}} för att komma igång
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=När du har hittat en sida som du vill diskutera, klicka på ikonen för {{brandShortname}} för att skapa en länk. Skicka det sen till din vän hur du vill!
invite_header_text_bold=Bjud in någon att surfa på sidan med dig!
invite_header_text_bold2=Bjud in en kompis att delta!
invite_header_text3=Det krävs två för att använda Firefox Hello, så skicka en länk till en vän för att surfa på webben med dig!
invite_header_text4=Dela denna länken så att ni kan börja surfa på Webben tillsammans.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=E-posta länk
invite_facebook_button3=Facebook
invite_your_link=Din länk:
# Status text
display_name_guest=Gäst
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=Ok
# Infobar strings
infobar_screenshare_no_guest_message=Så fort din kompis ansluter sig, kommer de att se vilka flikar du klickar på.
infobar_screenshare_browser_message2=Du delar dina flikar. Alla flik du klickar på kan ses av dina vänner
infobar_screenshare_browser_message3=Du delar nu dina flikar. Din vän kommer se alla flikar som du klickar på.
infobar_screenshare_stop_sharing_message=Du delar inte längre dina flikar
infobar_button_restart_label2=Starta om delning
infobar_button_restart_accesskey=d
@ -239,3 +260,5 @@ self_view_hidden_message=Själv-vy dold, men skickas ändå; ändra fönsterstor
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} är inte tillgänglig i ditt land.
display_name_guest=Gäst

View File

@ -26,18 +26,41 @@ sign_in_again_button=Giriş yap
sign_in_again_use_as_guest_button2={{clientSuperShortname}}'yu konuk olarak kullan
panel_browse_with_friend_button=Bu sayfayı arkadaşınızla birlikte gezin
panel_stop_sharing_tabs_button=Sekmeleri paylaşmayı durdur
panel_disconnect_button=Bağlantıyı kes
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Web sayfalarını bir arkadaşınızla birlikte gezmek için Hello düğmesine tıklayın.
first_time_experience_subheading_button_above=Web sayfalarını bir arkadaşınızla birlikte gezmek için yukarıdaki düğmeye tıklayın.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Birlikte plan yapın, birlikte çalışın, birlikte gülün.
first_time_experience_content2=İnternet birlikte güzel: Birlikte plan yapın, birlikte çalışın, birlikte gülün.
first_time_experience_button_label2=Nasıl çalıştığını görün
## First Time Experience Slides
fte_slide_1_title=Web sayfalarını bir arkadaşınızla gezin
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=İster bir seyahat planlıyor olun ister hediye seçiyor, {{clientShortname2}} daha çabuk karar vermenize yardımcı olacak.
fte_slide_2_title=Aynı sayfada buluşun
fte_slide_2_copy=Fikirlerinizi paylaşmak, seçenekleri karşılaştırmak ve karara varmak için yazılı ve görüntülü sohbet edebilirsiniz.
fte_slide_3_title=Bir bağlantı göndererek arkadaşınızı davet edin
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} çoğu masaüstü web tarayıcısıyla uyumludur. Hesap açmanız gerekmez ve herkes ücretsiz bağlanabilir.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Başlamak için {{clientSuperShortname}} simgesini bulun
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Üzerinde konuşmak istediğiniz sayfayı bulunca bir bağlantı oluşturmak için {{brandShortname}}'taki simgeye tıklayın. Ardından bu bağlantıyı arkadaşınızı gönderin.
invite_header_text_bold=Bu sayfayı birlikte gezmek için birini davet edin!
invite_header_text_bold2=Size katılması için arkadaşınızı davet edin!
invite_header_text3=Firefox Hello'yu kullanmak için iki kişi gerekiyor. Web'i birlikte gezmek istediğiniz arkadaşınıza bir bağlantı gönderin!
invite_header_text4=Web'de birlikte dolaşmaya başlamak için bu bağlantıyı paylaşın.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -47,9 +70,6 @@ invite_email_link_button=Bağlantıyı e-postala
invite_facebook_button3=Facebook
invite_your_link=Bağlantınız:
# Status text
display_name_guest=Konuk
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -75,6 +95,7 @@ share_email_body7=Bir arkadaşınız Firefox Hello'da sizi bekliyor. Bağlanmak
## the part between {{..}} and leave the \n\n part alone.
share_email_body_context3=Bir arkadaşınız Firefox Hello'da sizi bekliyor. Bağlanmak ve {{title}} sitesinde birlikte dolaşmak için bağlantıya tıklayın: {{callUrl}}
## LOCALIZATION NOTE (share_email_footer2): Common footer content for both email types
share_email_footer2=\n\n____________\nFirefox Hello web'de arkadaşlarınızla birlikte gezinmenizi sağlar. Birlikte plan yapmak, birlikte çalışmak veya birlikte gülmek istediğinizde onu kullanabilirsiniz. Daha fazla bilgi için: http://www.firefox.com/hello
## LOCALIZATION NOTE (share_tweeet): In this item, don't translate the part
## between {{..}}. Please keep the text below 117 characters to make sure it fits
## in a tweet.
@ -179,33 +200,21 @@ door_hanger_button=Tamam
# Infobar strings
infobar_screenshare_no_guest_message=Arkadaşınız katıldıktan sonra tıkladığınız her sekmeyi görebilecek.
infobar_screenshare_browser_message2=Sekmelerinizi paylaşıyorsunuz. Tıkladığınız her sekme arkadaşlarınız tarafından görülebilir
infobar_screenshare_paused_browser_message=Sekme paylaşımı duraklatıldı
infobar_button_gotit_label=Anladım!
infobar_button_gotit_accesskey=A
infobar_button_pause_label=Duraklat
infobar_button_pause_accesskey=D
infobar_button_restart_label=Yeniden başlat
infobar_button_restart_accesskey=e
infobar_button_resume_label=Sürdür
infobar_button_resume_accesskey=S
infobar_button_stop_label=Durdur
infobar_button_stop_accesskey=D
infobar_menuitem_dontshowagain_label=Bunu bir daha gösterme
infobar_menuitem_dontshowagain_accesskey=B
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Henüz hiç kişi yok.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Yeni bir görüşme başlatın!
infobar_screenshare_browser_message3=Şu an sekmelerinizi paylaşıyorsunuz. Arkadaşınız, tıkladığınız her sekmeyi görecek.
infobar_screenshare_stop_sharing_message=Artık sekmelerinizi paylaşmıyorsunuz
infobar_button_restart_label2=Paylaşmayı yeniden başlat
infobar_button_restart_accesskey=b
infobar_button_stop_label2=Paylaşmayı durdur
infobar_button_stop_accesskey=d
infobar_button_disconnect_label=Bağlantıyı kes
infobar_button_disconnect_accesskey=B
# E10s not supported strings
e10s_not_supported_button_label=Yeni pencere aç
e10s_not_supported_subheading={{brandShortname}} çok işlemli pencerede çalışmaz.
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
@ -243,10 +252,13 @@ rooms_room_full_call_to_action_label={{clientShortname}} hakkında bilgi alın
rooms_room_full_call_to_action_nonFx_label=Kendi görüşmenizi başlatmak için {{brandShortname}} indirin
rooms_room_full_label=Bu görüşmede zaten iki kişi var.
rooms_room_join_label=Görüşmeye katıl
rooms_room_joined_label=Birisi görüşmeye katıldı!
rooms_room_joined_owner_connected_label2=Arkadaşınız bağlandı ve artık sekmelerinizi görebilecek.
rooms_room_joined_owner_not_connected_label=Arkadaşınız sizinle birlikte {{roomURLHostname}} sitesinde gezmek için bekliyor.
self_view_hidden_message=Kendi görünümünüz gizlendi ama hâlâ gönderiliyor. Görmek için pencereyi boyutlandırın
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} ülkenizde kullanılamıyor.
display_name_guest=Misafir

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=Використовувати {{clientSuperS
panel_browse_with_friend_button=Переглянути цю сторінку з другом
panel_disconnect_button=Від'єднатися
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Натисніть кнопку Hello для перегляду веб-сторінок з друзями.
first_time_experience_subheading_button_above=Натисніть кнопку внизу для перегляду веб-сторінок з друзями.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=Використовуйте його для спільного планування, роботи й розваг.
first_time_experience_content2=Використовуйте його для спільного планування, роботи й розваг.
first_time_experience_button_label2=Дивитись, як це працює
## First Time Experience Slides
fte_slide_1_title=Переглядайте веб-сторінки з друзями
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=Плануєте ви подорож чи покупку подарунку, {{clientShortname2}} дозволяє вам приймати швидші рішення в реальному часі.
fte_slide_2_title=Переглядайте одну й ту саму сторінку
fte_slide_2_copy=Використовуйте вбудований текстовий чи відео чат для обміну ідеями, порівнянням можливостей і спільного узгодження.
fte_slide_3_title=Запрошуйте друзів, надсилаючи їм посилання
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} працює з більшістю настільних браузерів. Не потрібні облікові записи і кожен з'єднується безплатно.
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=Знайдіть піктограму {{clientSuperShortname}} щоб почати
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=Як тільки ви знайшли сторінку, яку хочете обговорити, натисніть піктограму в {{brandShortname}}, щоб створити посилання. Потім надішліть його друзям будь-яким бажаним способом!
invite_header_text_bold=Запросіть когось для перегляду цієї сторінки разом з вами!
invite_header_text_bold2=Запросіть друзів приєднатися!
invite_header_text3=Для користування Firefox Hello потрібно двоє осіб, тож надішліть посилання другу для спільного перегляду Інтернету!
invite_header_text4=Поділіться цим посиланням, щоб ви змогли почати перегляд в Інтернеті разом.
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=Надіслати посилання
invite_facebook_button3=Facebook
invite_your_link=Ваше посилання:
# Status text
display_name_guest=Гість
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -182,7 +201,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_no_guest_message=Як тільки ваші друзі приєднаються, вони зможуть бачити будь-яку вашу поточну вкладку.
infobar_screenshare_browser_message2=Ви ділитеся своїми вкладками. Ваші друзі можуть побачити вміст будь-якої вкладки, на яку ви перейшли.
infobar_screenshare_browser_message3=Тепер ви ділитеся своїми вкладками. Ваші друзі побачать будь-яку вашу поточну вкладку.
infobar_screenshare_stop_sharing_message=Ви більше не ділитеся своїми вкладками
infobar_button_restart_label2=Перезапустити обмін
infobar_button_restart_accesskey=з
@ -240,3 +261,5 @@ self_view_hidden_message=Вигляд самого себе прихований
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} недоступний у вашій країні.
display_name_guest=Гість

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=以访客身份使用 {{clientSuperShortname}
panel_browse_with_friend_button=与朋友一同浏览此页面
panel_disconnect_button=断开连接
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=点击 Hello 按钮,与朋友一起浏览网页。
first_time_experience_subheading_button_above=点击上面的按钮,与一名好友共同浏览网页。
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=用它一同策划,一同工作,一同欢笑。
first_time_experience_content2=使用它可以做到:一起协同,一起工作,一起欢笑。
first_time_experience_button_label2=它如何工作
## First Time Experience Slides
fte_slide_1_title=与一名好友共同浏览网页
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=无论是计划旅途还是礼品购买,{{clientShortname2}} 都可以让您更快地实时完成决策。
fte_slide_2_title=在同一个页面上
fte_slide_2_copy=使用内置的文字或视频聊天来分享想法,比较选择,以及达成一致。
fte_slide_3_title=发送一个链接来邀请好友
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} 可以在大多数桌面浏览器上运行。无需账号,并且所有连接都是免费的。
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=找到 {{clientSuperShortname}} 图标开始使用
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=一旦您想到讨论一个页面,点击 {{brandShortname}} 中的该图标创建一个链接。然后将其发送给你想要交流的朋友!
invite_header_text_bold=邀请某人访问此页面,和你一起聊天!
invite_header_text_bold2=邀请一名好友加入你!
invite_header_text3=使用 Firefox Hello 至少要两个人,因此把链接发给朋友,让他和你在这个页面一起聊天吧!
invite_header_text4=分享此链接以便与您开始协同浏览网络。
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=用邮件发送链接
invite_facebook_button3=Facebook
invite_your_link=您的链接:
# Status text
display_name_guest=访客
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=确定
# Infobar strings
infobar_screenshare_no_guest_message=只要你的朋友加入,他们就能看到你点击的任何标签页。
infobar_screenshare_browser_message2=您正在共享您的标签页。您的朋友将会看到您所点选的任何标签页
infobar_screenshare_browser_message3=您正在共享您的标签页。您的朋友将看到您点击的任何标签页。
infobar_screenshare_stop_sharing_message=您目前不再共享您的标签页
infobar_button_restart_label2=重新开始共享
infobar_button_restart_accesskey=e
@ -239,3 +260,5 @@ self_view_hidden_message=已隐藏但仍在发送中;调整窗口以显示
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} 在您的国家不可用。
display_name_guest=访客

View File

@ -28,17 +28,39 @@ sign_in_again_use_as_guest_button2=以訪客身分使用 {{clientSuperShortname}
panel_browse_with_friend_button=與朋友一起瀏覽此頁面
panel_disconnect_button=取消連線
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## LOCALIZATION_NOTE(first_time_experience_subheading2, first_time_experience_subheading_button_above): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=點擊 Hello 按鈕,和朋友一起瀏覽網頁。
first_time_experience_subheading_button_above=點擊上面的按鈕與朋友一起瀏覽網頁。
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## LOCALIZATION_NOTE(first_time_experience_content, first_time_experience_content2): Message describing
## ways to use Hello project.
first_time_experience_content=使用此功能一起規劃、一起工作、一起歡笑!
first_time_experience_content2=使用本功能一起合作: 一起規劃、一起工作、一起歡笑。
first_time_experience_button_label2=看看原理
## First Time Experience Slides
fte_slide_1_title=與朋友一起瀏覽網頁
## LOCALIZATION_NOTE(fte_slide_1_copy): {{clientShortname2}}
## will be replaced by the short name 2.
fte_slide_1_copy=不論您是要與朋友一起規劃行程或挑選禮物,{{clientShortname2}} 都可讓您更快把決定做好做滿。
fte_slide_2_title=前往相同頁面
fte_slide_2_copy=使用內建的文字或視訊聊天功能來分享點子、比較不同選擇。
fte_slide_3_title=傳送邀請鏈結給朋友
## LOCALIZATION_NOTE(fte_slide_3_copy): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_3_copy={{clientSuperShortname}} 能與大部分桌面版的瀏覽器相容,不用註冊帳號,也完全免費。
## LOCALIZATION_NOTE(fte_slide_4_title): {{clientSuperShortname}}
## will be replaced by the super short brand name.
fte_slide_4_title=尋找 {{clientSuperShortname}} 開始使用
## LOCALIZATION_NOTE(fte_slide_4_copy): {{brandShortname}}
## will be replaced by the brand short name.
fte_slide_4_copy=當您找到想討論的頁面後,點擊 {{brandShortname}} 當中的圖示來建立鏈結,然後可以用任何您想的方式將鏈結傳送朋友!
invite_header_text_bold=邀請別人來與您一起瀏覽此頁面!
invite_header_text_bold2=快邀請朋友加入!
invite_header_text3=要有兩個人才能使用 Firefox Hello寄個鏈結給朋友跟你一起瀏覽網頁吧
invite_header_text4=分享此鏈結給朋友,你們就可以開始一起瀏覽網頁。
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
@ -48,9 +70,6 @@ invite_email_link_button=寄送鏈結
invite_facebook_button3=Facebook
invite_your_link=您的鏈結:
# Status text
display_name_guest=訪客
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
@ -181,7 +200,9 @@ door_hanger_button=確定
# Infobar strings
infobar_screenshare_no_guest_message=當您的朋友加入後,他們就會看到您點擊的任何分頁。
infobar_screenshare_browser_message2=您正在分享分頁,您的朋友將能看到您點擊的任何分頁內容。
infobar_screenshare_browser_message3=您現在正在分享瀏覽中的分頁,您的朋友將會看到您點及的分頁。
infobar_screenshare_stop_sharing_message=您已停止分享分頁
infobar_button_restart_label2=重新開始分享
infobar_button_restart_accesskey=e
@ -239,3 +260,5 @@ self_view_hidden_message=已隱藏您自己的畫面,但還是會送出。請
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message=無法在您所在的國家使用 {{clientShortname}}。
display_name_guest=訪客

View File

@ -50,6 +50,15 @@
-moz-image-region: rect(1px, 125px, 17px, 109px);
}
/* The slideshow state disables the button for that window and makes it look
the same as the hover state to visually indicate that it's in-use.
*/
#loop-button[state="slideshow"] {
background: var(--toolbarbutton-hover-background);
border-color: var(--toolbarbutton-hover-bordercolor);
box-shadow: var(--toolbarbutton-hover-boxshadow);
}
@media (min-resolution: 1.1dppx) {
#loop-button {
list-style-image: url("chrome://loop/skin/toolbar@2x.png");
@ -276,4 +285,38 @@
background-color: #ef6745;
border-color: #ef6745;
}
#loop-remote-cursor {
background: url("chrome://loop/content/shared/img/cursor.svg#blue") no-repeat;
height: 20px;
width: 15px;
/*
* Svg cursor has a white outline so we need to get rid off it to ensure
* that the cursor points at a more precise position
*/
margin: -2px;
pointer-events: none;
position: absolute;
}
#loop-slideshow-container {
/* cover the entire viewport, mouse interaction with non-slideshow
content is now impossible. */
position: fixed;
z-index: 1;
width: 100%;
height: 100%;
/* darken the background content */
background: rgba(0, 0, 0, .8);
}
#loop-slideshow-browser {
width: 620px;
height:450px;
margin-top: 10%;
/* XXX derived from width, so should be 50% - (620px / 2)? */
-moz-margin-start: calc(50% - 310px);
}
}

View File

@ -41,7 +41,7 @@ function* checkFxA401() {
}
add_task(function* setup() {
Services.prefs.setIntPref("loop.gettingStarted.latestFTUVersion", 1);
Services.prefs.setIntPref("loop.gettingStarted.latestFTUVersion", 2);
MozLoopServiceInternal.mocks.pushHandler = mockPushHandler;
// Normally the same pushUrl would be registered but we change it in the test
// to be able to check for success on the second registration.

View File

@ -18,7 +18,7 @@ add_task(function* test_mozLoop_nochat() {
});
add_task(function* test_mozLoop_openchat() {
let windowId = LoopRooms.open("fake1234");
let windowId = yield LoopRooms.open("fake1234");
Assert.ok(isAnyLoopChatOpen(), "chat window should have been opened");
let chatboxesForRoom = [...Chat.chatboxes].filter(chatbox => {
@ -28,7 +28,7 @@ add_task(function* test_mozLoop_openchat() {
});
add_task(function* test_mozLoop_hangupAllChatWindows() {
LoopRooms.open("fake2345");
yield LoopRooms.open("fake2345");
yield promiseWaitForCondition(() => {
MozLoopService.hangupAllChatWindows();
@ -49,7 +49,7 @@ add_task(function* test_mozLoop_hangupOnClose() {
}
});
let windowId = LoopRooms.open(roomToken);
let windowId = yield LoopRooms.open(roomToken);
yield promiseWaitForCondition(() => {
MozLoopService.hangupAllChatWindows();

View File

@ -132,3 +132,106 @@ add_task(function* test_mozLoop_telemetryAdd_roomSessionWithChat() {
Assert.strictEqual(snapshot.counts[0], i);
}
});
// Skip until bug 1208416 has landed.
/*
add_task(function* test_mozLoop_telemetryAdd_infobarActionButtons() {
let histogramId = "LOOP_INFOBAR_ACTION_BUTTONS";
let histogram = Services.telemetry.getHistogramById(histogramId);
const ACTION_TYPES = gConstants.SHARING_SCREEN;
histogram.clear();
for (let value of [ACTION_TYPES.PAUSED,
ACTION_TYPES.PAUSED,
ACTION_TYPES.RESUMED]) {
gHandlers.TelemetryAddValue({ data: [histogramId, value] }, () => {});
}
let snapshot = histogram.snapshot();
Assert.strictEqual(snapshot.counts[ACTION_TYPES.RESUMED], 1,
"SHARING_SCREEN.RESUMED");
Assert.strictEqual(snapshot.counts[ACTION_TYPES.PAUSED], 2,
"SHARING_SCREEN.PAUSED");
});
add_task(function* test_mozLoop_telemetryAdd_loopMauType_buckets() {
let histogramId = "LOOP_MAU";
let histogram = Services.telemetry.getHistogramById(histogramId);
const ACTION_TYPES = gConstants.LOOP_MAU_TYPE;
histogram.clear();
for (let value of [ACTION_TYPES.OPEN_PANEL,
ACTION_TYPES.OPEN_CONVERSATION,
ACTION_TYPES.ROOM_OPEN,
ACTION_TYPES.ROOM_SHARE,
ACTION_TYPES.ROOM_DELETE]) {
gHandlers.TelemetryAddValue({ data: [histogramId, value] }, () => {});
}
let snapshot = histogram.snapshot();
Assert.strictEqual(snapshot.counts[ACTION_TYPES.OPEN_PANEL], 1,
"LOOP_MAU_TYPE.OPEN_PANEL");
Assert.strictEqual(snapshot.counts[ACTION_TYPES.OPEN_CONVERSATION], 1,
"LOOP_MAU_TYPE.OPEN_CONVERSATION");
Assert.strictEqual(snapshot.counts[ACTION_TYPES.ROOM_OPEN], 1,
"LOOP_MAU_TYPE.ROOM_OPEN");
Assert.strictEqual(snapshot.counts[ACTION_TYPES.ROOM_SHARE], 1,
"LOOP_MAU_TYPE.ROOM_SHARE");
Assert.strictEqual(snapshot.counts[ACTION_TYPES.ROOM_DELETE], 1,
"LOOP_MAU_TYPE.ROOM_DELETE");
});
*/
/**
* Tests that only one event is sent every 30 days
*/
// Skip until bug 1208416 has landed.
/*
add_task(function* test_mozLoop_telemetryAdd_loopMau_more_than_30_days() {
let histogramId = "LOOP_MAU";
let histogram = Services.telemetry.getHistogramById(histogramId);
const ACTION_TYPES = gConstants.LOOP_MAU_TYPE;
histogram.clear();
gHandlers.TelemetryAddValue({ data: [histogramId, ACTION_TYPES.OPEN_PANEL] }, () => {});
let snapshot = histogram.snapshot();
Assert.strictEqual(snapshot.counts[ACTION_TYPES.OPEN_PANEL], 1,
"LOOP_MAU_TYPE.OPEN_PANEL");
// Let's be sure that the last event was sent a month ago
let timestamp = (Math.floor(Date.now() / 1000)) - 2593000;
Services.prefs.setIntPref("loop.mau.openPanel", timestamp);
gHandlers.TelemetryAddValue({ data: [histogramId, ACTION_TYPES.OPEN_PANEL] }, () => {});
snapshot = histogram.snapshot();
Assert.strictEqual(snapshot.counts[ACTION_TYPES.OPEN_PANEL], 2,
"LOOP_MAU_TYPE.OPEN_PANEL");
Services.prefs.clearUserPref("loop.mau.openPanel");
});
add_task.skip(function* test_mozLoop_telemetryAdd_loopMau_less_than_30_days() {
let histogramId = "LOOP_MAU";
let histogram = Services.telemetry.getHistogramById(histogramId);
const ACTION_TYPES = gConstants.LOOP_MAU_TYPE;
histogram.clear();
gHandlers.TelemetryAddValue({ data: [histogramId, ACTION_TYPES.OPEN_PANEL] }, () => {});
let snapshot = histogram.snapshot();
Assert.strictEqual(snapshot.counts[ACTION_TYPES.OPEN_PANEL], 1,
"LOOP_MAU_TYPE.OPEN_PANEL");
let timestamp = (Math.floor(Date.now() / 1000)) - 1000;
Services.prefs.setIntPref("loop.mau.openPanel", timestamp);
gHandlers.TelemetryAddValue({ data: [histogramId, ACTION_TYPES.OPEN_PANEL] }, () => {});
snapshot = histogram.snapshot();
Assert.strictEqual(snapshot.counts[ACTION_TYPES.OPEN_PANEL], 1,
"LOOP_MAU_TYPE.OPEN_PANEL");
Services.prefs.clearUserPref("loop.mau.openPanel");
});
*/

View File

@ -8,7 +8,7 @@
"use strict";
Components.utils.import("resource://gre/modules/Promise.jsm", this);
Services.prefs.setIntPref("loop.gettingStarted.latestFTUVersion", 1);
Services.prefs.setIntPref("loop.gettingStarted.latestFTUVersion", 2);
const fxASampleToken = {
token_type: "bearer",

View File

@ -14,7 +14,7 @@ add_test(function test_intialize() {
LoopAPIInternal.initialize();
let [, , pageListeners2] = LoopAPI.inspect();
Assert.equal(pageListeners2.length, 2, "Two page listeners should be added");
Assert.equal(pageListeners2.length, 3, "Three page listeners should be added");
let pageListenersStub = {};
LoopAPI.stub([pageListenersStub]);

View File

@ -522,25 +522,10 @@ add_task(function* test_joinRoomGuest() {
MozLoopServiceInternal.fxAOAuthProfile = null;
let roomToken = "_nxD4V4FflQ";
let joinedData = yield LoopRooms.promise("join", roomToken);
let joinedData = yield LoopRooms.promise("join", roomToken, "guest");
Assert.equal(joinedData.action, "join");
});
// Test if joining a room as FxA user works as expected.
add_task(function* test_joinRoom() {
// We need these set up for getting the email address.
MozLoopServiceInternal.fxAOAuthTokenData = { token_type: "bearer" };
MozLoopServiceInternal.fxAOAuthProfile = { email: "fake@invalid.com" };
let roomToken = "_nxD4V4FflQ";
let joinedData = yield LoopRooms.promise("join", roomToken);
Assert.equal(joinedData.action, "join");
Assert.equal(joinedData.displayName, "fake@invalid.com");
MozLoopServiceInternal.fxAOAuthTokenData = null;
MozLoopServiceInternal.fxAOAuthProfile = null;
});
// Test if refreshing a room works as expected.
add_task(function* test_refreshMembership() {
let roomToken = "_nxD4V4FflQ";

View File

@ -29,6 +29,32 @@ add_task(function* request_with_unicode() {
() => Assert.ok(false, "Should have accepted"));
});
add_task(function* request_with_unicode() {
loopServer.registerPathHandler("/fake", (request, response) => {
Assert.ok(request.hasHeader("x-loop-addon-ver"), "Should have an add-on version header");
Assert.equal(request.getHeader("x-loop-addon-ver"), "3.1", "Should have the correct add-on version");
response.setStatusLine(null, 200, "OK");
response.processAsync();
response.finish();
});
// Pretend we're not enabled so full initialisation doesn't take place.
Services.prefs.setBoolPref("loop.enabled", false);
try {
yield MozLoopService.initialize("3.1");
} catch (ex) {
// Do nothing - this will throw due to being disabled, that's ok.
}
Services.prefs.clearUserPref("loop.enabled");
yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/fake", "POST", {}).then(
() => Assert.ok(true, "Should have accepted"),
() => Assert.ok(false, "Should have accepted"));
});
function run_test() {
setupFakeLoopServer();

View File

@ -9,7 +9,7 @@
<Description about="urn:mozilla:install-manifest">
<em:id>loop@mozilla.org</em:id>
<em:bootstrap>true</em:bootstrap>
<em:version>0.3.0</em:version>
<em:version>1.1.2</em:version>
<em:type>2</em:type>
<!-- Target Application this extension can install into,

View File

@ -14,7 +14,7 @@ FIREFOX_PREFERENCES = {
"devtools.debugger.prompt-connection": False,
"devtools.debugger.remote-enabled": True,
"media.volume_scale": "0",
"loop.gettingStarted.latestFTUVersion": 1,
"loop.gettingStarted.latestFTUVersion": 2,
# this dialog is fragile, and likely to introduce intermittent failures
"media.navigator.permission.disabled": True,

View File

@ -734,7 +734,7 @@ toolbarpaletteitem[place="palette"] > toolbaritem > toolbarbutton {
#PanelUI-remotetabs[mainview] #PanelUI-remotetabs-reauthsync,
#PanelUI-remotetabs[mainview] #PanelUI-remotetabs-nodevicespane,
#PanelUI-remotetabs[mainview] #PanelUI-remotetabs-tabsdisabledpane {
min-height: 30em;
min-height: 33em;
}
#PanelUI-remotetabs-tabslist > label[itemtype="client"] {

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