Bug 1079430 - Land the new Loop strings for Firefox 35. r=Standard8
authorJared Wein <jwein@mozilla.com>
Thu, 09 Oct 2014 11:45:04 -0400
changeset 232902 3e9de16c4c17411649cb5aa617ee64d1f66d5e38
parent 232901 97b76ccf75dc9e9fe76b72ebad9f0790aeef0ae2
child 232903 75f9efa43bb4390881c54dea2188f13408e5d64e
push id4187
push userbhearsum@mozilla.com
push dateFri, 28 Nov 2014 15:29:12 +0000
treeherdermozilla-beta@f23cc6a30c11 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersStandard8
bugs1079430
milestone35.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1079430 - Land the new Loop strings for Firefox 35. r=Standard8
browser/app/profile/firefox.js
browser/components/customizableui/CustomizableWidgets.jsm
browser/components/loop/MozLoopService.jsm
browser/components/loop/content/js/panel.js
browser/components/loop/content/js/panel.jsx
browser/components/loop/standalone/content/js/webapp.js
browser/components/loop/standalone/content/js/webapp.jsx
browser/components/loop/standalone/content/l10n/loop.en-US.properties
browser/components/loop/test/desktop-local/panel_test.js
browser/locales/en-US/chrome/browser/customizableui/customizableWidgets.properties
browser/locales/en-US/chrome/browser/loop/loop.properties
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1602,16 +1602,17 @@ pref("loop.throttled", false);
 pref("loop.enabled", true);
 pref("loop.throttled", true);
 pref("loop.soft_start_ticket_number", -1);
 pref("loop.soft_start_hostname", "soft-start.loop.services.mozilla.com");
 #endif
 
 pref("loop.server", "https://loop.services.mozilla.com");
 pref("loop.seenToS", "unseen");
+pref("loop.learnMoreUrl", "https://www.firefox.com/hello/");
 pref("loop.legal.ToS_url", "https://call.mozilla.com/legal/terms/");
 pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/");
 pref("loop.do_not_disturb", false);
 pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/Firefox-Long.ogg");
 pref("loop.retry_delay.start", 60000);
 pref("loop.retry_delay.limit", 300000);
 pref("loop.feedback.baseUrl", "https://input.mozilla.org/api/v1/feedback");
 pref("loop.feedback.product", "Loop");
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -900,19 +900,18 @@ const CustomizableWidgets = [
     tooltiptext: "email-link-button.tooltiptext3",
     onCommand: function(aEvent) {
       let win = aEvent.view;
       win.MailIntegration.sendLinkForWindow(win.content);
     }
   }, {
     id: "loop-call-button",
     type: "custom",
-    // XXX Bug 1013989 will provide a label for the button
-    label: "loop-call-button.label",
-    tooltiptext: "loop-call-button.tooltiptext",
+    label: "loop-call-button2.label",
+    tooltiptext: "loop-call-button2.tooltiptext",
     defaultArea: CustomizableUI.AREA_NAVBAR,
     introducedInVersion: 1,
     onBuild: function(aDocument) {
       let node = aDocument.createElementNS(kNSXUL, "toolbarbutton");
       node.setAttribute("id", this.id);
       node.classList.add("toolbarbutton-1");
       node.classList.add("chromeclass-toolbar-additional");
       node.classList.add("badged-button");
--- a/browser/components/loop/MozLoopService.jsm
+++ b/browser/components/loop/MozLoopService.jsm
@@ -1348,17 +1348,17 @@ this.MozLoopService = {
    *
    * @param {key} The element id to get strings for.
    * @return {String} A JSON string containing the localized
    *                  attribute/value pairs for the element.
    */
   getStrings: function(key) {
       var stringData = MozLoopServiceInternal.localizedStrings;
       if (!(key in stringData)) {
-        Cu.reportError('No string for key: ' + key + 'found');
+        log.error("No string found for key: ", key);
         return "";
       }
 
       return JSON.stringify(stringData[key]);
   },
 
   /**
    * Returns a new GUID (UUID) in curly braces format.
--- a/browser/components/loop/content/js/panel.js
+++ b/browser/components/loop/content/js/panel.js
@@ -163,17 +163,17 @@ loop.panel = (function(_, mozL10n) {
       return {seenToS: navigator.mozLoop.getLoopCharPref('seenToS')};
     },
 
     render: function() {
       if (this.state.seenToS == "unseen") {
         var terms_of_use_url = navigator.mozLoop.getLoopCharPref('legal.ToS_url');
         var privacy_notice_url = navigator.mozLoop.getLoopCharPref('legal.privacy_url');
         var tosHTML = __("legal_text_and_links3", {
-          "clientShortname": __("client_shortname_fallback"),
+          "clientShortname": __("clientShortname2"),
           "terms_of_use": React.renderComponentToStaticMarkup(
             React.DOM.a({href: terms_of_use_url, target: "_blank"}, 
               __("legal_text_tos")
             )
           ),
           "privacy_notice": React.renderComponentToStaticMarkup(
             React.DOM.a({href: privacy_notice_url, target: "_blank"}, 
               __("legal_text_privacy")
@@ -361,18 +361,21 @@ loop.panel = (function(_, mozL10n) {
           this.setState(this.getInitialState());
         }
       }
     },
 
     handleEmailButtonClick: function(event) {
       this.handleLinkExfiltration(event);
 
-      navigator.mozLoop.composeEmail(__("share_email_subject3"),
-        __("share_email_body3", { callUrl: this.state.callUrl }));
+      navigator.mozLoop.composeEmail(
+        __("share_email_subject4", { clientShortname: __("clientShortname2")}),
+        __("share_email_body4", { callUrl: this.state.callUrl,
+                                  clientShortname: __("clientShortname2"),
+                                  learnMoreUrl: navigator.mozLoop.getLoopCharPref("learnMoreUrl") }));
     },
 
     handleCopyButtonClick: function(event) {
       this.handleLinkExfiltration(event);
       // XXX the mozLoop object should be passed as a prop, to ease testing and
       //     using a fake implementation in UI components showcase.
       navigator.mozLoop.copyString(this.state.callUrl);
       this.setState({copied: true});
--- a/browser/components/loop/content/js/panel.jsx
+++ b/browser/components/loop/content/js/panel.jsx
@@ -163,17 +163,17 @@ loop.panel = (function(_, mozL10n) {
       return {seenToS: navigator.mozLoop.getLoopCharPref('seenToS')};
     },
 
     render: function() {
       if (this.state.seenToS == "unseen") {
         var terms_of_use_url = navigator.mozLoop.getLoopCharPref('legal.ToS_url');
         var privacy_notice_url = navigator.mozLoop.getLoopCharPref('legal.privacy_url');
         var tosHTML = __("legal_text_and_links3", {
-          "clientShortname": __("client_shortname_fallback"),
+          "clientShortname": __("clientShortname2"),
           "terms_of_use": React.renderComponentToStaticMarkup(
             <a href={terms_of_use_url} target="_blank">
               {__("legal_text_tos")}
             </a>
           ),
           "privacy_notice": React.renderComponentToStaticMarkup(
             <a href={privacy_notice_url} target="_blank">
               {__("legal_text_privacy")}
@@ -361,18 +361,21 @@ loop.panel = (function(_, mozL10n) {
           this.setState(this.getInitialState());
         }
       }
     },
 
     handleEmailButtonClick: function(event) {
       this.handleLinkExfiltration(event);
 
-      navigator.mozLoop.composeEmail(__("share_email_subject3"),
-        __("share_email_body3", { callUrl: this.state.callUrl }));
+      navigator.mozLoop.composeEmail(
+        __("share_email_subject4", { clientShortname: __("clientShortname2")}),
+        __("share_email_body4", { callUrl: this.state.callUrl,
+                                  clientShortname: __("clientShortname2"),
+                                  learnMoreUrl: navigator.mozLoop.getLoopCharPref("learnMoreUrl") }));
     },
 
     handleCopyButtonClick: function(event) {
       this.handleLinkExfiltration(event);
       // XXX the mozLoop object should be passed as a prop, to ease testing and
       //     using a fake implementation in UI components showcase.
       navigator.mozLoop.copyString(this.state.callUrl);
       this.setState({copied: true});
--- a/browser/components/loop/standalone/content/js/webapp.js
+++ b/browser/components/loop/standalone/content/js/webapp.js
@@ -113,17 +113,17 @@ loop.webapp = (function($, _, OT, mozL10
     }
   });
 
   var ConversationBranding = React.createClass({displayName: 'ConversationBranding',
     render: function() {
       return (
         React.DOM.h1({className: "standalone-header-title"}, 
           React.DOM.strong(null, mozL10n.get("brandShortname")), 
-          mozL10n.get("clientShortname")
+          mozL10n.get("clientShortname2")
         )
       );
     }
   });
 
   /**
    * The Firefox Marketplace exposes a web page that contains a postMesssage
    * based API that wraps a small set of functionality from the WebApps API
--- a/browser/components/loop/standalone/content/js/webapp.jsx
+++ b/browser/components/loop/standalone/content/js/webapp.jsx
@@ -113,17 +113,17 @@ loop.webapp = (function($, _, OT, mozL10
     }
   });
 
   var ConversationBranding = React.createClass({
     render: function() {
       return (
         <h1 className="standalone-header-title">
           <strong>{mozL10n.get("brandShortname")}</strong>
-          {mozL10n.get("clientShortname")}
+          {mozL10n.get("clientShortname2")}
         </h1>
       );
     }
   });
 
   /**
    * The Firefox Marketplace exposes a web page that contains a postMesssage
    * based API that wraps a small set of functionality from the WebApps API
--- a/browser/components/loop/standalone/content/l10n/loop.en-US.properties
+++ b/browser/components/loop/standalone/content/l10n/loop.en-US.properties
@@ -36,18 +36,25 @@ get_firefox_button=Get {{brandShortname}
 initiate_call_button_label2=Ready to start your conversation?
 initiate_audio_video_call_button2=Start
 initiate_audio_video_call_tooltip2=Start a video conversation
 initiate_audio_call_button2=Voice conversation
 initiate_call_cancel_button=Cancel
 legal_text_and_links=By using this product you agree to the {{terms_of_use_url}} and {{privacy_notice_url}}
 terms_of_use_link_text=Terms of use
 privacy_notice_link_text=Privacy notice
+invite_header_text=Invite someone to join you.
+
+## LOCALIZATION NOTE(brandShortname): This should not be localized and
+## should remain "Firefox" for all locales.
 brandShortname=Firefox
-clientShortname=WebRTC!
+## LOCALIZATION NOTE(clientShortname2): This should not be localized and
+## should remain "Firefox Hello" for all locales.
+clientShortname2=Firefox Hello
+
 ## LOCALIZATION NOTE (call_url_creation_date_label): Example output: (from May 26, 2014)
 call_url_creation_date_label=(from {{call_url_creation_date}})
 call_progress_connecting_description=Connecting…
 call_progress_ringing_description=Ringing…
 fxos_app_needed=Please install the {{fxosAppName}} app from the Firefox Marketplace.
 
 feedback_call_experience_heading2=How was your conversation?
 feedback_what_makes_you_sad=What makes you sad?
@@ -72,8 +79,31 @@ feedback_window_will_close_in2[other] = 
 
 ## LOCALIZATION_NOTE (feedback_rejoin_button): Displayed on the feedback form after
 ## a signed-in to signed-in user call.
 ## https://people.mozilla.org/~dhenein/labs/loop-mvp-spec/#feedback
 feedback_rejoin_button=Rejoin
 ## LOCALIZATION NOTE (feedback_report_user_button): Used to report a user in the case of
 ## an abusive user.
 feedback_report_user_button=Report User
+
+## LOCALIZATION_NOTE(first_time_experience.title): clientShortname will be
+## replaced by the brand name
+first_time_experience_title={{clientShortname}} — Join the conversation
+first_time_experience_button_label=Get Started
+
+help_label=Help
+tour_label=Tour
+
+rooms_default_room_name_template=Conversation {{conversationLabel}}
+rooms_leave_button_label=Leave
+rooms_list_copy_url_tooltip=Copy Link
+rooms_list_delete_tooltip=Delete conversation
+rooms_list_deleteConfirmation_label=Are you sure?
+rooms_name_this_room_label=Name this conversation
+rooms_new_room_button_label=Start a conversation
+rooms_only_occupant_label=You're the first one here.
+rooms_panel_title=Choose a conversation or start a new one
+rooms_room_full_label=There are already two people in this conversation.
+rooms_room_full_call_to_action_nonFx_label=Download {{brandShortname}} to start your own
+rooms_room_full_call_to_action_label=Learn more about {{clientShortname}} »
+rooms_room_joined_label=Someone has joined the conversation!
+rooms_room_join_label=Join the conversation
--- a/browser/components/loop/test/desktop-local/panel_test.js
+++ b/browser/components/loop/test/desktop-local/panel_test.js
@@ -389,19 +389,19 @@ describe("loop.panel", function() {
 
     describe("Rendering the component should generate a call URL", function() {
 
       beforeEach(function() {
         document.mozL10n.initialize({
           getStrings: function(key) {
             var text;
 
-            if (key === "share_email_subject3")
+            if (key === "share_email_subject4")
               text = "email-subject";
-            else if (key === "share_email_body3")
+            else if (key === "share_email_body4")
               text = "{{callUrl}}";
 
             return JSON.stringify({textContent: text});
           }
         });
       });
 
       it("should make a request to requestCallUrl", function() {
--- a/browser/locales/en-US/chrome/browser/customizableui/customizableWidgets.properties
+++ b/browser/locales/en-US/chrome/browser/customizableui/customizableWidgets.properties
@@ -92,16 +92,16 @@ email-link-button.tooltiptext3 = Email a
 
 # LOCALIZATION NOTE(quit-button.tooltiptext.linux2): %1$S is the brand name (e.g. Firefox),
 # %2$S is the keyboard shortcut
 quit-button.tooltiptext.linux2 = Quit %1$S (%2$S)
 # LOCALIZATION NOTE(quit-button.tooltiptext.mac): %1$S is the brand name (e.g. Firefox),
 # %2$S is the keyboard shortcut
 quit-button.tooltiptext.mac = Quit %1$S (%2$S)
 
-loop-call-button.label = Invite someone to talk
-loop-call-button.tooltiptext = Invite someone to talk
+loop-call-button2.label = Start a conversation
+loop-call-button2.tooltiptext = Start a conversation
 
 panic-button.label = Forget
 panic-button.tooltiptext = Forget about some browsing history
 
 web-apps-button.label = Apps
 web-apps-button.tooltiptext = Discover Apps
--- a/browser/locales/en-US/chrome/browser/loop/loop.properties
+++ b/browser/locales/en-US/chrome/browser/loop/loop.properties
@@ -1,15 +1,25 @@
 # 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/.
 
 # Panel Strings
 
+## LOCALIZATION NOTE(clientShortname2): This should not be localized and
+## should remain "Firefox Hello" for all locales.
+clientShortname2=Firefox Hello
+
+## LOCALIZATION_NOTE(first_time_experience.title): clientShortname will be
+## replaced by the brand name
+first_time_experience_title={{clientShortname}} — Join the conversation
+first_time_experience_button_label=Get Started
+
 share_link_header_text=Share this link to invite someone to talk:
+invite_header_text=Invite someone to join you.
 
 ## LOCALIZATION NOTE(invitee_name_label): Displayed when obtaining a url.
 ## See https://people.mozilla.org/~dhenein/labs/loop-mvp-spec/#precall-firstrun
 ## Click the label icon at the end of the url field.
 invitee_name_label=Who are you inviting?
 ## LOCALIZATION NOTE(invitee_expire_days_label): Allows the user to adjust
 ## the expiry time. Click the label icon at the end of the url field to see where
 ## this is:
@@ -47,22 +57,24 @@ login_expired=Your Login Has Expired
 service_not_available=Service Unavailable At This Time
 problem_accessing_account=There Was A Problem Accessing Your Account
 
 ## LOCALIZATION NOTE(retry_button): Displayed when there is an error to retry
 ## the appropriate action.
 ## See https://people.mozilla.org/~dhenein/labs/loop-mvp-spec/#error for location
 retry_button=Retry
 
-share_email_subject3=You have been invited to a conversation
-## LOCALIZATION NOTE (share_email_body3): In this item, don't translate the
+share_email_subject4={{clientShortname}} — Join the conversation
+## LOCALIZATION NOTE (share_email_body4): In this item, don't translate the
 ## part between {{..}} and leave the \r\n\r\n part alone
-share_email_body3=To accept this invitation, just copy or click this link to start your conversation:\r\n\r\n{{callUrl}}
+share_email_body4=Hello!\r\n\r\nJoin me for a video conversation using {{clientShortname}}:\r\n\r\nYou don't have to download or install anything. Just copy and paste this URL into your browser:\r\n\r\n{{callUrl}}\r\n\r\nIf you want, you can also learn more about {{clientShortname}} at {{learnMoreUrl}}\r\n\r\nTalk to you soon!
 share_button=Email
+share_button2=Email Link
 copy_url_button=Copy
+copy_url_button2=Copy Link
 copied_url_button=Copied!
 
 panel_footer_signin_or_signup_link=Sign In or Sign Up
 
 settings_menu_item_account=Account
 settings_menu_item_settings=Settings
 settings_menu_item_signout=Sign Out
 settings_menu_item_signin=Sign In
@@ -237,22 +249,27 @@ cancel_button=Cancel
 
 cannot_start_call_session_not_ready=Can't start call, session is not ready.
 network_disconnected=The network connection terminated abruptly.
 connection_error_see_console_notification=Call failed; see console for details.
 
 ## 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, or fall back to client_shortname_fallback
+## by the brand name.
 legal_text_and_links3=By using {{clientShortname}} you agree to the {{terms_of_use}} \
   and {{privacy_notice}}.
 legal_text_tos = Terms of Use
 legal_text_privacy = Privacy Notice
-client_shortname_fallback=this product
+
+## LOCALIZATION NOTE (powered_by_beforeLogo, powered_by_afterLogo):
+## These 2 strings are displayed before and after a 'Telefonica'
+## logo.
+powered_by_beforeLogo=Powered by
+powered_by_afterLogo=
 
 feedback_call_experience_heading2=How was your conversation?
 feedback_what_makes_you_sad=What makes you sad?
 feedback_thank_you_heading=Thank you for your feedback!
 feedback_category_audio_quality=Audio quality
 feedback_category_video_quality=Video quality
 feedback_category_was_disconnected=Was disconnected
 feedback_category_confusing=Confusing
@@ -268,12 +285,31 @@ feedback_window_will_close_in2=This wind
 ## LOCALIZATION_NOTE (feedback_rejoin_button): Displayed on the feedback form after
 ## a signed-in to signed-in user call.
 ## https://people.mozilla.org/~dhenein/labs/loop-mvp-spec/#feedback
 feedback_rejoin_button=Rejoin
 ## LOCALIZATION NOTE (feedback_report_user_button): Used to report a user in the case of
 ## an abusive user.
 feedback_report_user_button=Report User
 
+help_label=Help
+tour_label=Tour
+
+## LOCALIZATION NOTE(rooms_default_room_name_template): {{conversationLabel}}
+## will be replaced by a number. For example "Conversation 1" or "Conversation 12".
+rooms_default_room_name_template=Conversation {{conversationLabel}}
+rooms_leave_button_label=Leave
+rooms_list_copy_url_tooltip=Copy Link
 ## LOCALIZATION NOTE (rooms_list_current_conversations): We prefer to have no
 ## number in the string, but if you need it for your language please use {{num}}.
 rooms_list_current_conversations=Current conversation;Current conversations
+rooms_list_delete_tooltip=Delete conversation
+rooms_list_deleteConfirmation_label=Are you sure?
 rooms_list_no_current_conversations=No current conversations
+rooms_name_this_room_label=Name this conversation
+rooms_new_room_button_label=Start a conversation
+rooms_only_occupant_label=You're the first one here.
+rooms_panel_title=Choose a conversation or start a new one
+rooms_room_full_label=There are already two people in this conversation.
+rooms_room_full_call_to_action_nonFx_label=Download {{brandShortname}} to start your own
+rooms_room_full_call_to_action_label=Learn more about {{clientShortname}} »
+rooms_room_joined_label=Someone has joined the conversation!
+rooms_room_join_label=Join the conversation