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 209687 3e9de16c4c17411649cb5aa617ee64d1f66d5e38
parent 209686 97b76ccf75dc9e9fe76b72ebad9f0790aeef0ae2
child 209688 75f9efa43bb4390881c54dea2188f13408e5d64e
push id1
push userroot
push dateMon, 20 Oct 2014 17:29:22 +0000
reviewersStandard8
bugs1079430
milestone35.0a1
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