From 11cd112650c6c51b270eeae329d63a7cd732e605 Mon Sep 17 00:00:00 2001 From: "sergeyu@chromium.org" Date: Wed, 11 Jan 2012 23:25:05 +0000 Subject: Rename webapp_it2me to remoting_webapp and move it from webapp/me2mom to webapp/ The remoting webapp is not it2me specific anymore. Renaming stuff and moving it to avoid confusion, particularly for the newcomers. Review URL: http://codereview.chromium.org/9148043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117322 0039d316-1c4b-4281-b951-d872f2087c98 --- remoting/remoting.gyp | 250 ++++--- remoting/webapp/_locales.official/ar/messages.json | 1 + remoting/webapp/_locales.official/bg/messages.json | 1 + remoting/webapp/_locales.official/ca/messages.json | 1 + remoting/webapp/_locales.official/cs/messages.json | 1 + remoting/webapp/_locales.official/da/messages.json | 1 + remoting/webapp/_locales.official/de/messages.json | 1 + remoting/webapp/_locales.official/el/messages.json | 1 + remoting/webapp/_locales.official/en/messages.json | 1 + .../webapp/_locales.official/en_GB/messages.json | 1 + remoting/webapp/_locales.official/es/messages.json | 1 + .../webapp/_locales.official/es_419/messages.json | 1 + remoting/webapp/_locales.official/et/messages.json | 1 + remoting/webapp/_locales.official/fi/messages.json | 1 + .../webapp/_locales.official/fil/messages.json | 1 + remoting/webapp/_locales.official/fr/messages.json | 1 + remoting/webapp/_locales.official/he/messages.json | 1 + remoting/webapp/_locales.official/hi/messages.json | 1 + remoting/webapp/_locales.official/hr/messages.json | 1 + remoting/webapp/_locales.official/hu/messages.json | 1 + remoting/webapp/_locales.official/id/messages.json | 1 + remoting/webapp/_locales.official/it/messages.json | 1 + remoting/webapp/_locales.official/ja/messages.json | 1 + remoting/webapp/_locales.official/ko/messages.json | 1 + remoting/webapp/_locales.official/lt/messages.json | 1 + remoting/webapp/_locales.official/lv/messages.json | 1 + remoting/webapp/_locales.official/nb/messages.json | 1 + remoting/webapp/_locales.official/nl/messages.json | 1 + remoting/webapp/_locales.official/pl/messages.json | 1 + .../webapp/_locales.official/pt_BR/messages.json | 1 + .../webapp/_locales.official/pt_PT/messages.json | 1 + remoting/webapp/_locales.official/ro/messages.json | 1 + remoting/webapp/_locales.official/ru/messages.json | 1 + remoting/webapp/_locales.official/sk/messages.json | 1 + remoting/webapp/_locales.official/sl/messages.json | 1 + remoting/webapp/_locales.official/sr/messages.json | 1 + remoting/webapp/_locales.official/sv/messages.json | 1 + remoting/webapp/_locales.official/th/messages.json | 1 + remoting/webapp/_locales.official/tr/messages.json | 1 + remoting/webapp/_locales.official/uk/messages.json | 1 + remoting/webapp/_locales.official/vi/messages.json | 1 + .../webapp/_locales.official/zh_CN/messages.json | 1 + .../webapp/_locales.official/zh_TW/messages.json | 1 + remoting/webapp/_locales/en/messages.json | 228 ++++++ remoting/webapp/choice.css | 375 ++++++++++ remoting/webapp/choice.html | 324 +++++++++ remoting/webapp/client_screen.js | 469 ++++++++++++ remoting/webapp/client_session.js | 461 ++++++++++++ remoting/webapp/cs_oauth2_trampoline.js | 6 + remoting/webapp/debug_log.css | 40 ++ remoting/webapp/debug_log.gtestjs | 26 + remoting/webapp/debug_log.js | 800 +++++++++++++++++++++ remoting/webapp/dividerbottom.png | Bin 0 -> 2808 bytes remoting/webapp/dividertop.png | Bin 0 -> 4600 bytes remoting/webapp/event_handlers.js | 69 ++ remoting/webapp/host_list.js | 273 +++++++ remoting/webapp/host_plugin_proto.js | 44 ++ remoting/webapp/host_screen.js | 271 +++++++ remoting/webapp/host_session.js | 116 +++ remoting/webapp/host_table_entry.js | 196 +++++ remoting/webapp/l10n.js | 62 ++ remoting/webapp/log_to_server.js | 237 ++++++ remoting/webapp/main.css | 8 + remoting/webapp/manifest.json | 37 + .../me2mom/_locales.official/ar/messages.json | 1 - .../me2mom/_locales.official/bg/messages.json | 1 - .../me2mom/_locales.official/ca/messages.json | 1 - .../me2mom/_locales.official/cs/messages.json | 1 - .../me2mom/_locales.official/da/messages.json | 1 - .../me2mom/_locales.official/de/messages.json | 1 - .../me2mom/_locales.official/el/messages.json | 1 - .../me2mom/_locales.official/en/messages.json | 1 - .../me2mom/_locales.official/en_GB/messages.json | 1 - .../me2mom/_locales.official/es/messages.json | 1 - .../me2mom/_locales.official/es_419/messages.json | 1 - .../me2mom/_locales.official/et/messages.json | 1 - .../me2mom/_locales.official/fi/messages.json | 1 - .../me2mom/_locales.official/fil/messages.json | 1 - .../me2mom/_locales.official/fr/messages.json | 1 - .../me2mom/_locales.official/he/messages.json | 1 - .../me2mom/_locales.official/hi/messages.json | 1 - .../me2mom/_locales.official/hr/messages.json | 1 - .../me2mom/_locales.official/hu/messages.json | 1 - .../me2mom/_locales.official/id/messages.json | 1 - .../me2mom/_locales.official/it/messages.json | 1 - .../me2mom/_locales.official/ja/messages.json | 1 - .../me2mom/_locales.official/ko/messages.json | 1 - .../me2mom/_locales.official/lt/messages.json | 1 - .../me2mom/_locales.official/lv/messages.json | 1 - .../me2mom/_locales.official/nb/messages.json | 1 - .../me2mom/_locales.official/nl/messages.json | 1 - .../me2mom/_locales.official/pl/messages.json | 1 - .../me2mom/_locales.official/pt_BR/messages.json | 1 - .../me2mom/_locales.official/pt_PT/messages.json | 1 - .../me2mom/_locales.official/ro/messages.json | 1 - .../me2mom/_locales.official/ru/messages.json | 1 - .../me2mom/_locales.official/sk/messages.json | 1 - .../me2mom/_locales.official/sl/messages.json | 1 - .../me2mom/_locales.official/sr/messages.json | 1 - .../me2mom/_locales.official/sv/messages.json | 1 - .../me2mom/_locales.official/th/messages.json | 1 - .../me2mom/_locales.official/tr/messages.json | 1 - .../me2mom/_locales.official/uk/messages.json | 1 - .../me2mom/_locales.official/vi/messages.json | 1 - .../me2mom/_locales.official/zh_CN/messages.json | 1 - .../me2mom/_locales.official/zh_TW/messages.json | 1 - remoting/webapp/me2mom/_locales/en/messages.json | 228 ------ remoting/webapp/me2mom/choice.css | 375 ---------- remoting/webapp/me2mom/choice.html | 324 --------- remoting/webapp/me2mom/client_screen.js | 469 ------------ remoting/webapp/me2mom/client_session.js | 461 ------------ remoting/webapp/me2mom/cs_oauth2_trampoline.js | 6 - remoting/webapp/me2mom/debug_log.css | 40 -- remoting/webapp/me2mom/debug_log.gtestjs | 26 - remoting/webapp/me2mom/debug_log.js | 800 --------------------- remoting/webapp/me2mom/dividerbottom.png | Bin 2808 -> 0 bytes remoting/webapp/me2mom/dividertop.png | Bin 4600 -> 0 bytes remoting/webapp/me2mom/event_handlers.js | 69 -- remoting/webapp/me2mom/host_list.js | 273 ------- remoting/webapp/me2mom/host_plugin_proto.js | 44 -- remoting/webapp/me2mom/host_screen.js | 271 ------- remoting/webapp/me2mom/host_session.js | 116 --- remoting/webapp/me2mom/host_table_entry.js | 196 ----- remoting/webapp/me2mom/l10n.js | 62 -- remoting/webapp/me2mom/log_to_server.js | 237 ------ remoting/webapp/me2mom/main.css | 8 - remoting/webapp/me2mom/manifest.json | 37 - remoting/webapp/me2mom/oauth2.js | 348 --------- remoting/webapp/me2mom/oauth2_callback.html | 35 - remoting/webapp/me2mom/plugin_settings.js | 16 - remoting/webapp/me2mom/remoting.js | 186 ----- remoting/webapp/me2mom/scale-to-fit.png | Bin 301 -> 0 bytes remoting/webapp/me2mom/server_log_entry.js | 433 ----------- remoting/webapp/me2mom/spinner.gif | Bin 2274 -> 0 bytes remoting/webapp/me2mom/stats_accumulator.js | 126 ---- remoting/webapp/me2mom/toolbar.css | 75 -- remoting/webapp/me2mom/toolbar.js | 139 ---- remoting/webapp/me2mom/ui_mode.js | 85 --- remoting/webapp/me2mom/util.js | 53 -- remoting/webapp/me2mom/viewer_plugin_proto.js | 68 -- remoting/webapp/me2mom/wcs.js | 148 ---- remoting/webapp/me2mom/wcs_iq_client_proto.js | 29 - remoting/webapp/me2mom/wcs_loader.js | 132 ---- remoting/webapp/me2mom/xhr.js | 187 ----- remoting/webapp/oauth2.js | 348 +++++++++ remoting/webapp/oauth2_callback.html | 35 + remoting/webapp/plugin_settings.js | 16 + remoting/webapp/remoting.js | 186 +++++ remoting/webapp/scale-to-fit.png | Bin 0 -> 301 bytes remoting/webapp/server_log_entry.js | 433 +++++++++++ remoting/webapp/spinner.gif | Bin 0 -> 2274 bytes remoting/webapp/stats_accumulator.js | 126 ++++ remoting/webapp/toolbar.css | 75 ++ remoting/webapp/toolbar.js | 139 ++++ remoting/webapp/ui_mode.js | 85 +++ remoting/webapp/util.js | 53 ++ remoting/webapp/viewer_plugin_proto.js | 68 ++ remoting/webapp/wcs.js | 148 ++++ remoting/webapp/wcs_iq_client_proto.js | 29 + remoting/webapp/wcs_loader.js | 132 ++++ remoting/webapp/xhr.js | 187 +++++ 161 files changed, 6292 insertions(+), 6246 deletions(-) create mode 100644 remoting/webapp/_locales.official/ar/messages.json create mode 100644 remoting/webapp/_locales.official/bg/messages.json create mode 100644 remoting/webapp/_locales.official/ca/messages.json create mode 100644 remoting/webapp/_locales.official/cs/messages.json create mode 100644 remoting/webapp/_locales.official/da/messages.json create mode 100644 remoting/webapp/_locales.official/de/messages.json create mode 100644 remoting/webapp/_locales.official/el/messages.json create mode 100644 remoting/webapp/_locales.official/en/messages.json create mode 100644 remoting/webapp/_locales.official/en_GB/messages.json create mode 100644 remoting/webapp/_locales.official/es/messages.json create mode 100644 remoting/webapp/_locales.official/es_419/messages.json create mode 100644 remoting/webapp/_locales.official/et/messages.json create mode 100644 remoting/webapp/_locales.official/fi/messages.json create mode 100644 remoting/webapp/_locales.official/fil/messages.json create mode 100644 remoting/webapp/_locales.official/fr/messages.json create mode 100644 remoting/webapp/_locales.official/he/messages.json create mode 100644 remoting/webapp/_locales.official/hi/messages.json create mode 100644 remoting/webapp/_locales.official/hr/messages.json create mode 100644 remoting/webapp/_locales.official/hu/messages.json create mode 100644 remoting/webapp/_locales.official/id/messages.json create mode 100644 remoting/webapp/_locales.official/it/messages.json create mode 100644 remoting/webapp/_locales.official/ja/messages.json create mode 100644 remoting/webapp/_locales.official/ko/messages.json create mode 100644 remoting/webapp/_locales.official/lt/messages.json create mode 100644 remoting/webapp/_locales.official/lv/messages.json create mode 100644 remoting/webapp/_locales.official/nb/messages.json create mode 100644 remoting/webapp/_locales.official/nl/messages.json create mode 100644 remoting/webapp/_locales.official/pl/messages.json create mode 100644 remoting/webapp/_locales.official/pt_BR/messages.json create mode 100644 remoting/webapp/_locales.official/pt_PT/messages.json create mode 100644 remoting/webapp/_locales.official/ro/messages.json create mode 100644 remoting/webapp/_locales.official/ru/messages.json create mode 100644 remoting/webapp/_locales.official/sk/messages.json create mode 100644 remoting/webapp/_locales.official/sl/messages.json create mode 100644 remoting/webapp/_locales.official/sr/messages.json create mode 100644 remoting/webapp/_locales.official/sv/messages.json create mode 100644 remoting/webapp/_locales.official/th/messages.json create mode 100644 remoting/webapp/_locales.official/tr/messages.json create mode 100644 remoting/webapp/_locales.official/uk/messages.json create mode 100644 remoting/webapp/_locales.official/vi/messages.json create mode 100644 remoting/webapp/_locales.official/zh_CN/messages.json create mode 100644 remoting/webapp/_locales.official/zh_TW/messages.json create mode 100644 remoting/webapp/_locales/en/messages.json create mode 100644 remoting/webapp/choice.css create mode 100644 remoting/webapp/choice.html create mode 100644 remoting/webapp/client_screen.js create mode 100644 remoting/webapp/client_session.js create mode 100644 remoting/webapp/cs_oauth2_trampoline.js create mode 100644 remoting/webapp/debug_log.css create mode 100644 remoting/webapp/debug_log.gtestjs create mode 100644 remoting/webapp/debug_log.js create mode 100644 remoting/webapp/dividerbottom.png create mode 100644 remoting/webapp/dividertop.png create mode 100644 remoting/webapp/event_handlers.js create mode 100644 remoting/webapp/host_list.js create mode 100644 remoting/webapp/host_plugin_proto.js create mode 100644 remoting/webapp/host_screen.js create mode 100644 remoting/webapp/host_session.js create mode 100644 remoting/webapp/host_table_entry.js create mode 100644 remoting/webapp/l10n.js create mode 100644 remoting/webapp/log_to_server.js create mode 100644 remoting/webapp/main.css create mode 100644 remoting/webapp/manifest.json delete mode 100644 remoting/webapp/me2mom/_locales.official/ar/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/bg/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/ca/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/cs/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/da/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/de/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/el/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/en/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/en_GB/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/es/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/es_419/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/et/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/fi/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/fil/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/fr/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/he/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/hi/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/hr/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/hu/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/id/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/it/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/ja/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/ko/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/lt/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/lv/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/nb/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/nl/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/pl/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/pt_BR/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/pt_PT/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/ro/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/ru/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/sk/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/sl/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/sr/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/sv/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/th/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/tr/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/uk/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/vi/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/zh_CN/messages.json delete mode 100644 remoting/webapp/me2mom/_locales.official/zh_TW/messages.json delete mode 100644 remoting/webapp/me2mom/_locales/en/messages.json delete mode 100644 remoting/webapp/me2mom/choice.css delete mode 100644 remoting/webapp/me2mom/choice.html delete mode 100644 remoting/webapp/me2mom/client_screen.js delete mode 100644 remoting/webapp/me2mom/client_session.js delete mode 100644 remoting/webapp/me2mom/cs_oauth2_trampoline.js delete mode 100644 remoting/webapp/me2mom/debug_log.css delete mode 100644 remoting/webapp/me2mom/debug_log.gtestjs delete mode 100644 remoting/webapp/me2mom/debug_log.js delete mode 100644 remoting/webapp/me2mom/dividerbottom.png delete mode 100644 remoting/webapp/me2mom/dividertop.png delete mode 100644 remoting/webapp/me2mom/event_handlers.js delete mode 100644 remoting/webapp/me2mom/host_list.js delete mode 100644 remoting/webapp/me2mom/host_plugin_proto.js delete mode 100644 remoting/webapp/me2mom/host_screen.js delete mode 100644 remoting/webapp/me2mom/host_session.js delete mode 100644 remoting/webapp/me2mom/host_table_entry.js delete mode 100644 remoting/webapp/me2mom/l10n.js delete mode 100644 remoting/webapp/me2mom/log_to_server.js delete mode 100644 remoting/webapp/me2mom/main.css delete mode 100644 remoting/webapp/me2mom/manifest.json delete mode 100644 remoting/webapp/me2mom/oauth2.js delete mode 100644 remoting/webapp/me2mom/oauth2_callback.html delete mode 100644 remoting/webapp/me2mom/plugin_settings.js delete mode 100644 remoting/webapp/me2mom/remoting.js delete mode 100644 remoting/webapp/me2mom/scale-to-fit.png delete mode 100644 remoting/webapp/me2mom/server_log_entry.js delete mode 100644 remoting/webapp/me2mom/spinner.gif delete mode 100644 remoting/webapp/me2mom/stats_accumulator.js delete mode 100644 remoting/webapp/me2mom/toolbar.css delete mode 100644 remoting/webapp/me2mom/toolbar.js delete mode 100644 remoting/webapp/me2mom/ui_mode.js delete mode 100644 remoting/webapp/me2mom/util.js delete mode 100644 remoting/webapp/me2mom/viewer_plugin_proto.js delete mode 100644 remoting/webapp/me2mom/wcs.js delete mode 100644 remoting/webapp/me2mom/wcs_iq_client_proto.js delete mode 100644 remoting/webapp/me2mom/wcs_loader.js delete mode 100644 remoting/webapp/me2mom/xhr.js create mode 100644 remoting/webapp/oauth2.js create mode 100644 remoting/webapp/oauth2_callback.html create mode 100644 remoting/webapp/plugin_settings.js create mode 100644 remoting/webapp/remoting.js create mode 100644 remoting/webapp/scale-to-fit.png create mode 100644 remoting/webapp/server_log_entry.js create mode 100644 remoting/webapp/spinner.gif create mode 100644 remoting/webapp/stats_accumulator.js create mode 100644 remoting/webapp/toolbar.css create mode 100644 remoting/webapp/toolbar.js create mode 100644 remoting/webapp/ui_mode.js create mode 100644 remoting/webapp/util.js create mode 100644 remoting/webapp/viewer_plugin_proto.js create mode 100644 remoting/webapp/wcs.js create mode 100644 remoting/webapp/wcs_iq_client_proto.js create mode 100644 remoting/webapp/wcs_loader.js create mode 100644 remoting/webapp/xhr.js (limited to 'remoting') diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp index 56ce7b4..7b84fd6 100644 --- a/remoting/remoting.gyp +++ b/remoting/remoting.gyp @@ -49,96 +49,96 @@ ['branding=="Chrome"', { # Must match host/plugin/constants.h 'host_plugin_name': 'Chrome Remote Desktop Host', - 'remoting_it2me_locale_files': [ - 'webapp/me2mom/_locales.official/ar/messages.json', - 'webapp/me2mom/_locales.official/bg/messages.json', - 'webapp/me2mom/_locales.official/ca/messages.json', - 'webapp/me2mom/_locales.official/cs/messages.json', - 'webapp/me2mom/_locales.official/da/messages.json', - 'webapp/me2mom/_locales.official/de/messages.json', - 'webapp/me2mom/_locales.official/el/messages.json', - 'webapp/me2mom/_locales.official/en/messages.json', - 'webapp/me2mom/_locales.official/en_GB/messages.json', - 'webapp/me2mom/_locales.official/es/messages.json', - 'webapp/me2mom/_locales.official/es_419/messages.json', - 'webapp/me2mom/_locales.official/et/messages.json', - 'webapp/me2mom/_locales.official/fi/messages.json', - 'webapp/me2mom/_locales.official/fil/messages.json', - 'webapp/me2mom/_locales.official/fr/messages.json', - 'webapp/me2mom/_locales.official/he/messages.json', - 'webapp/me2mom/_locales.official/hi/messages.json', - 'webapp/me2mom/_locales.official/hr/messages.json', - 'webapp/me2mom/_locales.official/hu/messages.json', - 'webapp/me2mom/_locales.official/id/messages.json', - 'webapp/me2mom/_locales.official/it/messages.json', - 'webapp/me2mom/_locales.official/ja/messages.json', - 'webapp/me2mom/_locales.official/ko/messages.json', - 'webapp/me2mom/_locales.official/lt/messages.json', - 'webapp/me2mom/_locales.official/lv/messages.json', - 'webapp/me2mom/_locales.official/nb/messages.json', - 'webapp/me2mom/_locales.official/nl/messages.json', - 'webapp/me2mom/_locales.official/pl/messages.json', - 'webapp/me2mom/_locales.official/pt_BR/messages.json', - 'webapp/me2mom/_locales.official/pt_PT/messages.json', - 'webapp/me2mom/_locales.official/ro/messages.json', - 'webapp/me2mom/_locales.official/ru/messages.json', - 'webapp/me2mom/_locales.official/sk/messages.json', - 'webapp/me2mom/_locales.official/sl/messages.json', - 'webapp/me2mom/_locales.official/sr/messages.json', - 'webapp/me2mom/_locales.official/sv/messages.json', - 'webapp/me2mom/_locales.official/th/messages.json', - 'webapp/me2mom/_locales.official/tr/messages.json', - 'webapp/me2mom/_locales.official/uk/messages.json', - 'webapp/me2mom/_locales.official/vi/messages.json', - 'webapp/me2mom/_locales.official/zh_CN/messages.json', - 'webapp/me2mom/_locales.official/zh_TW/messages.json', + 'remoting_webapp_locale_files': [ + 'webapp/_locales.official/ar/messages.json', + 'webapp/_locales.official/bg/messages.json', + 'webapp/_locales.official/ca/messages.json', + 'webapp/_locales.official/cs/messages.json', + 'webapp/_locales.official/da/messages.json', + 'webapp/_locales.official/de/messages.json', + 'webapp/_locales.official/el/messages.json', + 'webapp/_locales.official/en/messages.json', + 'webapp/_locales.official/en_GB/messages.json', + 'webapp/_locales.official/es/messages.json', + 'webapp/_locales.official/es_419/messages.json', + 'webapp/_locales.official/et/messages.json', + 'webapp/_locales.official/fi/messages.json', + 'webapp/_locales.official/fil/messages.json', + 'webapp/_locales.official/fr/messages.json', + 'webapp/_locales.official/he/messages.json', + 'webapp/_locales.official/hi/messages.json', + 'webapp/_locales.official/hr/messages.json', + 'webapp/_locales.official/hu/messages.json', + 'webapp/_locales.official/id/messages.json', + 'webapp/_locales.official/it/messages.json', + 'webapp/_locales.official/ja/messages.json', + 'webapp/_locales.official/ko/messages.json', + 'webapp/_locales.official/lt/messages.json', + 'webapp/_locales.official/lv/messages.json', + 'webapp/_locales.official/nb/messages.json', + 'webapp/_locales.official/nl/messages.json', + 'webapp/_locales.official/pl/messages.json', + 'webapp/_locales.official/pt_BR/messages.json', + 'webapp/_locales.official/pt_PT/messages.json', + 'webapp/_locales.official/ro/messages.json', + 'webapp/_locales.official/ru/messages.json', + 'webapp/_locales.official/sk/messages.json', + 'webapp/_locales.official/sl/messages.json', + 'webapp/_locales.official/sr/messages.json', + 'webapp/_locales.official/sv/messages.json', + 'webapp/_locales.official/th/messages.json', + 'webapp/_locales.official/tr/messages.json', + 'webapp/_locales.official/uk/messages.json', + 'webapp/_locales.official/vi/messages.json', + 'webapp/_locales.official/zh_CN/messages.json', + 'webapp/_locales.official/zh_TW/messages.json', ], }, { # else: branding!="Chrome" # Must match host/plugin/constants.h 'host_plugin_name': 'Chromoting Host', - 'remoting_it2me_locale_files': [ - 'webapp/me2mom/_locales/en/messages.json', + 'remoting_webapp_locale_files': [ + 'webapp/_locales/en/messages.json', ], }], ], - 'remoting_it2me_files': [ + 'remoting_webapp_files': [ 'resources/icon_cross.png', 'resources/icon_host.png', 'resources/icon_pencil.png', 'resources/icon_warning.png', - 'webapp/me2mom/choice.css', - 'webapp/me2mom/choice.html', - 'webapp/me2mom/client_screen.js', - 'webapp/me2mom/client_session.js', - 'webapp/me2mom/cs_oauth2_trampoline.js', - 'webapp/me2mom/debug_log.css', - 'webapp/me2mom/debug_log.js', - 'webapp/me2mom/dividerbottom.png', - 'webapp/me2mom/dividertop.png', - 'webapp/me2mom/event_handlers.js', - 'webapp/me2mom/host_list.js', - 'webapp/me2mom/host_screen.js', - 'webapp/me2mom/host_session.js', - 'webapp/me2mom/host_table_entry.js', - 'webapp/me2mom/l10n.js', - 'webapp/me2mom/log_to_server.js', - 'webapp/me2mom/main.css', - 'webapp/me2mom/manifest.json', - 'webapp/me2mom/oauth2.js', - 'webapp/me2mom/oauth2_callback.html', - 'webapp/me2mom/plugin_settings.js', - 'webapp/me2mom/remoting.js', - 'webapp/me2mom/scale-to-fit.png', - 'webapp/me2mom/server_log_entry.js', - 'webapp/me2mom/spinner.gif', - 'webapp/me2mom/stats_accumulator.js', - 'webapp/me2mom/toolbar.css', - 'webapp/me2mom/toolbar.js', - 'webapp/me2mom/ui_mode.js', - 'webapp/me2mom/util.js', - 'webapp/me2mom/wcs.js', - 'webapp/me2mom/wcs_loader.js', - 'webapp/me2mom/xhr.js', + 'webapp/choice.css', + 'webapp/choice.html', + 'webapp/client_screen.js', + 'webapp/client_session.js', + 'webapp/cs_oauth2_trampoline.js', + 'webapp/debug_log.css', + 'webapp/debug_log.js', + 'webapp/dividerbottom.png', + 'webapp/dividertop.png', + 'webapp/event_handlers.js', + 'webapp/host_list.js', + 'webapp/host_screen.js', + 'webapp/host_session.js', + 'webapp/host_table_entry.js', + 'webapp/l10n.js', + 'webapp/log_to_server.js', + 'webapp/main.css', + 'webapp/manifest.json', + 'webapp/oauth2.js', + 'webapp/oauth2_callback.html', + 'webapp/plugin_settings.js', + 'webapp/remoting.js', + 'webapp/scale-to-fit.png', + 'webapp/server_log_entry.js', + 'webapp/spinner.gif', + 'webapp/stats_accumulator.js', + 'webapp/toolbar.css', + 'webapp/toolbar.js', + 'webapp/ui_mode.js', + 'webapp/util.js', + 'webapp/wcs.js', + 'webapp/wcs_loader.js', + 'webapp/xhr.js', 'resources/chromoting16.png', 'resources/chromoting48.png', 'resources/chromoting128.png', @@ -344,7 +344,12 @@ }], ], }, # end of target 'remoting_host_plugin' + { + # This is a deprecated target that has been replaced with remoting_it2me. + # It is kept here because there are some pieces that still depend on + # this target. + # TODO(sergeyu): Remove this target. 'target_name': 'webapp_it2me', 'type': 'none', 'dependencies': [ @@ -352,9 +357,50 @@ ], 'sources': [ 'webapp/build-webapp.py', + '<@(remoting_webapp_files)', + '<@(remoting_webapp_locale_files)', + ], + 'actions': [ + { + 'action_name': 'Build Remoting WebApp', + 'output_dir': '<(PRODUCT_DIR)/remoting/it2me.webapp', + 'plugin_path': '<(PRODUCT_DIR)/<(host_plugin_prefix)remoting_host_plugin.<(host_plugin_extension)', + 'zip_path': '<(PRODUCT_DIR)/remoting-it2me.zip', + 'inputs': [ + 'webapp/build-webapp.py', + '<(_plugin_path)', + '<@(remoting_webapp_files)', + '<@(remoting_webapp_locale_files)', + ], + 'outputs': [ + '<(_output_dir)', + '<(_zip_path)', + ], + 'action': [ + 'python', 'webapp/build-webapp.py', + '<(buildtype)', + '<(host_plugin_mime_type)', + '<(_output_dir)', + '<(_zip_path)', + '<(_plugin_path)', + '<@(remoting_webapp_files)', + '--locales', + '<@(remoting_webapp_locale_files)', + ], + }, + ], + }, # end of target 'remoting_webapp' + { + 'target_name': 'remoting_webapp', + 'type': 'none', + 'dependencies': [ + 'remoting_host_plugin', + ], + 'sources': [ + 'webapp/build-webapp.py', 'webapp/verify-webapp.py', - '<@(remoting_it2me_files)', - '<@(remoting_it2me_locale_files)', + '<@(remoting_webapp_files)', + '<@(remoting_webapp_locale_files)', ], # Can't use a 'copies' because we need to manipulate # the manifest file to get the right plugin name. @@ -364,41 +410,41 @@ # when the actual project is generated. 'actions': [ { - 'action_name': 'Verify It2Me WebApp i18n', + 'action_name': 'Verify Remoting WebApp i18n', 'inputs': [ 'webapp/verify-webapp.py', - 'webapp/me2mom/_locales/en/messages.json', - 'webapp/me2mom/choice.html', - 'webapp/me2mom/host_table_entry.js', - 'webapp/me2mom/manifest.json', - 'webapp/me2mom/remoting.js', + 'webapp/_locales/en/messages.json', + 'webapp/choice.html', + 'webapp/host_table_entry.js', + 'webapp/manifest.json', + 'webapp/remoting.js', 'host/plugin/host_script_object.cc', ], 'outputs': [ - '<(PRODUCT_DIR)/remoting/it2me_verified.stamp', + '<(PRODUCT_DIR)/remoting/webapp_verified.stamp', ], 'action': [ 'python', 'webapp/verify-webapp.py', - '<(PRODUCT_DIR)/remoting/it2me_verified.stamp', - 'webapp/me2mom/_locales/en/messages.json', - 'webapp/me2mom/choice.html', - 'webapp/me2mom/host_table_entry.js', - 'webapp/me2mom/manifest.json', - 'webapp/me2mom/remoting.js', + '<(PRODUCT_DIR)/remoting/webapp_verified.stamp', + 'webapp/_locales/en/messages.json', + 'webapp/choice.html', + 'webapp/host_table_entry.js', + 'webapp/manifest.json', + 'webapp/remoting.js', 'host/plugin/host_script_object.cc', ], }, { - 'action_name': 'Build It2Me WebApp', - 'output_dir': '<(PRODUCT_DIR)/remoting/it2me.webapp', + 'action_name': 'Build Remoting WebApp', + 'output_dir': '<(PRODUCT_DIR)/remoting/remoting.webapp', 'plugin_path': '<(PRODUCT_DIR)/<(host_plugin_prefix)remoting_host_plugin.<(host_plugin_extension)', - 'zip_path': '<(PRODUCT_DIR)/remoting-it2me.zip', + 'zip_path': '<(PRODUCT_DIR)/remoting-webapp.zip', 'inputs': [ 'webapp/build-webapp.py', '<(_plugin_path)', - '<@(remoting_it2me_files)', - '<@(remoting_it2me_locale_files)', + '<@(remoting_webapp_files)', + '<@(remoting_webapp_locale_files)', ], 'outputs': [ '<(_output_dir)', @@ -411,13 +457,13 @@ '<(_output_dir)', '<(_zip_path)', '<(_plugin_path)', - '<@(remoting_it2me_files)', + '<@(remoting_webapp_files)', '--locales', - '<@(remoting_it2me_locale_files)', + '<@(remoting_webapp_locale_files)', ], }, ], - }, # end of target 'webapp_it2me' + }, # end of target 'remoting_webapp' { 'target_name': 'remoting_base', 'type': 'static_library', diff --git a/remoting/webapp/_locales.official/ar/messages.json b/remoting/webapp/_locales.official/ar/messages.json new file mode 100644 index 0000000..0465096 --- /dev/null +++ b/remoting/webapp/_locales.official/ar/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644"},"access_code_timer":{"message":"\u0633\u062a\u0646\u062a\u0647\u064a \u0635\u0644\u0627\u062d\u064a\u0629 \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644 \u0647\u0630\u0627 \u062e\u0644\u0627\u0644 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0625\u0644\u063a\u0627\u0621"},"close_prompt":{"message":"\u0633\u062a\u0624\u062f\u064a \u0645\u063a\u0627\u062f\u0631\u0629 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629 \u0625\u0644\u0649 \u0625\u0646\u0647\u0627\u0621 \u062c\u0644\u0633\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome."},"connect_button":{"message":"\u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"continue_button":{"message":"\u0645\u062a\u0627\u0628\u0639\u0629"},"continue_prompt":{"message":"\u0623\u0646\u062a \u062a\u0634\u0627\u0631\u0643 \u0647\u0630\u0627 \u0627\u0644\u062c\u0647\u0627\u0632 \u062d\u0627\u0644\u064a\u064b\u0627 \u0645\u0639 \u0645\u0633\u062a\u062e\u062f\u0645 \u0622\u062e\u0631. \u0647\u0644 \u062a\u0631\u064a\u062f \u0628\u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0645\u062a\u0627\u0628\u0639\u0629 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629\u061f"},"description_authorize":{"message":"\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome\u060c \u064a\u062c\u0628 \u0623\u0648\u0644\u0627\u064b \u0645\u0646\u062d \u0623\u0630\u0648\u0646\u0627\u062a \u0645\u0648\u0633\u0651\u0639\u0629 \u0628\u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631. \u0644\u0646 \u064a\u064f\u0637\u0644\u0628 \u0645\u0646\u0643 \u0625\u062c\u0631\u0627\u0621 \u0630\u0644\u0643 \u0633\u0648\u0649 \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629."},"description_connect":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0645\u0637\u0627\u0644\u0628\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u062e\u0627\u0635 \u0628\u0647 \u0628\u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \"\u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0622\u0646\" \u0648\u0645\u0646\u062d\u0643 \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644."},"description_home":{"message":"\u064a\u0633\u0645\u062d \u0644\u0643 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0628\u0645\u0634\u0627\u0631\u0643\u0629 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0628\u0634\u0643\u0644 \u0622\u0645\u0646 \u0639\u0628\u0631 \u0627\u0644\u0648\u064a\u0628. \u0648\u064a\u062c\u0628 \u0623\u0646 \u064a\u0634\u063a\u0651\u0644 \u0643\u0644\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u062a\u0637\u0628\u064a\u0642 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome\u060c \u0648\u0627\u0644\u0630\u064a \u064a\u0645\u0643\u0646 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u064a\u0647 \u0639\u0644\u0649 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"disconnect_other_button":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"error_authentication_failed":{"message":"\u0623\u062e\u0641\u0642\u062a \u0627\u0644\u0645\u0635\u0627\u062f\u0642\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0646 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_bad_plugin_version":{"message":"\u0628\u0639\u0636 \u0627\u0644\u0645\u0643\u0648\u0646\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0644\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0645\u0641\u0642\u0648\u062f\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u062a\u062b\u0628\u064a\u062a \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_generic":{"message":"\u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0646 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_host_is_offline":{"message":"\u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u0628\u0639\u064a\u062f \u0644\u0627 \u064a\u0633\u062a\u062c\u064a\u0628 \u0644\u0637\u0644\u0628\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u062a\u0635\u0627\u0644\u0647 \u0628\u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_incompatible_protocol":{"message":"\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0625\u0635\u062f\u0627\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0627\u0641\u0642 \u0645\u0646 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u062a\u062b\u0628\u064a\u062a \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0645\u0646 Google Chrome \u0648\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0639\u0644\u0649 \u062c\u0647\u0627\u0632\u064a \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0643\u0644\u064a\u0647\u0645\u0627 \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_invalid_access_code":{"message":"\u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_missing_plugin":{"message":"\u0628\u0639\u0636 \u0627\u0644\u0645\u0643\u0648\u0646\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0644\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0645\u0641\u0642\u0648\u062f\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u062a\u0634\u063a\u064a\u0644 \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0645\u0646 Google Chrome \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_no_response":{"message":"\u0623\u062e\u0641\u0642 \u0627\u0644\u062e\u0627\u062f\u0645 \u0641\u064a \u0627\u0644\u0627\u0633\u062a\u062c\u0627\u0628\u0629 \u0644\u0637\u0644\u0628 \u0627\u0644\u0634\u0628\u0643\u0629."},"error_service_unavailable":{"message":"\u0627\u0644\u062e\u062f\u0645\u0629 \u063a\u064a\u0631 \u0645\u062a\u0627\u062d\u0629 \u0645\u0624\u0642\u062a\u064b\u0627. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u064b\u0627."},"error_unexpected":{"message":"\u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0625\u0628\u0644\u0627\u063a \u0639\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0625\u0644\u0649 \u0645\u0637\u0648\u0631\u064a \u0627\u0644\u0628\u0631\u0627\u0645\u062c."},"footer_waiting":{"message":"\u0641\u064a \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u0627\u062a\u0635\u0627\u0644..."},"help":{"message":"\u0645\u0633\u0627\u0639\u062f\u0629"},"home_access_button":{"message":"\u062f\u062e\u0648\u0644 \u0627\u0644\u0622\u0646"},"home_access_description":{"message":"\u0627\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u062c\u0647\u0627\u0632 \u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u062a\u0645\u062a \u0645\u0634\u0627\u0631\u0643\u062a\u0647 \u0648\u0627\u0644\u062a\u062d\u0643\u0645 \u0641\u064a\u0647."},"home_my_computers_title":{"message":"\u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631"},"home_share_button":{"message":"\u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0622\u0646"},"home_share_description":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0645\u0634\u0627\u0631\u0643\u0629 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0647\u0630\u0627 \u0645\u0639 \u0645\u0633\u062a\u062e\u062f\u0645 \u0622\u062e\u0631 \u0644\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u064a\u0647 \u0648\u0627\u0644\u062a\u062d\u0643\u0645 \u0641\u064a\u0647."},"home_share_description_chrome_os":{"message":"(\u0647\u0630\u0647 \u0627\u0644\u0645\u064a\u0632\u0629 \u063a\u064a\u0631 \u0645\u062a\u0627\u062d\u0629 \u0628\u0639\u062f \u0644\u0623\u062c\u0647\u0632\u0629 Chromebook\u2026 \u062a\u0631\u0642\u0628\u0647\u0627 \u0642\u0631\u064a\u0628\u064b\u0627)"},"instructions_share_above":{"message":"\u0644\u0628\u062f\u0621 \u0645\u0634\u0627\u0631\u0643\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628\u060c \u0627\u0645\u0646\u062d \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0634\u062e\u0635 \u0627\u0644\u0630\u064a \u0633\u064a\u0633\u0627\u0639\u062f\u0643."},"instructions_share_below":{"message":"\u0639\u0646\u062f \u0625\u062f\u062e\u0627\u0644\u0647 \u0627\u0644\u0631\u0645\u0632\u060c \u062a\u0628\u062f\u0623 \u062c\u0644\u0633\u0629 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629."},"label_connected":{"message":"\u0645\u062a\u0635\u0644:"},"message_connecting":{"message":"\u062c\u0627\u0631\u064d \u0627\u0644\u0627\u062a\u0635\u0627\u0644..."},"message_generating":{"message":"\u062c\u0627\u0631\u064d \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644..."},"message_session_finished":{"message":"\u0627\u0646\u062a\u0647\u062a \u062c\u0644\u0633\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome."},"message_shared":{"message":"\u062a\u062c\u0631\u064a \u0645\u0634\u0627\u0631\u0643\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u062d\u0627\u0644\u064a\u064b\u0627 \u0645\u0639 $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0627\u0644\u062a\u0641\u0648\u064a\u0636"},"mode_connect":{"message":"\u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"mode_share":{"message":"\u0645\u0634\u0627\u0631\u0643\u0629"},"offline":{"message":"\u0628\u0644\u0627 \u0627\u062a\u0635\u0627\u0644"},"ok":{"message":"\u0645\u0648\u0627\u0641\u0642"},"product_description":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u0623\u062c\u0647\u0632\u0629 \u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0623\u062e\u0631\u0649 \u0623\u0648 \u0627\u0644\u0633\u0645\u0627\u062d \u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0622\u062e\u0631 \u0628\u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0628\u0634\u0643\u0644 \u0622\u0645\u0646 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a."},"product_name":{"message":"\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome"},"sign_out_button":{"message":"\u0627\u0644\u062e\u0631\u0648\u062c"},"stop_sharing_button":{"message":"\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629"},"tooltip_scaling":{"message":"\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u062d\u062c\u0645 \u0644\u0645\u0644\u0627\u0621\u0645\u0629 \u062d\u062c\u0645 \u0627\u0644\u0634\u0627\u0634\u0629"},"warning_nat_disabled":{"message":"\u0645\u0644\u0627\u062d\u0638\u0629: \u0644\u0627 \u062a\u0633\u0645\u062d \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u0633\u0629 \u0633\u0648\u0649 \u0628\u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u064a\u0646 \u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u062f\u0627\u062e\u0644 \u0634\u0628\u0643\u062a\u0643."}} diff --git a/remoting/webapp/_locales.official/bg/messages.json b/remoting/webapp/_locales.official/bg/messages.json new file mode 100644 index 0000000..be5e085e --- /dev/null +++ b/remoting/webapp/_locales.official/bg/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u041a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f"},"access_code_timer":{"message":"\u0422\u043e\u0437\u0438 \u043a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0449\u0435 \u0438\u0437\u0442\u0435\u0447\u0435 \u0441\u043b\u0435\u0434 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u041e\u0442\u043a\u0430\u0437"},"close_prompt":{"message":"\u0410\u043a\u043e \u0438\u0437\u043b\u0435\u0437\u0435\u0442\u0435 \u043e\u0442 \u0442\u0430\u0437\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u0441\u0435\u0441\u0438\u044f\u0442\u0430 \u0432\u0438 \u0432 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0449\u0435 \u0441\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438."},"connect_button":{"message":"\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435"},"continue_button":{"message":"\u041d\u0430\u043f\u0440\u0435\u0434"},"continue_prompt":{"message":"\u041f\u043e\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435 \u0442\u043e\u0437\u0438 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u0441 \u0434\u0440\u0443\u0433 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435?"},"description_authorize":{"message":"\u0417\u0430 \u0434\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome, \u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0441\u0438. \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u0442\u043e\u0432\u0430 \u0441\u0430\u043c\u043e \u0432\u0435\u0434\u043d\u044a\u0436."},"description_connect":{"message":"\u041f\u043e\u043c\u043e\u043b\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f, \u0434\u043e \u0447\u0438\u0439\u0442\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043e\u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f, \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435 \u0432\u044a\u0440\u0445\u0443 \u201e\u0421\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435 \u0441\u0435\u0433\u0430\u201c \u0438 \u0434\u0430 \u0432\u0438 \u0434\u0430\u0434\u0435 \u043a\u043e\u0434\u0430 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f."},"description_home":{"message":"\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f\u0442 \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0432\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0430 \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u043d\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0441\u0438 \u043f\u0440\u0435\u0437 \u043c\u0440\u0435\u0436\u0430\u0442\u0430. \u0418 \u0434\u0432\u0430\u043c\u0430\u0442\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e, \u043a\u043e\u0435\u0442\u043e \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043e \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435"},"disconnect_other_button":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435"},"error_authentication_failed":{"message":"\u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0435 \u0431\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u041c\u043e\u043b\u044f, \u0438\u0437\u043b\u0435\u0437\u0442\u0435 \u043e\u0442 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_bad_plugin_version":{"message":"\u041b\u0438\u043f\u0441\u0432\u0430\u0442 \u043d\u044f\u043a\u043e\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0438 \u0437\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome. \u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043b\u0438 \u043d\u0430\u0439-\u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_generic":{"message":"\u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430. \u041c\u043e\u043b\u044f, \u0438\u0437\u043b\u0435\u0437\u0442\u0435 \u043e\u0442 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_host_is_offline":{"message":"\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f\u0442 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u043d\u0435 \u043e\u0442\u0433\u043e\u0432\u0430\u0440\u044f \u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0438\u0442\u0435 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0430. \u041c\u043e\u043b\u044f, \u043f\u043e\u0442\u0432\u044a\u0440\u0434\u0435\u0442\u0435, \u0447\u0435 \u0435 \u043e\u043d\u043b\u0430\u0439\u043d, \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_incompatible_protocol":{"message":"\u041e\u0442\u043a\u0440\u0438\u0442\u0430 \u0435 \u043d\u0435\u0441\u044a\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome. \u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u0435 \u043d\u0430 \u0434\u0432\u0430\u0442\u0430 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0441 \u043d\u0430\u0439-\u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Google Chrome \u0438 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_invalid_access_code":{"message":"\u041a\u043e\u0434\u044a\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d. \u041c\u043e\u043b\u044f, \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_missing_plugin":{"message":"\u041b\u0438\u043f\u0441\u0432\u0430\u0442 \u043d\u044f\u043a\u043e\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0438 \u0437\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome. \u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u043d\u0430\u0439-\u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Google Chrome \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_no_response":{"message":"\u0421\u044a\u0440\u0432\u044a\u0440\u044a\u0442 \u043d\u0435 \u0443\u0441\u043f\u044f \u0434\u0430 \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u0438 \u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430\u0442\u0430 \u043e\u0442 \u043c\u0440\u0435\u0436\u0430\u0442\u0430."},"error_service_unavailable":{"message":"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u044f\u043c\u0430\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0443\u0441\u043b\u0443\u0433\u0430\u0442\u0430. \u041c\u043e\u043b\u044f, \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e \u043f\u043e-\u043a\u044a\u0441\u043d\u043e."},"error_unexpected":{"message":"\u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u043d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430. \u041c\u043e\u043b\u044f, \u043f\u043e\u0434\u0430\u0439\u0442\u0435 \u0441\u0438\u0433\u043d\u0430\u043b \u0437\u0430 \u0442\u043e\u0437\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0434\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438\u0441\u0442\u0438\u0442\u0435."},"footer_waiting":{"message":"\u0438\u0437\u0447\u0430\u043a\u0432\u0430 \u0441\u0435 \u0432\u0440\u044a\u0437\u043a\u0430..."},"help":{"message":"\u041f\u043e\u043c\u043e\u0449"},"home_access_button":{"message":"\u0414\u043e\u0441\u0442\u044a\u043f \u0441\u0435\u0433\u0430"},"home_access_description":{"message":"\u0412\u0438\u0436\u0442\u0435 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0430\u0439\u0442\u0435 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440."},"home_my_computers_title":{"message":"\u041c\u043e\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u044e\u0442\u0440\u0438"},"home_share_button":{"message":"\u0421\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435 \u0441\u0435\u0433\u0430"},"home_share_description":{"message":"\u0421\u043f\u043e\u0434\u0435\u043b\u0435\u0442\u0435 \u0442\u043e\u0437\u0438 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440, \u0442\u0430\u043a\u0430 \u0447\u0435 \u0434\u0430 \u0441\u0435 \u0432\u0438\u0436\u0434\u0430 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b."},"home_share_description_chrome_os":{"message":"(\u0442\u0430\u0437\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0449\u0435 \u043d\u0435 \u0435 \u043d\u0430\u043b\u0438\u0446\u0435 \u0437\u0430 Chromebook \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0432\u0430\u0439\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438)"},"instructions_share_above":{"message":"\u0417\u0430 \u0434\u0430 \u0437\u0430\u043f\u043e\u0447\u043d\u0435\u0442\u0435 \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u044f \u0441\u0438 \u043f\u043b\u043e\u0442, \u0434\u0430\u0439\u0442\u0435 \u0434\u043e\u043b\u0443\u043f\u043e\u0441\u043e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u043d\u0430 \u0447\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0439\u0442\u043e \u0449\u0435 \u0432\u0438 \u043f\u043e\u043c\u0430\u0433\u0430."},"instructions_share_below":{"message":"\u0421\u043b\u0435\u0434 \u043a\u0430\u0442\u043e \u0442\u043e\u0439 \u0432\u044a\u0432\u0435\u0434\u0435 \u043a\u043e\u0434\u0430, \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0430\u0442\u0430 \u0432\u0438 \u0441\u0435\u0441\u0438\u044f \u0449\u0435 \u0437\u0430\u043f\u043e\u0447\u043d\u0435."},"label_connected":{"message":"\u0418\u043c\u0430 \u0432\u0440\u044a\u0437\u043a\u0430:"},"message_connecting":{"message":"\u0421\u0432\u044a\u0440\u0437\u0432\u0430 \u0441\u0435\u2026"},"message_generating":{"message":"\u041a\u043e\u0434\u044a\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0441\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0430..."},"message_session_finished":{"message":"\u0421\u0435\u0441\u0438\u044f\u0442\u0430 \u0432\u0438 \u0432 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438."},"message_shared":{"message":"\u041f\u043e\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c $1 \u0441\u043f\u043e\u0434\u0435\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u044f \u0432\u0438 \u043f\u043b\u043e\u0442.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0423\u043f\u044a\u043b\u043d\u043e\u043c\u043e\u0449\u0430\u0432\u0430\u043d\u0435"},"mode_connect":{"message":"\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435"},"mode_share":{"message":"\u0421\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435"},"offline":{"message":"\u041e\u0444\u043b\u0430\u0439\u043d"},"ok":{"message":"OK"},"product_description":{"message":"\u041e\u0441\u044a\u0449\u0435\u0441\u0442\u0432\u044f\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0434\u0440\u0443\u0433\u0438 \u043a\u043e\u043c\u043f\u044e\u0442\u0440\u0438 \u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u0442\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u0434\u0430 \u043e\u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0438 \u043d\u0430\u0434\u0435\u0436\u0434\u043d\u043e \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0432\u0438 \u043f\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"product_name":{"message":"\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome"},"sign_out_button":{"message":"\u0418\u0437\u0445\u043e\u0434"},"stop_sharing_button":{"message":"\u0421\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435\u0442\u043e"},"tooltip_scaling":{"message":"\u041f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0449\u0430\u0431\u0430"},"warning_nat_disabled":{"message":"\u0417\u0410\u0411\u0415\u041b\u0415\u0416\u041a\u0410: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430\u0442 \u0432\u0440\u044a\u0437\u043a\u0438 \u0441\u0430\u043c\u043e \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u044e\u0442\u0440\u0438 \u0432 \u043c\u0440\u0435\u0436\u0430\u0442\u0430 \u0432\u0438."}} diff --git a/remoting/webapp/_locales.official/ca/messages.json b/remoting/webapp/_locales.official/ca/messages.json new file mode 100644 index 0000000..a8e2e00 --- /dev/null +++ b/remoting/webapp/_locales.official/ca/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Codi d'acc\u00e9s"},"access_code_timer":{"message":"Aquest codi d'acc\u00e9s caducar\u00e0 d'aqu\u00ed a $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancel\u00b7la"},"close_prompt":{"message":"Si sortiu d'aquesta p\u00e0gina, la sessi\u00f3 de Chrome Remote Desktop finalitzar\u00e0."},"connect_button":{"message":"Connecta"},"continue_button":{"message":"Continua"},"continue_prompt":{"message":"Esteu compartint aquest equip amb un altre usuari. Voleu continuar compartint-lo?"},"description_authorize":{"message":"Per utilitzar Chrome Remote Desktop heu de concedir permisos d'acc\u00e9s ampliat a l'equip. Nom\u00e9s ho heu de fer una vegada."},"description_connect":{"message":"Demaneu a l'usuari de l'equip al qual voleu accedir que faci clic a \"Comparteix ara\" i que us doni el codi d'acc\u00e9s."},"description_home":{"message":"Chrome Remote Desktop us permet compartir el vostre equip de manera segura mitjan\u00e7ant el web. Els dos usuaris han d'executar l'aplicaci\u00f3 Chrome Remote Desktop, que es pot cercar a $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconnecta (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconnecta (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconnecta (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconnecta"},"disconnect_other_button":{"message":"Desconnecta"},"error_authentication_failed":{"message":"L'autenticaci\u00f3 ha fallat. Tanqueu la sessi\u00f3 de Chrome Remote Desktop i torneu-ho a provar."},"error_bad_plugin_version":{"message":"Falten alguns components que es requereixen per a Chrome Remote Desktop. Assegureu-vos que h\u00e0giu instal\u00b7lat la versi\u00f3 m\u00e9s recent de Google Chrome i torneu-ho a provar."},"error_generic":{"message":"S'ha produ\u00eft un error desconegut. Tanqueu la sessi\u00f3 de Chrome Remote Desktop i torneu-ho a provar."},"error_host_is_offline":{"message":"L'equip remot no respon a les sol\u00b7licituds de connexi\u00f3. Verifiqueu que estigui en l\u00ednia i torneu-ho a provar."},"error_incompatible_protocol":{"message":"S'ha detectat una versi\u00f3 incompatible de Chrome Remote Desktop. Assegureu-vos que teniu la versi\u00f3 m\u00e9s recent de Google Chrome i de Chrome Remote Desktop als dos equips i torneu-ho a provar."},"error_invalid_access_code":{"message":"El codi d'acc\u00e9s no \u00e9s v\u00e0lid. Torneu-ho a provar."},"error_missing_plugin":{"message":"Falten alguns components que es requereixen per a Chrome Remote Desktop. Assegureu-vos que executeu la versi\u00f3 m\u00e9s recent de Google Chrome i torneu-ho a provar."},"error_no_response":{"message":"El servidor no ha pogut respondre a la sol\u00b7licitud de xarxa."},"error_service_unavailable":{"message":"El servei no est\u00e0 disponible temporalment. Torneu-ho a provar m\u00e9s tard."},"error_unexpected":{"message":"S'ha produ\u00eft un error inesperat. Informeu d'aquest problema als desenvolupadors."},"footer_waiting":{"message":"s'est\u00e0 esperant la connexi\u00f3..."},"help":{"message":"Ajuda"},"home_access_button":{"message":"Accedeix ara"},"home_access_description":{"message":"Vegeu i controleu un equip compartit."},"home_my_computers_title":{"message":"Els meus equips"},"home_share_button":{"message":"Comparteix-ho ara"},"home_share_description":{"message":"Compartiu aquest equip perqu\u00e8 un altre usuari el vegi i el controli."},"home_share_description_chrome_os":{"message":"(aquesta funci\u00f3 encara no est\u00e0 disponible per als Chromebook... estigueu ben atent)"},"instructions_share_above":{"message":"Per comen\u00e7ar a compartir l'escriptori, doneu el codi d'acc\u00e9s seg\u00fcent a la persona que us ajudar\u00e0."},"instructions_share_below":{"message":"Quan hagin introdu\u00eft el codi, la sessi\u00f3 d'\u00fas compartit comen\u00e7ar\u00e0."},"label_connected":{"message":"Connectat:"},"message_connecting":{"message":"S'est\u00e0 connectant..."},"message_generating":{"message":"S'est\u00e0 generant el codi d'acc\u00e9s..."},"message_session_finished":{"message":"La sessi\u00f3 de Chrome Remote Desktop ha finalitzat."},"message_shared":{"message":"Esteu compartint l'escriptori amb $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoritza"},"mode_connect":{"message":"Connecta"},"mode_share":{"message":"Comparteix"},"offline":{"message":"Fora de l\u00ednia"},"ok":{"message":"D'acord"},"product_description":{"message":"Accediu a altres equips o permeteu que un altre usuari accedeixi al vostre equip de manera segura per Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Tanca la sessi\u00f3"},"stop_sharing_button":{"message":"Deixa de compartir"},"tooltip_scaling":{"message":"Canvia l'escala per ajustar"},"warning_nat_disabled":{"message":"NOTA: La configuraci\u00f3 de pol\u00edtiques permet connexions nom\u00e9s entre equips de la vostra xarxa."}} diff --git a/remoting/webapp/_locales.official/cs/messages.json b/remoting/webapp/_locales.official/cs/messages.json new file mode 100644 index 0000000..ae76202 --- /dev/null +++ b/remoting/webapp/_locales.official/cs/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"P\u0159\u00edstupov\u00fd k\u00f3d"},"access_code_timer":{"message":"Platnost tohoto p\u0159\u00edstupov\u00e9ho k\u00f3du vypr\u0161\u00ed za $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Zru\u0161it"},"close_prompt":{"message":"Pokud opust\u00edte tuto str\u00e1nku, relace Vzd\u00e1len\u00e9 plochy Chrome bude ukon\u010dena."},"connect_button":{"message":"P\u0159ipojit"},"continue_button":{"message":"Pokra\u010dovat"},"continue_prompt":{"message":"Moment\u00e1ln\u011b sd\u00edl\u00edte tento po\u010d\u00edta\u010d s jin\u00fdm u\u017eivatelem. Chcete ve sd\u00edlen\u00ed pokra\u010dovat?"},"description_authorize":{"message":"Chcete-li pou\u017e\u00edvat Vzd\u00e1lenou plochu Chrome, je t\u0159eba ud\u011blit roz\u0161\u00ed\u0159en\u00e1 opr\u00e1vn\u011bn\u00ed k p\u0159\u00edstupu do va\u0161eho po\u010d\u00edta\u010de. Tato opr\u00e1vn\u011bn\u00ed je t\u0159eba ud\u011blit pouze jednou."},"description_connect":{"message":"Po\u017e\u00e1dejte u\u017eivatele, jeho\u017e po\u010d\u00edta\u010d chcete sd\u00edlet, aby kliknul na polo\u017eku Sd\u00edlet a poskytl v\u00e1m p\u0159\u00edstupov\u00fd k\u00f3d."},"description_home":{"message":"Vzd\u00e1len\u00e1 plocha Chrome v\u00e1m umo\u017e\u0148uje bezpe\u010dn\u011b sd\u00edlet sv\u016fj po\u010d\u00edta\u010d p\u0159es internet. Oba u\u017eivatel\u00e9 mus\u00ed m\u00edt spu\u0161t\u011bnou aplikaci Vzd\u00e1len\u00e1 plocha Chrome, kterou najdete na adrese $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Odpojit (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Odpojit (Opt + Ctrl + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Odpojit (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"Odpojit"},"disconnect_other_button":{"message":"Odpojit"},"error_authentication_failed":{"message":"Ov\u011b\u0159en\u00ed se nezda\u0159ilo. Odhlaste se pros\u00edm od Vzd\u00e1len\u00e9 plochy Chrome a zkuste to znovu."},"error_bad_plugin_version":{"message":"N\u011bkter\u00e9 sou\u010d\u00e1sti pot\u0159ebn\u00e9 pro Vzd\u00e1lenou plochu Chrome chyb\u00ed. Zkontrolujte, zda je nainstalov\u00e1na nejnov\u011bj\u0161\u00ed verze, a zkuste to znovu."},"error_generic":{"message":"Do\u0161lo k nezn\u00e1m\u00e9 chyb\u011b. Odhlaste se pros\u00edm od Vzd\u00e1len\u00e9 plochy Chrome a zkuste to znovu."},"error_host_is_offline":{"message":"Vzd\u00e1len\u00fd po\u010d\u00edta\u010d nereaguje na \u017e\u00e1dosti o p\u0159ipojen\u00ed. Zkontrolujte, zda je online, a zkuste to znovu."},"error_incompatible_protocol":{"message":"Byla zji\u0161t\u011bna nekompatibiln\u00ed verze Vzd\u00e1len\u00e9 plochy Chrome. Zkontrolujte, zda m\u00e1te nejnov\u011bj\u0161\u00ed verzi prohl\u00ed\u017ee\u010de Google Chrome a Vzd\u00e1len\u00e9 plochy Chrome na obou po\u010d\u00edta\u010d\u00edch, a zkuste to znovu."},"error_invalid_access_code":{"message":"P\u0159\u00edstupov\u00fd k\u00f3d je neplatn\u00fd. Zkuste to pros\u00edm znovu."},"error_missing_plugin":{"message":"N\u011bkter\u00e9 sou\u010d\u00e1sti pot\u0159ebn\u00e9 pro Vzd\u00e1lenou plochu Chrome chyb\u00ed. Zkontrolujte, zda pou\u017e\u00edv\u00e1te nejnov\u011bj\u0161\u00ed verzi prohl\u00ed\u017ee\u010de Google Chrome, a zkuste to znovu."},"error_no_response":{"message":"Serveru se nepoda\u0159ilo odpov\u011bd\u011bt na po\u017eadavek s\u00edt\u011b."},"error_service_unavailable":{"message":"Slu\u017eba je do\u010dasn\u011b nedostupn\u00e1. Zkuste to pros\u00edm znovu pozd\u011bji."},"error_unexpected":{"message":"Do\u0161lo k neo\u010dek\u00e1van\u00e9 chyb\u011b. Nahlaste tento probl\u00e9m pros\u00edm v\u00fdvoj\u00e1\u0159\u016fm."},"footer_waiting":{"message":"\u010dek\u00e1 se na p\u0159ipojen\u00ed..."},"help":{"message":"N\u00e1pov\u011bda"},"home_access_button":{"message":"Z\u00edskat p\u0159\u00edstup"},"home_access_description":{"message":"Umo\u017e\u0148uje zobrazit a ovl\u00e1dat sd\u00edlen\u00fd po\u010d\u00edta\u010d."},"home_my_computers_title":{"message":"M\u00e9 po\u010d\u00edta\u010de"},"home_share_button":{"message":"Sd\u00edlet"},"home_share_description":{"message":"Sd\u00edlet tento po\u010d\u00edta\u010d, aby jej mohl jin\u00fd u\u017eivatel zobrazit a ovl\u00e1dat."},"home_share_description_chrome_os":{"message":"(Tato funkce zat\u00edm pro Chromebooky nen\u00ed k dispozici, ale brzy bude.)"},"instructions_share_above":{"message":"Chcete-li za\u010d\u00edt sd\u00edlet svoji plochu, poskytn\u011bte n\u00ed\u017ee uveden\u00fd p\u0159\u00edstupov\u00fd k\u00f3d osob\u011b, kter\u00e1 v\u00e1m bude pom\u00e1hat."},"instructions_share_below":{"message":"Po zad\u00e1n\u00ed k\u00f3du bude spu\u0161t\u011bna relace sd\u00edlen\u00ed."},"label_connected":{"message":"P\u0159ipojeno:"},"message_connecting":{"message":"P\u0159ipojov\u00e1n\u00ed..."},"message_generating":{"message":"Vytv\u00e1\u0159en\u00ed p\u0159\u00edstupov\u00e9ho k\u00f3du..."},"message_session_finished":{"message":"Relace Vzd\u00e1len\u00e9 plochy Chrome byla ukon\u010dena."},"message_shared":{"message":"Aktu\u00e1ln\u011b sd\u00edl\u00edte plochu s u\u017eivatelem $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizovat"},"mode_connect":{"message":"P\u0159ipojit"},"mode_share":{"message":"Sd\u00edlet"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"P\u0159istupujte k jin\u00fdm po\u010d\u00edta\u010d\u016fm nebo umo\u017en\u011bte dal\u0161\u00edmu u\u017eivateli p\u0159istupovat k va\u0161emu po\u010d\u00edta\u010di bezpe\u010dn\u011b p\u0159es internet."},"product_name":{"message":"Vzd\u00e1len\u00e1 plocha Chrome"},"sign_out_button":{"message":"Odhl\u00e1sit se"},"stop_sharing_button":{"message":"Ukon\u010dit sd\u00edlen\u00ed"},"tooltip_scaling":{"message":"P\u0159izp\u016fsobit velikost"},"warning_nat_disabled":{"message":"POZN\u00c1MKA: Nastaven\u00ed z\u00e1sad umo\u017e\u0148uj\u00ed spojen\u00ed pouze mezi po\u010d\u00edta\u010di v r\u00e1mci va\u0161\u00ed s\u00edt\u011b."}} diff --git a/remoting/webapp/_locales.official/da/messages.json b/remoting/webapp/_locales.official/da/messages.json new file mode 100644 index 0000000..5ecbb9c --- /dev/null +++ b/remoting/webapp/_locales.official/da/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Adgangskode"},"access_code_timer":{"message":"Denne adgangskode udl\u00f8ber om $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annuller"},"close_prompt":{"message":"Hvis du forlader denne side, afsluttes din session med Chrome Fjernskrivebord."},"connect_button":{"message":"Opret forbindelse"},"continue_button":{"message":"Forts\u00e6t"},"continue_prompt":{"message":"Du deler i \u00f8jeblikket denne maskine med en anden bruger. Vil du forts\u00e6tte med at dele?"},"description_authorize":{"message":"Hvis du vil bruge Chrome Fjernskrivebord, skal du give udvidet tilladelse til adgang til din computer. Du skal kun g\u00f8re dette \u00e9n gang."},"description_connect":{"message":"Bed den bruger, hvis computer, du \u00f8nsker adgang til, om at klikke p\u00e5 \"Del nu\" og give dig adgangskoden."},"description_home":{"message":"Chrome Fjernskrivebord giver dig mulighed for sikkert at dele din computer via internettet. Begge brugere skal k\u00f8re appen Chrome Fjernskrivebord, som kan findes p\u00e5 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Afbryd (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Afbryd (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Afbryd (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Afbryd forbindelsen"},"disconnect_other_button":{"message":"Afbryd forbindelsen"},"error_authentication_failed":{"message":"Godkendelsen mislykkedes. Log ud af Chrome Fjernskrivebord, og pr\u00f8v igen."},"error_bad_plugin_version":{"message":"Nogle komponenter, der kr\u00e6ves til Chrome Fjernskrivebord, mangler. Kontroller, at du har den nyeste version af Google Chrome, og pr\u00f8v igen."},"error_generic":{"message":"Der opstod en ukendt fejl. Log ud af Chrome Fjernskrivebord, og pr\u00f8v igen."},"error_host_is_offline":{"message":"Fjerncomputeren svarer ikke p\u00e5 anmodninger om oprettelse af forbindelse. Kontroller, at den er online, og pr\u00f8v igen."},"error_incompatible_protocol":{"message":"Der er registreret en inkompatibel version af Chrome Fjernskrivebord. Kontroller, at du har den nyeste version af Google Chrome og Chrome Fjernskrivebord p\u00e5 begge computere, og pr\u00f8v igen."},"error_invalid_access_code":{"message":"Adgangskoden er ugyldig. Pr\u00f8v igen."},"error_missing_plugin":{"message":"Nogle komponenter, der kr\u00e6ves til Chrome Fjernskrivebord, mangler. Kontroller, at du har den nyeste version af Google Chrome, og pr\u00f8v igen."},"error_no_response":{"message":"Serveren svarede ikke p\u00e5 netv\u00e6rksanmodningen"},"error_service_unavailable":{"message":"Tjenesten er midlertidigt utilg\u00e6ngelig. Pr\u00f8v igen senere."},"error_unexpected":{"message":"Der opstod en uventet fejl. Rapporter dette problem til udviklerne."},"footer_waiting":{"message":"venter p\u00e5 forbindelse..."},"help":{"message":"Hj\u00e6lp"},"home_access_button":{"message":"F\u00e5 adgang nu"},"home_access_description":{"message":"F\u00e5 vist og kontroller en delt computer."},"home_my_computers_title":{"message":"Mine computere"},"home_share_button":{"message":"Del nu"},"home_share_description":{"message":"Del denne computer, s\u00e5 en anden bruger kan se og kontrollere den."},"home_share_description_chrome_os":{"message":"(denne funktion er endnu ikke tilg\u00e6ngelig for Chromebooks... hold dig opdateret)"},"instructions_share_above":{"message":"Hvis du vil begynde at dele dit skrivebord, skal du give adgangskoden nedenfor til den person, som skal hj\u00e6lpe dig."},"instructions_share_below":{"message":"N\u00e5r personen indtaster koden, startes delingssessionen."},"label_connected":{"message":"Tilsluttet:"},"message_connecting":{"message":"Opretter forbindelse..."},"message_generating":{"message":"Genererer adgangskode..."},"message_session_finished":{"message":"Din session med Chrome Fjernskrivebord er afsluttet."},"message_shared":{"message":"Dit skrivebord deles i \u00f8jeblikket med $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Tillad"},"mode_connect":{"message":"Opret forbindelse"},"mode_share":{"message":"Del"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"F\u00e5 adgang til andre computere, eller giv en anden bruger adgang til din computer sikkert via internettet."},"product_name":{"message":"Chrome Fjernskrivebord"},"sign_out_button":{"message":"Log ud"},"stop_sharing_button":{"message":"Stop deling"},"tooltip_scaling":{"message":"Tilpasset vinduet"},"warning_nat_disabled":{"message":"BEM\u00c6RK! Politikindstillingerne tillader kun forbindelser mellem computere inden for dit netv\u00e6rk."}} diff --git a/remoting/webapp/_locales.official/de/messages.json b/remoting/webapp/_locales.official/de/messages.json new file mode 100644 index 0000000..c288950 --- /dev/null +++ b/remoting/webapp/_locales.official/de/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Zugriffscode"},"access_code_timer":{"message":"Dieser Zugriffscode l\u00e4uft in $1 ab.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Abbrechen"},"close_prompt":{"message":"Wenn Sie diese Seite verlassen, wird Ihre Chrome Remote Desktop-Sitzung beendet."},"connect_button":{"message":"Verbinden"},"continue_button":{"message":"Weiter"},"continue_prompt":{"message":"Dieser Computer ist zurzeit f\u00fcr einen anderen Nutzer freigegeben. M\u00f6chten Sie Ihren Computer weiterhin freigeben?"},"description_authorize":{"message":"Zur Verwendung von Chrome Remote Desktop ist es erforderlich, erweiterte Zugriffsberechtigungen f\u00fcr Ihren Computer zu gew\u00e4hren. Dieser Schritt ist nur einmal erforderlich."},"description_connect":{"message":"Bitten Sie den Nutzer, auf dessen Computer Sie zugreifen m\u00f6chten, auf \"Jetzt freigeben\" zu klicken und Ihnen den Zugriffscode mitzuteilen."},"description_home":{"message":"Chrome Remote Desktop erm\u00f6glicht die sichere Freigabe Ihres Computers \u00fcber das Internet. Beide Nutzer m\u00fcssen dazu die Chrome Remote Desktop-App ausf\u00fchren. Diese App finden Sie unter $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Verbindung trennen (Strg+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Verbindung trennen (Wahltaste+Strg+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Verbindung trennen (Strg+Alt+Esc)"},"disconnect_myself_button":{"message":"Verbindung trennen"},"disconnect_other_button":{"message":"Verbindung trennen"},"error_authentication_failed":{"message":"Fehler bei der Authentifizierung. Melden Sie sich von Chrome Remote Desktop ab und versuchen Sie es erneut."},"error_bad_plugin_version":{"message":"Es fehlen einige Komponenten, die f\u00fcr Chrome Remote Desktop erforderlich sind. \u00dcberpr\u00fcfen Sie, ob die neueste Version installiert ist, und versuchen Sie es erneut."},"error_generic":{"message":"Ein unbekannter Fehler ist aufgetreten. Melden Sie sich von Chrome Remote Desktop ab und versuchen Sie es erneut."},"error_host_is_offline":{"message":"Der Remote-Computer reagiert nicht auf Verbindungsanfragen. \u00dcberpr\u00fcfen Sie, ob er online ist, und versuchen Sie es erneut."},"error_incompatible_protocol":{"message":"Eine inkompatible Version von Chrome Remote Desktop wurde erkannt. \u00dcberpr\u00fcfen Sie, ob die neueste Version von Google Chrome und Chrome Remote Desktop auf beiden Computern installiert ist, und versuchen Sie es erneut."},"error_invalid_access_code":{"message":"Der Zugriffscode ist ung\u00fcltig. Versuchen Sie es erneut."},"error_missing_plugin":{"message":"Es fehlen einige Komponenten, die f\u00fcr Chrome Remote Desktop erforderlich sind. \u00dcberpr\u00fcfen Sie, ob Sie die neueste Version von Google Chrome verwenden, und versuchen Sie es erneut."},"error_no_response":{"message":"Der Server reagiert nicht auf die Netzwerkanfrage."},"error_service_unavailable":{"message":"Der Service ist vor\u00fcbergehend nicht verf\u00fcgbar. Bitte versuchen Sie es sp\u00e4ter erneut."},"error_unexpected":{"message":"Ein unerwarteter Fehler ist aufgetreten. Bitte melden Sie dieses Problem an die Entwickler."},"footer_waiting":{"message":"Warten auf Verbindung..."},"help":{"message":"Hilfe"},"home_access_button":{"message":"Jetzt zugreifen"},"home_access_description":{"message":"Freigegebenen Computer sehen und steuern"},"home_my_computers_title":{"message":"Meine Computer"},"home_share_button":{"message":"Jetzt freigeben"},"home_share_description":{"message":"Diesen Computer f\u00fcr einen anderen Nutzer zur Ansicht und Steuerung freigeben"},"home_share_description_chrome_os":{"message":"(Diese Funktion ist noch nicht f\u00fcr Chromebooks verf\u00fcgbar\u2026 Bitte haben Sie noch etwas Geduld.)"},"instructions_share_above":{"message":"Teilen Sie zur Freigabe Ihres Desktops zun\u00e4chst der anderen Person den unten stehenden Zugriffscode mit."},"instructions_share_below":{"message":"Sobald der Nutzer den Code eingibt, beginnt die Freigabesitzung."},"label_connected":{"message":"Verbunden:"},"message_connecting":{"message":"Verbindung wird hergestellt..."},"message_generating":{"message":"Zugriffscode wird generiert..."},"message_session_finished":{"message":"Ihre Chrome Remote Desktop-Sitzung wurde beendet."},"message_shared":{"message":"Ihr Desktop ist derzeit f\u00fcr $1 freigegeben.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorisieren"},"mode_connect":{"message":"Verbinden"},"mode_share":{"message":"Freigeben"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Greifen Sie sicher \u00fcber das Internet auf andere Computer zu oder gew\u00e4hren Sie anderen Nutzern Zugriff auf Ihren Computer."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Abmelden"},"stop_sharing_button":{"message":"Freigabe beenden"},"tooltip_scaling":{"message":"Gr\u00f6\u00dfe anpassen"},"warning_nat_disabled":{"message":"Hinweis: Die Richtlinieneinstellungen erlauben nur Verbindungen zwischen Computern in Ihrem Netzwerk."}} diff --git a/remoting/webapp/_locales.official/el/messages.json b/remoting/webapp/_locales.official/el/messages.json new file mode 100644 index 0000000..151c59c --- /dev/null +++ b/remoting/webapp/_locales.official/el/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2"},"access_code_timer":{"message":"\u0391\u03c5\u03c4\u03cc\u03c2 \u03bf \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b8\u03b1 \u03bb\u03ae\u03be\u03b5\u03b9 \u03c3\u03b5 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7"},"close_prompt":{"message":"\u0391\u03bd \u03b1\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03bd\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1, \u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c3\u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03b8\u03b1 \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03b9\u03c3\u03c4\u03b5\u03af."},"connect_button":{"message":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"continue_button":{"message":"\u03a3\u03c5\u03bd\u03ad\u03c7\u03b9\u03c3\u03b7"},"continue_prompt":{"message":"\u0391\u03c5\u03c4\u03ae \u03c4\u03b7 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03bc\u03b5 \u03ad\u03bd\u03b1\u03bd \u03ac\u03bb\u03bb\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7. \u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7;"},"description_authorize":{"message":"\u0393\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03b1\u03c1\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b5\u03ba\u03c4\u03b5\u03c4\u03b1\u03bc\u03ad\u03bd\u03b1 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2. \u0391\u03c5\u03c4\u03cc \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03bc\u03cc\u03bd\u03bf \u03bc\u03af\u03b1 \u03c6\u03bf\u03c1\u03ac."},"description_connect":{"message":"\u0396\u03b7\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c4\u03bf\u03c5 \u03bf\u03c0\u03bf\u03af\u03bf\u03c5 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03b9 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \"\u039a\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1\" \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03c3\u03b1\u03c2 \u03b4\u03ce\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2."},"description_home":{"message":"\u0397 \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03c3\u03ac\u03c2 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b1\u03c3\u03c6\u03ac\u03bb\u03b5\u03b9\u03b1 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2 \u03bc\u03ad\u03c3\u03c9 \u0399\u03c3\u03c4\u03bf\u03cd. \u039a\u03b1\u03b9 \u03bf\u03b9 \u03b4\u03cd\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03ba\u03c4\u03b5\u03bb\u03bf\u03cd\u03bd \u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome, \u03b7 \u03bf\u03c0\u03bf\u03af\u03b1 \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"disconnect_other_button":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"error_authentication_failed":{"message":"\u039f \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5. \u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_bad_plugin_version":{"message":"\u039b\u03b5\u03af\u03c0\u03bf\u03c5\u03bd \u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03c5 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_generic":{"message":"\u03a0\u03c1\u03bf\u03ad\u03ba\u03c5\u03c8\u03b5 \u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1. \u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_host_is_offline":{"message":"\u039f \u03b1\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_incompatible_protocol":{"message":"\u0395\u03bd\u03c4\u03bf\u03c0\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03bc\u03b9\u03b1 \u03bc\u03b7 \u03c3\u03c5\u03bc\u03b2\u03b1\u03c4\u03ae \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c4\u03b7\u03c2 \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7\u03c2 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c4\u03bf\u03c5 Google Chrome \u03ba\u03b1\u03b8\u03ce\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03ba\u03b1\u03b9 \u03c3\u03c4\u03bf\u03c5 \u03b4\u03cd\u03bf \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_invalid_access_code":{"message":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_missing_plugin":{"message":"\u039b\u03b5\u03af\u03c0\u03bf\u03c5\u03bd \u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03c5 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c4\u03bf\u03c5 Google Chrome \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_no_response":{"message":"\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03bd\u03b1 \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03b9\u03b8\u03b5\u03af \u03c3\u03c4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5."},"error_service_unavailable":{"message":"\u0397 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03bc\u03b1\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c1\u03b9\u03bd\u03ac. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac \u03b1\u03c1\u03b3\u03cc\u03c4\u03b5\u03c1\u03b1."},"error_unexpected":{"message":"\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03bc\u03b7 \u03b1\u03bd\u03b1\u03bc\u03b5\u03bd\u03cc\u03bc\u03b5\u03bd\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1. \u0391\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03c0\u03c1\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03b9\u03c3\u03c4\u03ad\u03c2."},"footer_waiting":{"message":"\u03b1\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae \u03b3\u03b9\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7..."},"help":{"message":"\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1"},"home_access_button":{"message":"\u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1"},"home_access_description":{"message":"\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03b1\u03b9 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03b5\u03bd\u03cc\u03c2 \u03ba\u03bf\u03b9\u03bd\u03cc\u03c7\u03c1\u03b7\u03c3\u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae."},"home_my_computers_title":{"message":"\u039f\u03b9 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2 \u03bc\u03bf\u03c5"},"home_share_button":{"message":"\u039a\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1"},"home_share_description":{"message":"\u03a0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03ce\u03c3\u03c4\u03b5 \u03ad\u03bd\u03b1\u03c2 \u03ac\u03bb\u03bb\u03bf\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03c4\u03b7 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 \u03bd\u03b1 \u03b2\u03bb\u03ad\u03c0\u03b5\u03b9 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03bb\u03ad\u03b3\u03c7\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2."},"home_share_description_chrome_os":{"message":"(\u03b1\u03c5\u03c4\u03ae \u03b7 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03ba\u03cc\u03bc\u03b1 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03b3\u03b9\u03b1 Chromebook\u2026 \u03bc\u03b5\u03af\u03bd\u03b5\u03c4\u03b5 \u03c3\u03c5\u03bd\u03c4\u03bf\u03bd\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03b9)"},"instructions_share_above":{"message":"\u0393\u03b9\u03b1 \u03bd\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2, \u03b4\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03c4\u03c9 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03c3\u03b1\u03c2 \u03b2\u03bf\u03b7\u03b8\u03ae\u03c3\u03b5\u03b9."},"instructions_share_below":{"message":"\u039c\u03cc\u03bb\u03b9\u03c2 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03af\u03c3\u03bf\u03c5\u03bd \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc, \u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03ba\u03bf\u03b9\u03bd\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03b8\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03b9."},"label_connected":{"message":"\u03a3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5 \u03bc\u03b5:"},"message_connecting":{"message":"\u0393\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7..."},"message_generating":{"message":"\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2..."},"message_session_finished":{"message":"\u0397 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c3\u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03af\u03c3\u03c4\u03b7\u03ba\u03b5."},"message_shared":{"message":"\u0391\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0395\u03be\u03bf\u03c5\u03c3\u03b9\u03bf\u03b4\u03cc\u03c4\u03b7\u03c3\u03b7"},"mode_connect":{"message":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"mode_share":{"message":"\u039a\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7"},"offline":{"message":"\u0395\u03ba\u03c4\u03cc\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2"},"ok":{"message":"OK"},"product_description":{"message":"\u0391\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03ac\u03bb\u03bb\u03bf\u03c5\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2 \u03ae \u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03ad\u03bd\u03b1\u03bd \u03ac\u03bb\u03bb\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03b7 \u03b1\u03c3\u03c6\u03b1\u03bb\u03ae\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2 \u03bc\u03ad\u03c3\u03c9 \u0394\u03b9\u03b1\u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5."},"product_name":{"message":"\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome"},"sign_out_button":{"message":"\u0388\u03be\u03bf\u03b4\u03bf\u03c2"},"stop_sharing_button":{"message":"\u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03ba\u03bf\u03b9\u03bd\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2"},"tooltip_scaling":{"message":"\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae \u03bc\u03b5\u03b3\u03ad\u03b8\u03bf\u03c5\u03c2"},"warning_nat_disabled":{"message":"\u03a3\u0397\u039c\u0395\u0399\u03a9\u03a3\u0397: \u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03c0\u03bf\u03bb\u03b9\u03c4\u03b9\u03ba\u03ae\u03c2 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03bf\u03c5\u03bd \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03b9\u03c2 \u03bc\u03cc\u03bd\u03bf \u03bc\u03b5\u03c4\u03b1\u03be\u03cd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b1\u03bd\u03ae\u03ba\u03bf\u03c5\u03bd \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03cc \u03c3\u03b1\u03c2."}} diff --git a/remoting/webapp/_locales.official/en/messages.json b/remoting/webapp/_locales.official/en/messages.json new file mode 100644 index 0000000..daf776e --- /dev/null +++ b/remoting/webapp/_locales.official/en/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Access code"},"access_code_timer":{"message":"This access code will expire in $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancel"},"close_prompt":{"message":"Leaving this page will end your Chrome Remote Desktop session."},"connect_button":{"message":"Connect"},"continue_button":{"message":"Continue"},"continue_prompt":{"message":"You are currently sharing this machine with another user. Do you want to continue sharing?"},"description_authorize":{"message":"To use Chrome Remote Desktop you must grant extended access permissions to your computer. You only have to do this once."},"description_connect":{"message":"Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code."},"description_home":{"message":"Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnect (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnect"},"disconnect_other_button":{"message":"Disconnect"},"error_authentication_failed":{"message":"Authentication failed. Please sign out of Chrome Remote Desktop and try again."},"error_bad_plugin_version":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you have installed the latest version and try again."},"error_generic":{"message":"An unknown error occurred. Please sign out of Chrome Remote Desktop and try again."},"error_host_is_offline":{"message":"The remote computer is not responding to connection requests. Please verify that it is online and try again."},"error_incompatible_protocol":{"message":"An incompatible version of Chrome Remote Desktop was detected. Please make sure that you have the latest version of Google Chrome and Chrome Remote Desktop on both computers and try again."},"error_invalid_access_code":{"message":"The access code is invalid. Please try again."},"error_missing_plugin":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you're running the latest version of Google Chrome and try again."},"error_no_response":{"message":"The server failed to respond to the network request."},"error_service_unavailable":{"message":"The service is temporarily unavailable. Please try again later."},"error_unexpected":{"message":"An unexpected error occurred. Please report this problem to the developers."},"footer_waiting":{"message":"waiting for connection\u2026"},"help":{"message":"Help"},"home_access_button":{"message":"Access Now"},"home_access_description":{"message":"See and control a shared computer."},"home_my_computers_title":{"message":"My Computers"},"home_share_button":{"message":"Share Now"},"home_share_description":{"message":"Share this computer for another user to see and control."},"home_share_description_chrome_os":{"message":"(this feature is not yet available for Chromebooks\u2026 stay tuned)"},"instructions_share_above":{"message":"To begin sharing your desktop, give the access code below to the person who will be assisting you."},"instructions_share_below":{"message":"Once they enter the code your sharing session will begin."},"label_connected":{"message":"Connected:"},"message_connecting":{"message":"Connecting\u2026"},"message_generating":{"message":"Generating access code\u2026"},"message_session_finished":{"message":"Your Chrome Remote Desktop session has ended."},"message_shared":{"message":"Your desktop is currently being shared with $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Authorize"},"mode_connect":{"message":"Connect"},"mode_share":{"message":"Share"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Access other computers or allow another user to access your computer securely over the Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Sign out"},"stop_sharing_button":{"message":"Stop Sharing"},"tooltip_scaling":{"message":"Scale to fit"},"warning_nat_disabled":{"message":"NOTE: Policy settings permit connections only between computers within your network."}} diff --git a/remoting/webapp/_locales.official/en_GB/messages.json b/remoting/webapp/_locales.official/en_GB/messages.json new file mode 100644 index 0000000..706d45d --- /dev/null +++ b/remoting/webapp/_locales.official/en_GB/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Access code"},"access_code_timer":{"message":"This access code will expire in $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancel"},"close_prompt":{"message":"Leaving this page will end your Chrome Remote Desktop session."},"connect_button":{"message":"Connect"},"continue_button":{"message":"Continue"},"continue_prompt":{"message":"You are currently sharing this machine with another user. Do you want to continue sharing?"},"description_authorize":{"message":"To use Chrome Remote Desktop you must grant extended access permissions to your computer. You only have to do this once."},"description_connect":{"message":"Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code."},"description_home":{"message":"Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnect (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnect"},"disconnect_other_button":{"message":"Disconnect"},"error_authentication_failed":{"message":"Authentication failed. Please sign out of Chrome Remote Desktop and try again."},"error_bad_plugin_version":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure that you have installed the latest version and try again."},"error_generic":{"message":"An unknown error occurred. Please sign out of Chrome Remote Desktop and try again."},"error_host_is_offline":{"message":"The remote computer is not responding to connection requests. Please verify that it is online and try again."},"error_incompatible_protocol":{"message":"An incompatible version of Chrome Remote Desktop was detected. Please make sure that you have the latest version of Google Chrome and Chrome Remote Desktop on both computers and try again."},"error_invalid_access_code":{"message":"The access code is invalid. Please try again."},"error_missing_plugin":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure that you're running the latest version of Google Chrome and try again."},"error_no_response":{"message":"The server failed to respond to the network request."},"error_service_unavailable":{"message":"Our service is temporarily unavailable. Please try again later."},"error_unexpected":{"message":"An unexpected error occurred. Please report this problem to the developers."},"footer_waiting":{"message":"waiting for connection\u2026"},"help":{"message":"Help"},"home_access_button":{"message":"Access Now"},"home_access_description":{"message":"See and control a shared computer."},"home_my_computers_title":{"message":"My Computers"},"home_share_button":{"message":"Share Now"},"home_share_description":{"message":"Share this computer for another user to see and control."},"home_share_description_chrome_os":{"message":"(this feature is not yet available for Chromebooks\u2026 stay tuned)"},"instructions_share_above":{"message":"To begin sharing your desktop, give the access code below to the person who will be assisting you."},"instructions_share_below":{"message":"Once they have entered the code your sharing session will begin."},"label_connected":{"message":"Connected:"},"message_connecting":{"message":"Connecting\u2026"},"message_generating":{"message":"Generating access code\u2026"},"message_session_finished":{"message":"Your Chrome Remote Desktop session has ended."},"message_shared":{"message":"Your desktop is currently being shared with $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Authorise"},"mode_connect":{"message":"Connect"},"mode_share":{"message":"Share"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Access other computers or allow another user to access your computer securely over the Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Sign out"},"stop_sharing_button":{"message":"Stop Sharing"},"tooltip_scaling":{"message":"Scaled to fit"},"warning_nat_disabled":{"message":"NOTE: Policy settings only permit connections between computers within your network."}} diff --git a/remoting/webapp/_locales.official/es/messages.json b/remoting/webapp/_locales.official/es/messages.json new file mode 100644 index 0000000..be8bc65 --- /dev/null +++ b/remoting/webapp/_locales.official/es/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"C\u00f3digo de acceso"},"access_code_timer":{"message":"Este c\u00f3digo de acceso caducar\u00e1 dentro de $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Si abandonas esta p\u00e1gina, finalizar\u00e1 tu sesi\u00f3n en Chrome Remote Desktop."},"connect_button":{"message":"Conectar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"Actualmente est\u00e1s compartiendo este ordenador con otro usuario. \u00bfQuieres seguir comparti\u00e9ndolo?"},"description_authorize":{"message":"Para poder utilizar Chrome Remote Desktop, debes conceder permisos de acceso ampliados a tu ordenador. Solo tienes que realizar esta acci\u00f3n una vez."},"description_connect":{"message":"Pide al propietario del ordenador al que quieras acceder que haga clic en la opci\u00f3n Compartir ahora y que te facilite el c\u00f3digo de acceso."},"description_home":{"message":"Chrome Remote Desktop permite compartir de forma segura tu ordenador a trav\u00e9s de Internet. Ambos usuarios deben estar ejecutando la aplicaci\u00f3n Chrome Remote Desktop, que est\u00e1 disponible en la p\u00e1gina $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconectar (Opci\u00f3n+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconectar"},"disconnect_other_button":{"message":"Desconectar"},"error_authentication_failed":{"message":"Se ha producido un error de autenticaci\u00f3n. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_bad_plugin_version":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de haber instalado la \u00faltima versi\u00f3n y vuelve a intentarlo."},"error_generic":{"message":"Se ha producido un error desconocido. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_host_is_offline":{"message":"El ordenador remoto no responde a las solicitudes de conexi\u00f3n. Comprueba que est\u00e9 conectado y vuelve a intentarlo."},"error_incompatible_protocol":{"message":"Hemos detectado que tu versi\u00f3n de Chrome Remote Desktop no es compatible. Aseg\u00farate de haber instalado en ambos ordenadores la \u00faltima versi\u00f3n de Google Chrome y de Chrome Remote Desktop."},"error_invalid_access_code":{"message":"El c\u00f3digo de acceso no es v\u00e1lido. Vuelve a intentarlo."},"error_missing_plugin":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de estar ejecutando la \u00faltima versi\u00f3n de Google Chrome y vuelve a intentarlo."},"error_no_response":{"message":"El servidor no ha respondido a la solicitud de red."},"error_service_unavailable":{"message":"El servicio no est\u00e1 disponible temporalmente. Vuelve a intentarlo m\u00e1s tarde."},"error_unexpected":{"message":"Se ha producido un error inesperado. Comunica la incidencia a los desarrolladores."},"footer_waiting":{"message":"esperando conexi\u00f3n..."},"help":{"message":"Ayuda"},"home_access_button":{"message":"Acceder ahora"},"home_access_description":{"message":"Permite ver y controlar un ordenador compartido."},"home_my_computers_title":{"message":"Mis ordenadores"},"home_share_button":{"message":"Compartir ahora"},"home_share_description":{"message":"Comparte este ordenador para que otro usuario pueda acceder a \u00e9l y controlarlo."},"home_share_description_chrome_os":{"message":"(esta funci\u00f3n a\u00fan no est\u00e1 disponible para los Chromebook\u2026, sigue atento a las novedades)"},"instructions_share_above":{"message":"Para empezar a compartir tu escritorio, proporciona el c\u00f3digo de acceso que se muestra a continuaci\u00f3n a la persona que te vaya a ayudar."},"instructions_share_below":{"message":"Cuando el usuario introduzca el c\u00f3digo de acceso, empezar\u00e1 la sesi\u00f3n compartida."},"label_connected":{"message":"Conectado:"},"message_connecting":{"message":"Conectando\u2026"},"message_generating":{"message":"Generando c\u00f3digo de acceso..."},"message_session_finished":{"message":"Ha finalizado tu sesi\u00f3n en Chrome Remote Desktop."},"message_shared":{"message":"Actualmente est\u00e1s compartiendo tu escritorio con $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Conectar"},"mode_share":{"message":"Compartir"},"offline":{"message":"Sin conexi\u00f3n"},"ok":{"message":"Aceptar"},"product_description":{"message":"Accede a otros ordenadores o permite que otro usuario acceda a tu ordenador de forma segura a trav\u00e9s de Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Salir"},"stop_sharing_button":{"message":"Dejar de compartir"},"tooltip_scaling":{"message":"Ajusta el tama\u00f1o a la pantalla"},"warning_nat_disabled":{"message":"NOTA: la configuraci\u00f3n de la pol\u00edtica solo permite establecer conexiones entre ordenadores de tu misma red."}} diff --git a/remoting/webapp/_locales.official/es_419/messages.json b/remoting/webapp/_locales.official/es_419/messages.json new file mode 100644 index 0000000..335e866 --- /dev/null +++ b/remoting/webapp/_locales.official/es_419/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"C\u00f3digo de acceso"},"access_code_timer":{"message":"Este c\u00f3digo de acceso caducar\u00e1 en $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Al abandonar esta p\u00e1gina, se cerrar\u00e1 la sesi\u00f3n que iniciaste en Chrome Remote Desktop."},"connect_button":{"message":"Conectar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"En este momento compartes esta computadora con otro usuario. \u00bfDeseas continuar comparti\u00e9ndola?"},"description_authorize":{"message":"Para usar Chrome Remote Desktop debes extender los permisos de acceso a tu computadora. Solo tienes que hacer esto una vez."},"description_connect":{"message":"Solicita que el usuario de la computadora a la que deseas acceder haga clic en \"Compartir ahora\" y te proporcione el c\u00f3digo de acceso."},"description_home":{"message":"Chrome Remote Desktop te permite compartir tu computadora con otro usuario de manera segura en la Web. Tanto t\u00fa como el otro usuario deben ejecutar la aplicaci\u00f3n Chrome Remote Desktop, disponible en $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconectar (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconectar"},"disconnect_other_button":{"message":"Desconectar"},"error_authentication_failed":{"message":"No se pudo realizar la autenticaci\u00f3n. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_bad_plugin_version":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de haber instalado la \u00faltima versi\u00f3n y vuelve a intentarlo."},"error_generic":{"message":"Se produjo un error desconocido. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_host_is_offline":{"message":"La computadora remota no responde a las solicitudes de conexi\u00f3n. Verifica que esta se encuentre en l\u00ednea y vuelve a intentarlo."},"error_incompatible_protocol":{"message":"Se detect\u00f3 una versi\u00f3n incompatible de Chrome Remote Desktop. Aseg\u00farate de que se hayan instalado las \u00faltimas versiones de Google Chrome y de Chrome Remote Desktop en ambas computadoras y vuelve a intentarlo."},"error_invalid_access_code":{"message":"El c\u00f3digo de acceso no es v\u00e1lido. Vuelve a intentarlo."},"error_missing_plugin":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de estar ejecutando la \u00faltima versi\u00f3n de Google Chrome y vuelve a intentarlo."},"error_no_response":{"message":"El servidor no pudo responder a la solicitud de red."},"error_service_unavailable":{"message":"El servicio no est\u00e1 disponible temporalmente. Vuelve a intentarlo m\u00e1s adelante."},"error_unexpected":{"message":"Se produjo un error inesperado. Informa este problema a los programadores."},"footer_waiting":{"message":"Aguardando la conexi\u00f3n..."},"help":{"message":"Ayuda"},"home_access_button":{"message":"Acceder ahora"},"home_access_description":{"message":"Ve y controla una computadora compartida."},"home_my_computers_title":{"message":"Mis computadoras"},"home_share_button":{"message":"Compartir ahora"},"home_share_description":{"message":"Comparte esta computadora con otro usuario para que este pueda verla y controlarla."},"home_share_description_chrome_os":{"message":"(Esta funci\u00f3n a\u00fan no est\u00e1 disponible para las Chromebooks\u2026 Queda a la espera de novedades)."},"instructions_share_above":{"message":"Para comenzar a compartir tu escritorio, proporciona el c\u00f3digo de acceso que aparece a continuaci\u00f3n a la persona que te asistir\u00e1."},"instructions_share_below":{"message":"Una vez que se haya ingresado el c\u00f3digo, se iniciar\u00e1 la sesi\u00f3n compartida."},"label_connected":{"message":"Conectado:"},"message_connecting":{"message":"Conectando..."},"message_generating":{"message":"Generando el c\u00f3digo de acceso..."},"message_session_finished":{"message":"Se cerr\u00f3 la sesi\u00f3n que iniciaste en Chrome Remote Desktop."},"message_shared":{"message":"En este momento compartes tu escritorio con $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Conectar"},"mode_share":{"message":"Compartir"},"offline":{"message":"Sin conexi\u00f3n"},"ok":{"message":"Aceptar"},"product_description":{"message":"Accede a otras computadoras o permite que otro usuario acceda a tu computadora de manera segura en Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Salir"},"stop_sharing_button":{"message":"Dejar de compartir"},"tooltip_scaling":{"message":"Ajustar al tama\u00f1o de la ventana"},"warning_nat_disabled":{"message":"NOTA: La configuraci\u00f3n de la pol\u00edtica local solo permite conexiones entre computadoras de tu misma red."}} diff --git a/remoting/webapp/_locales.official/et/messages.json b/remoting/webapp/_locales.official/et/messages.json new file mode 100644 index 0000000..3082f7b --- /dev/null +++ b/remoting/webapp/_locales.official/et/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"P\u00e4\u00e4sukood"},"access_code_timer":{"message":"See p\u00e4\u00e4sukood aegub $1 p\u00e4rast","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"T\u00fchista"},"close_prompt":{"message":"Lehelt lahkumine l\u00f5petab teie Chrome Remote Desktopi seansi."},"connect_button":{"message":"\u00dchenda"},"continue_button":{"message":"J\u00e4tka"},"continue_prompt":{"message":"Jagate seda seadet praegu teise kasutajaga. Kas soovite jagamist j\u00e4tkata?"},"description_authorize":{"message":"Chrome Remote Desktopi kasutamiseks peate andma arvutile laiendatud p\u00e4\u00e4suload. Peate tegema seda ainult \u00fcks kord."},"description_connect":{"message":"Paluge kasutajal, kelle arvutisse soovite juurde p\u00e4\u00e4seda, kl\u00f5psata valikul \u201eJaga n\u00fc\u00fcd\u201d ja anda teile seej\u00e4rel p\u00e4\u00e4sukood."},"description_home":{"message":"Chrome Remote Desktop v\u00f5imaldab arvutit turvaliselt veebi kaudu jagada. M\u00f5lema kasutaja arvutis peab t\u00f6\u00f6tama rakendus Chrome Remote Desktop, mille leiate aadressilt $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Katkesta \u00fchendus (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Katkesta \u00fchendus (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Katkesta \u00fchendus (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Katkesta \u00fchendus"},"disconnect_other_button":{"message":"Katkesta \u00fchendus"},"error_authentication_failed":{"message":"Autentimine eba\u00f5nnestus. Logige Chrome Remote Desktopist v\u00e4lja ja proovige uuesti."},"error_bad_plugin_version":{"message":"M\u00f5ned Chrome Remote Desktopi jaoks vajalikud komponendid on puudu. Veenduge, et olete installinud uusima versiooni ja proovige uuesti."},"error_generic":{"message":"Ilmnes tundmatu viga. Logige Chrome Remote Desktopist v\u00e4lja ja proovige uuesti."},"error_host_is_offline":{"message":"Kaugarvuti ei reageeri \u00fchenduse taotlusele. Kontrollige, et arvutil oleks v\u00f5rgu\u00fchendus ja proovige uuesti."},"error_incompatible_protocol":{"message":"Tuvastati Chrome Remote Desktopi \u00fchildumatu verisoon. Veenduge, et m\u00f5lemasse arvutisse on installitud Google Chrome'i ja Chrome Remote Desktopi uusim versioon, ning proovige uuesti."},"error_invalid_access_code":{"message":"P\u00e4\u00e4sukood on kehtetu. Proovige uuesti."},"error_missing_plugin":{"message":"M\u00f5ned Chrome Remote Desktopi jaoks vajalikud komponendid on puudu. Veenduge, et arvutis t\u00f6\u00f6tab Google Chrome'i uusim versioon ja proovige uuesti."},"error_no_response":{"message":"Server ei vastanud v\u00f5rgup\u00e4ringule."},"error_service_unavailable":{"message":"Teenus on ajutiselt k\u00e4ttesaamatu. Proovige hiljem uuesti."},"error_unexpected":{"message":"Ilmnes ootamatu viga. Teatage sellest probleemist arendajatele."},"footer_waiting":{"message":"\u00fchenduse ootamine ..."},"help":{"message":"Abi"},"home_access_button":{"message":"Hangi n\u00fc\u00fcd juurdep\u00e4\u00e4s"},"home_access_description":{"message":"Vaadake ja juhtige jagatud arvutit."},"home_my_computers_title":{"message":"Minu arvutid"},"home_share_button":{"message":"Jaga n\u00fc\u00fcd"},"home_share_description":{"message":"Jagage seda arvutit teise kasutajaga, nii et ta n\u00e4eb ja saab arvutit juhtida."},"home_share_description_chrome_os":{"message":"(See funktsioon ei ole veel Chromebooksis saadaval ... j\u00e4\u00e4ge ootele.)"},"instructions_share_above":{"message":"Arvuti jagamise alustamiseks andke allolev p\u00e4\u00e4sukood inimesele, kes teid aitama hakkab."},"instructions_share_below":{"message":"Kui ta on koodi sisestanud, algab teie jagamisseanss."},"label_connected":{"message":"\u00dchendatud:"},"message_connecting":{"message":"\u00dchendamine ..."},"message_generating":{"message":"P\u00e4\u00e4sukoodi loomine ..."},"message_session_finished":{"message":"Teie Chrome Remote Desktopi seanss on l\u00f5ppenud."},"message_shared":{"message":"Teie t\u00f6\u00f6lauda jagatakse praegu kasutajaga $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Volitamine"},"mode_connect":{"message":"\u00dchendamine"},"mode_share":{"message":"Jagamine"},"offline":{"message":"V\u00f5rgu\u00fchenduseta"},"ok":{"message":"OK"},"product_description":{"message":"Hankige turvaliselt Interneti kaudu juurdep\u00e4\u00e4s teistele arvutitele v\u00f5i lubage teisel kasutajal hankida juurdep\u00e4\u00e4s oma arvutile."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Logi v\u00e4lja"},"stop_sharing_button":{"message":"L\u00f5peta jagamine"},"tooltip_scaling":{"message":"Suurusega kohandamine"},"warning_nat_disabled":{"message":"M\u00c4RKUS: reeglite seaded lubavad \u00fchendust ainult teie v\u00f5rku kuuluvate arvutite vahel."}} diff --git a/remoting/webapp/_locales.official/fi/messages.json b/remoting/webapp/_locales.official/fi/messages.json new file mode 100644 index 0000000..529fb29 --- /dev/null +++ b/remoting/webapp/_locales.official/fi/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"K\u00e4ytt\u00f6koodi"},"access_code_timer":{"message":"T\u00e4m\u00e4 k\u00e4ytt\u00f6koodi vanhenee $1 kuluttua.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Peruuta"},"close_prompt":{"message":"Vaihtamalla sivua p\u00e4\u00e4t\u00e4t Chrome-et\u00e4k\u00e4ytt\u00f6kerran."},"connect_button":{"message":"Yhdist\u00e4"},"continue_button":{"message":"Jatka"},"continue_prompt":{"message":"Jaat t\u00e4ll\u00e4 hetkell\u00e4 t\u00e4m\u00e4n tietokoneen toisen k\u00e4ytt\u00e4j\u00e4n kanssa. Haluatko jatkaa jakamista?"},"description_authorize":{"message":"Sinun on annettava laajennetut k\u00e4ytt\u00f6oikeudet tietokoneeseesi, jotta voit k\u00e4ytt\u00e4\u00e4 Chrome-et\u00e4k\u00e4ytt\u00f6\u00e4. T\u00e4m\u00e4 t\u00e4ytyy tehd\u00e4 vain kerran."},"description_connect":{"message":"Pyyd\u00e4 k\u00e4ytt\u00e4j\u00e4\u00e4, jonka tietokonetta haluat k\u00e4ytt\u00e4\u00e4, valitsemaan Jaa nyt ja antamaan sinulle k\u00e4ytt\u00f6koodi."},"description_home":{"message":"Chrome-et\u00e4k\u00e4ytt\u00f6sovelluksen avulla voit jakaa tietokoneesi suojatun verkkoyhteyden kautta. Molempien k\u00e4ytt\u00e4jien t\u00e4ytyy k\u00e4ytt\u00e4\u00e4 osoitteesta $1 l\u00f6ytyv\u00e4\u00e4 Chrome-et\u00e4k\u00e4ytt\u00f6sovellusta.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Katkaise yhteys (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Katkaise yhteys (Opt + Ctrl + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Katkaise yhteys (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"Katkaise yhteys"},"disconnect_other_button":{"message":"Katkaise yhteys"},"error_authentication_failed":{"message":"Todennus ep\u00e4onnistui. Kirjaudu ulos Chrome-et\u00e4k\u00e4yt\u00f6st\u00e4 ja yrit\u00e4 uudelleen."},"error_bad_plugin_version":{"message":"Jotkin Chrome-et\u00e4k\u00e4ytt\u00f6\u00f6n vaadittavat komponentit puuttuvat. Varmista, ett\u00e4 olet asentanut uusimman Google Chrome -version, ja yrit\u00e4 uudelleen."},"error_generic":{"message":"Tuntematon virhe. Kirjaudu ulos Chrome-et\u00e4k\u00e4yt\u00f6st\u00e4 ja yrit\u00e4 uudelleen."},"error_host_is_offline":{"message":"Et\u00e4tietokone ei vastaa yhteyspyynt\u00f6ihin. Vahvista, ett\u00e4 se on online-tilassa, ja yrit\u00e4 uudelleen."},"error_incompatible_protocol":{"message":"Havaittiin yhteensopimaton Chrome-et\u00e4k\u00e4ytt\u00f6versio. Varmista, ett\u00e4 molemmissa tietokoneissa on uusimmat Google Chrome- ja Chrome-et\u00e4k\u00e4ytt\u00f6versiot, ja yrit\u00e4 uudelleen."},"error_invalid_access_code":{"message":"K\u00e4ytt\u00f6koodi on virheellinen. Yrit\u00e4 uudelleen."},"error_missing_plugin":{"message":"Jotkin Chrome-et\u00e4k\u00e4ytt\u00f6\u00f6n vaadittavat komponentit puuttuvat. Varmista, ett\u00e4 k\u00e4yt\u00e4t uusinta Google Chrome -versiota ja yrit\u00e4 uudelleen."},"error_no_response":{"message":"Palvelin ei pystynyt vastaamaan verkkopyynt\u00f6\u00f6n."},"error_service_unavailable":{"message":"Palvelu ei ole t\u00e4ll\u00e4 hetkell\u00e4 k\u00e4ytett\u00e4viss\u00e4. Yrit\u00e4 my\u00f6hemmin uudelleen."},"error_unexpected":{"message":"Odottamaton virhe. Ilmoita t\u00e4st\u00e4 ongelmasta kehitt\u00e4jille."},"footer_waiting":{"message":"odotetaan yhteytt\u00e4..."},"help":{"message":"Ohje"},"home_access_button":{"message":"K\u00e4yt\u00e4 nyt"},"home_access_description":{"message":"Tarkastele ja hallinnoi jaettua tietokonetta."},"home_my_computers_title":{"message":"Omat tietokoneet"},"home_share_button":{"message":"Jaa nyt"},"home_share_description":{"message":"Jaa t\u00e4m\u00e4 tietokone toisen k\u00e4ytt\u00e4j\u00e4n n\u00e4ht\u00e4v\u00e4ksi ja hallinnoitavaksi."},"home_share_description_chrome_os":{"message":"(t\u00e4m\u00e4 ominaisuus ei ole viel\u00e4 saatavilla Chromebookeille ... pysy kuulolla)"},"instructions_share_above":{"message":"Aloita ty\u00f6p\u00f6yd\u00e4n jakaminen antamalla k\u00e4ytt\u00f6koodi sinua avustavalle henkil\u00f6lle."},"instructions_share_below":{"message":"Tietokoneen jakaminen aloitetaan k\u00e4ytt\u00e4j\u00e4n annettua k\u00e4ytt\u00f6koodin."},"label_connected":{"message":"Yhdistetty:"},"message_connecting":{"message":"Yhdistet\u00e4\u00e4n\u2026"},"message_generating":{"message":"Luodaan k\u00e4ytt\u00f6koodia..."},"message_session_finished":{"message":"Chrome-et\u00e4k\u00e4ytt\u00f6kerta on p\u00e4\u00e4ttynyt."},"message_shared":{"message":"Tietokoneesi on jaettu k\u00e4ytt\u00e4j\u00e4n $1 kanssa.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Valtuuta"},"mode_connect":{"message":"Yhdist\u00e4"},"mode_share":{"message":"Jaa"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"K\u00e4yt\u00e4 muita tietokoneita tai salli toisen k\u00e4ytt\u00e4j\u00e4n k\u00e4ytt\u00e4\u00e4 tietokonettasi suojatun internetyhteyden kautta."},"product_name":{"message":"Chrome-et\u00e4k\u00e4ytt\u00f6"},"sign_out_button":{"message":"Kirjaudu ulos"},"stop_sharing_button":{"message":"Lopeta jakaminen"},"tooltip_scaling":{"message":"Sovita koon mukaan"},"warning_nat_disabled":{"message":"HUOMAA: k\u00e4yt\u00e4nt\u00f6asetusten vuoksi vain verkossasi olevien tietokoneiden v\u00e4liset yhteydet sallitaan."}} diff --git a/remoting/webapp/_locales.official/fil/messages.json b/remoting/webapp/_locales.official/fil/messages.json new file mode 100644 index 0000000..9722973 --- /dev/null +++ b/remoting/webapp/_locales.official/fil/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Access code"},"access_code_timer":{"message":"Mag-e-expire ang access code sa $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Kanselahin"},"close_prompt":{"message":"Tatapusin ng pag-alis sa pahinang ito ang iyong session sa Chrome Remote Desktop."},"connect_button":{"message":"Kumonekta"},"continue_button":{"message":"Magpatuloy"},"continue_prompt":{"message":"Kasalukuyan mong ibinabahagi ang machine na ito sa isa pang user. Gusto mo bang ipagpatuloy ang pagbabahagi?"},"description_authorize":{"message":"Upang gamitin ang Chrome Remote Desktop, dapat kang magbigay ng mga pagpapahintulot ng pinalawak na access sa iyong computer. Kailangan mo lamang itong gawin nang isang beses."},"description_connect":{"message":"Hilingin sa user na nagmamay-ari ng computer na gusto mong i-access na i-click ang \u2018Ibahagi Ngayon\u2019 at ibigay sa iyo ang access code."},"description_home":{"message":"Binibigyang-daan ka ng Chrome Remote Desktop na ibahagi sa Web ang iyong computer nang secure. Kailangang nagpapatakbo ng Chrome Remote app ang parehong mga user, na matatagpuan sa $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Idiskonekta (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Idiskonekta (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Idiskonekta (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Idiskonekta"},"disconnect_other_button":{"message":"Idiskonekta"},"error_authentication_failed":{"message":"Nabigo ang pagpapatotoo. Mangyaring mag-sign out sa Chrome Remote Desktop at subukang muli."},"error_bad_plugin_version":{"message":"Nawawala ang ilang bahaging kinakailangan para sa Chrome Remote Desktop. Mangyaring tiyaking na-install mo ang pinakabagong bersyon at subukang muli."},"error_generic":{"message":"Naganap ang isang hindi kilalang error. Mangyaring mag-sign out sa Chrome Remote Desktop at subukang muli."},"error_host_is_offline":{"message":"Hindi tumutugon ang malayuang computer sa mga kahilingan ng koneksyon. Paki-verify na ito ay online at subukang muli."},"error_incompatible_protocol":{"message":"Natukoy ang isang hindi tugmang bersyon ng Chrome Remote Desktop. Mangyaring tiyaking na-install mo ang pinakabagong bersyon ng Google Chrome at Chrome Remote Desktop sa parehong mga computer at subukang muli."},"error_invalid_access_code":{"message":"Di-wasto ang access code. Pakisubukang muli."},"error_missing_plugin":{"message":"Nawawala ang ilang bahaging kinakailangan para sa Chrome Remote Desktop. Mangyaring tiyaking pinapatakbo mo ang pinakabagong bersyon ng Google Chrome at subukang muli."},"error_no_response":{"message":"Nabigo ang server na tumugon sa kahilingan ng network."},"error_service_unavailable":{"message":"Pansamantalang hindi available ang serbisyo. Pakisubukang muli sa ibang pagkakataon."},"error_unexpected":{"message":"May naganap na hindi inaasahang error. Paki-ulat ang problemang ito sa mga developer."},"footer_waiting":{"message":"naghihitay ng koneksyon\u2026"},"help":{"message":"Tulong"},"home_access_button":{"message":"I-access Ngayon"},"home_access_description":{"message":"Tingnan at kontrolin ang isang nakabahaging computer."},"home_my_computers_title":{"message":"Aking Mga Computer"},"home_share_button":{"message":"Ibahagi Ngayon"},"home_share_description":{"message":"Ibahagi ang computer na ito sa isa pang user upang tingnan at kontrolin."},"home_share_description_chrome_os":{"message":"(hindi pa available ang tampok na ito para sa Mga Chromebook\u2026 manatiling nakasubaybay)"},"instructions_share_above":{"message":"Upang simulang ibahagi ang iyong desktop, ibigay sa taong tutulong sa iyo ang access code na nasa ibaba."},"instructions_share_below":{"message":"Sa sandaling ilagay nila ang code ay magsisimula ang iyong session ng pagbabahagi."},"label_connected":{"message":"Nakakonekta:"},"message_connecting":{"message":"Kumukonekta..."},"message_generating":{"message":"Binubuo ang access code\u2026"},"message_session_finished":{"message":"Natapos na ang iyong session sa Chrome Remote Desktop."},"message_shared":{"message":"Kasalukuyang nakabahagi ang iyong desktop kay $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Pahintulutan"},"mode_connect":{"message":"Kumonekta"},"mode_share":{"message":"Ibahagi"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Mag-access ng iba pang mga computer o payagan ang isa pang user na i-access sa Internet ang iyong computer nang secure."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Mag-sign out"},"stop_sharing_button":{"message":"Ihinto ang Pagbabahagi"},"tooltip_scaling":{"message":"Sukatin upang umangkop"},"warning_nat_disabled":{"message":"TANDAAN: Pinapayagan ng mga setting ng patakaran ang mga koneksyon sa pagitan lamang ng mga computer sa loob ng iyong network."}} diff --git a/remoting/webapp/_locales.official/fr/messages.json b/remoting/webapp/_locales.official/fr/messages.json new file mode 100644 index 0000000..976df3e --- /dev/null +++ b/remoting/webapp/_locales.official/fr/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Code d'acc\u00e8s"},"access_code_timer":{"message":"Ce code d'acc\u00e8s expire dans $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annuler"},"close_prompt":{"message":"En quittant cette page, vous mettrez fin \u00e0 la session du bureau \u00e0 distance Chrome."},"connect_button":{"message":"Connexion"},"continue_button":{"message":"Continuer"},"continue_prompt":{"message":"Vous partagez actuellement cette machine avec un autre utilisateur. Voulez-vous continuer ce partage\u00a0?"},"description_authorize":{"message":"Pour utiliser le bureau \u00e0 distance Chrome, vous devez autoriser l'acc\u00e8s \u00e9tendu \u00e0 votre ordinateur. Vous n'aurez \u00e0 effectuer cette op\u00e9ration qu'une seule fois."},"description_connect":{"message":"Demandez \u00e0 l'utilisateur poss\u00e9dant l'ordinateur auquel vous souhaitez acc\u00e9der de cliquer sur \"Partager\", puis de vous communiquer le code d'acc\u00e8s."},"description_home":{"message":"L'application Bureau \u00e0 distance Chrome vous permet de partager votre ordinateur sur le Web en toute s\u00e9curit\u00e9. Pour ce faire, les deux\u00a0utilisateurs en question doivent ex\u00e9cuter cette application, disponible \u00e0 l'adresse $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"D\u00e9connecter (Ctrl\u00a0+\u00a0Alt\u00a0+\u00a0Echap)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"D\u00e9connecter (Opt + Ctrl + Echap)"},"disconnect_button_plus_shortcut_windows":{"message":"D\u00e9connecter (Ctrl + Alt + Echap)"},"disconnect_myself_button":{"message":"Se d\u00e9connecter"},"disconnect_other_button":{"message":"D\u00e9connecter"},"error_authentication_failed":{"message":"\u00c9chec de l'authentification. Veuillez vous d\u00e9connecter du bureau \u00e0 distance Chrome, puis r\u00e9essayer."},"error_bad_plugin_version":{"message":"Certains composants n\u00e9cessaires \u00e0 l'utilisation du bureau \u00e0 distance Chrome sont introuvables. Veuillez vous assurer que vous utilisez la derni\u00e8re version de Google\u00a0Chrome, puis r\u00e9essayer."},"error_generic":{"message":"Une erreur inconnue s'est produite. Veuillez vous d\u00e9connecter du bureau \u00e0 distance\u00a0Chrome, puis r\u00e9essayer."},"error_host_is_offline":{"message":"L'ordinateur distant ne r\u00e9pond pas aux demandes de connexion. Veuillez v\u00e9rifier qu'il est connect\u00e9, puis r\u00e9essayer."},"error_incompatible_protocol":{"message":"Une version incompatible du bureau \u00e0 distance Chrome a \u00e9t\u00e9 d\u00e9tect\u00e9e. Veuillez vous assurer que vous utilisez la derni\u00e8re version de Google\u00a0Chrome et du bureau \u00e0 distance sur les deux\u00a0ordinateurs, puis r\u00e9essayer."},"error_invalid_access_code":{"message":"Le code d'acc\u00e8s n'est pas valide. Veuillez r\u00e9essayer."},"error_missing_plugin":{"message":"Certains composants n\u00e9cessaires \u00e0 l'utilisation du bureau \u00e0 distance Chrome sont introuvables. Veuillez vous assurer que vous utilisez la derni\u00e8re version de Google\u00a0Chrome, puis r\u00e9essayer."},"error_no_response":{"message":"\u00c9chec de la r\u00e9ponse du serveur \u00e0 la demande du r\u00e9seau."},"error_service_unavailable":{"message":"Le service est momentan\u00e9ment indisponible. Veuillez r\u00e9essayer ult\u00e9rieurement."},"error_unexpected":{"message":"Une erreur inattendue s'est produite. Veuillez signaler le probl\u00e8me aux d\u00e9veloppeurs."},"footer_waiting":{"message":"en attente de connexion\u2026"},"help":{"message":"Aide"},"home_access_button":{"message":"Acc\u00e9der"},"home_access_description":{"message":"Voir et contr\u00f4ler un ordinateur partag\u00e9"},"home_my_computers_title":{"message":"Mes ordinateurs"},"home_share_button":{"message":"Partager"},"home_share_description":{"message":"Partager cet ordinateur et permettre \u00e0 un utilisateur de le voir et de le contr\u00f4ler"},"home_share_description_chrome_os":{"message":"Cette fonctionnalit\u00e9 n'est pas encore disponible pour les Chromebooks. Merci de votre patience."},"instructions_share_above":{"message":"Pour d\u00e9marrer le partage de votre bureau, communiquez le code d'acc\u00e8s ci-dessous \u00e0 la personne qui vous assistera."},"instructions_share_below":{"message":"Votre session de partage d\u00e9butera une fois le code saisi."},"label_connected":{"message":"Connect\u00e9\u00a0:"},"message_connecting":{"message":"Connexion en cours\u2026"},"message_generating":{"message":"G\u00e9n\u00e9ration du code d'acc\u00e8s\u2026"},"message_session_finished":{"message":"La session du bureau \u00e0 distance Chrome est termin\u00e9e."},"message_shared":{"message":"Vous partagez actuellement votre bureau avec $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriser"},"mode_connect":{"message":"Se connecter"},"mode_share":{"message":"Partager"},"offline":{"message":"Hors connexion"},"ok":{"message":"OK"},"product_description":{"message":"Acc\u00e9dez \u00e0 d'autres ordinateurs ou permettez \u00e0 un utilisateur d'acc\u00e9der au v\u00f4tre en toute s\u00e9curit\u00e9 via Internet."},"product_name":{"message":"Bureau \u00e0 distance Chrome"},"sign_out_button":{"message":"D\u00e9connexion"},"stop_sharing_button":{"message":"Arr\u00eater le partage"},"tooltip_scaling":{"message":"Ajuster"},"warning_nat_disabled":{"message":"REMARQUE\u00a0: Les param\u00e8tres des r\u00e8gles n'autorisent que les connexions entre les ordinateurs de votre r\u00e9seau."}} diff --git a/remoting/webapp/_locales.official/he/messages.json b/remoting/webapp/_locales.official/he/messages.json new file mode 100644 index 0000000..54d91dd --- /dev/null +++ b/remoting/webapp/_locales.official/he/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u05e7\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4"},"access_code_timer":{"message":"\u05ea\u05d5\u05e7\u05e4\u05d5 \u05e9\u05dc \u05e7\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4 \u05d6\u05d4 \u05d9\u05e4\u05d5\u05d2 \u05d1\u05e2\u05d5\u05d3 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u05d1\u05d9\u05d8\u05d5\u05dc"},"close_prompt":{"message":"\u05d9\u05e6\u05d9\u05d0\u05d4 \u05de\u05d3\u05e3 \u05d6\u05d4 \u05ea\u05e1\u05d9\u05d9\u05dd \u05d0\u05ea \u05d4\u05e4\u05e2\u05dc\u05ea '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome'."},"connect_button":{"message":"\u05d4\u05ea\u05d7\u05d1\u05e8"},"continue_button":{"message":"\u05d4\u05de\u05e9\u05da"},"continue_prompt":{"message":"\u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05e3 \u05db\u05e2\u05ea \u05d0\u05ea \u05d4\u05de\u05d7\u05e9\u05d1 \u05d4\u05d6\u05d4 \u05e2\u05dd \u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d7\u05e8. \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da \u05dc\u05e9\u05ea\u05e3?"},"description_authorize":{"message":"\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome', \u05e2\u05dc\u05d9\u05da \u05dc\u05d4\u05e2\u05e0\u05d9\u05e7 \u05d4\u05e8\u05e9\u05d0\u05d5\u05ea \u05d2\u05d9\u05e9\u05d4 \u05de\u05d5\u05e8\u05d7\u05d1\u05d5\u05ea \u05dc\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05da. \u05d9\u05d4\u05d9\u05d4 \u05e2\u05dc\u05d9\u05da \u05dc\u05e2\u05e9\u05d5\u05ea \u05d6\u05d0\u05ea \u05e4\u05e2\u05dd \u05d0\u05d7\u05ea \u05d1\u05dc\u05d1\u05d3."},"description_connect":{"message":"\u05d1\u05e7\u05e9 \u05de\u05d4\u05de\u05e9\u05ea\u05de\u05e9 \u05e9\u05d0\u05dc \u05d4\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05d5 \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d2\u05e9\u05ea \u05dc\u05dc\u05d7\u05d5\u05e5 \u05e2\u05dc '\u05e9\u05ea\u05e3 \u05e2\u05db\u05e9\u05d9\u05d5' \u05d5\u05dc\u05ea\u05ea \u05dc\u05da \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4\u05d2\u05d9\u05e9\u05d4."},"description_home":{"message":"'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05de\u05d0\u05e4\u05e9\u05e8 \u05dc\u05da \u05dc\u05e9\u05ea\u05e3 \u05d0\u05ea \u05d4\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05da \u05d1\u05d0\u05d5\u05e4\u05df \u05de\u05d0\u05d5\u05d1\u05d8\u05d7 \u05d3\u05e8\u05da \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8. \u05e2\u05dc \u05e9\u05e0\u05d9 \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05d9\u05d9\u05e9\u05d5\u05dd '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome', \u05e9\u05e0\u05d9\u05ea\u05df \u05dc\u05de\u05e6\u05d5\u05d0 \u05d1\u05db\u05ea\u05d5\u05d1\u05ea $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u05d4\u05ea\u05e0\u05ea\u05e7 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u05d4\u05ea\u05e0\u05ea\u05e7 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u05d4\u05ea\u05e0\u05ea\u05e7 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u05e0\u05d9\u05ea\u05d5\u05e7"},"disconnect_other_button":{"message":"\u05e0\u05d9\u05ea\u05d5\u05e7"},"error_authentication_failed":{"message":"\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05e0\u05db\u05e9\u05dc. \u05e6\u05d0 \u05de'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_bad_plugin_version":{"message":"\u05d7\u05dc\u05e7 \u05de\u05d4\u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05d4\u05d3\u05e8\u05d5\u05e9\u05d9\u05dd \u05e2\u05d1\u05d5\u05e8 '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d7\u05e1\u05e8\u05d9\u05dd. \u05d5\u05d3\u05d0 \u05e9\u05d4\u05ea\u05e7\u05e0\u05ea \u05d0\u05ea \u05d4\u05d2\u05d9\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_generic":{"message":"\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05de\u05d5\u05db\u05e8\u05ea. \u05e6\u05d0 \u05de'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_host_is_offline":{"message":"\u05d4\u05de\u05d7\u05e9\u05d1 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d2\u05d9\u05d1 \u05dc\u05d1\u05e7\u05e9\u05d5\u05ea \u05d4\u05d7\u05d9\u05d1\u05d5\u05e8. \u05d5\u05d3\u05d0 \u05e9\u05d4\u05d5\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8 \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_incompatible_protocol":{"message":"\u05d4\u05de\u05e2\u05e8\u05db\u05ea \u05d6\u05d9\u05d4\u05ea\u05d4 \u05d2\u05d9\u05e8\u05e1\u05d4 \u05dc\u05d0 \u05ea\u05d5\u05d0\u05de\u05ea \u05e9\u05dc '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome'. \u05d5\u05d3\u05d0 \u05e9\u05d4\u05d2\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05dc Google Chrome \u05d5\u05e9\u05dc '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05de\u05d5\u05ea\u05e7\u05e0\u05ea \u05d1\u05e9\u05e0\u05d9 \u05d4\u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_invalid_access_code":{"message":"\u05e7\u05d5\u05d3 \u05d4\u05d2\u05d9\u05e9\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05d7\u05d5\u05e7\u05d9. \u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_missing_plugin":{"message":"\u05d7\u05dc\u05e7 \u05de\u05d4\u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05d4\u05d3\u05e8\u05d5\u05e9\u05d9\u05dd \u05e2\u05d1\u05d5\u05e8 '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d7\u05e1\u05e8\u05d9\u05dd. \u05d5\u05d3\u05d0 \u05e9\u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05de\u05e9 \u05d1\u05d2\u05d9\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05dc Google Chrome \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_no_response":{"message":"\u05d4\u05e9\u05e8\u05ea \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7 \u05dc\u05d4\u05d2\u05d9\u05d1 \u05dc\u05d1\u05e7\u05e9\u05ea \u05d4\u05e8\u05e9\u05ea."},"error_service_unavailable":{"message":"\u05d4\u05e9\u05d9\u05e8\u05d5\u05ea \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df \u05d6\u05de\u05e0\u05d9\u05ea. \u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1 \u05de\u05d0\u05d5\u05d7\u05e8 \u05d9\u05d5\u05ea\u05e8."},"error_unexpected":{"message":"\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05e6\u05e4\u05d5\u05d9\u05d4. \u05d3\u05d5\u05d5\u05d7 \u05e2\u05dc \u05d1\u05e2\u05d9\u05d4 \u05d6\u05d5 \u05dc\u05de\u05e4\u05ea\u05d7\u05d9\u05dd."},"footer_waiting":{"message":"\u05de\u05de\u05ea\u05d9\u05df \u05dc\u05d7\u05d9\u05d1\u05d5\u05e8..."},"help":{"message":"\u05e2\u05d6\u05e8\u05d4"},"home_access_button":{"message":"\u05d2\u05e9 \u05db\u05e2\u05ea"},"home_access_description":{"message":"\u05d4\u05e6\u05d2 \u05ea\u05d5\u05db\u05df \u05e9\u05dc \u05de\u05d7\u05e9\u05d1 \u05de\u05e9\u05d5\u05ea\u05e3 \u05d5\u05e9\u05dc\u05d5\u05d8 \u05d1\u05d5"},"home_my_computers_title":{"message":"\u05d4\u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05e9\u05dc\u05d9"},"home_share_button":{"message":"\u05e9\u05ea\u05e3 \u05db\u05e2\u05ea"},"home_share_description":{"message":"\u05e9\u05ea\u05e3 \u05de\u05d7\u05e9\u05d1 \u05d6\u05d4 \u05d5\u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d7\u05e8 \u05dc\u05d4\u05e6\u05d9\u05d2 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05e9\u05dc\u05d5 \u05d5\u05dc\u05e9\u05dc\u05d5\u05d8 \u05d1\u05d5."},"home_share_description_chrome_os":{"message":"(\u05ea\u05db\u05d5\u05e0\u05d4 \u05d6\u05d5 \u05d0\u05d9\u05e0\u05d4 \u05d6\u05de\u05d9\u05e0\u05d4 \u05e2\u05d3\u05d9\u05d9\u05df \u05e2\u05d1\u05d5\u05e8 \u05de\u05d7\u05e9\u05d1\u05d9 Chromebook ... \u05d4\u05de\u05e9\u05da \u05dc\u05e2\u05e7\u05d5\u05d1)"},"instructions_share_above":{"message":"\u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05d1\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05e9\u05dc\u05da, \u05ea\u05df \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4\u05d2\u05d9\u05e9\u05d4 \u05d4\u05de\u05d5\u05e4\u05d9\u05e2 \u05d1\u05d4\u05de\u05e9\u05da \u05dc\u05d0\u05d3\u05dd \u05e9\u05d9\u05e1\u05d9\u05d9\u05e2 \u05dc\u05da."},"instructions_share_below":{"message":"\u05dc\u05d0\u05d7\u05e8 \u05e9\u05d4\u05de\u05e9\u05ea\u05de\u05e9 \u05d9\u05d6\u05d9\u05df \u05d0\u05ea \u05d4\u05e7\u05d5\u05d3, \u05e4\u05e2\u05d9\u05dc\u05d5\u05ea \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e9\u05dc\u05db\u05dd \u05ea\u05ea\u05d7\u05d9\u05dc."},"label_connected":{"message":"\u05de\u05d7\u05d5\u05d1\u05e8:"},"message_connecting":{"message":"\u05de\u05ea\u05d7\u05d1\u05e8\u2026"},"message_generating":{"message":"\u05d9\u05d5\u05e6\u05e8 \u05e7\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4..."},"message_session_finished":{"message":"\u05d4\u05e4\u05e2\u05dc\u05ea '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d4\u05e1\u05ea\u05d9\u05d9\u05de\u05d4."},"message_shared":{"message":"\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05e9\u05dc\u05da \u05de\u05e9\u05d5\u05ea\u05e3 \u05db\u05e8\u05d2\u05e2 \u05e2\u05dd $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u05ea\u05df \u05d4\u05e8\u05e9\u05d0\u05d4"},"mode_connect":{"message":"\u05d4\u05ea\u05d7\u05d1\u05e8"},"mode_share":{"message":"\u05e9\u05ea\u05e3"},"offline":{"message":"\u05dc\u05d0 \u05de\u05e7\u05d5\u05d5\u05df"},"ok":{"message":"\u05d0\u05d9\u05e9\u05d5\u05e8"},"product_description":{"message":"\u05d2\u05e9 \u05dc\u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05d0\u05d7\u05e8\u05d9\u05dd \u05d0\u05d5 \u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d7\u05e8 \u05dc\u05d2\u05e9\u05ea \u05dc\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05da \u05d1\u05d0\u05d5\u05e4\u05df \u05de\u05d0\u05d5\u05d1\u05d8\u05d7 \u05d3\u05e8\u05da \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8."},"product_name":{"message":"\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome"},"sign_out_button":{"message":"\u05d9\u05e6\u05d9\u05d0\u05d4"},"stop_sharing_button":{"message":"\u05d4\u05e4\u05e1\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3"},"tooltip_scaling":{"message":"\u05d4\u05ea\u05d0\u05dd \u05d0\u05ea \u05d4\u05d2\u05d5\u05d3\u05dc"},"warning_nat_disabled":{"message":"\u05d4\u05e2\u05e8\u05d4: \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05de\u05d3\u05d9\u05e0\u05d9\u05d5\u05ea \u05de\u05ea\u05d9\u05e8\u05d5\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8\u05d9\u05dd \u05e8\u05e7 \u05d1\u05d9\u05df \u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05d1\u05ea\u05d5\u05da \u05d4\u05e8\u05e9\u05ea \u05e9\u05dc\u05da."}} diff --git a/remoting/webapp/_locales.official/hi/messages.json b/remoting/webapp/_locales.official/hi/messages.json new file mode 100644 index 0000000..c26df7b --- /dev/null +++ b/remoting/webapp/_locales.official/hi/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921"},"access_code_timer":{"message":"\u092f\u0939 \u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921 $1 \u092e\u0947\u0902 \u0938\u092e\u093e\u092a\u094d\u0924 \u0939\u094b \u091c\u093e\u090f\u0917\u093e","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902"},"close_prompt":{"message":"\u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0915\u094b \u091b\u094b\u095c \u0926\u0947\u0928\u0947 \u092a\u0930 \u0906\u092a\u0915\u093e Chrome Remote Desktop \u0938\u0924\u094d\u0930 \u0938\u092e\u093e\u092a\u094d\u0924 \u0939\u094b \u091c\u093e\u090f\u0917\u093e."},"connect_button":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902"},"continue_button":{"message":"\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902"},"continue_prompt":{"message":"You are currently sharing this machine with another user. Do you want to continue sharing?"},"description_authorize":{"message":"To use Chrome Remote Desktop you must grant extended access permissions to your computer. You only have to do this once."},"description_connect":{"message":"Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code."},"description_home":{"message":"Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0921\u093f\u0938\u094d\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnect (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0921\u093f\u0938\u094d\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnect"},"disconnect_other_button":{"message":"Disconnect"},"error_authentication_failed":{"message":"\u092a\u094d\u0930\u092e\u093e\u0923\u0940\u0915\u0930\u0923 \u0935\u093f\u092b\u0932. \u0915\u0943\u092a\u092f\u093e Chrome Remote Desktop \u0938\u0947 \u0938\u093e\u0907\u0928 \u0906\u0909\u091f \u0915\u0930\u0947\u0902 \u0914\u0930 \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_bad_plugin_version":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you have installed the latest version and try again."},"error_generic":{"message":"\u0915\u094b\u0908 \u0905\u091c\u094d\u091e\u093e\u0924 \u0924\u094d\u0930\u0941\u091f\u093f \u0906\u0908. \u0915\u0943\u092a\u092f\u093e Chrome Remote Desktop \u0938\u0947 \u0938\u093e\u0907\u0928 \u0906\u0909\u091f \u0915\u0930\u0947\u0902 \u0914\u0930 \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_host_is_offline":{"message":"The remote computer is not responding to connection requests. Please verify that it is online and try again."},"error_incompatible_protocol":{"message":"An incompatible version of Chrome Remote Desktop was detected. Please make sure that you have the latest version of Google Chrome and Chrome Remote Desktop on both computers and try again."},"error_invalid_access_code":{"message":"\u092f\u0939 \u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921 \u0905\u092e\u093e\u0928\u094d\u092f \u0939\u0948. \u0915\u0943\u092a\u092f\u093e \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_missing_plugin":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you're running the latest version of Google Chrome and try again."},"error_no_response":{"message":"The server failed to respond to the network request."},"error_service_unavailable":{"message":"\u0938\u0947\u0935\u093e \u0905\u0938\u094d\u0925\u093e\u0908 \u0930\u0942\u092a \u0938\u0947 \u0905\u0928\u0941\u092a\u0932\u092c\u094d\u0927 \u0939\u0948. \u0915\u0943\u092a\u092f\u093e \u092c\u093e\u0926 \u092e\u0947\u0902 \u092a\u0941\u0928: \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_unexpected":{"message":"\u090f\u0915 \u0905\u0928\u092a\u0947\u0915\u094d\u0937\u093f\u0924 \u0924\u094d\u0930\u0941\u091f\u093f \u0939\u0941\u0908. \u0915\u0943\u092a\u092f\u093e \u0907\u0938 \u0938\u092e\u0938\u094d\u092f\u093e \u0915\u0940 \u0930\u093f\u092a\u094b\u0930\u094d\u091f \u0921\u0947\u0935\u0932\u092a\u0930 \u0938\u0947 \u0915\u0930\u0947\u0902."},"footer_waiting":{"message":"\u0915\u0928\u0947\u0915\u094d\u0936\u0928 \u0915\u0947 \u0932\u093f\u090f \u092a\u094d\u0930\u0924\u0940\u0915\u094d\u0937\u093e \u0915\u0930 \u0930\u0939\u093e \u0939\u0948\u2026"},"help":{"message":"\u0938\u0939\u093e\u092f\u0924\u093e"},"home_access_button":{"message":"Access Now"},"home_access_description":{"message":"See and control a shared computer."},"home_my_computers_title":{"message":"\u092e\u0947\u0930\u0947 \u0915\u0902\u092a\u094d\u092f\u0942\u091f\u0930"},"home_share_button":{"message":"Share Now"},"home_share_description":{"message":"Share this computer for another user to see and control."},"home_share_description_chrome_os":{"message":"(\u092f\u0939 \u0938\u0941\u0935\u093f\u0927\u093e \u0905\u092d\u0940 Chrome \u092c\u0941\u0915 \u0915\u0947 \u0932\u093f\u090f \u0909\u092a\u0932\u092c\u094d\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948 ... \u092c\u0928\u0947 \u0930\u0939\u0947\u0902)"},"instructions_share_above":{"message":"To begin sharing your desktop, give the access code below to the person who will be assisting you."},"instructions_share_below":{"message":"\u0909\u0928\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u0915\u094b\u0921 \u0926\u0930\u094d\u091c \u0915\u0930\u0928\u0947 \u0915\u0947 \u092c\u093e\u0926 \u0906\u092a\u0915\u093e \u0938\u093e\u091d\u093e \u0915\u0930\u0928\u0947 \u0915\u093e \u0938\u0924\u094d\u0930 \u092a\u094d\u0930\u093e\u0930\u0902\u092d \u0939\u094b \u091c\u093e\u090f\u0917\u093e."},"label_connected":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f\u0947\u0921:"},"message_connecting":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948..."},"message_generating":{"message":"\u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921 \u091c\u0928\u0930\u0947\u091f \u0915\u0930 \u0930\u0939\u093e \u0939\u0948\u2026"},"message_session_finished":{"message":"\u0906\u092a\u0915\u093e Chrome Remote Desktop \u0938\u0924\u094d\u0930 \u0938\u092e\u093e\u092a\u094d\u0924 \u0939\u094b \u091a\u0941\u0915\u093e \u0939\u0948."},"message_shared":{"message":"\u0906\u092a\u0915\u093e \u0921\u0947\u0938\u094d\u0915\u091f\u0949\u092a \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u092e\u0947\u0902 $1 \u0915\u0947 \u0938\u093e\u0925 \u0938\u093e\u091d\u093e \u0915\u093f\u092f\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0905\u0927\u093f\u0915\u0943\u0924 \u0915\u0930\u0947\u0902"},"mode_connect":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902"},"mode_share":{"message":"\u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902"},"offline":{"message":"\u0911\u092b\u093c\u0932\u093e\u0907\u0928"},"ok":{"message":"\u0920\u0940\u0915"},"product_description":{"message":"Access other computers or allow another user to access your computer securely over the Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u0938\u093e\u0907\u0928 \u0906\u0909\u091f \u0915\u0930\u0947\u0902"},"stop_sharing_button":{"message":"\u0938\u093e\u091d\u093e \u0915\u0930\u0928\u093e \u0930\u094b\u0915\u0947\u0902"},"tooltip_scaling":{"message":"Scale to fit"},"warning_nat_disabled":{"message":"NOTE: Policy settings permit connections only between computers within your network."}} diff --git a/remoting/webapp/_locales.official/hr/messages.json b/remoting/webapp/_locales.official/hr/messages.json new file mode 100644 index 0000000..234d5f6 --- /dev/null +++ b/remoting/webapp/_locales.official/hr/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Pristupni k\u00f4d"},"access_code_timer":{"message":"Ovaj pristupni k\u00f4d iste\u0107i \u0107e za $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Odustani"},"close_prompt":{"message":"Ako napustite ovu stranicu, zavr\u0161it \u0107e va\u0161a sesija u aplikaciji Chrome Remote Desktop."},"connect_button":{"message":"Pove\u017ei se"},"continue_button":{"message":"Nastavi"},"continue_prompt":{"message":"Ovaj stroj trenuta\u010dno dijelite s drugim korisnikom. \u017delite li nastaviti dijeljenje?"},"description_authorize":{"message":"Da biste upotrebljavali Chrome Remote Desktop, morate odobriti dozvole za pro\u0161ireni pristup svojem ra\u010dunalu. To morate u\u010diniti samo jednom."},"description_connect":{"message":"Korisnika \u010dijem ra\u010dunalu \u017eelite pristupiti zamolite da klikne \"Dijeli sada\" i da vam pru\u017ei pristupni k\u00f4d."},"description_home":{"message":"Aplikacija Chrome Remote Desktop omogu\u0107uje vam da svoje ra\u010dunalo sigurno dijelite putem weba. Na ra\u010dunalima oba korisnika mora se izvoditi aplikacija Chrome Remote Desktop koju mo\u017eete prona\u0107i na web-lokaciji $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Prekini vezu (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Prekini vezu (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Prekini vezu (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Prekini vezu"},"disconnect_other_button":{"message":"Prekini vezu"},"error_authentication_failed":{"message":"Autentifikacija nije uspjela. Odjavite se iz aplikacije Chrome Remote Desktop i poku\u0161ajte ponovo."},"error_bad_plugin_version":{"message":"Nedostaju neke komponente potrebne za aplikaciju Chrome Remote Desktop. Provjerite jeste li instalirali najnoviju verziju i poku\u0161ajte ponovno."},"error_generic":{"message":"Do\u0161lo je do nepoznate pogre\u0161ke. Odjavite se iz aplikacije Chrome Remote Desktop i poku\u0161ajte ponovo."},"error_host_is_offline":{"message":"Udaljeno ra\u010dunalo ne odgovara na zahtjev za povezivanje. Provjerite je li na mre\u017ei i poku\u0161ajte ponovo."},"error_incompatible_protocol":{"message":"Otkrivena je nekompatibilna verzija aplikacije Chrome Remote Desktop. Provjerite imate li na oba ra\u010dunala najnoviju verziju preglednika Google Chrome i aplikacije Chrome Remote Desktop, a zatim poku\u0161ajte ponovo."},"error_invalid_access_code":{"message":"Pristupni k\u00f4d neva\u017ee\u0107i je. Poku\u0161ajte ponovo."},"error_missing_plugin":{"message":"Nedostaju neke komponente potrebne za aplikaciju Chrome Remote Desktop. Provjerite imate li pokrenutu najnoviju verziju aplikacije Google Chrome i poku\u0161ajte ponovno."},"error_no_response":{"message":"Poslu\u017eitelj nije uspio odgovoriti na zahtjev mre\u017ee."},"error_service_unavailable":{"message":"Usluga je privremeno nedostupna. Poku\u0161ajte ponovo kasnije."},"error_unexpected":{"message":"Pojavila se neo\u010dekivana pogre\u0161ka. Prijavite taj problem razvojnim programerima."},"footer_waiting":{"message":"\u010dekanje na vezu..."},"help":{"message":"Pomo\u0107"},"home_access_button":{"message":"Pristupi sada"},"home_access_description":{"message":"Gledajte dijeljeno ra\u010dunalo i upravljajte njime"},"home_my_computers_title":{"message":"Moja ra\u010dunala"},"home_share_button":{"message":"Dijeli sada"},"home_share_description":{"message":"Dijelite ovo ra\u010dunalo kako bi ga drugi korisnik mogao vidjeti i upravljati njime."},"home_share_description_chrome_os":{"message":"(ova zna\u010dajka jo\u0161 nije dostupna za Chromebookove... pratite nas i dalje)"},"instructions_share_above":{"message":"Da biste zapo\u010deli dijeliti radnu povr\u0161inu, po\u0161aljite pristupni k\u00f4d iz nastavka osobi koja \u0107e vam pomagati."},"instructions_share_below":{"message":"Nakon \u0161to se unese k\u00f4d, po\u010det \u0107e sesija dijeljenja."},"label_connected":{"message":"Povezan:"},"message_connecting":{"message":"Povezivanje\u2026"},"message_generating":{"message":"Generiranje pristupnog koda..."},"message_session_finished":{"message":"Zavr\u0161ila je va\u0161a sesija u aplikaciji Chrome Remote Desktop."},"message_shared":{"message":"Va\u0161a se radna povr\u0161ina trenuta\u010dno dijeli s korisnikom $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriziraj"},"mode_connect":{"message":"Pove\u017ei se"},"mode_share":{"message":"Dijeli"},"offline":{"message":"Izvanmre\u017eno"},"ok":{"message":"U redu"},"product_description":{"message":"Putem interneta pristupajte drugim ra\u010dunalima ili drugim korisnicima omogu\u0107ite siguran pristup svojem ra\u010dunalu."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Odjava"},"stop_sharing_button":{"message":"Zaustavi dijeljenje"},"tooltip_scaling":{"message":"Prilagodi veli\u010dinu prozoru"},"warning_nat_disabled":{"message":"NAPOMENA: Postavke pravila dopu\u0161taju jedino veze izme\u0111u ra\u010dunala u va\u0161oj mre\u017ei."}} diff --git a/remoting/webapp/_locales.official/hu/messages.json b/remoting/webapp/_locales.official/hu/messages.json new file mode 100644 index 0000000..02b6b57 --- /dev/null +++ b/remoting/webapp/_locales.official/hu/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Hozz\u00e1f\u00e9r\u00e9si k\u00f3d"},"access_code_timer":{"message":"Ez a hozz\u00e1f\u00e9r\u00e9si k\u00f3d ennyi id\u0151 m\u00falva lej\u00e1r: $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"M\u00e9gse"},"close_prompt":{"message":"Ha elhagyja ezt az oldalt, akkor befejez\u0151dik a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s munkamenete."},"connect_button":{"message":"Kapcsol\u00f3d\u00e1s"},"continue_button":{"message":"Tov\u00e1bb"},"continue_prompt":{"message":"Ezt a g\u00e9pet jelenleg megosztja egy m\u00e1sik felhaszn\u00e1l\u00f3val. Szeretn\u00e9 folytatni a megoszt\u00e1st?"},"description_authorize":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s haszn\u00e1lat\u00e1hoz kiterjesztett hozz\u00e1f\u00e9r\u00e9si jogosults\u00e1gokat kell adnia a sz\u00e1m\u00edt\u00f3g\u00e9p\u00e9hez. Ezt csak egyszer kell elv\u00e9gezni."},"description_connect":{"message":"K\u00e9rje meg azt a felhaszn\u00e1l\u00f3t, akinek a sz\u00e1m\u00edt\u00f3g\u00e9p\u00e9t haszn\u00e1lni szeretn\u00e9, hogy kattintson a \"Megoszt\u00e1s most\" feliratra, \u00e9s adja meg \u00d6nnek a hozz\u00e1f\u00e9r\u00e9si k\u00f3dot."},"description_home":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s lehet\u0151v\u00e9 teszi a sz\u00e1m\u00edt\u00f3g\u00e9p biztons\u00e1gos megoszt\u00e1s\u00e1t az interneten kereszt\u00fcl. Mindk\u00e9t felhaszn\u00e1l\u00f3n\u00e1l futnia kell a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1snak, amely itt tal\u00e1lhat\u00f3: $1","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Kapcsolat bont\u00e1sa (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Kapcsolat bont\u00e1sa (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Kapcsolat bont\u00e1sa (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Kapcsolat bont\u00e1sa"},"disconnect_other_button":{"message":"Kapcsolat bont\u00e1sa"},"error_authentication_failed":{"message":"A hiteles\u00edt\u00e9s nem siker\u00fclt. K\u00e9rj\u00fck, jelentkezzen ki a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1sb\u00f3l, \u00e9s pr\u00f3b\u00e1lkozzon \u00fajra."},"error_bad_plugin_version":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s egyes sz\u00fcks\u00e9ges \u00f6sszetev\u0151i hi\u00e1nyoznak. K\u00e9rj\u00fck, ellen\u0151rizze, hogy telep\u00edtve van-e a legfrissebb verzi\u00f3, majd pr\u00f3b\u00e1lja \u00fajra."},"error_generic":{"message":"Ismeretlen hiba t\u00f6rt\u00e9nt. K\u00e9rj\u00fck, jelentkezzen ki a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s alkalmaz\u00e1sb\u00f3l, \u00e9s pr\u00f3b\u00e1lkozzon \u00fajra."},"error_host_is_offline":{"message":"A t\u00e1voli sz\u00e1m\u00edt\u00f3g\u00e9p nem v\u00e1laszol a csatlakoz\u00e1si k\u00e9r\u00e9sekre. K\u00e9rj\u00fck, ellen\u0151rizze, hogy kapcsolatban van-e, majd pr\u00f3b\u00e1lja \u00fajra."},"error_incompatible_protocol":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s egy nem kompatibilis verzi\u00f3ja tal\u00e1lhat\u00f3 a sz\u00e1m\u00edt\u00f3g\u00e9pen. K\u00e9rj\u00fck, ellen\u0151rizze, hogy mindk\u00e9t sz\u00e1m\u00edt\u00f3g\u00e9pen a Google Chrome \u00e9s a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s legfrissebb verzi\u00f3i legyenek, majd pr\u00f3b\u00e1lja \u00fajra."},"error_invalid_access_code":{"message":"A hozz\u00e1f\u00e9r\u00e9si k\u00f3d \u00e9rv\u00e9nytelen. K\u00e9rj\u00fck, pr\u00f3b\u00e1lja \u00fajra."},"error_missing_plugin":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s egyes sz\u00fcks\u00e9ges \u00f6sszetev\u0151i hi\u00e1nyoznak. K\u00e9rj\u00fck, ellen\u0151rizze, hogy a Google Chrome legfrissebb verzi\u00f3j\u00e1t haszn\u00e1lja-e, majd pr\u00f3b\u00e1lja \u00fajra."},"error_no_response":{"message":"A szerver nem v\u00e1laszolt a h\u00e1l\u00f3zati k\u00e9r\u00e9sre."},"error_service_unavailable":{"message":"A szolg\u00e1ltat\u00e1s \u00e1tmenetileg nem \u00e9rhet\u0151 el. K\u00e9rj\u00fck, pr\u00f3b\u00e1lkozzon \u00fajra k\u00e9s\u0151bb."},"error_unexpected":{"message":"V\u00e1ratlan hiba t\u00f6rt\u00e9nt. K\u00e9rj\u00fck, jelentse a probl\u00e9m\u00e1t a fejleszt\u0151knek."},"footer_waiting":{"message":"v\u00e1rakoz\u00e1s a kapcsolatra..."},"help":{"message":"S\u00fag\u00f3"},"home_access_button":{"message":"Hozz\u00e1f\u00e9r\u00e9s most"},"home_access_description":{"message":"Megosztott sz\u00e1m\u00edt\u00f3g\u00e9p megtekint\u00e9se \u00e9s ir\u00e1ny\u00edt\u00e1sa."},"home_my_computers_title":{"message":"Saj\u00e1t sz\u00e1m\u00edt\u00f3g\u00e9pek"},"home_share_button":{"message":"Megoszt\u00e1s most"},"home_share_description":{"message":"E sz\u00e1m\u00edt\u00f3g\u00e9p megoszt\u00e1sa \u00fagy, hogy azt egy m\u00e1sik felhaszn\u00e1l\u00f3 l\u00e1thassa \u00e9s ir\u00e1ny\u00edthassa."},"home_share_description_chrome_os":{"message":"(Ez a funkci\u00f3 m\u00e9g nem \u00e9rhet\u0151 el Chromebookok sz\u00e1m\u00e1ra... l\u00e1togasson vissza k\u00e9s\u0151bb)"},"instructions_share_above":{"message":"Az asztal megoszt\u00e1s\u00e1nak megkezd\u00e9s\u00e9hez adja meg az al\u00e1bbi el\u00e9r\u00e9si k\u00f3dot annak a szem\u00e9lynek, aki seg\u00edt \u00d6nnek."},"instructions_share_below":{"message":"Miut\u00e1n be\u00edrj\u00e1k a k\u00f3dot, megkezd\u0151dik a megoszt\u00e1si munkamenet."},"label_connected":{"message":"Csatlakoztatva:"},"message_connecting":{"message":"Csatlakoz\u00e1s\u2026"},"message_generating":{"message":"Hozz\u00e1f\u00e9r\u00e9si k\u00f3d l\u00e9trehoz\u00e1sa..."},"message_session_finished":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s munkamenet v\u00e9get \u00e9rt."},"message_shared":{"message":"Az asztalt jelenleg ezzel a felhaszn\u00e1l\u00f3val osztja meg: $1","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Enged\u00e9lyez\u00e9s"},"mode_connect":{"message":"Kapcsol\u00f3d\u00e1s"},"mode_share":{"message":"Megoszt\u00e1s"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"M\u00e1s sz\u00e1m\u00edt\u00f3g\u00e9pek el\u00e9r\u00e9se vagy annak enged\u00e9lyez\u00e9se, hogy egy m\u00e1sik felhaszn\u00e1l\u00f3 a sz\u00e1m\u00edt\u00f3g\u00e9phez biztons\u00e1gosan hozz\u00e1f\u00e9rhessen az interneten kereszt\u00fcl."},"product_name":{"message":"Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s"},"sign_out_button":{"message":"Kijelentkez\u00e9s"},"stop_sharing_button":{"message":"Megoszt\u00e1s le\u00e1ll\u00edt\u00e1sa"},"tooltip_scaling":{"message":"M\u00e9retre igaz\u00edt\u00e1s"},"warning_nat_disabled":{"message":"MEGJEGYZ\u00c9S: a rendszab\u00e1ly-be\u00e1ll\u00edt\u00e1sok a csatlakoz\u00e1st csak a saj\u00e1t h\u00e1l\u00f3zaton bel\u00fcl tal\u00e1lhat\u00f3 sz\u00e1m\u00edt\u00f3g\u00e9pek k\u00f6z\u00f6tt teszik lehet\u0151v\u00e9."}} diff --git a/remoting/webapp/_locales.official/id/messages.json b/remoting/webapp/_locales.official/id/messages.json new file mode 100644 index 0000000..6666200 --- /dev/null +++ b/remoting/webapp/_locales.official/id/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Kode akses"},"access_code_timer":{"message":"Kode akses ini akan kedaluwarsa dalam waktu $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Batal"},"close_prompt":{"message":"Dengan meninggalkan laman ini, Anda akan mengakhiri sesi Chrome Desktop Jarak Jauh."},"connect_button":{"message":"Sambungkan"},"continue_button":{"message":"Lanjutkan"},"continue_prompt":{"message":"Saat ini Anda sedang berbagi mesin ini dengan pengguna lain. Apakah Anda ingin terus berbagi?"},"description_authorize":{"message":"Untuk menggunakan Chrome Desktop Jarak Jauh Anda harus memberikan izin akses yang diperpanjang ke komputer. Anda hanya perlu melakukan ini satu kali."},"description_connect":{"message":"Mintalah kepada pengguna yang ingin Anda akses komputernya agar mengeklik 'Bagikan Sekarang' dan memberikan kode aksesnya kepada Anda."},"description_home":{"message":"Chrome Desktop Jarak Jauh memungkinkan Anda berbagi komputer melalui web dengan aman. Kedua pengguna harus menjalankan apl Chrome Desktop Jarak Jauh yang dapat ditemukan di $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Putuskan sambungan (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Putuskan sambungan (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Putuskan sambungan (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Putuskan sambungan"},"disconnect_other_button":{"message":"Putuskan sambungan"},"error_authentication_failed":{"message":"Autentikasi gagal. Keluarlah dari Chrome Desktop Jarak Jauh lalu coba lagi."},"error_bad_plugin_version":{"message":"Beberapa komponen yang diperlukan untuk Chrome Desktop Jarak Jauh hilang. Pastikan bahwa Anda telah memasang versi teranyar dan coba lagi."},"error_generic":{"message":"Terjadi galat tak dikenal. Keluarlah dari Chrome Desktop Jarak Jauh lalu coba lagi."},"error_host_is_offline":{"message":"Komputer jarak jauh tidak menanggapi permintaan sambungan. Verifikasikan bahwa komputer jarak jauh sedang daring dan coba lagi."},"error_incompatible_protocol":{"message":"Versi Chrome Desktop Jarak Jauh yang tidak kompatibel terdeteksi. Pastikan bahwa Anda memiliki Google Chrome dan Chrome Desktop Jarak Jauh versi teranyar di kedua komputer lalu coba lagi."},"error_invalid_access_code":{"message":"Kode akses tidak valid. Harap coba lagi."},"error_missing_plugin":{"message":"Beberapa komponen yang diperlukan untuk Chrome Desktop Jarak Jauh hilang. Pastikan bahwa Anda menjalankan Google Chrome versi teranyar dan coba lagi."},"error_no_response":{"message":"Server gagal menanggapi permintaan jaringan."},"error_service_unavailable":{"message":"Layanan kami tidak tersedia untuk sementara. Coba lagi nanti."},"error_unexpected":{"message":"Terjadi galat yang tidak terduga. Laporkan masalah ini kepada pengembang."},"footer_waiting":{"message":"menunggu sambungan..."},"help":{"message":"Bantuan"},"home_access_button":{"message":"Akses Sekarang"},"home_access_description":{"message":"Melihat dan mengontrol komputer bersama."},"home_my_computers_title":{"message":"Komputer Saya"},"home_share_button":{"message":"Bagikan Sekarang"},"home_share_description":{"message":"Membagi komputer ini agar pengguna lain dapat melihat dan mengontrol."},"home_share_description_chrome_os":{"message":"(fitur ini belum tersedia untuk Chromebooks... nantikan kabar berikutnya)"},"instructions_share_above":{"message":"Untuk mulai berbagi desktop, berikan kode akses di bawah kepada orang yang akan membantu Anda."},"instructions_share_below":{"message":"Setelah mereka memasukkan kode, sesi berbagi Anda akan dimulai."},"label_connected":{"message":"Tersambung:"},"message_connecting":{"message":"Menyambungkan..."},"message_generating":{"message":"Membuat kode akses..."},"message_session_finished":{"message":"Sesi Chrome Desktop Jarak Jauh Anda telah berakhir."},"message_shared":{"message":"Saat ini desktop Anda sedang dibagikan dengan $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Beri Otorisasi"},"mode_connect":{"message":"Sambungkan"},"mode_share":{"message":"Bagikan"},"offline":{"message":"Luring"},"ok":{"message":"OK"},"product_description":{"message":"Mengakses komputer lain atau mengizinkan pengguna lain mengakses komputer Anda dengan aman melalui internet."},"product_name":{"message":"Chrome Desktop Jarak Jauh"},"sign_out_button":{"message":"Keluar"},"stop_sharing_button":{"message":"Hentikan Berbagi"},"tooltip_scaling":{"message":"Sesuaikan dengan layar"},"warning_nat_disabled":{"message":"CATATAN: Setelan kebijakan hanya mengizinkan sambungan antar-komputer dalam jaringan Anda."}} diff --git a/remoting/webapp/_locales.official/it/messages.json b/remoting/webapp/_locales.official/it/messages.json new file mode 100644 index 0000000..282a78c --- /dev/null +++ b/remoting/webapp/_locales.official/it/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Codice di accesso"},"access_code_timer":{"message":"Questo codice di accesso scadr\u00e0 tra $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annulla"},"close_prompt":{"message":"Se esci da questa pagina terminer\u00e0 la sessione Chrome Remote Desktop."},"connect_button":{"message":"Connetti"},"continue_button":{"message":"Continua"},"continue_prompt":{"message":"Stai condividendo questo computer con un altro utente. Confermi che desideri continuare la condivisione?"},"description_authorize":{"message":"Per poter utilizzare Chrome Remote Desktop devi concedere autorizzazioni di accesso esteso per il tuo computer. \u00c8 necessario svolgere questa operazione soltanto una volta."},"description_connect":{"message":"Chiedi all'utente del computer a cui desideri accedere di fare clic su \"Condividi ora\" e di fornirti il codice di accesso."},"description_home":{"message":"Chrome Remote Desktop ti consente di condividere in modo sicuro il computer sul Web. Entrambi gli utenti devono eseguire l'applicazione Chrome Remote Desktop, reperibile all'indirizzo $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Disconnetti (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnetti (Opz+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Disconnetti (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnetti"},"disconnect_other_button":{"message":"Disconnetti"},"error_authentication_failed":{"message":"Autenticazione non riuscita. Esci da Chrome Remote Desktop e riprova."},"error_bad_plugin_version":{"message":"Mancano alcuni componenti necessari per Chrome Remote Desktop. Assicurati che sia installata la versione pi\u00f9 recente e riprova."},"error_generic":{"message":"Si \u00e8 verificato un errore sconosciuto. Esci da Chrome Remote Desktop e riprova."},"error_host_is_offline":{"message":"Il computer remoto non sta rispondendo alle richieste di connessione. Verifica che sia online e riprova."},"error_incompatible_protocol":{"message":"\u00c8 stata rilevata una versione incompatibile di Chrome Remote Desktop. Assicurati di disporre della versione pi\u00f9 recente di Google Chrome e di Chrome Remote Desktop su entrambi i computer e riprova."},"error_invalid_access_code":{"message":"Il codice di accesso non \u00e8 valido. Riprova."},"error_missing_plugin":{"message":"Mancano alcuni componenti necessari per Chrome Remote Desktop. Assicurati che sia in uso la versione pi\u00f9 recente di Google Chrome e riprova."},"error_no_response":{"message":"Risposta del server alla richiesta di rete non riuscita."},"error_service_unavailable":{"message":"Il servizio non \u00e8 al momento disponibile. Riprova pi\u00f9 tardi."},"error_unexpected":{"message":"Si \u00e8 verificato un errore imprevisto. Segnala il problema agli sviluppatori."},"footer_waiting":{"message":"in attesa di connessione..."},"help":{"message":"Guida"},"home_access_button":{"message":"Accedi ora"},"home_access_description":{"message":"Visualizza e controlla un computer condiviso."},"home_my_computers_title":{"message":"I miei computer"},"home_share_button":{"message":"Condividi ora"},"home_share_description":{"message":"Condividi questo computer per consentire la visione e il controllo a un altro utente."},"home_share_description_chrome_os":{"message":"(questa funzione non \u00e8 ancora disponibile per i Chromebook... Resta in attesa di ulteriori aggiornamenti)"},"instructions_share_above":{"message":"Per iniziare a condividere il desktop, fornisci il seguente codice di accesso alla persona che ti aiuter\u00e0."},"instructions_share_below":{"message":"Una volta inserito il codice, la sessione di condivisione avr\u00e0 inizio."},"label_connected":{"message":"Connesso:"},"message_connecting":{"message":"Connessione in corso..."},"message_generating":{"message":"Generazione codice di accesso in corso..."},"message_session_finished":{"message":"La sessione Chrome Remote Desktop \u00e8 terminata."},"message_shared":{"message":"Il desktop \u00e8 attualmente condiviso con $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizza"},"mode_connect":{"message":"Connetti"},"mode_share":{"message":"Condividi"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Accedi ad altri computer o consenti a un altro utente di accedere al tuo computer in modo sicuro su Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Esci"},"stop_sharing_button":{"message":"Interrompi condivisione"},"tooltip_scaling":{"message":"Adatta alla pagina"},"warning_nat_disabled":{"message":"NOTA. Le impostazioni dei criteri consentono connessioni solo tra computer all'interno della tua rete."}} diff --git a/remoting/webapp/_locales.official/ja/messages.json b/remoting/webapp/_locales.official/ja/messages.json new file mode 100644 index 0000000..61b044c --- /dev/null +++ b/remoting/webapp/_locales.official/ja/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9"},"access_code_timer":{"message":"\u3053\u306e\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u306f\u3042\u3068 $1 \u3067\u671f\u9650\u5207\u308c\u3068\u306a\u308a\u307e\u3059\u3002","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u30ad\u30e3\u30f3\u30bb\u30eb"},"close_prompt":{"message":"\u3053\u306e\u30da\u30fc\u30b8\u3092\u9589\u3058\u308b\u3068\u3001Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 \u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u7d42\u4e86\u3057\u307e\u3059\u3002"},"connect_button":{"message":"\u63a5\u7d9a"},"continue_button":{"message":"\u7d9a\u884c"},"continue_prompt":{"message":"\u73fe\u5728\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u3092\u5225\u306e\u30e6\u30fc\u30b6\u30fc\u3068\u5171\u6709\u3057\u3066\u3044\u307e\u3059\u3002\u5171\u6709\u3092\u7d99\u7d9a\u3057\u307e\u3059\u304b\uff1f"},"description_authorize":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u62e1\u5f35\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u3092\u4ed8\u4e0e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u4f5c\u696d\u306f 1 \u56de\u3060\u3051\u5fc5\u8981\u3067\u3059\u3002"},"description_connect":{"message":"\u30a2\u30af\u30bb\u30b9\u3057\u305f\u3044\u30d1\u30bd\u30b3\u30f3\u306e\u30e6\u30fc\u30b6\u30fc\u306b [\u4eca\u3059\u3050\u5171\u6709] \u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3088\u3046\u4f1d\u3048\u3066\u3001\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u3092\u53d7\u3051\u53d6\u3063\u3066\u304f\u3060\u3055\u3044\u3002"},"description_home":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30d1\u30bd\u30b3\u30f3\u3092\u30a6\u30a7\u30d6\u7d4c\u7531\u3067\u5b89\u5168\u306b\u5171\u6709\u3067\u304d\u307e\u3059\u3002\u4e21\u65b9\u306e\u30e6\u30fc\u30b6\u30fc\u304c Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f $1 \u304b\u3089\u5165\u624b\u3067\u304d\u307e\u3059\u3002","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u5207\u65ad\uff08Ctrl+Alt+Esc\uff09"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u5207\u65ad\uff08Opt+Ctrl+Esc\uff09"},"disconnect_button_plus_shortcut_windows":{"message":"\u5207\u65ad\uff08Ctrl+Alt+Esc\uff09"},"disconnect_myself_button":{"message":"\u5207\u65ad\u3059\u308b"},"disconnect_other_button":{"message":"\u5207\u65ad\u3059\u308b"},"error_authentication_failed":{"message":"\u8a8d\u8a3c\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304b\u3089\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_bad_plugin_version":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306b\u5fc5\u8981\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\u6700\u65b0\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_generic":{"message":"\u4e0d\u660e\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304b\u3089\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002"},"error_host_is_offline":{"message":"\u30ea\u30e2\u30fc\u30c8\u306e\u30d1\u30bd\u30b3\u30f3\u304c\u63a5\u7d9a\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002\u305d\u306e\u30d1\u30bd\u30b3\u30f3\u304c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u63a5\u7d9a\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_incompatible_protocol":{"message":"\u4e92\u63db\u6027\u306e\u306a\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Google Chrome \u3068 Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304c\u4e21\u65b9\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_invalid_access_code":{"message":"\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u304c\u7121\u52b9\u3067\u3059\u3002\u3082\u3046\u4e00\u5ea6\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_missing_plugin":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306b\u5fc5\u8981\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\u5b9f\u884c\u3057\u3066\u3044\u308b Google Chrome \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u6700\u65b0\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_no_response":{"message":"\u30b5\u30fc\u30d0\u30fc\u304c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u3002"},"error_service_unavailable":{"message":"\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u4e00\u6642\u7684\u306b\u5229\u7528\u3067\u304d\u306a\u304f\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002"},"error_unexpected":{"message":"\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u554f\u984c\u3092\u30c7\u30d9\u30ed\u30c3\u30d1\u30fc\u306b\u5831\u544a\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"footer_waiting":{"message":"\u63a5\u7d9a\u3092\u5f85\u6a5f\u3057\u3066\u3044\u307e\u3059..."},"help":{"message":"\u30d8\u30eb\u30d7"},"home_access_button":{"message":"\u4eca\u3059\u3050\u30a2\u30af\u30bb\u30b9"},"home_access_description":{"message":"\u5171\u6709\u30d1\u30bd\u30b3\u30f3\u306e\u753b\u9762\u3092\u898b\u306a\u304c\u3089\u64cd\u4f5c\u3057\u307e\u3059\u3002"},"home_my_computers_title":{"message":"\u30de\u30a4 \u30d1\u30bd\u30b3\u30f3"},"home_share_button":{"message":"\u4eca\u3059\u3050\u5171\u6709"},"home_share_description":{"message":"\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u304c\u5171\u6709\u3055\u308c\u3001\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u306e\u753b\u9762\u3092\u898b\u306a\u304c\u3089\u64cd\u4f5c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002"},"home_share_description_chrome_os":{"message":"\uff08\u3053\u306e\u6a5f\u80fd\u306f\u73fe\u5728 Chromebook \u306b\u5bfe\u5fdc\u3057\u3066\u304a\u308a\u307e\u305b\u3093\u3002\u3054\u5229\u7528\u53ef\u80fd\u306b\u306a\u308b\u307e\u3067\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002\uff09"},"instructions_share_above":{"message":"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306e\u5171\u6709\u3092\u958b\u59cb\u3059\u308b\u306b\u306f\u3001\u5171\u6709\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306b\u4ee5\u4e0b\u306e\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u3092\u901a\u77e5\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"instructions_share_below":{"message":"\u5171\u6709\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u304c\u3053\u306e\u30b3\u30fc\u30c9\u3092\u5165\u529b\u3059\u308b\u3068\u3001\u5171\u6709\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u958b\u59cb\u3055\u308c\u307e\u3059\u3002"},"label_connected":{"message":"\u63a5\u7d9a\u6e08\u307f:"},"message_connecting":{"message":"\u63a5\u7d9a\u3057\u3066\u3044\u307e\u3059..."},"message_generating":{"message":"\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059..."},"message_session_finished":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 \u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002"},"message_shared":{"message":"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306f\u73fe\u5728 $1 \u3068\u5171\u6709\u3055\u308c\u3066\u3044\u307e\u3059\u3002","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u627f\u8a8d"},"mode_connect":{"message":"\u63a5\u7d9a"},"mode_share":{"message":"\u5171\u6709"},"offline":{"message":"\u30aa\u30d5\u30e9\u30a4\u30f3"},"ok":{"message":"OK"},"product_description":{"message":"\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u304b\u3089\u4ed6\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u3001\u307e\u305f\u306f\u4ed6\u306e\u30d1\u30bd\u30b3\u30f3\u304b\u3089\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3092\u7d4c\u7531\u3057\u3066\u5b89\u5168\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002"},"product_name":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7"},"sign_out_button":{"message":"\u30ed\u30b0\u30a2\u30a6\u30c8"},"stop_sharing_button":{"message":"\u5171\u6709\u3092\u505c\u6b62"},"tooltip_scaling":{"message":"\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u5408\u308f\u305b\u308b"},"warning_nat_disabled":{"message":"\u6ce8: \u30dd\u30ea\u30b7\u30fc\u8a2d\u5b9a\u306b\u57fa\u3065\u304d\u3001\u63a5\u7d9a\u304c\u8a31\u53ef\u3055\u308c\u308b\u306e\u306f\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e\u30d1\u30bd\u30b3\u30f3\u9593\u306e\u307f\u3068\u306a\u308a\u307e\u3059\u3002"}} diff --git a/remoting/webapp/_locales.official/ko/messages.json b/remoting/webapp/_locales.official/ko/messages.json new file mode 100644 index 0000000..3e6c4156 --- /dev/null +++ b/remoting/webapp/_locales.official/ko/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc"},"access_code_timer":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc\uac00 $1\ucd08 \ud6c4\uc5d0 \ub9cc\ub8cc\ub429\ub2c8\ub2e4.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\ucde8\uc18c"},"close_prompt":{"message":"\uc774 \ud398\uc774\uc9c0\ub97c \ub2eb\uc73c\uba74 Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1 \uc138\uc158\uc774 \uc885\ub8cc\ub429\ub2c8\ub2e4."},"connect_button":{"message":"\uc5f0\uacb0"},"continue_button":{"message":"\uacc4\uc18d"},"continue_prompt":{"message":"\ud604\uc7ac \uc774 \ucef4\ud4e8\ud130\ub97c \ub2e4\ub978 \uc0ac\uc6a9\uc790\uc640 \uacf5\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uacc4\uc18d \uacf5\uc720\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?"},"description_authorize":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \ub0b4 \ucef4\ud4e8\ud130\uc5d0 \ud655\uc7a5 \uc561\uc138\uc2a4 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 \ud55c \ubc88\ub9cc \uc218\ud589\ud558\uba74 \ub429\ub2c8\ub2e4."},"description_connect":{"message":"\ub0b4\uac00 \uc561\uc138\uc2a4\ud558\uace0 \uc2f6\uc740 \ucef4\ud4e8\ud130\uc758 \uc0ac\uc6a9\uc790\uc5d0\uac8c '\uc9c0\uae08 \uacf5\uc720'\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c \uc561\uc138\uc2a4 \ucf54\ub4dc\ub97c \uc54c\ub824\ub2ec\ub77c\uace0 \uc694\uccad\ud558\uc138\uc694."},"description_home":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc744 \uc0ac\uc6a9\ud558\uba74 \uc6f9\uc744 \ud1b5\ud574 \ub0b4 \ucef4\ud4e8\ud130\ub97c \uc548\uc804\ud558\uac8c \uacf5\uc720\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \ubaa8\ub450 $1 \ud398\uc774\uc9c0\uc5d0 \uc788\ub294 Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1 \uc571\uc744 \uc2e4\ud589\ud574\uc57c \ud569\ub2c8\ub2e4.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\uc5f0\uacb0 \ud574\uc81c(Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\uc5f0\uacb0 \ud574\uc81c(Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\uc5f0\uacb0 \ud574\uc81c(Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\uc5f0\uacb0 \ud574\uc81c"},"disconnect_other_button":{"message":"\uc5f0\uacb0 \ud574\uc81c"},"error_authentication_failed":{"message":"\uc778\uc99d\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0\uc11c \ub85c\uadf8\uc544\uc6c3\ud55c \ub2e4\uc74c \ub2e4\uc2dc \ub85c\uadf8\uc778\ud558\uc138\uc694."},"error_bad_plugin_version":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0 \ud544\uc694\ud55c \uc77c\ubd80 \uad6c\uc131 \uc694\uc18c\uac00 \ub204\ub77d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud588\ub294\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_generic":{"message":"\uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0\uc11c \ub85c\uadf8\uc544\uc6c3\ud55c \ub4a4 \ub2e4\uc2dc \ub85c\uadf8\uc778\ud558\uc138\uc694."},"error_host_is_offline":{"message":"\uc6d0\uaca9 \ucef4\ud4e8\ud130\uac00 \uc5f0\uacb0 \uc694\uccad\uc5d0 \uc751\ub2f5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc628\ub77c\uc778 \uc0c1\ud0dc\uc778\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_incompatible_protocol":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc758 \ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc774 \uac10\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc591\ucabd \ucef4\ud4e8\ud130\uc758 Chrome\uacfc Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc774 \ubaa8\ub450 \ucd5c\uc2e0 \ubc84\uc804\uc778\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_invalid_access_code":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_missing_plugin":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0 \ud544\uc694\ud55c \uc77c\ubd80 \uad6c\uc131 \uc694\uc18c\uac00 \ub204\ub77d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. Chrome \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc2e4\ud589\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_no_response":{"message":"\uc11c\ubc84\uac00 \ub124\ud2b8\uc6cc\ud06c \uc694\uccad\uc5d0 \uc751\ub2f5\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4."},"error_service_unavailable":{"message":"\uc11c\ube44\uc2a4\ub97c \uc77c\uc2dc\uc801\uc73c\ub85c \uc774\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_unexpected":{"message":"\uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\uc790\uc5d0\uac8c \ubb38\uc81c\ub97c \uc2e0\uace0\ud574 \uc8fc\uc138\uc694."},"footer_waiting":{"message":"\uc5f0\uacb0 \ub300\uae30 \uc911..."},"help":{"message":"\ub3c4\uc6c0\ub9d0"},"home_access_button":{"message":"\uc9c0\uae08 \uc561\uc138\uc2a4"},"home_access_description":{"message":"\uacf5\uc720\ud55c \ucef4\ud4e8\ud130\ub97c \ubcf4\uace0 \ucee8\ud2b8\ub864\ud569\ub2c8\ub2e4."},"home_my_computers_title":{"message":"\ub0b4 \ucef4\ud4e8\ud130"},"home_share_button":{"message":"\uc9c0\uae08 \uacf5\uc720"},"home_share_description":{"message":"\ub2e4\ub978 \uc0ac\uc6a9\uc790\uac00 \ubcf4\uace0 \ucee8\ud2b8\ub864\ud560 \uc218 \uc788\ub3c4\ub85d \uc774 \ucef4\ud4e8\ud130\ub97c \uacf5\uc720\ud569\ub2c8\ub2e4."},"home_share_description_chrome_os":{"message":"(\uc544\uc9c1 \ud06c\ub86c\ubd81\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub294 \uae30\ub2a5\uc785\ub2c8\ub2e4. \uc870\uae08\ub9cc \uae30\ub2e4\ub824 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.)"},"instructions_share_above":{"message":"\ub370\uc2a4\ud06c\ud1b1 \uacf5\uc720\ub97c \uc2dc\uc791\ud558\ub824\uba74 \ub0b4 \ub370\uc2a4\ud06c\ud1b1\uc5d0 \uc561\uc138\uc2a4\ud558\ub824\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc544\ub798 \uc561\uc138\uc2a4 \ucf54\ub4dc\ub97c \uc54c\ub824\uc8fc\uc138\uc694."},"instructions_share_below":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\uba74 \uacf5\uc720 \uc138\uc158\uc774 \uc2dc\uc791\ub429\ub2c8\ub2e4."},"label_connected":{"message":"\uc5f0\uacb0\ub428:"},"message_connecting":{"message":"\uc5f0\uacb0 \uc911..."},"message_generating":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc \uc0dd\uc131 \uc911..."},"message_session_finished":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1 \uc138\uc158\uc774 \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4."},"message_shared":{"message":"\ub0b4 \ucef4\ud4e8\ud130\ub97c $1\ub2d8\uacfc \uacf5\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\uc778\uc99d"},"mode_connect":{"message":"\uc5f0\uacb0"},"mode_share":{"message":"\uacf5\uc720"},"offline":{"message":"\uc624\ud504\ub77c\uc778"},"ok":{"message":"\ud655\uc778"},"product_description":{"message":"\ub2e4\ub978 \ucef4\ud4e8\ud130\uc5d0 \uc561\uc138\uc2a4\ud558\uac70\ub098 \ub2e4\ub978 \uc0ac\uc6a9\uc790\uac00 \uc778\ud130\ub137\uc744 \ud1b5\ud574 \uc548\uc804\ud558\uac8c \ub0b4 \ucef4\ud4e8\ud130\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."},"product_name":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1"},"sign_out_button":{"message":"\ub85c\uadf8\uc544\uc6c3"},"stop_sharing_button":{"message":"\uacf5\uc720 \uc911\uc9c0"},"tooltip_scaling":{"message":"\ud654\uba74 \ud06c\uae30\uc5d0 \ub9de\uac8c \uc870\uc815"},"warning_nat_disabled":{"message":"\ucc38\uace0: \uc815\ucc45 \uc124\uc815\uc5d0 \ub530\ub77c \ub124\ud2b8\uc6cc\ud06c \ub0b4\uc5d0 \uc788\ub294 \ucef4\ud4e8\ud130 \uac04\uc758 \uc5f0\uacb0\ub9cc \ud5c8\uc6a9\ub429\ub2c8\ub2e4."}} diff --git a/remoting/webapp/_locales.official/lt/messages.json b/remoting/webapp/_locales.official/lt/messages.json new file mode 100644 index 0000000..8ac5bbb --- /dev/null +++ b/remoting/webapp/_locales.official/lt/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Prieigos kodas"},"access_code_timer":{"message":"\u0160io prieigos kodo galiojimo laikas baigsis po $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"At\u0161aukti"},"close_prompt":{"message":"I\u0161\u0117jus i\u0161 \u0161io puslapio, baigsis nuotolinio \u201eChrome\u201c darbalaukio sesija."},"connect_button":{"message":"Prisijungti"},"continue_button":{"message":"T\u0119sti"},"continue_prompt":{"message":"\u0160iuo metu \u0161\u012f \u012frengin\u012f bendrinate su kitu naudotoju. Ar norite toliau bendrinti?"},"description_authorize":{"message":"Jei norite naudoti nuotolin\u012f \u201eChrome\u201c darbalauk\u012f, turite suteikti kompiuterio i\u0161pl\u0117stin\u0117s prieigos leidimus. Tai reik\u0117s atlikti tik vien\u0105 kart\u0105."},"description_connect":{"message":"Papra\u0161ykite, kad naudotojas, kurio kompiuter\u012f norite pasiekti, spustel\u0117t\u0173 \u201eBendrinti dabar\u201c ir suteikt\u0173 jums prieigos kod\u0105."},"description_home":{"message":"Naudodami nuotolin\u012f \u201eChrome\u201c darbalauk\u012f galite saugiai bendrinti kompiuter\u012f \u017einiatinkliu. Abu naudotojai turi paleisti nuotolinio \u201eChrome\u201c darbalaukio program\u0105, kuri\u0105 galima rasti adresu $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Atsijungti (\u201eCtrl\u201c + \u201eAlt\u201c + \u201eEsc\u201c)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Atsijungti (\u201eOpt\u201c + \u201eCtrl\u201c + \u201eEsc\u201c)"},"disconnect_button_plus_shortcut_windows":{"message":"Atsijungti (\u201eCtrl\u201c + \u201eAlt\u201c + \u201eEsc\u201c)"},"disconnect_myself_button":{"message":"Atsijungti"},"disconnect_other_button":{"message":"Atsijungti"},"error_authentication_failed":{"message":"Nepavyko nustatyti tapatyb\u0117s. Atsijunkite nuo nuotolinio \u201eChrome\u201c darbalaukio ir bandykite dar kart\u0105."},"error_bad_plugin_version":{"message":"Tr\u016bksta kai kuri\u0173 nuotoliniam \u201eChrome\u201c darbalaukiui reikaling\u0173 komponent\u0173. \u012esitikinkite, kad \u012fdieg\u0117te naujausi\u0105 versij\u0105, ir bandykite dar kart\u0105."},"error_generic":{"message":"\u012evyko ne\u017einoma klaida. Atsijunkite nuo nuotolinio \u201eChrome\u201c darbalaukio ir bandykite dar kart\u0105."},"error_host_is_offline":{"message":"Nuotolinis kompiuteris nereaguoja \u012f ry\u0161io u\u017eklausas. Patikrinkite, ar jis prijungtas, ir bandykite dar kart\u0105."},"error_incompatible_protocol":{"message":"Aptikta nesuderinama nuotolinio \u201eChrome\u201c darbalaukio versija. \u012esitikinkite, kad naudojate naujausios versijos \u201eGoogle Chrome\u201c ir nuotolin\u012f \u201eChrome\u201c darbalauk\u012f abiejuose kompiuteriuose, ir bandykite dar kart\u0105."},"error_invalid_access_code":{"message":"Netinkamas prieigos kodas. Bandykite dar kart\u0105."},"error_missing_plugin":{"message":"Tr\u016bksta kai kuri\u0173 nuotoliniam \u201eChrome\u201c darbalaukiui reikaling\u0173 komponent\u0173. \u012esitikinkite, kad naudojate naujausios versijos \u201eGoogle Chrome\u201c, ir bandykite dar kart\u0105."},"error_no_response":{"message":"Serveriui nepavyko atsakyti \u012f tinklo u\u017eklaus\u0105."},"error_service_unavailable":{"message":"Paslauga laikinai negalima. Bandykite dar kart\u0105 v\u0117liau."},"error_unexpected":{"message":"\u012evyko netik\u0117ta klaida. Prane\u0161kite apie problem\u0105 k\u016br\u0117jams."},"footer_waiting":{"message":"laukiama ry\u0161io..."},"help":{"message":"Pagalba"},"home_access_button":{"message":"Pasiekti dabar"},"home_access_description":{"message":"\u017di\u016br\u0117kite ir valdykite bendrinam\u0105 kompiuter\u012f."},"home_my_computers_title":{"message":"Mano kompiuteriai"},"home_share_button":{"message":"Bendrinti dabar"},"home_share_description":{"message":"Bendrinkite \u0161\u012f kompiuter\u012f, kad kitas naudotojas gal\u0117t\u0173 j\u012f matyti ir valdyti."},"home_share_description_chrome_os":{"message":"(\u0160i funkcija \u201eChromebook\u201c dar negalima\u2026 Steb\u0117kite naujienas.)"},"instructions_share_above":{"message":"Jei norite prad\u0117ti bendrinti darbalauk\u012f, pateikite toliau nurodyt\u0105 prieigos kod\u0105 asmeniui, kuris jums pad\u0117s."},"instructions_share_below":{"message":"Kai jis \u012fves kod\u0105, prasid\u0117s j\u016bs\u0173 bendrinimo sesija."},"label_connected":{"message":"Prisijungta:"},"message_connecting":{"message":"Jungiamasi\u2026"},"message_generating":{"message":"Generuojamas prieigos kodas..."},"message_session_finished":{"message":"Baig\u0117si nuotolinio \u201eChrome\u201c darbalaukio sesija."},"message_shared":{"message":"\u0160iuo metu darbalaukis bendrinamas su $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Suteikti prieigos teis\u0119"},"mode_connect":{"message":"Prisijungti"},"mode_share":{"message":"Bendrinti"},"offline":{"message":"Neprijungta"},"ok":{"message":"Gerai"},"product_description":{"message":"Pasiekite kitus kompiuterius arba leiskite kitam naudotojui saugiai pasiekti kompiuter\u012f internetu."},"product_name":{"message":"Nuotolinis \u201eChrome\u201c darbalaukis"},"sign_out_button":{"message":"Atsijungti"},"stop_sharing_button":{"message":"Stabdyti bendrinim\u0105"},"tooltip_scaling":{"message":"Keisti mastel\u012f, kad tilpt\u0173"},"warning_nat_disabled":{"message":"PASTABA: pagal politikos nustatymus leid\u017eiama u\u017emegzti tik tinkle esan\u010di\u0173 kompiuteri\u0173 ry\u0161\u012f."}} diff --git a/remoting/webapp/_locales.official/lv/messages.json b/remoting/webapp/_locales.official/lv/messages.json new file mode 100644 index 0000000..a6c8c5b --- /dev/null +++ b/remoting/webapp/_locales.official/lv/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Piek\u013cuves kods"},"access_code_timer":{"message":"\u0160\u012b piek\u013cuves koda der\u012bguma termi\u0146\u0161 beigsies p\u0113c $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Atcelt"},"close_prompt":{"message":"Aizverot \u0161o lapu, Chrome att\u0101l\u0101s darbvirsmas sesija tiks p\u0101rtraukta."},"connect_button":{"message":"Pievienot"},"continue_button":{"message":"Turpin\u0101t"},"continue_prompt":{"message":"\u0160obr\u012bd j\u016bs kop\u012bgojat \u0161o ier\u012bci ar citu lietot\u0101ju. Vai v\u0113laties turpin\u0101t kop\u012bgo\u0161anu?"},"description_authorize":{"message":"Lai izmantotu Chrome att\u0101lo darbvirsmu, vispirms pie\u0161\u0137iriet papla\u0161in\u0101tas piek\u013cuves at\u013caujas savam datoram. Tas ir j\u0101dara tikai vienu reizi."},"description_connect":{"message":"L\u016bdziet lietot\u0101jam, kura datoram v\u0113laties piek\u013c\u016bt, noklik\u0161\u0137in\u0101t uz Kop\u012bgot \u0161o datoru un p\u0113c tam pie\u0161\u0137irt jums piek\u013cuves kodu."},"description_home":{"message":"Izmantojot Chrome att\u0101lo darbvirsmu, varat dro\u0161\u0101 veid\u0101 t\u012bmekl\u012b kop\u012bgot savu datoru. Abiem lietot\u0101jiem ir j\u0101izmanto lietotne Chrome att\u0101l\u0101 darbvirsma, kas atrodama \u0161eit: $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Atvienot (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Atvienot (Ctrl+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Atvienot (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Atvienot"},"disconnect_other_button":{"message":"Atvienot"},"error_authentication_failed":{"message":"Autentifik\u0101cija neizdev\u0101s. Izrakstieties no Chrome att\u0101l\u0101s darbvirsmas un m\u0113\u0123iniet v\u0113lreiz."},"error_bad_plugin_version":{"message":"Tr\u016bkst da\u017eu Chrome att\u0101lajai darbvirsmai nepiecie\u0161amo komponentu. P\u0101rbaudiet, vai esat instal\u0113jis jaun\u0101ko versiju un m\u0113\u0123iniet v\u0113lreiz."},"error_generic":{"message":"Radusies nezin\u0101ma k\u013c\u016bda. Izrakstieties no Chrome att\u0101l\u0101s darbvirsmas un m\u0113\u0123iniet v\u0113lreiz."},"error_host_is_offline":{"message":"Att\u0101lais dators nerea\u0123\u0113 uz savienojuma piepras\u012bjumiem. P\u0101rbaudiet, vai tam ir savienojums ar internetu un m\u0113\u0123iniet v\u0113lreiz."},"error_incompatible_protocol":{"message":"Tika konstat\u0113ta nesader\u012bga Chrome att\u0101l\u0101s darbvirsmas versija. P\u0101rbaudiet, vai lietojat p\u0101rl\u016bka Google Chrome un lietotnes Chrome att\u0101l\u0101 darbvirsma jaun\u0101ko versiju abos datoros un m\u0113\u0123iniet v\u0113lreiz."},"error_invalid_access_code":{"message":"Piek\u013cuves kods nav der\u012bgs. M\u0113\u0123iniet v\u0113lreiz."},"error_missing_plugin":{"message":"Tr\u016bkst da\u017eu Chrome att\u0101lajai darbvirsmai nepiecie\u0161amo komponentu. P\u0101rbaudiet, vai lietojat jaun\u0101ko p\u0101rl\u016bka Google Chrome versiju un m\u0113\u0123iniet v\u0113lreiz."},"error_no_response":{"message":"Serverim neizdev\u0101s atbild\u0113t uz t\u012bkla piepras\u012bjumu."},"error_service_unavailable":{"message":"\u0160obr\u012bd pakalpojums nav pieejams. V\u0113l\u0101k m\u0113\u0123iniet v\u0113lreiz."},"error_unexpected":{"message":"Rad\u0101s neparedz\u0113ta k\u013c\u016bda. Zi\u0146ojiet par \u0161o probl\u0113mu izstr\u0101d\u0101t\u0101jiem."},"footer_waiting":{"message":"tiek gaid\u012bta savienojuma izveide..."},"help":{"message":"Pal\u012bdz\u012bba"},"home_access_button":{"message":"Piek\u013c\u016bt t\u016bl\u012bt"},"home_access_description":{"message":"Skatiet un kontrol\u0113jiet kop\u012bgotu datoru."},"home_my_computers_title":{"message":"Mani datori"},"home_share_button":{"message":"Kop\u012bgot t\u016bl\u012bt"},"home_share_description":{"message":"Kop\u012bgojiet \u0161o cita lietot\u0101ja datoru, lai redz\u0113tu un kontrol\u0113tu t\u0101 darbvirsmu."},"home_share_description_chrome_os":{"message":"(\u0161\u012b funkcija v\u0113l nav pieejama Chromebook datoriem\u2026 sekojiet jaunumiem)"},"instructions_share_above":{"message":"Lai kop\u012bgotu savu darbvirsmu, pie\u0161\u0137iriet t\u0101l\u0101k redzamo piek\u013cuves kodu lietot\u0101jam, kur\u0161 jums pal\u012bdz\u0113s."},"instructions_share_below":{"message":"Tikl\u012bdz kods ir ievad\u012bts, tiek s\u0101kta kop\u012bgo\u0161anas sesija."},"label_connected":{"message":"Pievienots:"},"message_connecting":{"message":"Notiek savienojuma izveide..."},"message_generating":{"message":"Notiek piek\u013cuves koda \u0123ener\u0113\u0161ana..."},"message_session_finished":{"message":"J\u016bsu Chrome att\u0101l\u0101s darbvirsmas sesija ir p\u0101rtraukta."},"message_shared":{"message":"\u0160obr\u012bd j\u016bs kop\u012bgojat savu darbvirsmu ar lietot\u0101ju $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriz\u0113t"},"mode_connect":{"message":"Pievienot"},"mode_share":{"message":"Kop\u012bgot"},"offline":{"message":"Bezsaist\u0113"},"ok":{"message":"Labi"},"product_description":{"message":"Piek\u013c\u016bstiet citiem datoriem vai \u013caujiet citam lietot\u0101jam piek\u013c\u016bt j\u016bsu datoram dro\u0161\u0101 veid\u0101, izmantojot interneta savienojumu."},"product_name":{"message":"Chrome att\u0101l\u0101 darbvirsma"},"sign_out_button":{"message":"Izrakst\u012bties"},"stop_sharing_button":{"message":"P\u0101rtraukt kop\u012bgo\u0161anu"},"tooltip_scaling":{"message":"M\u0113rogot, lai ietilpin\u0101tu"},"warning_nat_disabled":{"message":"PIEZ\u012aME: saska\u0146\u0101 ar politikas iestat\u012bjumiem savienojumi ir at\u013cauti tikai starp datoriem j\u016bsu t\u012bkl\u0101."}} diff --git a/remoting/webapp/_locales.official/nb/messages.json b/remoting/webapp/_locales.official/nb/messages.json new file mode 100644 index 0000000..0941d8c --- /dev/null +++ b/remoting/webapp/_locales.official/nb/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Tilgangskode"},"access_code_timer":{"message":"Denne tilgangskoden utl\u00f8per om $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Avbryt"},"close_prompt":{"message":"Hvis du forlater denne siden, avsluttes Chrome Eksternt skrivebord-\u00f8kten."},"connect_button":{"message":"Koble til"},"continue_button":{"message":"Fortsett"},"continue_prompt":{"message":"Du deler denne datamaskinen med en annen bruker. Vil du fortsette \u00e5 dele?"},"description_authorize":{"message":"For \u00e5 bruke Chrome Eksternt skrivebord m\u00e5 du gi utvidede tilgangstillatelser til datamaskinen din. Du trenger \u00e5 gj\u00f8re dette bare \u00e9n gang."},"description_connect":{"message":"Be brukeren som har datamaskinen du \u00f8nsker tilgang til, om \u00e5 klikke p\u00e5 \u00abDel n\u00e5\u00bb og gi deg tilgangskoden."},"description_home":{"message":"Med Chrome Eksternt skrivebord kan du trygt dele datamaskinen via Internett. Begge brukerne m\u00e5 kj\u00f8re Chrome Eksternt skrivebord-programmet, som kan lastes ned p\u00e5 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Koble fra (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Koble fra (Opt + Ctrl + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Koble fra (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"Koble fra"},"disconnect_other_button":{"message":"Koble fra"},"error_authentication_failed":{"message":"Autentiseringen mislyktes. Logg deg av Chrome Eksternt skrivebord og pr\u00f8v p\u00e5 nytt."},"error_bad_plugin_version":{"message":"Du mangler noen komponenter som kreves for Chrome Eksternt skrivebord. Kontroller at du har installert den nyeste versjonen, og pr\u00f8v p\u00e5 nytt."},"error_generic":{"message":"Det oppsto en ukjent feil. Logg deg av Chrome Eksternt skrivebord, og pr\u00f8v p\u00e5 nytt."},"error_host_is_offline":{"message":"Den eksterne datamaskinen svarer ikke p\u00e5 tilkoblingsforesp\u00f8rsler. Kontroller at datamaskinen er koblet til Internett, og pr\u00f8v p\u00e5 nytt."},"error_incompatible_protocol":{"message":"En ikke-kompatibel versjon av Chrome Eksternt skrivebord ble oppdaget. Kontroller at du har den nyeste versjonen av Google Chrome og Chrome Eksternt skrivebord p\u00e5 begge maskinene, og pr\u00f8v p\u00e5 nytt."},"error_invalid_access_code":{"message":"Tilgangskoden er ugyldig. Pr\u00f8v p\u00e5 nytt."},"error_missing_plugin":{"message":"Du mangler noen komponenter som kreves for Chrome Eksternt skrivebord. S\u00f8rg for at du kj\u00f8rer den nyeste versjonen av Google Chrome, og pr\u00f8v p\u00e5 nytt."},"error_no_response":{"message":"Tjeneren svarte ikke p\u00e5 nettverksforesp\u00f8rselen."},"error_service_unavailable":{"message":"Tjenesten er ikke tilgjengelig for \u00f8yeblikket. Pr\u00f8v p\u00e5 nytt senere."},"error_unexpected":{"message":"Det oppsto en uventet feil. Rapporter dette problemet til utviklerne."},"footer_waiting":{"message":"venter p\u00e5 tilkobling \u2026"},"help":{"message":"Hjelp"},"home_access_button":{"message":"Start tilgang n\u00e5"},"home_access_description":{"message":"Se og kontroller en delt datamaskin."},"home_my_computers_title":{"message":"Mine datamaskiner"},"home_share_button":{"message":"Del n\u00e5"},"home_share_description":{"message":"Del denne datamaskinen slik at en annen bruker kan se og kontrollere den."},"home_share_description_chrome_os":{"message":"(denne funksjonen er ikke tilgjengelig for Chromebooks enn\u00e5 \u2026 f\u00f8lg med)"},"instructions_share_above":{"message":"Kom i gang med deling av skrivebordet ved \u00e5 gi adgangskoden nedenfor til personen som skal hjelpe deg."},"instructions_share_below":{"message":"N\u00e5r brukeren har skrevet inn koden, starter delings\u00f8kten."},"label_connected":{"message":"Tilkoblet:"},"message_connecting":{"message":"Kobler til \u2026"},"message_generating":{"message":"Genererer tilgangskode \u2026"},"message_session_finished":{"message":"Chrome Eksternt skrivebord-\u00f8kten din er avsluttet."},"message_shared":{"message":"Skrivebordet ditt deles for \u00f8yeblikket med $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Godkjenn"},"mode_connect":{"message":"Koble til"},"mode_share":{"message":"Del"},"offline":{"message":"Frakoblet"},"ok":{"message":"OK"},"product_description":{"message":"F\u00e5 tilgang til andre datamaskiner eller gi en annen bruker sikker tilgang til datamaskinen din via Internett."},"product_name":{"message":"Chrome Eksternt skrivebord"},"sign_out_button":{"message":"Logg av"},"stop_sharing_button":{"message":"Stopp deling"},"tooltip_scaling":{"message":"Tilpass st\u00f8rrelse"},"warning_nat_disabled":{"message":"MERK: I henhold til lokale retningslinjer er tilkobling tillatt bare mellom datamaskiner i nettverket ditt."}} diff --git a/remoting/webapp/_locales.official/nl/messages.json b/remoting/webapp/_locales.official/nl/messages.json new file mode 100644 index 0000000..326a312 --- /dev/null +++ b/remoting/webapp/_locales.official/nl/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Toegangscode"},"access_code_timer":{"message":"Deze toegangscode verloopt over $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annuleren"},"close_prompt":{"message":"Als u deze pagina verlaat, wordt uw Chrome Remote Desktop-sessie be\u00ebindigd."},"connect_button":{"message":"Verbinding maken"},"continue_button":{"message":"Doorgaan"},"continue_prompt":{"message":"U deelt deze computer momenteel met een andere gebruiker. Wilt u doorgaan met delen?"},"description_authorize":{"message":"Om Chrome Remote Desktop te gebruiken, moet u eerst uitgebreide toegangsrechten voor uw computer verlenen. U hoeft dit slechts \u00e9\u00e9n keer te doen."},"description_connect":{"message":"Vraag de gebruiker tot wiens computer u toegang wilt hebben, op 'Nu delen' te klikken en u de toegangscode te geven."},"description_home":{"message":"Met Chrome Remote Desktop kunt u uw computer veilig delen via internet. Beide gebruikers moeten de app Chrome Remote Desktop uitvoeren, die beschikbaar is op $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Verbinding verbreken (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Verbinding verbreken (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Verbinding verbreken (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Verbinding verbreken"},"disconnect_other_button":{"message":"Verbinding verbreken"},"error_authentication_failed":{"message":"Authenticatie mislukt. Meld u af bij Chrome Remote Desktop en probeer het opnieuw."},"error_bad_plugin_version":{"message":"Er ontbreken enkele componenten die vereist zijn voor Chrome Remote Desktop. Controleer of u de nieuwste versie heeft ge\u00efnstalleerd en probeer het opnieuw."},"error_generic":{"message":"Er is een onbekende fout opgetreden. Meld u af bij Chrome Remote Desktop en probeer het opnieuw."},"error_host_is_offline":{"message":"De externe computer reageert niet op verbindingsverzoeken. Controleer of deze online is en probeer het opnieuw."},"error_incompatible_protocol":{"message":"Er is een incompatibele versie van Chrome Remote Desktop gedetecteerd. Controleer of beide computers beschikken over de nieuwste versie van Google Chrome en Chrome Remote Desktop en probeer het opnieuw."},"error_invalid_access_code":{"message":"De toegangscode is ongeldig. Probeer het opnieuw."},"error_missing_plugin":{"message":"Er ontbreken enkele componenten die vereist zijn voor Chrome Remote Desktop. Controleer of u de nieuwste versie van Google Chrome gebruikt en probeer het opnieuw."},"error_no_response":{"message":"De server heeft niet gereageerd op het netwerkverzoek."},"error_service_unavailable":{"message":"De service is tijdelijk niet beschikbaar. Probeer het later opnieuw."},"error_unexpected":{"message":"Er is een onverwachte fout opgetreden. Meld dit probleem aan de ontwikkelaars."},"footer_waiting":{"message":"wachten op verbinding\u2026"},"help":{"message":"Help"},"home_access_button":{"message":"Nu openen"},"home_access_description":{"message":"Een gedeelde computer bekijken en beheren."},"home_my_computers_title":{"message":"Mijn computers"},"home_share_button":{"message":"Nu delen"},"home_share_description":{"message":"De computer delen zodat een andere gebruiker deze kan bekijken en beheren."},"home_share_description_chrome_os":{"message":"(deze functie is nog niet beschikbaar voor Chromebooks\u2026 nog even geduld)"},"instructions_share_above":{"message":"Om uw bureaublad te delen, geeft u de onderstaande toegangscode aan de persoon die u gaat helpen."},"instructions_share_below":{"message":"Zodra ze de code opgeven, wordt uw deelsessie gestart."},"label_connected":{"message":"Verbonden:"},"message_connecting":{"message":"Verbinding maken..."},"message_generating":{"message":"Toegangscode genereren\u2026"},"message_session_finished":{"message":"Uw Chrome Remote Desktop-sessie is be\u00ebindigd."},"message_shared":{"message":"Uw bureaublad wordt momenteel gedeeld met $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriseren"},"mode_connect":{"message":"Verbinding maken"},"mode_share":{"message":"Delen"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Toegang krijgen tot andere computers of een andere gebruiker toestemming geven veilig toegang te krijgen tot uw computer via internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Afmelden"},"stop_sharing_button":{"message":"Delen stoppen"},"tooltip_scaling":{"message":"Passend schalen"},"warning_nat_disabled":{"message":"OPMERKING: beleidsinstellingen staan alleen verbindingen tussen computers binnen uw netwerk toe."}} diff --git a/remoting/webapp/_locales.official/pl/messages.json b/remoting/webapp/_locales.official/pl/messages.json new file mode 100644 index 0000000..58e1779 --- /dev/null +++ b/remoting/webapp/_locales.official/pl/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Kod dost\u0119pu"},"access_code_timer":{"message":"Ten kod dost\u0119pu wygasa za $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Anuluj"},"close_prompt":{"message":"Je\u015bli opu\u015bcisz t\u0119 stron\u0119, sesja Pulpitu zdalnego Chrome zostanie zako\u0144czona."},"connect_button":{"message":"Po\u0142\u0105cz"},"continue_button":{"message":"Kontynuuj"},"continue_prompt":{"message":"Obecnie udost\u0119pniasz ten komputer innemu u\u017cytkownikowi. Czy chcesz kontynuowa\u0107 udost\u0119pnianie?"},"description_authorize":{"message":"Aby korzysta\u0107 z Pulpitu zdalnego Chrome, musisz przyzna\u0107 rozszerzone pozwolenia dost\u0119pu do swojego komputera. Trzeba to zrobi\u0107 tylko raz."},"description_connect":{"message":"Popro\u015b u\u017cytkownika komputera, do kt\u00f3rego chcesz uzyska\u0107 dost\u0119p, aby klikn\u0105\u0142 \u201eUdost\u0119pnij teraz\u201d i przekaza\u0142 Ci kod dost\u0119pu."},"description_home":{"message":"Pulpit zdalny Chrome pozwala na bezpieczne udost\u0119pnianie komputera za po\u015brednictwem sieci. Obaj u\u017cytkownicy musz\u0105 mie\u0107 uruchomion\u0105 aplikacj\u0119 Pulpit zdalny Chrome, kt\u00f3r\u0105 mo\u017cna znale\u017a\u0107 pod adresem $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Roz\u0142\u0105cz (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Roz\u0142\u0105cz (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Roz\u0142\u0105cz (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Roz\u0142\u0105cz"},"disconnect_other_button":{"message":"Roz\u0142\u0105cz"},"error_authentication_failed":{"message":"Uwierzytelnianie nie powiod\u0142o si\u0119. Wyloguj si\u0119 z Pulpitu zdalnego Chrome i spr\u00f3buj ponownie."},"error_bad_plugin_version":{"message":"Brak niekt\u00f3rych element\u00f3w wymaganych dla Pulpitu zdalnego Chrome. Upewnij si\u0119, \u017ce masz zainstalowan\u0105 najnowsz\u0105 wersj\u0119 i spr\u00f3buj ponownie."},"error_generic":{"message":"Wyst\u0105pi\u0142 nieznany b\u0142\u0105d. Wyloguj si\u0119 z Pulpitu zdalnego Chrome i spr\u00f3buj ponownie."},"error_host_is_offline":{"message":"Komputer zdalny nie odpowiada na \u017c\u0105dania po\u0142\u0105czenia. Sprawd\u017a, czy dzia\u0142a on w trybie online i spr\u00f3buj ponownie."},"error_incompatible_protocol":{"message":"Wykryto niezgodn\u0105 wersj\u0119 Pulpitu zdalnego Chrome. Upewnij si\u0119, \u017ce masz najnowsz\u0105 wersj\u0119 przegl\u0105darki Google Chrome i Pulpitu zdalnego Chrome na obu komputerach i spr\u00f3buj ponownie."},"error_invalid_access_code":{"message":"Kod dost\u0119pu jest nieprawid\u0142owy. Spr\u00f3buj ponownie."},"error_missing_plugin":{"message":"Brak niekt\u00f3rych element\u00f3w wymaganych dla Pulpitu zdalnego Chrome. Upewnij si\u0119, \u017ce korzystasz z najnowszej wersji Google Chrome i spr\u00f3buj ponownie."},"error_no_response":{"message":"Serwer nie odpowiada na \u017c\u0105danie sieciowe."},"error_service_unavailable":{"message":"Us\u0142uga jest tymczasowo niedost\u0119pna. Spr\u00f3buj ponownie p\u00f3\u017aniej."},"error_unexpected":{"message":"Wyst\u0105pi\u0142 nieoczekiwany b\u0142\u0105d. Zg\u0142o\u015b ten problem programistom."},"footer_waiting":{"message":"oczekiwanie na po\u0142\u0105czenie..."},"help":{"message":"Pomoc"},"home_access_button":{"message":"Uzyskaj dost\u0119p teraz"},"home_access_description":{"message":"Zobacz i kontroluj udost\u0119pniony komputer."},"home_my_computers_title":{"message":"Moje komputery"},"home_share_button":{"message":"Udost\u0119pnij teraz"},"home_share_description":{"message":"Udost\u0119pnij ten komputer innemu u\u017cytkownikowi, aby m\u00f3g\u0142 go widzie\u0107 i kontrolowa\u0107."},"home_share_description_chrome_os":{"message":"(Ta funkcja nie jest jeszcze dost\u0119pna dla Chromebook\u00f3w \u2013 prosimy o cierpliwo\u015b\u0107)."},"instructions_share_above":{"message":"Aby udost\u0119pni\u0107 pulpit, podaj poni\u017cszy kod dost\u0119pu osobie, kt\u00f3ra b\u0119dzie Ci pomaga\u0107."},"instructions_share_below":{"message":"Po wprowadzeniu kodu przez drug\u0105 stron\u0119 rozpocznie si\u0119 sesja udost\u0119pniania."},"label_connected":{"message":"Po\u0142\u0105czono:"},"message_connecting":{"message":"\u0141\u0105czenie\u2026"},"message_generating":{"message":"Generowanie kodu dost\u0119pu..."},"message_session_finished":{"message":"Sesja Pulpitu zdalnego Chrome zosta\u0142a zako\u0144czona."},"message_shared":{"message":"Tw\u00f3j pulpit jest obecnie udost\u0119pniany u\u017cytkownikowi: $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoryzuj"},"mode_connect":{"message":"Po\u0142\u0105cz"},"mode_share":{"message":"Udost\u0119pnione"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Uzyskuj dost\u0119p do innych komputer\u00f3w lub zezwalaj innym u\u017cytkownikom na dost\u0119p do swojego komputera przez internet w bezpieczny spos\u00f3b."},"product_name":{"message":"Pulpit zdalny Chrome"},"sign_out_button":{"message":"Wyloguj si\u0119"},"stop_sharing_button":{"message":"Zatrzymaj udost\u0119pnianie"},"tooltip_scaling":{"message":"Przeskaluj, aby dopasowa\u0107"},"warning_nat_disabled":{"message":"UWAGA: ustawienia zasad zezwalaj\u0105 wy\u0142\u0105cznie na po\u0142\u0105czenia mi\u0119dzy komputerami w Twojej sieci."}} diff --git a/remoting/webapp/_locales.official/pt_BR/messages.json b/remoting/webapp/_locales.official/pt_BR/messages.json new file mode 100644 index 0000000..4f8f714 --- /dev/null +++ b/remoting/webapp/_locales.official/pt_BR/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"C\u00f3digo de acesso"},"access_code_timer":{"message":"Este c\u00f3digo de acesso expira em $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Abandonar esta p\u00e1gina encerrar\u00e1 sua sess\u00e3o na \u00c1rea de trabalho remota do Chrome."},"connect_button":{"message":"Conectar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"Esta m\u00e1quina est\u00e1 sendo compartilhada com outro usu\u00e1rio. Deseja continuar compartilhando?"},"description_authorize":{"message":"Para utilizar a \u00c1rea de trabalho remota do Chrome, \u00e9 necess\u00e1rio conceder permiss\u00f5es de acesso estendidas a seu computador. \u00c9 necess\u00e1rio fazer isto apenas uma vez."},"description_connect":{"message":"Solicite ao usu\u00e1rio cujo computador voc\u00ea deseja acessar que clique em \"Compartilhar agora\" e que forne\u00e7a a voc\u00ea o c\u00f3digo de acesso."},"description_home":{"message":"A \u00c1rea de trabalho remota do Chrome permite que voc\u00ea compartilhe seu computador com seguran\u00e7a atrav\u00e9s da web. Para isso, \u00e9 preciso que os usu\u00e1rios executem simultaneamente o aplicativo da \u00c1rea de trabalho remota do Chrome, que \u00e9 poss\u00edvel achar em $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconectar"},"disconnect_other_button":{"message":"Desconectar"},"error_authentication_failed":{"message":"Falha na autentica\u00e7\u00e3o. Saia da \u00c1rea de trabalho remota do Chrome e tente novamente."},"error_bad_plugin_version":{"message":"Alguns componentes necess\u00e1rios \u00e0 \u00c1rea de trabalho remota do Chrome est\u00e3o faltando. Certifique-se de que esteja executando a \u00faltima vers\u00e3o do Google Chrome e tente novamente."},"error_generic":{"message":"Ocorreu um erro desconhecido. Saia da \u00c1rea de trabalho remota do Chrome e tente novamente."},"error_host_is_offline":{"message":"O computador remoto n\u00e3o est\u00e1 respondendo \u00e0s solicita\u00e7\u00f5es de conex\u00e3o. Certifique-se de que ele esteja on-line e tente novamente."},"error_incompatible_protocol":{"message":"Uma vers\u00e3o incompat\u00edvel da \u00c1rea de trabalho remota do Chrome foi detectada. Certifique-se de que voc\u00ea possui a vers\u00e3o mais recente do Google Chrome e da \u00c1rea de trabalho remota do Chrome em ambos os computadores e tente novamente."},"error_invalid_access_code":{"message":"C\u00f3digo de acesso inv\u00e1lido. Tente novamente."},"error_missing_plugin":{"message":"Alguns componentes necess\u00e1rios \u00e0 \u00c1rea de trabalho remota do Chrome est\u00e3o faltando. Certifique-se de que esteja executando a \u00faltima vers\u00e3o do Google Chrome e tente novamente."},"error_no_response":{"message":"O servidor falhou ao responder ao pedido de rede."},"error_service_unavailable":{"message":"O servi\u00e7o est\u00e1 temporariamente indispon\u00edvel. Tente novamente mais tarde."},"error_unexpected":{"message":"Ocorreu um erro inesperado. Informe este problema aos desenvolvedores."},"footer_waiting":{"message":"aguardando conex\u00e3o..."},"help":{"message":"Ajuda"},"home_access_button":{"message":"Acessar agora"},"home_access_description":{"message":"Ver e controlar um computador compartilhado."},"home_my_computers_title":{"message":"Meus Computadores"},"home_share_button":{"message":"Compartilhar agora"},"home_share_description":{"message":"Compartilhe este computador para que outro usu\u00e1rio possa visualiz\u00e1-lo e control\u00e1-lo."},"home_share_description_chrome_os":{"message":"Este recurso ainda n\u00e3o est\u00e1 dispon\u00edvel para Chromebooks ... fique ligado"},"instructions_share_above":{"message":"Para compartilhar sua \u00e1rea de trabalho, forne\u00e7a o c\u00f3digo de acesso abaixo \u00e0 pessoa que ajudar\u00e1 voc\u00ea."},"instructions_share_below":{"message":"Assim que o c\u00f3digo for inserido, sua sess\u00e3o de compartilhamento iniciar\u00e1."},"label_connected":{"message":"Connectado:"},"message_connecting":{"message":"Conectando..."},"message_generating":{"message":"Gerando c\u00f3digo de acesso..."},"message_session_finished":{"message":"Sua sess\u00e3o na \u00c1rea de trabalho remota do Chrome foi encerrada."},"message_shared":{"message":"Sua \u00e1rea de trabalho est\u00e1 sendo compartilhada com $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Conectar"},"mode_share":{"message":"Compartilhar"},"offline":{"message":"Off-line"},"ok":{"message":"OK"},"product_description":{"message":"Acesse outros computadores ou permita que outro usu\u00e1rio acesse seu computador de forma segura atrav\u00e9s da Internet."},"product_name":{"message":"\u00c1rea de trabalho remota do Chrome"},"sign_out_button":{"message":"Sair"},"stop_sharing_button":{"message":"Parar compartilhamento"},"tooltip_scaling":{"message":"Ajustar \u00e0 janela"},"warning_nat_disabled":{"message":"NOTA: as configura\u00e7\u00f5es de Pol\u00edtica permitem conex\u00e3o apenas entre computadores em sua rede."}} diff --git a/remoting/webapp/_locales.official/pt_PT/messages.json b/remoting/webapp/_locales.official/pt_PT/messages.json new file mode 100644 index 0000000..508a28d --- /dev/null +++ b/remoting/webapp/_locales.official/pt_PT/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"C\u00f3digo de acesso"},"access_code_timer":{"message":"Este c\u00f3digo de acesso ir\u00e1 expirar \u00e0s $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Se sair desta p\u00e1gina, terminar\u00e1 a sess\u00e3o do Ambiente de Trabalho Remoto do Chrome."},"connect_button":{"message":"Ligar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"Est\u00e1 atualmente a partilhar este computador com outro utilizador. Pretende continuar a partilhar?"},"description_authorize":{"message":"Para utilizar o Ambiente de Trabalho Remoto do Chrome, \u00e9 necess\u00e1rio conceder permiss\u00f5es de acesso alargadas ao computador. Apenas tem de efetuar esta opera\u00e7\u00e3o uma vez."},"description_connect":{"message":"Solicite ao utilizador a cujo computador pretende aceder que clique em \"Partilhar Agora\" e que indique o c\u00f3digo de acesso."},"description_home":{"message":"O Ambiente de Trabalho Remoto do Chrome permite partilhar o computador de forma segura atrav\u00e9s da Web. Ambos os utilizadores devem ter em execu\u00e7\u00e3o a aplica\u00e7\u00e3o do Ambiente de Trabalho Remoto do Chrome, que pode ser encontrada em $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desligar (Ctrl+Alt +Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desligar (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desligar (Ctrl+Alt +Esc)"},"disconnect_myself_button":{"message":"Desligar"},"disconnect_other_button":{"message":"Desligar"},"error_authentication_failed":{"message":"Falha na autentica\u00e7\u00e3o. Termine a sess\u00e3o do Ambiente de Trabalho Remoto do Chrome e tente novamente."},"error_bad_plugin_version":{"message":"Faltam alguns componentes necess\u00e1rios ao Ambiente de Trabalho Remoto do Chrome. Certifique-se de que instalou a vers\u00e3o mais recente e tente novamente."},"error_generic":{"message":"Ocorreu um erro desconhecido. Termine sess\u00e3o do Ambiente de Trabalho Remoto do Chrome e tente novamente."},"error_host_is_offline":{"message":"O computador remoto n\u00e3o est\u00e1 a responder aos pedidos de liga\u00e7\u00e3o. Verifique se est\u00e1 on-line e tente novamente."},"error_incompatible_protocol":{"message":"Foi detetada uma vers\u00e3o n\u00e3o compat\u00edvel do Ambiente de Trabalho Remoto do Chrome. Certifique-se de que tem a vers\u00e3o mais recente do Google Chrome e do Ambiente de Trabalho Remoto do Chrome em ambos os computadores e tente novamente."},"error_invalid_access_code":{"message":"O c\u00f3digo de acesso \u00e9 inv\u00e1lido. Tente novamente."},"error_missing_plugin":{"message":"Faltam alguns componentes necess\u00e1rios ao Ambiente de Trabalho Remoto do Chrome. Certifique-se de que est\u00e1 a executar a vers\u00e3o mais recente do Google Chrome e tente novamente."},"error_no_response":{"message":"O servidor n\u00e3o conseguiu responder ao pedido de rede."},"error_service_unavailable":{"message":"O servi\u00e7o est\u00e1 temporariamente indispon\u00edvel. Tente novamente mais tarde."},"error_unexpected":{"message":"Ocorreu um erro inesperado. Comunique este problema aos programadores."},"footer_waiting":{"message":"a aguardar liga\u00e7\u00e3o..."},"help":{"message":"Ajuda"},"home_access_button":{"message":"Aceder Agora"},"home_access_description":{"message":"Ver e controlar um computador partilhado."},"home_my_computers_title":{"message":"Os Meus Computadores"},"home_share_button":{"message":"Partilhar Agora"},"home_share_description":{"message":"Partilhar este computador para que outro utilizador o possa ver e controlar."},"home_share_description_chrome_os":{"message":"(esta funcionalidade ainda n\u00e3o est\u00e1 dispon\u00edvel para Chromebooks... fique atento)"},"instructions_share_above":{"message":"Para come\u00e7ar a partilhar o seu ambiente de trabalho, forne\u00e7a o c\u00f3digo de acesso abaixo \u00e0 pessoa que o ir\u00e1 ajudar."},"instructions_share_below":{"message":"A sess\u00e3o de partilha come\u00e7a assim que introduzirem o c\u00f3digo."},"label_connected":{"message":"Ligado:"},"message_connecting":{"message":"A ligar..."},"message_generating":{"message":"A gerar c\u00f3digo de acesso..."},"message_session_finished":{"message":"A sess\u00e3o do Ambiente de Trabalho Remoto do Chrome terminou."},"message_shared":{"message":"O seu computador est\u00e1 a ser atualmente partilhado com $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Ligar"},"mode_share":{"message":"Partilhar"},"offline":{"message":"Off-line"},"ok":{"message":"OK"},"product_description":{"message":"Aceder a outros computadores ou permitir que outro utilizador aceda ao seu computador de forma segura atrav\u00e9s da internet."},"product_name":{"message":"Ambiente de Trabalho Remoto do Chrome"},"sign_out_button":{"message":"Terminar sess\u00e3o"},"stop_sharing_button":{"message":"Terminar Partilha"},"tooltip_scaling":{"message":"Ajustar tamanho"},"warning_nat_disabled":{"message":"NOTA: as defini\u00e7\u00f5es da Pol\u00edtica permitem liga\u00e7\u00f5es apenas entre computadores da sua rede."}} diff --git a/remoting/webapp/_locales.official/ro/messages.json b/remoting/webapp/_locales.official/ro/messages.json new file mode 100644 index 0000000..dace99e --- /dev/null +++ b/remoting/webapp/_locales.official/ro/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Cod de acces"},"access_code_timer":{"message":"Acest cod de acces va expira \u00een $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Anula\u0163i"},"close_prompt":{"message":"P\u0103r\u0103sind aceast\u0103 pagin\u0103 ve\u0163i \u00eencheia sesiunea dvs. Desktop la distan\u0163\u0103 Chrome."},"connect_button":{"message":"Conecta\u0163i-v\u0103"},"continue_button":{"message":"Continua\u0163i"},"continue_prompt":{"message":"\u00cen prezent permite\u0163i accesul la acest computer altui utilizator. Dori\u0163i s\u0103 permite\u0163i \u00een continuare accesul?"},"description_authorize":{"message":"Pentru a utiliza aplica\u0163ia Desktop la distan\u0163\u0103 Chrome trebuie s\u0103 acorda\u0163i permisiuni extinse de acces la computerul dvs. Este necesar s\u0103 face\u0163i acest lucru numai o singur\u0103 dat\u0103."},"description_connect":{"message":"Cere\u0163i-i utilizatorului al c\u0103rui computer dori\u0163i s\u0103 \u00eel accesa\u0163i s\u0103 fac\u0103 clic pe \u201ePermite\u0163i accesul acum\u201d \u015fi s\u0103 v\u0103 transmit\u0103 codul de acces."},"description_home":{"message":"Cu aplica\u0163ia Desktop la distan\u0163\u0103 Chrome pute\u0163i permite accesul \u00een siguran\u0163\u0103 la computerul dvs. pe web. Ambii utilizatori trebuie s\u0103 ruleze aplica\u0163ia Desktop la distan\u0163\u0103 Chrome, care poate fi g\u0103sit\u0103 la $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Deconecta\u0163i-v\u0103 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Deconecta\u0163i-v\u0103 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Deconecta\u0163i-v\u0103 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Deconecta\u0163i-v\u0103"},"disconnect_other_button":{"message":"Deconecta\u0163i-v\u0103"},"error_authentication_failed":{"message":"Autentificarea a e\u015fuat. Deconecta\u0163i-v\u0103 de la Desktop la distan\u0163\u0103 Chrome \u015fi \u00eencerca\u0163i din nou."},"error_bad_plugin_version":{"message":"Unele componente necesare pentru Desktop la distan\u0163\u0103 Chrome lipsesc. Asigura\u0163i-v\u0103 c\u0103 a\u0163i instalat cea mai recent\u0103 versiune a aplica\u0163iei \u015fi \u00eencerca\u0163i din nou."},"error_generic":{"message":"A ap\u0103rut o eroare necunoscut\u0103. Deconecta\u0163i-v\u0103 de la Desktop la distan\u0163\u0103 Chrome \u015fi \u00eencerca\u0163i din nou."},"error_host_is_offline":{"message":"Computerul la distan\u0163\u0103 nu r\u0103spunde la solicit\u0103rile de conectare. Verifica\u0163i dac\u0103 respectivul computer este online \u015fi \u00eencerca\u0163i din nou."},"error_incompatible_protocol":{"message":"A fost detectat\u0103 o versiune incompatibil\u0103 a aplica\u0163iei Desktop la distan\u0163\u0103 Chrome. Asigura\u0163i-v\u0103 c\u0103 ave\u0163i cea mai recent\u0103 versiune pentru Google Chrome \u015fi Desktop la distan\u0163\u0103 Chrome pe ambele computere \u015fi \u00eencerca\u0163i din nou."},"error_invalid_access_code":{"message":"Codul de acces nu este valid. \u00cencerca\u0163i din nou."},"error_missing_plugin":{"message":"Unele componente necesare pentru aplica\u0163ia Desktop la distan\u0163\u0103 Chrome lipsesc. Asigura\u0163i-v\u0103 c\u0103 rula\u0163i cea mai recent\u0103 versiune a browserului Google Chrome \u015fi \u00eencerca\u0163i din nou."},"error_no_response":{"message":"Serverul nu a putut r\u0103spunde la solicitarea din re\u0163ea."},"error_service_unavailable":{"message":"Serviciul este temporar indisponibil. \u00cencerca\u0163i din nou mai t\u00e2rziu."},"error_unexpected":{"message":"A ap\u0103rut o eroare nea\u015fteptat\u0103. Raporta\u0163i aceast\u0103 problem\u0103 dezvoltatorilor."},"footer_waiting":{"message":"se a\u015fteapt\u0103 realizarea conexiunii..."},"help":{"message":"Ajutor"},"home_access_button":{"message":"Accesa\u0163i acum"},"home_access_description":{"message":"Vede\u0163i \u015fi controla\u0163i un computer la care se permite accesul."},"home_my_computers_title":{"message":"Computerele mele"},"home_share_button":{"message":"Permite\u0163i accesul acum"},"home_share_description":{"message":"Permite\u0163i accesul la acest computer altui utilizator, pentru ca acesta s\u0103 \u00eel poat\u0103 vedea \u015fi controla."},"home_share_description_chrome_os":{"message":"(aceast\u0103 func\u0163ie nu este \u00eenc\u0103 disponibil\u0103 pentru Chromebooks... urm\u0103ri\u0163i-ne \u00een continuare)"},"instructions_share_above":{"message":"Pentru a \u00eencepe s\u0103 permite\u0163i accesul la desktopul dvs., trimite\u0163i codul de acces de mai jos persoanei care v\u0103 va oferi asisten\u0163\u0103."},"instructions_share_below":{"message":"Dup\u0103 ce persoana respectiv\u0103 introduce codul, sesiunea de permitere a accesului va \u00eencepe."},"label_connected":{"message":"Conectat:"},"message_connecting":{"message":"Se conecteaz\u0103..."},"message_generating":{"message":"Se genereaz\u0103 codul de acces..."},"message_session_finished":{"message":"Sesiunea dvs. Desktop la distan\u0163\u0103 Chrome s-a \u00eencheiat."},"message_shared":{"message":"\u00cen prezent, accesul la desktopul dvs. este permis pentru $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriza\u0163i"},"mode_connect":{"message":"Conecta\u0163i-v\u0103"},"mode_share":{"message":"Permite\u0163i accesul"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Accesa\u0163i alte computere sau permite\u0163i altui utilizator s\u0103 acceseze computerul dvs. \u00een siguran\u0163\u0103 pe internet."},"product_name":{"message":"Desktop la distan\u0163\u0103 Chrome"},"sign_out_button":{"message":"Deconecta\u0163i-v\u0103"},"stop_sharing_button":{"message":"Opri\u0163i permiterea accesului"},"tooltip_scaling":{"message":"Redimensiona\u0163i pentru a se potrivi"},"warning_nat_disabled":{"message":"NOT\u0102: set\u0103rile politicii permit conexiuni numai \u00eentre computerele din re\u0163eaua dvs."}} diff --git a/remoting/webapp/_locales.official/ru/messages.json b/remoting/webapp/_locales.official/ru/messages.json new file mode 100644 index 0000000..fcc5c0c --- /dev/null +++ b/remoting/webapp/_locales.official/ru/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430"},"access_code_timer":{"message":"\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u041e\u0442\u043c\u0435\u043d\u0430"},"close_prompt":{"message":"\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043a\u0438\u043d\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0441\u0435\u0430\u043d\u0441 \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d."},"connect_button":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"continue_button":{"message":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},"continue_prompt":{"message":"\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u0435\u0430\u043d\u0441?"},"description_authorize":{"message":"\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437."},"description_connect":{"message":"\u041f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443\" \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430."},"description_home":{"message":"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f (Opt\u00a0+\u00a0Ctrl\u00a0+\u00a0Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"disconnect_other_button":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"error_authentication_failed":{"message":"\u0421\u0431\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0412\u044b\u0439\u0434\u0438\u0442\u0435 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome\" \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_bad_plugin_version":{"message":"\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_generic":{"message":"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b\u0439\u0434\u0438\u0442\u0435 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome\" \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_host_is_offline":{"message":"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043b\u0438 \u043e\u043d \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_incompatible_protocol":{"message":"\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Chrome, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_invalid_access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_missing_plugin":{"message":"\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Chrome, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_no_response":{"message":"\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441."},"error_service_unavailable":{"message":"\u0421\u043b\u0443\u0436\u0431\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435."},"error_unexpected":{"message":"\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c."},"footer_waiting":{"message":"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435..."},"help":{"message":"\u0421\u043f\u0440\u0430\u0432\u043a\u0430"},"home_access_button":{"message":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f"},"home_access_description":{"message":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443."},"home_my_computers_title":{"message":"\u041c\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440"},"home_share_button":{"message":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443"},"home_share_description":{"message":"\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e."},"home_share_description_chrome_os":{"message":"(\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 Chromebooks. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438.)"},"instructions_share_above":{"message":"\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u043e\u043b\u0443, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u0435\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434."},"instructions_share_below":{"message":"\u0421\u0435\u0430\u043d\u0441 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430."},"label_connected":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e:"},"message_connecting":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435..."},"message_generating":{"message":"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430..."},"message_session_finished":{"message":"\u0421\u0435\u0430\u043d\u0441 \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d."},"message_shared":{"message":"\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u043e\u043b\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f"},"mode_connect":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"mode_share":{"message":"\u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f"},"offline":{"message":"\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e"},"ok":{"message":"\u041e\u041a"},"product_description":{"message":"\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0447\u0443\u0436\u0438\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c \u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"product_name":{"message":"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome"},"sign_out_button":{"message":"\u0412\u044b\u0439\u0442\u0438"},"stop_sharing_button":{"message":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f"},"tooltip_scaling":{"message":"\u041f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u043e\u043a\u043d\u0430"},"warning_nat_disabled":{"message":"\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438."}} diff --git a/remoting/webapp/_locales.official/sk/messages.json b/remoting/webapp/_locales.official/sk/messages.json new file mode 100644 index 0000000..a4b8caa --- /dev/null +++ b/remoting/webapp/_locales.official/sk/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Pr\u00edstupov\u00fd k\u00f3d"},"access_code_timer":{"message":"Platnos\u0165 pr\u00edstupov\u00e9ho k\u00f3du vypr\u0161\u00ed o $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Zru\u0161i\u0165"},"close_prompt":{"message":"Ak opust\u00edte t\u00fato str\u00e1nku, rel\u00e1cia Vzdialenej plochy Chrome sa ukon\u010d\u00ed."},"connect_button":{"message":"Pripoji\u0165"},"continue_button":{"message":"Pokra\u010dova\u0165"},"continue_prompt":{"message":"Moment\u00e1lne zdie\u013eate tento po\u010d\u00edta\u010d s in\u00fdm pou\u017e\u00edvate\u013eom. Chcete pokra\u010dova\u0165 v zdie\u013ean\u00ed?"},"description_authorize":{"message":"Ak chcete pou\u017e\u00edva\u0165 Vzdialen\u00fa plochu Chrome, mus\u00edte najprv udeli\u0165 roz\u0161\u00edren\u00e9 povolenia na pr\u00edstup k v\u00e1\u0161mu po\u010d\u00edta\u010du. Sta\u010d\u00ed to urobi\u0165 len raz."},"description_connect":{"message":"Po\u017eiadajte pou\u017e\u00edvate\u013ea, ku ktor\u00e9ho po\u010d\u00edta\u010du chcete pristupova\u0165, aby klikol na mo\u017enos\u0165 Zdie\u013ea\u0165 tento po\u010d\u00edta\u010d a poskytol v\u00e1m pr\u00edstupov\u00fd k\u00f3d."},"description_home":{"message":"Vzdialen\u00e1 plocha Chrome v\u00e1m umo\u017e\u0148uje bezpe\u010dne zdie\u013ea\u0165 v\u00e1\u0161 po\u010d\u00edta\u010d cez Internet. Obaja pou\u017e\u00edvatelia musia ma\u0165 spusten\u00fa aplik\u00e1ciu Vzdialen\u00e1 plocha Chrome, ktor\u00fa n\u00e1jdete na adrese $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Odpoji\u0165 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Odpoji\u0165 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Odpoji\u0165 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Odpoji\u0165"},"disconnect_other_button":{"message":"Odpoji\u0165"},"error_authentication_failed":{"message":"Overenie toto\u017enosti zlyhalo. Odhl\u00e1ste sa zo slu\u017eby Vzdialen\u00e1 plocha Chrome a sk\u00faste to znova."},"error_bad_plugin_version":{"message":"Niektor\u00e9 s\u00fa\u010dasti potrebn\u00e9 pre Vzdialen\u00fa plochu Chrome ch\u00fdbaj\u00fa. Uistite sa, \u017ee ste nain\u0161talovali najnov\u0161iu verziu a sk\u00faste to znova."},"error_generic":{"message":"Vyskytla sa nezn\u00e1ma chyba. Odhl\u00e1ste sa zo slu\u017eby Vzdialen\u00e1 plocha Chrome a sk\u00faste to znova."},"error_host_is_offline":{"message":"Vzdialen\u00fd po\u010d\u00edta\u010d nereaguje na \u017eiadosti o pripojenie. Skontrolujte, \u010di je online a sk\u00faste to znova."},"error_incompatible_protocol":{"message":"Bola zisten\u00e1 nekompatibiln\u00e1 verzia Vzdialenej plochy Chrome. Uistite sa, \u017ee m\u00e1te najnov\u0161iu verziu prehliada\u010da Google Chrome a Vzdialenej plochy Chrome na oboch po\u010d\u00edta\u010doch a sk\u00faste to znova."},"error_invalid_access_code":{"message":"Pr\u00edstupov\u00fd k\u00f3d je neplatn\u00fd. Sk\u00faste to znova."},"error_missing_plugin":{"message":"Niektor\u00e9 s\u00fa\u010dasti potrebn\u00e9 pre Vzdialen\u00fa plochu Chrome ch\u00fdbaj\u00fa. Uistite sa, \u017ee pou\u017e\u00edvate najnov\u0161iu verziu prehliada\u010da Google Chrome a sk\u00faste to znova."},"error_no_response":{"message":"Serveru sa nepodarilo odpoveda\u0165 na po\u017eiadavku siete."},"error_service_unavailable":{"message":"Slu\u017eba je do\u010dasne nedostupn\u00e1. Sk\u00faste to znova nesk\u00f4r."},"error_unexpected":{"message":"Vyskytla sa neo\u010dak\u00e1van\u00e1 chyba. Nahl\u00e1ste tento probl\u00e9m v\u00fdvoj\u00e1rom."},"footer_waiting":{"message":"\u010dak\u00e1 sa na pripojenie..."},"help":{"message":"Pomocn\u00edk"},"home_access_button":{"message":"Prist\u00fapi\u0165"},"home_access_description":{"message":"Zobrazte a ovl\u00e1dajte zdie\u013ean\u00fd po\u010d\u00edta\u010d."},"home_my_computers_title":{"message":"Moje po\u010d\u00edta\u010de"},"home_share_button":{"message":"Zdie\u013ea\u0165"},"home_share_description":{"message":"Zdie\u013ea\u0165 tento po\u010d\u00edta\u010d, aby ho mohol in\u00fd pou\u017e\u00edvate\u013e zobrazi\u0165 a ovl\u00e1da\u0165."},"home_share_description_chrome_os":{"message":"(t\u00e1to funkcia nie je e\u0161te k dispoz\u00edcii pre Chromebooky... sledujte n\u00e1s aj na\u010falej)"},"instructions_share_above":{"message":"Ak chcete za\u010da\u0165 zdie\u013ea\u0165 svoju pracovn\u00fa plochu, poskytnite ni\u017e\u0161ie uveden\u00fd pr\u00edstupov\u00fd k\u00f3d osobe, ktor\u00e1 v\u00e1m bude pom\u00e1ha\u0165."},"instructions_share_below":{"message":"Va\u0161a rel\u00e1cia zdie\u013eania za\u010dne okam\u017eite po zadan\u00ed k\u00f3du."},"label_connected":{"message":"Pripojen\u00fd:"},"message_connecting":{"message":"Prebieha prip\u00e1janie..."},"message_generating":{"message":"Prebieha generovanie pr\u00edstupov\u00e9ho k\u00f3du..."},"message_session_finished":{"message":"Va\u0161a rel\u00e1cia Vzdialenej plochy Chrome bola ukon\u010den\u00e1."},"message_shared":{"message":"Va\u0161a pracovn\u00e1 plocha je moment\u00e1lne zdie\u013ean\u00e1 s pou\u017e\u00edvate\u013eom $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizova\u0165"},"mode_connect":{"message":"Pripoji\u0165"},"mode_share":{"message":"Zdie\u013ea\u0165"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Pristupujte k in\u00fdm po\u010d\u00edta\u010dom alebo umo\u017enite \u010fal\u0161iemu pou\u017e\u00edvate\u013eovi pristupova\u0165 k v\u00e1\u0161mu po\u010d\u00edta\u010du bezpe\u010dne cez Internet."},"product_name":{"message":"Vzdialen\u00e1 plocha Chrome"},"sign_out_button":{"message":"Odhl\u00e1si\u0165 sa"},"stop_sharing_button":{"message":"Presta\u0165 zdie\u013ea\u0165"},"tooltip_scaling":{"message":"Prisp\u00f4sobi\u0165 oknu"},"warning_nat_disabled":{"message":"Pozn\u00e1mka: Nastavenia pravidiel umo\u017e\u0148uj\u00fa pripojenie len medzi po\u010d\u00edta\u010dmi v r\u00e1mci va\u0161ej siete."}} diff --git a/remoting/webapp/_locales.official/sl/messages.json b/remoting/webapp/_locales.official/sl/messages.json new file mode 100644 index 0000000..1d64a78 --- /dev/null +++ b/remoting/webapp/_locales.official/sl/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Koda za dostop"},"access_code_timer":{"message":"Ta koda za dostop bo potekla \u010dez $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Prekli\u010di"},"close_prompt":{"message":"\u010ce zapustite to stran, se bo seja oddaljenega namizja Chrome kon\u010dala."},"connect_button":{"message":"Vzpostavi povezavo"},"continue_button":{"message":"Nadaljuj"},"continue_prompt":{"message":"Trenutno delite to napravo z drugim uporabnikom. Ali \u017eelite nadaljevati s skupno rabo?"},"description_authorize":{"message":"\u010ce \u017eelite uporabljati oddaljeno namizje Chrome, morate odobriti raz\u0161irjena dovoljenja za dostop do ra\u010dunalnika. To morate storiti samo enkrat."},"description_connect":{"message":"Uporabnika ra\u010dunalnika, do katerega \u017eelite dostop, prosite, da klikne \u00bbDeli zdaj\u00ab in vam nato po\u0161lje kodo za dostop."},"description_home":{"message":"Oddaljeno namizje Chrome omogo\u010da, da varno delite ra\u010dunalnik v spletu. Oba uporabnika morata uporabljati program Oddaljeno namizje Chrome, ki ga najdete na $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Prekini povezavo (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Prekini povezavo (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Prekini povezavo (Ctrl +Alt + Esc)"},"disconnect_myself_button":{"message":"Prekini povezavo"},"disconnect_other_button":{"message":"Prekini povezavo"},"error_authentication_failed":{"message":"Preverjanje pristnosti ni uspelo. Odjavite se iz oddaljenega namizja Chrome in poskusite znova."},"error_bad_plugin_version":{"message":"Ni nekaterih delov, ki so zahtevani za oddaljeno namizje Chrome. Preverite, ali imate najnovej\u0161o razli\u010dico Google Chroma in poskusite znova."},"error_generic":{"message":"Neznana napaka. Odjavite se iz oddaljenega namizja Chrome in poskusite znova."},"error_host_is_offline":{"message":"Oddaljeni ra\u010dunalnik se ne odziva na zahteve za povezavo. Preverite, ali ima vzpostavljeno povezavo, in poskusite znova."},"error_incompatible_protocol":{"message":"Zaznana je bila nezdru\u017eljiva razli\u010dica oddaljenega namizja Chrome. Preverite, ali imate v obeh ra\u010dunalnikih najnovej\u0161i razli\u010dici Google Chroma in oddaljenega namizja Chrome, ter poskusite znova."},"error_invalid_access_code":{"message":"Koda za dostop je neveljavna. Poskusite znova."},"error_missing_plugin":{"message":"Ni nekaterih delov, ki so zahtevani za oddaljeno namizje Chrome. Preverite, ali imate najnovej\u0161o razli\u010dico Google Chroma in poskusite znova."},"error_no_response":{"message":"Stre\u017enik se ni odzval na zahtevo omre\u017eja."},"error_service_unavailable":{"message":"Ta storitev za\u010dasno ni na voljo. Poskusite znova pozneje."},"error_unexpected":{"message":"Nepri\u010dakovana napaka. O tem obvestite razvijalce."},"footer_waiting":{"message":"\u010dakanje na povezavo ..."},"help":{"message":"Pomo\u010d"},"home_access_button":{"message":"Dostopajte zdaj"},"home_access_description":{"message":"Ogled in nadziranje ra\u010dunalnika v skupni rabi."},"home_my_computers_title":{"message":"Moji ra\u010dunalniki"},"home_share_button":{"message":"Deli zdaj"},"home_share_description":{"message":"Delite ta ra\u010dunalnik, ki ga lahko drug uporabnik vidi in nadzira."},"home_share_description_chrome_os":{"message":"(ta funkcija \u0161e ni na voljo za Chromebooke \u2026 preverite pozneje)"},"instructions_share_above":{"message":"\u010ce \u017eelite za\u010deti deliti namizje, po\u0161ljite spodnjo kodo za dostop osebi, ki vam bo pomagala."},"instructions_share_below":{"message":"Ko je koda vnesena, se seja skupne rabe za\u010dne."},"label_connected":{"message":"Povezava vzpostavljena:"},"message_connecting":{"message":"Vzpostavljanje povezave ..."},"message_generating":{"message":"Ustvarjanje kode za dostop ..."},"message_session_finished":{"message":"Seja oddaljenega namizja Chrome je kon\u010dana."},"message_shared":{"message":"Namizje trenutno delite z uporabnikom $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Dovoli"},"mode_connect":{"message":"Vzpostavi povezavo"},"mode_share":{"message":"Skupna raba"},"offline":{"message":"Brez povezave"},"ok":{"message":"V redu"},"product_description":{"message":"Dostopajte do drugih ra\u010dunalnikov ali omogo\u010dite drugemu uporabniku dostop do svojega ra\u010dunalnika varno po internetu."},"product_name":{"message":"Oddaljeno namizje Chrome"},"sign_out_button":{"message":"Odjava"},"stop_sharing_button":{"message":"Prekli\u010di skupno rabo"},"tooltip_scaling":{"message":"Prilagodi, da ustreza"},"warning_nat_disabled":{"message":"OPOMBA: Nastavitve na podlagi pravilnika dovoljujejo povezave samo med ra\u010dunalniki v va\u0161em omre\u017eju."}} diff --git a/remoting/webapp/_locales.official/sr/messages.json b/remoting/webapp/_locales.official/sr/messages.json new file mode 100644 index 0000000..c6ce164 --- /dev/null +++ b/remoting/webapp/_locales.official/sr/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434"},"access_code_timer":{"message":"\u041e\u0432\u0430\u0458 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434 \u045b\u0435 \u0438\u0441\u0442\u0435\u045b\u0438 \u0437\u0430 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u041e\u0442\u043a\u0430\u0436\u0438"},"close_prompt":{"message":"\u041d\u0430\u043f\u0443\u0448\u0442\u0430\u045a\u0435\u043c \u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0437\u0430\u0432\u0440\u0448\u0438\u045b\u0435\u0442\u0435 \u0441\u0435\u0441\u0438\u0458\u0443 Chrome Remote Desktop-\u0430."},"connect_button":{"message":"\u041f\u043e\u0432\u0435\u0436\u0438"},"continue_button":{"message":"\u041d\u0430\u0441\u0442\u0430\u0432\u0438"},"continue_prompt":{"message":"\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u0443\u0440\u0435\u0452\u0430\u0458 \u0441\u0430 \u0458\u043e\u0448 \u0458\u0435\u0434\u043d\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c. \u0414\u0430 \u043b\u0438 \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0434\u0435\u0459\u0435\u045a\u0435?"},"description_authorize":{"message":"\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u043b\u0438 Chrome Remote Desktop, \u043c\u043e\u0440\u0430\u0442\u0435 \u0434\u0430 \u043e\u0434\u043e\u0431\u0440\u0438\u0442\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0435 \u0437\u0430 \u0448\u0438\u0440\u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443. \u0422\u043e \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0443\u0440\u0430\u0434\u0438\u0442\u0435 \u0441\u0430\u043c\u043e \u0458\u0435\u0434\u0430\u043d\u043f\u0443\u0442."},"description_connect":{"message":"\u0417\u0430\u0442\u0440\u0430\u0436\u0438\u0442\u0435 \u043e\u0434 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 \u0447\u0438\u0458\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443 \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u0435 \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435 \u043d\u0430 \u201e\u0414\u0435\u043b\u0438 \u043e\u0434\u043c\u0430\u0445\u201c \u0438 \u0434\u0430 \u0432\u0430\u043c \u0434\u0430 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434."},"description_home":{"message":"Chrome Remote Desktop \u0432\u0430\u043c \u043e\u043c\u043e\u0433\u0443\u045b\u0430\u0432\u0430 \u0434\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0435 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u043d\u0430 \u0412\u0435\u0431\u0443. \u041f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435 \u0434\u0430 \u043e\u0431\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 \u043f\u043e\u043a\u0440\u0435\u043d\u0443 \u0430\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0458\u0443 Chrome Remote Desktop \u043a\u043e\u0458\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043d\u0430\u0452\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0438 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443"},"disconnect_other_button":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443"},"error_authentication_failed":{"message":"\u041f\u043e\u0442\u0432\u0440\u0434\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043b\u0430. \u041e\u0434\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435 \u0438\u0437 Chrome Remote Desktop-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_bad_plugin_version":{"message":"\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0443 \u043d\u0435\u043a\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u043a\u043e\u0458\u0435 \u0441\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0435 \u0437\u0430 Chrome Remote Desktop. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u0441\u0442\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043b\u0438 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_generic":{"message":"\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u043d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u0435 \u0433\u0440\u0435\u0448\u043a\u0435. \u041e\u0434\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435 \u0438\u0437 Chrome Remote Desktop-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_host_is_offline":{"message":"\u0423\u0434\u0430\u0459\u0435\u043d\u0438 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u043d\u0435 \u043e\u0434\u0433\u043e\u0432\u0430\u0440\u0430 \u043d\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0435 \u0437\u0430 \u043f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u0458\u0435 \u043d\u0430 \u043c\u0440\u0435\u0436\u0438 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_incompatible_protocol":{"message":"\u041e\u0442\u043a\u0440\u0438\u0432\u0435\u043d\u0430 \u0458\u0435 \u043d\u0435\u043a\u043e\u043c\u043f\u0430\u0442\u0438\u0431\u0438\u043b\u043d\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Chrome Remote Desktop-\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u043d\u0430 \u043e\u0431\u0430 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0430 \u0438\u043c\u0430\u0442\u0435 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Google Chrome-\u0430 \u0438 Chrome Remote Desktop-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_invalid_access_code":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434 \u0458\u0435 \u043d\u0435\u0432\u0430\u0436\u0435\u045b\u0438. \u041f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_missing_plugin":{"message":"\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0443 \u043d\u0435\u043a\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u043a\u043e\u0458\u0435 \u0441\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0435 \u0437\u0430 Chrome Remote Desktop. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Google Chrome-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_no_response":{"message":"\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043e \u0434\u0430 \u043e\u0434\u0433\u043e\u0432\u043e\u0440\u0438 \u043d\u0430 \u0437\u0430\u0445\u0442\u0435\u0432 \u043c\u0440\u0435\u0436\u0435."},"error_service_unavailable":{"message":"\u0423\u0441\u043b\u0443\u0433\u0430 \u0458\u0435 \u043f\u0440\u0438\u0432\u0440\u0435\u043c\u0435\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430. \u041f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e \u043a\u0430\u0441\u043d\u0438\u0458\u0435."},"error_unexpected":{"message":"\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u043d\u0435\u043e\u0447\u0435\u043a\u0438\u0432\u0430\u043d\u0435 \u0433\u0440\u0435\u0448\u043a\u0435. \u041f\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0435\u0440\u0438\u043c\u0430."},"footer_waiting":{"message":"\u0447\u0435\u043a\u0430 \u0441\u0435 \u0443\u0441\u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0430\u045a\u0435 \u0432\u0435\u0437\u0435\u2026"},"help":{"message":"\u041f\u043e\u043c\u043e\u045b"},"home_access_button":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438 \u043e\u0434\u043c\u0430\u0445"},"home_access_description":{"message":"\u041f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0458\u0442\u0435 \u0434\u0435\u0459\u0435\u043d\u0438 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u0438 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u0458\u0442\u0435 \u045a\u0438\u043c\u0435."},"home_my_computers_title":{"message":"\u041c\u043e\u0458\u0438 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0438"},"home_share_button":{"message":"\u0414\u0435\u043b\u0438 \u043e\u0434\u043c\u0430\u0445"},"home_share_description":{"message":"\u0414\u0435\u043b\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u0434\u0430 \u0431\u0438 \u0434\u0440\u0443\u0433\u0438 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a \u043c\u043e\u0433\u0430\u043e \u0434\u0430 \u0433\u0430 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u0459\u0430 \u045a\u0438\u043c\u0435."},"home_share_description_chrome_os":{"message":"(\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0458\u0430 \u0458\u043e\u0448 \u0443\u0432\u0435\u043a \u043d\u0438\u0458\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0437\u0430 Chromebook-\u043e\u0432\u0435\u2026 \u043f\u0440\u0430\u0442\u0438\u0442\u0435 \u0440\u0430\u0437\u0432\u043e\u0458 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0458\u0435)"},"instructions_share_above":{"message":"\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u043f\u043e\u0447\u0435\u043b\u0438 \u0434\u0430 \u0434\u0435\u043b\u0438\u0442\u0435 \u0440\u0430\u0447\u0443\u043d\u0430\u0440, \u0443 \u043d\u0430\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u0430\u0458\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434 \u043e\u0441\u043e\u0431\u0438 \u043a\u043e\u0458\u0430 \u045b\u0435 \u0432\u0430\u043c \u043f\u043e\u043c\u0430\u0433\u0430\u0442\u0438."},"instructions_share_below":{"message":"\u041a\u0430\u0434\u0430 \u0443\u043d\u0435\u0441\u0435 \u043a\u00f4\u0434, \u043f\u043e\u0447\u0435\u045b\u0435 \u0441\u0435\u0441\u0438\u0458\u0430 \u0434\u0435\u0459\u0435\u045a\u0430."},"label_connected":{"message":"\u041f\u043e\u0432\u0435\u0437\u0430\u043d \u0441\u0430:"},"message_connecting":{"message":"\u041f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0435\u2026"},"message_generating":{"message":"\u0413\u0435\u043d\u0435\u0440\u0438\u0441\u0430\u045a\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u043e\u0433 \u043a\u043e\u0434\u0430\u2026"},"message_session_finished":{"message":"\u0421\u0435\u0441\u0438\u0458\u0430 Chrome Remote Desktop-\u0430 \u0458\u0435 \u0437\u0430\u0432\u0440\u0448\u0435\u043d\u0430."},"message_shared":{"message":"\u0420\u0430\u045b\u0443\u043d\u0430\u0440 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0435 \u0441\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u041e\u0432\u043b\u0430\u0441\u0442\u0438"},"mode_connect":{"message":"\u041f\u043e\u0432\u0435\u0436\u0438"},"mode_share":{"message":"\u0414\u0435\u0459\u0435\u045a\u0435"},"offline":{"message":"\u0412\u0430\u043d \u043c\u0440\u0435\u0436\u0435"},"ok":{"message":"\u041f\u043e\u0442\u0432\u0440\u0434\u0438"},"product_description":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0438\u043c\u0430 \u0438\u043b\u0438 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u043c\u0430 \u0434\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0458\u0443 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443 \u043f\u0440\u0435\u043a\u043e \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u041e\u0434\u0458\u0430\u0432\u0438 \u043c\u0435"},"stop_sharing_button":{"message":"\u0417\u0430\u0443\u0441\u0442\u0430\u0432\u0438 \u0434\u0435\u0459\u0435\u045a\u0435"},"tooltip_scaling":{"message":"\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0443\u043a\u043b\u043e\u043f\u0438\u043b\u043e"},"warning_nat_disabled":{"message":"\u041d\u0410\u041f\u041e\u041c\u0415\u041d\u0410: \u041f\u043e\u0434\u0435\u0448\u0430\u0432\u0430\u045a\u0430 \u0441\u043c\u0435\u0440\u043d\u0438\u0446\u0430 \u0434\u043e\u0437\u0432\u043e\u0459\u0430\u0432\u0430\u0458\u0443 \u0432\u0435\u0437\u0435 \u0441\u0430\u043c\u043e \u0438\u0437\u043c\u0435\u0452\u0443 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0430 \u0443 \u043e\u043a\u0432\u0438\u0440\u0443 \u0432\u0430\u0448\u0435 \u043c\u0440\u0435\u0436\u0435."}} diff --git a/remoting/webapp/_locales.official/sv/messages.json b/remoting/webapp/_locales.official/sv/messages.json new file mode 100644 index 0000000..fdc4d77 --- /dev/null +++ b/remoting/webapp/_locales.official/sv/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u00c5tkomstkod"},"access_code_timer":{"message":"\u00c5tkomstkoden upph\u00f6r att g\u00e4lla om $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Avbryt"},"close_prompt":{"message":"Om du l\u00e4mnar sidan avslutas sessionen i Chrome Remote Desktop."},"connect_button":{"message":"Anslut"},"continue_button":{"message":"Forts\u00e4tt"},"continue_prompt":{"message":"Du delar nu den h\u00e4r datorn med en annan anv\u00e4ndare. Vill du forts\u00e4tta att dela?"},"description_authorize":{"message":"Om du vill anv\u00e4nda Chrome Remote Desktop m\u00e5ste du bevilja ut\u00f6kad \u00e5tkomstbeh\u00f6righet till datorn. Du beh\u00f6ver bara g\u00f6ra det en g\u00e5ng."},"description_connect":{"message":"Be anv\u00e4ndaren vars dator du vill f\u00e5 tillg\u00e5ng till att klicka p\u00e5 l\u00e4nken Dela nu och ge dig \u00e5tkomstkoden."},"description_home":{"message":"Med Chrome Remote Desktop kan du dela din dator via Internet p\u00e5 ett s\u00e4kert s\u00e4tt. B\u00e5da anv\u00e4ndarna m\u00e5ste k\u00f6ra appen Chrome Remote Desktop som du hittar p\u00e5 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Koppla fr\u00e5n (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Koppla fr\u00e5n (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Koppla fr\u00e5n (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Koppla fr\u00e5n"},"disconnect_other_button":{"message":"Koppla fr\u00e5n"},"error_authentication_failed":{"message":"Det gick inte att autentisera. Logga ut fr\u00e5n Chrome Remote Desktop och f\u00f6rs\u00f6k igen."},"error_bad_plugin_version":{"message":"Vissa komponenter som kr\u00e4vs f\u00f6r Chrome Remote Desktop saknas. Kontrollera att du har installerat den senaste versionen och f\u00f6rs\u00f6k igen."},"error_generic":{"message":"Ett ok\u00e4nt fel uppstod. Logga ut fr\u00e5n Chrome Remote Desktop och f\u00f6rs\u00f6k igen."},"error_host_is_offline":{"message":"Fj\u00e4rrdatorn svarar inte p\u00e5 anslutningsbeg\u00e4ran. Kontrollera att den \u00e4r ansluten till Internet och f\u00f6rs\u00f6k igen."},"error_incompatible_protocol":{"message":"Du anv\u00e4nder en inkompatibel version av Chrome Remote Desktop. Se till att den senaste versionen av Google Chrome och Chrome Remote Desktop har installerats p\u00e5 b\u00e5da datorerna och f\u00f6rs\u00f6k igen."},"error_invalid_access_code":{"message":"Koden \u00e4r ogiltig. F\u00f6rs\u00f6k igen."},"error_missing_plugin":{"message":"Vissa komponenter som kr\u00e4vs f\u00f6r Chrome Remote Desktop saknas. Kontrollera att du anv\u00e4nder den senaste versionen av Google Chrome och f\u00f6rs\u00f6k igen."},"error_no_response":{"message":"Servern kunde inte svara p\u00e5 n\u00e4tverkets beg\u00e4ran."},"error_service_unavailable":{"message":"Tj\u00e4nsten \u00e4r inte tillg\u00e4nglig f\u00f6r n\u00e4rvarande. F\u00f6rs\u00f6k igen senare."},"error_unexpected":{"message":"Ett ov\u00e4ntat fel uppstod. Rapportera problemet till utvecklarna."},"footer_waiting":{"message":"v\u00e4ntar p\u00e5 anslutning ..."},"help":{"message":"Hj\u00e4lp"},"home_access_button":{"message":"F\u00e5 \u00e5tkomst nu"},"home_access_description":{"message":"Visa och styra en delad dator."},"home_my_computers_title":{"message":"Mina datorer"},"home_share_button":{"message":"Dela nu"},"home_share_description":{"message":"Dela den h\u00e4r datorn s\u00e5 att en annan anv\u00e4ndare kan visa och styra den."},"home_share_description_chrome_os":{"message":"(funktionen \u00e4r \u00e4nnu inte tillg\u00e4ngligt f\u00f6r Chromebooks ... h\u00e5ll utkik)"},"instructions_share_above":{"message":"Om du vill dela ditt skrivbord ger du \u00e5tkomstkoden nedan till den som ska hj\u00e4lpa dig."},"instructions_share_below":{"message":"N\u00e4r koden anges startar delningssessionen."},"label_connected":{"message":"Ansluten:"},"message_connecting":{"message":"Ansluter ..."},"message_generating":{"message":"\u00c5tkomstkod genereras ..."},"message_session_finished":{"message":"Chrome Remote Desktop-sessionen har avslutats."},"message_shared":{"message":"Ditt skrivbord delas just nu med $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Auktorisera"},"mode_connect":{"message":"Anslut"},"mode_share":{"message":"Dela"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"F\u00e5 \u00e5tkomst till andra datorer eller ge andra \u00e5tkomst till din dator \u00f6ver Internet p\u00e5 ett s\u00e4kert s\u00e4tt."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Logga ut"},"stop_sharing_button":{"message":"Sluta dela"},"tooltip_scaling":{"message":"Anpassa"},"warning_nat_disabled":{"message":"OBS! Enligt policyinst\u00e4llningarna till\u00e5ts endast anslutning mellan datorer i ditt n\u00e4tverk."}} diff --git a/remoting/webapp/_locales.official/th/messages.json b/remoting/webapp/_locales.official/th/messages.json new file mode 100644 index 0000000..5f26b03 --- /dev/null +++ b/remoting/webapp/_locales.official/th/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07"},"access_code_timer":{"message":"\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e19\u0e35\u0e49\u0e08\u0e30\u0e2b\u0e21\u0e14\u0e2d\u0e32\u0e22\u0e38\u0e43\u0e19\u0e2d\u0e35\u0e01 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01"},"close_prompt":{"message":"\u0e01\u0e32\u0e23\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e19\u0e35\u0e49\u0e08\u0e30\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Chrome Remote Desktop \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13"},"connect_button":{"message":"\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"continue_button":{"message":"\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d"},"continue_prompt":{"message":"\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49\u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49\u0e01\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e37\u0e48\u0e19 \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48"},"description_authorize":{"message":"\u0e43\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 Chrome Remote Desktop \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e04\u0e38\u0e13\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e40\u0e0a\u0e48\u0e19\u0e19\u0e35\u0e49\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27"},"description_connect":{"message":"\u0e02\u0e2d\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e40\u0e02\u0e32\u0e04\u0e25\u0e34\u0e01\u0e17\u0e35\u0e48 \"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e19\u0e35\u0e49\" \u0e41\u0e25\u0e30\u0e43\u0e2b\u0e49\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e41\u0e01\u0e48\u0e04\u0e38\u0e13"},"description_home":{"message":"Chrome Remote Desktop \u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e27\u0e47\u0e1a\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22 \u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2a\u0e2d\u0e07\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e41\u0e2d\u0e1b\u0e1e\u0e25\u0e34\u0e40\u0e04\u0e0a\u0e31\u0e19 Chrome Remote Desktop \u0e0b\u0e36\u0e48\u0e07\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e23\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e17\u0e35\u0e48 $1","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"disconnect_other_button":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"error_authentication_failed":{"message":"\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e42\u0e1b\u0e23\u0e14\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e30\u0e1a\u0e1a Chrome Remote Desktop \u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_bad_plugin_version":{"message":"\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e17\u0e35\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e1a\u0e32\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a Chrome Remote Desktop \u0e02\u0e32\u0e14\u0e2b\u0e32\u0e22\u0e44\u0e1b \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e23\u0e38\u0e48\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_generic":{"message":"\u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e17\u0e23\u0e32\u0e1a\u0e2a\u0e32\u0e40\u0e2b\u0e15\u0e38 \u0e42\u0e1b\u0e23\u0e14\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e30\u0e1a\u0e1a Chrome Remote Desktop \u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_host_is_offline":{"message":"\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e23\u0e30\u0e22\u0e30\u0e44\u0e01\u0e25\u0e44\u0e21\u0e48\u0e15\u0e2d\u0e1a\u0e2a\u0e19\u0e2d\u0e07\u0e04\u0e33\u0e02\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e27\u0e48\u0e32\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e14\u0e31\u0e07\u0e01\u0e25\u0e48\u0e32\u0e27\u0e2d\u0e2d\u0e19\u0e44\u0e25\u0e19\u0e4c\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_incompatible_protocol":{"message":"\u0e15\u0e23\u0e27\u0e08\u0e1e\u0e1a\u0e23\u0e38\u0e48\u0e19\u0e17\u0e35\u0e48\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e19\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e02\u0e2d\u0e07 Chrome Remote Desktop \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e21\u0e35 Google Chrome \u0e41\u0e25\u0e30 Chrome Remote Desktop \u0e23\u0e38\u0e48\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e1a\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2a\u0e2d\u0e07\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_invalid_access_code":{"message":"\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07 \u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_missing_plugin":{"message":"\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e17\u0e35\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e1a\u0e32\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a Chrome Remote Desktop \u0e02\u0e32\u0e14\u0e2b\u0e32\u0e22\u0e44\u0e1b \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e43\u0e0a\u0e49 Google Chrome \u0e23\u0e38\u0e48\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_no_response":{"message":"\u0e40\u0e0b\u0e34\u0e23\u0e4c\u0e1f\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e15\u0e2d\u0e1a\u0e2a\u0e19\u0e2d\u0e07\u0e04\u0e33\u0e02\u0e2d\u0e02\u0e2d\u0e07\u0e40\u0e04\u0e23\u0e37\u0e2d\u0e02\u0e48\u0e32\u0e22"},"error_service_unavailable":{"message":"\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49\u0e44\u0e14\u0e49\u0e43\u0e19\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49 \u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e43\u0e19\u0e20\u0e32\u0e22\u0e2b\u0e25\u0e31\u0e07"},"error_unexpected":{"message":"\u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e04\u0e32\u0e14\u0e04\u0e34\u0e14 \u0e42\u0e1b\u0e23\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e1e\u0e31\u0e12\u0e19\u0e32\u0e0b\u0e2d\u0e1f\u0e15\u0e4c\u0e41\u0e27\u0e23\u0e4c\u0e17\u0e23\u0e32\u0e1a"},"footer_waiting":{"message":"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e23\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d..."},"help":{"message":"\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d"},"home_access_button":{"message":"\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e19\u0e35\u0e49"},"home_access_description":{"message":"\u0e40\u0e2b\u0e47\u0e19\u0e41\u0e25\u0e30\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e01\u0e31\u0e19"},"home_my_computers_title":{"message":"\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e09\u0e31\u0e19"},"home_share_button":{"message":"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e19\u0e35\u0e49"},"home_share_description":{"message":"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e19\u0e35\u0e49\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e37\u0e48\u0e19\u0e40\u0e2b\u0e47\u0e19\u0e41\u0e25\u0e30\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e44\u0e14\u0e49"},"home_share_description_chrome_os":{"message":"(\u0e04\u0e38\u0e13\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30\u0e19\u0e35\u0e49\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e43\u0e19 Chromebook... \u0e42\u0e1b\u0e23\u0e14\u0e04\u0e2d\u0e22\u0e15\u0e34\u0e14\u0e15\u0e32\u0e21)"},"instructions_share_above":{"message":"\u0e2b\u0e32\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e23\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e40\u0e14\u0e2a\u0e01\u0e4c\u0e17\u0e47\u0e2d\u0e1b\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e42\u0e1b\u0e23\u0e14\u0e43\u0e2b\u0e49\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e17\u0e35\u0e48\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u0e41\u0e01\u0e48\u0e1a\u0e38\u0e04\u0e04\u0e25\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e2b\u0e49\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e04\u0e38\u0e13"},"instructions_share_below":{"message":"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1e\u0e27\u0e01\u0e40\u0e02\u0e32\u0e1b\u0e49\u0e2d\u0e19\u0e23\u0e2b\u0e31\u0e2a\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e08\u0e30\u0e40\u0e23\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19"},"label_connected":{"message":"\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e41\u0e25\u0e49\u0e27:"},"message_connecting":{"message":"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u2026"},"message_generating":{"message":"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07..."},"message_session_finished":{"message":"\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Chrome Remote Desktop \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27"},"message_shared":{"message":"\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49\u0e40\u0e14\u0e2a\u0e01\u0e4c\u0e17\u0e47\u0e2d\u0e1b\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e21\u0e35\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e01\u0e31\u0e1a $1","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15"},"mode_connect":{"message":"\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"mode_share":{"message":"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19"},"offline":{"message":"\u0e2d\u0e2d\u0e1f\u0e44\u0e25\u0e19\u0e4c"},"ok":{"message":"\u0e15\u0e01\u0e25\u0e07"},"product_description":{"message":"\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e37\u0e48\u0e19\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22\u0e1c\u0e48\u0e32\u0e19\u0e17\u0e32\u0e07\u0e2d\u0e34\u0e19\u0e40\u0e17\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e47\u0e15"},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e30\u0e1a\u0e1a"},"stop_sharing_button":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19"},"tooltip_scaling":{"message":"\u0e1b\u0e23\u0e31\u0e1a\u0e02\u0e19\u0e32\u0e14\u0e43\u0e2b\u0e49\u0e1e\u0e2d\u0e14\u0e35"},"warning_nat_disabled":{"message":"\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38: \u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e19\u0e42\u0e22\u0e1a\u0e32\u0e22\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e20\u0e32\u0e22\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e2d\u0e02\u0e48\u0e32\u0e22\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19"}} diff --git a/remoting/webapp/_locales.official/tr/messages.json b/remoting/webapp/_locales.official/tr/messages.json new file mode 100644 index 0000000..a972025 --- /dev/null +++ b/remoting/webapp/_locales.official/tr/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"Eri\u015fim kodu"},"access_code_timer":{"message":"Bu eri\u015fim kodunun s\u00fcresi $1 saniye i\u00e7inde sona erecek","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0130ptal"},"close_prompt":{"message":"Bu sayfadan ayr\u0131l\u0131rsan\u0131z Chrome Uzaktan Masa\u00fcst\u00fc oturumunuz sonlan\u0131r."},"connect_button":{"message":"Ba\u011flan"},"continue_button":{"message":"Devam"},"continue_prompt":{"message":"Bu makineyi \u015fu anda ba\u015fka bir kullan\u0131c\u0131yla payla\u015f\u0131yorsunuz. Payla\u015fmaya devam etmek istiyor musunuz?"},"description_authorize":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131n\u0131 kullanabilmek i\u00e7in \u00f6ncelikle, bilgisayar\u0131n\u0131za geni\u015fletilmi\u015f eri\u015fim izinleri vermelisiniz. Bunu yaln\u0131zca bir kez yapman\u0131z gerekir."},"description_connect":{"message":"Bilgisayar\u0131na eri\u015fmek istedi\u011finiz kullan\u0131c\u0131dan, '\u015eimdi Payla\u015f' se\u00e7ene\u011fini t\u0131klamas\u0131n\u0131 ve size eri\u015fim kodunu vermesini isteyin."},"description_home":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc, bilgisayar\u0131n\u0131z\u0131 Web \u00fczerinden g\u00fcvenli bir \u015fekilde payla\u015fabilmenize olanak sa\u011flar. Her iki kullan\u0131c\u0131n\u0131n da Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131yor olmas\u0131 gerekir. Uygulamay\u0131 $1 adresinde bulabilirsiniz.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Ba\u011flant\u0131y\u0131 Kes (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Ba\u011flant\u0131y\u0131 Kes (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Ba\u011flant\u0131y\u0131 Kes (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Ba\u011flant\u0131y\u0131 Kes"},"disconnect_other_button":{"message":"Ba\u011flant\u0131y\u0131 Kes"},"error_authentication_failed":{"message":"Kimlik do\u011frulama ba\u015far\u0131s\u0131z oldu. L\u00fctfen Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131ndan \u00e7\u0131k\u0131\u015f yap\u0131n ve tekrar deneyin."},"error_bad_plugin_version":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc i\u00e7in gereken baz\u0131 bile\u015fenler eksik. L\u00fctfen son s\u00fcr\u00fcm\u00fc y\u00fckledi\u011finizden emin olun ve tekrar deneyin."},"error_generic":{"message":"Bilinmeyen bir hata olu\u015ftu. L\u00fctfen Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131ndan \u00e7\u0131k\u0131\u015f yap\u0131n ve tekrar deneyin."},"error_host_is_offline":{"message":"Uzaktan ba\u011flanaca\u011f\u0131n\u0131z bilgisayar, ba\u011flant\u0131 isteklerine yan\u0131t vermiyor. L\u00fctfen bu bilgisayar\u0131n \u00e7evrimi\u00e7i oldu\u011funu do\u011frulay\u0131n ve tekrar deneyin."},"error_incompatible_protocol":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131n\u0131n uyumsuz bir s\u00fcr\u00fcm\u00fc alg\u0131land\u0131. L\u00fctfen, her iki bilgisayarda Google Chrome ve Chrome Uzaktan Masa\u00fcst\u00fc uygulamalar\u0131n\u0131n son s\u00fcr\u00fcmlerinin oldu\u011fundan emin olun ve tekrar deneyin."},"error_invalid_access_code":{"message":"Eri\u015fim kodu ge\u00e7ersiz. L\u00fctfen tekrar deneyin."},"error_missing_plugin":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc i\u00e7in gereken baz\u0131 bile\u015fenler eksik. L\u00fctfen Google Chrome'un son s\u00fcr\u00fcm\u00fcn\u00fc \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun ve tekrar deneyin."},"error_no_response":{"message":"Sunucu, a\u011f iste\u011fine yan\u0131t veremedi."},"error_service_unavailable":{"message":"Hizmet ge\u00e7ici olarak kullan\u0131lam\u0131yor. L\u00fctfen daha sonra tekrar deneyin."},"error_unexpected":{"message":"Beklenmeyen bir hata olu\u015ftu. L\u00fctfen bu sorunu geli\u015ftiricilere bildirin."},"footer_waiting":{"message":"ba\u011flant\u0131 bekleniyor..."},"help":{"message":"Yard\u0131m"},"home_access_button":{"message":"\u015eimdi Eri\u015f"},"home_access_description":{"message":"Payla\u015f\u0131lan bir bilgisayar\u0131 g\u00f6r\u00fcn ve denetleyin."},"home_my_computers_title":{"message":"Bilgisayarlar\u0131m"},"home_share_button":{"message":"\u015eimdi Payla\u015f"},"home_share_description":{"message":"Bu bilgisayar\u0131 ba\u015fka bir kullan\u0131c\u0131n\u0131n g\u00f6rmesi ve kontrol etmesi i\u00e7in payla\u015f\u0131n."},"home_share_description_chrome_os":{"message":"(bu \u00f6zellik hen\u00fcz Chromebook'larda kullan\u0131lm\u0131yor... bizi izlemeye devam edin)"},"instructions_share_above":{"message":"Masa\u00fcst\u00fcn\u00fcz\u00fc payla\u015fmaya ba\u015flamak i\u00e7in, size yard\u0131mc\u0131 olacak ki\u015fiye a\u015fa\u011f\u0131daki eri\u015fim kodunu verin."},"instructions_share_below":{"message":"Kullan\u0131c\u0131, kodu girdi\u011finde payla\u015f\u0131m oturumunuz ba\u015flar."},"label_connected":{"message":"Ba\u011fl\u0131:"},"message_connecting":{"message":"Ba\u011flan\u0131yor..."},"message_generating":{"message":"Eri\u015fim kodu olu\u015fturuluyor..."},"message_session_finished":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc oturumunuz sonland\u0131."},"message_shared":{"message":"Masa\u00fcst\u00fcn\u00fcz \u015fu anda $1 adl\u0131 kullan\u0131c\u0131yla payla\u015f\u0131l\u0131yor.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Yetkilendir"},"mode_connect":{"message":"Ba\u011flan"},"mode_share":{"message":"Payla\u015f"},"offline":{"message":"\u00c7evrimd\u0131\u015f\u0131"},"ok":{"message":"Tamam"},"product_description":{"message":"\u0130nternet \u00fczerinden g\u00fcvenli bir \u015fekilde di\u011fer bilgisayarlara eri\u015fin veya ba\u015fka kullan\u0131c\u0131lar\u0131n bilgisayar\u0131n\u0131za eri\u015fmesine izin verin."},"product_name":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc"},"sign_out_button":{"message":"\u00c7\u0131k\u0131\u015f yap"},"stop_sharing_button":{"message":"Payla\u015fmay\u0131 Durdur"},"tooltip_scaling":{"message":"S\u0131\u011fd\u0131r"},"warning_nat_disabled":{"message":"NOT: Politika ayarlar\u0131, yaln\u0131zca a\u011f\u0131n\u0131zdaki bilgisayarlar aras\u0131ndaki ba\u011flant\u0131lara izin veriyor."}} diff --git a/remoting/webapp/_locales.official/uk/messages.json b/remoting/webapp/_locales.official/uk/messages.json new file mode 100644 index 0000000..68663b4 --- /dev/null +++ b/remoting/webapp/_locales.official/uk/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443"},"access_code_timer":{"message":"\u0422\u0435\u0440\u043c\u0456\u043d \u0434\u0456\u0457 \u043a\u043e\u0434\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0437\u0430\u043a\u0456\u043d\u0447\u0443\u0454\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438"},"close_prompt":{"message":"\u042f\u043a\u0449\u043e \u0437\u0430\u043b\u0438\u0448\u0438\u0442\u0438 \u0446\u044e \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0443, \u0441\u0435\u0430\u043d\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0437\u0430\u043a\u0456\u043d\u0447\u0438\u0442\u044c\u0441\u044f."},"connect_button":{"message":"\u0417\u2019\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"},"continue_button":{"message":"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438"},"continue_prompt":{"message":"\u0417\u0430\u0440\u0430\u0437 \u0432\u0438 \u043d\u0430\u0434\u0430\u0454\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0456\u043d\u0448\u043e\u043c\u0443 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0443. \u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0441\u043f\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f?"},"description_authorize":{"message":"\u0429\u043e\u0431 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043e\u044e \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043d\u0430\u0434\u0430\u0442\u0438 \u0440\u043e\u0437\u0448\u0438\u0440\u0435\u043d\u0456 \u0434\u043e\u0437\u0432\u043e\u043b\u0438 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0432\u0430\u0448\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430. \u0426\u0435 \u0442\u0440\u0435\u0431\u0430 \u0437\u0440\u043e\u0431\u0438\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437."},"description_connect":{"message":"\u041f\u043e\u043f\u0440\u043e\u0441\u0456\u0442\u044c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430, \u0434\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u044f\u043a\u043e\u0433\u043e \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f, \u043d\u0430\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\", \u0430 \u043f\u043e\u0442\u0456\u043c \u0434\u0430\u0442\u0438 \u0432\u0430\u043c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443."},"description_home":{"message":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u0454 \u0431\u0435\u0437\u043f\u0435\u0447\u043d\u043e \u043d\u0430\u0434\u0430\u0432\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0406\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0412 \u043e\u0431\u043e\u0445 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432 \u043c\u0430\u0454 \u0431\u0443\u0442\u0438 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome, \u044f\u043a\u0443 \u043c\u043e\u0436\u043d\u0430 \u0437\u043d\u0430\u0439\u0442\u0438 \u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u044e $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"},"disconnect_other_button":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438"},"error_authentication_failed":{"message":"\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u0457. \u0412\u0438\u0439\u0434\u0456\u0442\u044c \u0456\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_bad_plugin_version":{"message":"\u0412\u0456\u0434\u0441\u0443\u0442\u043d\u0456 \u0434\u0435\u044f\u043a\u0456 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0456 \u0434\u043b\u044f \u0440\u043e\u0431\u043e\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0443 \u0432\u0435\u0440\u0441\u0456\u044e, \u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_generic":{"message":"\u0421\u0442\u0430\u043b\u0430\u0441\u044f \u043d\u0435\u0432\u0456\u0434\u043e\u043c\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430. \u0412\u0438\u0439\u0434\u0456\u0442\u044c \u0456\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_host_is_offline":{"message":"\u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440 \u043d\u0435 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0430\u0454 \u043d\u0430 \u0437\u0430\u043f\u0438\u0442\u0438 \u043d\u0430 \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u0432\u0456\u043d \u043f\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u043d\u0438\u0439 \u0434\u043e \u043c\u0435\u0440\u0435\u0436\u0456, \u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_incompatible_protocol":{"message":"\u0412\u0438\u044f\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u0443\u043c\u0456\u0441\u043d\u0443 \u0432\u0435\u0440\u0441\u0456\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u043d\u0430 \u043e\u0431\u043e\u0445 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430\u0445 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043d\u0456 \u0432\u0435\u0440\u0441\u0456\u0457 \u0432\u0435\u0431-\u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0430\u0447\u0430 Google Chrome \u0456 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome, \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_invalid_access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043d\u0435 \u0434\u0456\u0439\u0441\u043d\u0438\u0439. \u041f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_missing_plugin":{"message":"\u0412\u0456\u0434\u0441\u0443\u0442\u043d\u0456 \u0434\u0435\u044f\u043a\u0456 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0456 \u0434\u043b\u044f \u0440\u043e\u0431\u043e\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0430 \u0432\u0435\u0440\u0441\u0456\u044f Google Chrome, \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_no_response":{"message":"\u0421\u0435\u0440\u0432\u0435\u0440\u0443 \u043d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0441\u0442\u0438 \u043d\u0430 \u0437\u0430\u043f\u0438\u0442 \u043c\u0435\u0440\u0435\u0436\u0456."},"error_service_unavailable":{"message":"\u0426\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u0442\u0438\u043c\u0447\u0430\u0441\u043e\u0432\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443 \u043f\u0456\u0437\u043d\u0456\u0448\u0435."},"error_unexpected":{"message":"\u0421\u0442\u0430\u043b\u0430\u0441\u044f \u043d\u0435\u043e\u0447\u0456\u043a\u0443\u0432\u0430\u043d\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430. \u041f\u043e\u0432\u0456\u0434\u043e\u043c\u0442\u0435 \u0440\u043e\u0437\u0440\u043e\u0431\u043d\u0438\u043a\u0430\u043c \u043f\u0440\u043e \u0446\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443."},"footer_waiting":{"message":"\u043e\u0447\u0456\u043a\u0443\u0432\u0430\u043d\u043d\u044f \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f..."},"help":{"message":"\u0414\u043e\u0432\u0456\u0434\u043a\u0430"},"home_access_button":{"message":"\u041e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u0440\u0430\u0437"},"home_access_description":{"message":"\u0412\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0442\u0430 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f \u043d\u0438\u043c."},"home_my_computers_title":{"message":"\u041c\u043e\u0457 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0438"},"home_share_button":{"message":"\u041d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f"},"home_share_description":{"message":"\u0414\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0438 \u0456\u043d\u0448\u043e\u043c\u0443 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u0432\u0456 \u0431\u0430\u0447\u0438\u0442\u0438 \u0446\u0435\u0439 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440 \u0456 \u043a\u0435\u0440\u0443\u0432\u0430\u0442\u0438 \u043d\u0438\u043c."},"home_share_description_chrome_os":{"message":"(\u0446\u044f \u0444\u0443\u043d\u043a\u0446\u0456\u044f \u0449\u0435 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f Chromebooks ... \u0441\u0442\u0435\u0436\u0442\u0435 \u0437\u0430 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f\u043c\u0438)"},"instructions_share_above":{"message":"\u0429\u043e\u0431 \u043d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430, \u0443\u043a\u0430\u0436\u0456\u0442\u044c \u043d\u0438\u0436\u0447\u0435 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043b\u044f \u043b\u044e\u0434\u0438\u043d\u0438, \u044f\u043a\u0430 \u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u0442\u0438\u043c\u0435 \u0437 \u0432\u0430\u043c\u0438."},"instructions_share_below":{"message":"\u041f\u0456\u0441\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043a\u043e\u0434\u0443 \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0435\u0442\u044c\u0441\u044f \u0441\u0435\u0430\u043d\u0441 \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0443."},"label_connected":{"message":"\u041f\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u043d\u043e:"},"message_connecting":{"message":"\u041f\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f..."},"message_generating":{"message":"\u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043a\u043e\u0434\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0443..."},"message_session_finished":{"message":"\u0421\u0435\u0430\u043d\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0437\u0430\u043a\u0456\u043d\u0447\u0435\u043d\u043e."},"message_shared":{"message":"\u0412\u0430\u0448 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440 \u0437\u0430\u0440\u0430\u0437 \u0443 \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0456 \u0437 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043c $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0456\u044f"},"mode_connect":{"message":"\u0417\u2019\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"},"mode_share":{"message":"\u041d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f"},"offline":{"message":"\u041e\u0444\u043b\u0430\u0439\u043d"},"ok":{"message":"OK"},"product_description":{"message":"\u041e\u0442\u0440\u0438\u043c\u0443\u0439\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0456\u043d\u0448\u0438\u0445 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0456\u0432 \u0430\u0431\u043e \u043d\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0456\u043d\u0448\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043c \u0431\u0435\u0437\u043f\u0435\u0447\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0406\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"product_name":{"message":"\u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome"},"sign_out_button":{"message":"\u0412\u0438\u0439\u0442\u0438"},"stop_sharing_button":{"message":"\u041f\u0440\u0438\u043f\u0438\u043d\u0438\u0442\u0438 \u043d\u0430\u0434\u0430\u043d\u043d\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443"},"tooltip_scaling":{"message":"\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0437\u0430 \u0440\u043e\u0437\u043c\u0456\u0440\u043e\u043c"},"warning_nat_disabled":{"message":"\u041f\u0420\u0418\u041c\u0406\u0422\u041a\u0410. \u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043f\u043e\u043b\u0456\u0442\u0438\u043a\u0438 \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442\u044c \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u043b\u0438\u0448\u0435 \u0437 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u0443 \u0432\u0430\u0448\u0456\u0439 \u043c\u0435\u0440\u0435\u0436\u0456."}} diff --git a/remoting/webapp/_locales.official/vi/messages.json b/remoting/webapp/_locales.official/vi/messages.json new file mode 100644 index 0000000..9e249bc --- /dev/null +++ b/remoting/webapp/_locales.official/vi/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"M\u00e3 truy c\u1eadp"},"access_code_timer":{"message":"M\u00e3 truy c\u1eadp n\u00e0y s\u1ebd h\u1ebft h\u1ea1n sau $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"H\u1ee7y"},"close_prompt":{"message":"Tho\u00e1t kh\u1ecfi trang n\u00e0y s\u1ebd k\u1ebft th\u00fac phi\u00ean Chrome Remote Desktop c\u1ee7a b\u1ea1n."},"connect_button":{"message":"K\u1ebft n\u1ed1i"},"continue_button":{"message":"Ti\u1ebfp t\u1ee5c"},"continue_prompt":{"message":"B\u1ea1n hi\u1ec7n \u0111ang chia s\u1ebb m\u00e1y n\u00e0y v\u1edbi m\u1ed9t ng\u01b0\u1eddi d\u00f9ng kh\u00e1c. B\u1ea1n c\u00f3 mu\u1ed1n ti\u1ebfp t\u1ee5c chia s\u1ebb kh\u00f4ng?"},"description_authorize":{"message":"\u0110\u1ec3 s\u1eed d\u1ee5ng Chrome Remote Desktop, b\u1ea1n ph\u1ea3i c\u1ea5p c\u00e1c quy\u1ec1n truy c\u1eadp m\u1edf r\u1ed9ng cho m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh. B\u1ea1n ch\u1ec9 ph\u1ea3i th\u1ef1c hi\u1ec7n vi\u1ec7c n\u00e0y m\u1ed9t l\u1ea7n."},"description_connect":{"message":"Y\u00eau c\u1ea7u ng\u01b0\u1eddi d\u00f9ng c\u00f3 m\u00e1y t\u00ednh m\u00e0 b\u1ea1n mu\u1ed1n truy c\u1eadp nh\u1ea5p v\u00e0o \u2018Chia s\u1ebb ngay b\u00e2y gi\u1edd\u2019 v\u00e0 cung c\u1ea5p cho b\u1ea1n m\u00e3 truy c\u1eadp."},"description_home":{"message":"Chrome Remote Desktop cho ph\u00e9p b\u1ea1n chia s\u1ebb m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh m\u1ed9t c\u00e1ch an to\u00e0n qua Web. C\u1ea3 hai ng\u01b0\u1eddi d\u00f9ng \u0111\u1ec1u ph\u1ea3i ch\u1ea1y \u1ee9ng d\u1ee5ng Chrome Remote Desktop m\u00e0 b\u1ea1n c\u00f3 th\u1ec3 t\u00ecm th\u1ea5y t\u1ea1i $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i"},"disconnect_other_button":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i"},"error_authentication_failed":{"message":"X\u00e1c th\u1ef1c kh\u00f4ng th\u00e0nh c\u00f4ng. Vui l\u00f2ng \u0111\u0103ng xu\u1ea5t kh\u1ecfi Chrome Remote Desktop v\u00e0 th\u1eed l\u1ea1i."},"error_bad_plugin_version":{"message":"Thi\u1ebfu m\u1ed9t s\u1ed1 th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft cho Chrome Remote Desktop. Vui l\u00f2ng \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n m\u1edbi nh\u1ea5t v\u00e0 th\u1eed l\u1ea1i."},"error_generic":{"message":"\u0110\u00e3 x\u1ea3y ra l\u1ed7i kh\u00f4ng x\u00e1c \u0111\u1ecbnh. Vui l\u00f2ng \u0111\u0103ng xu\u1ea5t kh\u1ecfi Chrome Remote Desktop v\u00e0 th\u1eed l\u1ea1i."},"error_host_is_offline":{"message":"M\u00e1y t\u00ednh t\u1eeb xa kh\u00f4ng ph\u1ea3n h\u1ed3i y\u00eau c\u1ea7u k\u1ebft n\u1ed1i. Vui l\u00f2ng x\u00e1c minh r\u1eb1ng m\u00e1y t\u00ednh \u0111ang tr\u1ef1c tuy\u1ebfn v\u00e0 th\u1eed l\u1ea1i."},"error_incompatible_protocol":{"message":"\u0110\u00e3 ph\u00e1t hi\u1ec7n ra phi\u00ean b\u1ea3n Chrome Remote Desktop kh\u00f4ng t\u01b0\u01a1ng th\u00edch. Vui l\u00f2ng \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n Google Chrome v\u00e0 Chrome Remote Desktop m\u1edbi nh\u1ea5t tr\u00ean c\u1ea3 hai m\u00e1y t\u00ednh v\u00e0 th\u1eed l\u1ea1i."},"error_invalid_access_code":{"message":"M\u00e3 truy c\u1eadp kh\u00f4ng h\u1ee3p l\u1ec7. Vui l\u00f2ng th\u1eed l\u1ea1i."},"error_missing_plugin":{"message":"Thi\u1ebfu m\u1ed9t s\u1ed1 th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft cho Chrome Remote Desktop. Vui l\u00f2ng \u0111\u1ea3m b\u1ea3o b\u1ea1n \u0111ang ch\u1ea1y phi\u00ean b\u1ea3n Google Chrome m\u1edbi nh\u1ea5t v\u00e0 th\u1eed l\u1ea1i."},"error_no_response":{"message":"M\u00e1y ch\u1ee7 kh\u00f4ng ph\u1ea3n h\u1ed3i y\u00eau c\u1ea7u m\u1ea1ng."},"error_service_unavailable":{"message":"D\u1ecbch v\u1ee5 t\u1ea1m th\u1eddi kh\u00f4ng kh\u1ea3 d\u1ee5ng. Vui l\u00f2ng th\u1eed l\u1ea1i sau."},"error_unexpected":{"message":"\u0110\u00e3 x\u1ea3y ra l\u1ed7i kh\u00f4ng mong mu\u1ed1n. Vui l\u00f2ng b\u00e1o c\u00e1o v\u1ea5n \u0111\u1ec1 n\u00e0y cho nh\u00e0 ph\u00e1t tri\u1ec3n."},"footer_waiting":{"message":"\u0111ang \u0111\u1ee3i k\u1ebft n\u1ed1i\u2026"},"help":{"message":"Tr\u1ee3 gi\u00fap"},"home_access_button":{"message":"Truy c\u1eadp ngay b\u00e2y gi\u1edd"},"home_access_description":{"message":"Xem v\u00e0 ki\u1ec3m so\u00e1t m\u00e1y t\u00ednh d\u00f9ng chung."},"home_my_computers_title":{"message":"M\u00e1y t\u00ednh c\u1ee7a t\u00f4i"},"home_share_button":{"message":"Chia s\u1ebb ngay b\u00e2y gi\u1edd"},"home_share_description":{"message":"Chia s\u1ebb m\u00e1y t\u00ednh n\u00e0y \u0111\u1ec3 ng\u01b0\u1eddi d\u00f9ng kh\u00e1c xem v\u00e0 ki\u1ec3m so\u00e1t."},"home_share_description_chrome_os":{"message":"(t\u00ednh n\u0103ng n\u00e0y ch\u01b0a kh\u1ea3 d\u1ee5ng \u0111\u1ed1i v\u1edbi Chromebook\u2026 h\u00e3y ch\u00fa \u00fd theo d\u00f5i)"},"instructions_share_above":{"message":"\u0110\u1ec3 b\u1eaft \u0111\u1ea7u chia s\u1ebb m\u00e1y t\u00ednh c\u1ee7a b\u1ea1n, h\u00e3y cung c\u1ea5p m\u00e3 truy c\u1eadp b\u00ean d\u01b0\u1edbi cho ng\u01b0\u1eddi s\u1ebd tr\u1ee3 gi\u00fap b\u1ea1n."},"instructions_share_below":{"message":"Sau khi h\u1ecd nh\u1eadp m\u00e3, phi\u00ean chia s\u1ebb c\u1ee7a b\u1ea1n s\u1ebd b\u1eaft \u0111\u1ea7u."},"label_connected":{"message":"\u0110\u00e3 k\u1ebft n\u1ed1i:"},"message_connecting":{"message":"\u0110ang k\u1ebft n\u1ed1i..."},"message_generating":{"message":"\u0110ang t\u1ea1o m\u00e3 truy c\u00e2\u0323p\u2026"},"message_session_finished":{"message":"Phi\u00ean Chrome Remote Desktop c\u1ee7a b\u1ea1n \u0111\u00e3 k\u1ebft th\u00fac."},"message_shared":{"message":"M\u00e1y t\u00ednh c\u1ee7a b\u1ea1n hi\u1ec7n \u0111ang \u0111\u01b0\u1ee3c chia s\u1ebb v\u1edbi $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Cho ph\u00e9p"},"mode_connect":{"message":"K\u1ebft n\u1ed1i"},"mode_share":{"message":"Chia s\u1ebb"},"offline":{"message":"Ngo\u1ea1i tuy\u1ebfn"},"ok":{"message":"OK"},"product_description":{"message":"Truy c\u1eadp m\u00e1y t\u00ednh kh\u00e1c ho\u1eb7c cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng kh\u00e1c truy c\u1eadp m\u00e1y t\u00ednh c\u1ee7a b\u1ea1n m\u1ed9t c\u00e1ch an to\u00e0n qua Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u0110\u0103ng xu\u1ea5t"},"stop_sharing_button":{"message":"Ng\u1eebng chia s\u1ebb"},"tooltip_scaling":{"message":"Ch\u1ec9nh t\u1ef7 l\u1ec7 cho v\u1eeba"},"warning_nat_disabled":{"message":"L\u01afU \u00dd: C\u00e0i \u0111\u1eb7t ch\u00ednh s\u00e1ch ch\u1ec9 cho ph\u00e9p k\u1ebft n\u1ed1i gi\u1eefa c\u00e1c m\u00e1y t\u00ednh trong m\u1ea1ng c\u1ee7a b\u1ea1n."}} diff --git a/remoting/webapp/_locales.official/zh_CN/messages.json b/remoting/webapp/_locales.official/zh_CN/messages.json new file mode 100644 index 0000000..b3fabd2 --- /dev/null +++ b/remoting/webapp/_locales.official/zh_CN/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u8bbf\u95ee\u4ee3\u7801"},"access_code_timer":{"message":"\u6b64\u8bbf\u95ee\u4ee3\u7801\u5c06\u5728 $1 \u540e\u8fc7\u671f\u3002","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u53d6\u6d88"},"close_prompt":{"message":"\u79bb\u5f00\u6b64\u9875\u4f1a\u7ed3\u675f\u60a8\u7684 Chrome \u8fdc\u7a0b\u684c\u9762\u4f1a\u8bdd\u3002"},"connect_button":{"message":"\u8fde\u63a5"},"continue_button":{"message":"\u7ee7\u7eed"},"continue_prompt":{"message":"\u60a8\u76ee\u524d\u6b63\u5728\u4e0e\u5176\u4ed6\u7528\u6237\u5171\u4eab\u6b64\u8ba1\u7b97\u673a\u3002\u60a8\u5e0c\u671b\u7ee7\u7eed\u5171\u4eab\u5417\uff1f"},"description_authorize":{"message":"\u8981\u4f7f\u7528 Chrome \u8fdc\u7a0b\u684c\u9762\uff0c\u60a8\u5fc5\u987b\u5411\u60a8\u7684\u8ba1\u7b97\u673a\u6388\u4e88\u66f4\u591a\u8bbf\u95ee\u6743\u9650\u3002\u6b64\u64cd\u4f5c\u53ea\u9700\u6267\u884c\u4e00\u6b21\u3002"},"description_connect":{"message":"\u8ba9\u60a8\u60f3\u8981\u8bbf\u95ee\u7684\u8ba1\u7b97\u673a\u7684\u4f7f\u7528\u8005\u70b9\u51fb\u201c\u7acb\u5373\u5171\u4eab\u201d\uff0c\u7136\u540e\u544a\u8bc9\u60a8\u8bbf\u95ee\u4ee3\u7801\u3002"},"description_home":{"message":"Chrome \u8fdc\u7a0b\u684c\u9762\u53ef\u8ba9\u60a8\u901a\u8fc7\u7f51\u7edc\u5b89\u5168\u5730\u5171\u4eab\u60a8\u7684\u8ba1\u7b97\u673a\u3002\u4e24\u4e2a\u7528\u6237\u5fc5\u987b\u540c\u65f6\u8fd0\u884c Chrome \u8fdc\u7a0b\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\u3002\u8981\u4e0b\u8f7d\u8be5\u5e94\u7528\u7a0b\u5e8f\uff0c\u8bf7\u8bbf\u95ee $1\u3002","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u65ad\u5f00\u8fde\u63a5 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u65ad\u5f00\u8fde\u63a5 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u65ad\u5f00\u8fde\u63a5 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u65ad\u5f00\u8fde\u63a5"},"disconnect_other_button":{"message":"\u65ad\u5f00\u8fde\u63a5"},"error_authentication_failed":{"message":"\u8eab\u4efd\u9a8c\u8bc1\u5931\u8d25\u3002\u8bf7\u9000\u51fa Chrome \u8fdc\u7a0b\u684c\u9762\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_bad_plugin_version":{"message":"\u7f3a\u5c11 Chrome \u8fdc\u7a0b\u684c\u9762\u6240\u9700\u7684\u67d0\u4e9b\u7ec4\u4ef6\u3002\u8bf7\u786e\u4fdd\u60a8\u5df2\u5b89\u88c5\u6700\u65b0\u7248\u672c\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_generic":{"message":"\u53d1\u751f\u672a\u77e5\u9519\u8bef\u3002\u8bf7\u9000\u51fa Chrome \u8fdc\u7a0b\u684c\u9762\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_host_is_offline":{"message":"\u8fdc\u7a0b\u8ba1\u7b97\u673a\u6ca1\u6709\u5bf9\u8fde\u63a5\u8bf7\u6c42\u505a\u51fa\u54cd\u5e94\u3002\u8bf7\u786e\u4fdd\u5176\u5728\u7ebf\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_incompatible_protocol":{"message":"\u68c0\u6d4b\u5230\u4e00\u4e2a\u4e0d\u517c\u5bb9\u7684 Chrome \u8fdc\u7a0b\u684c\u9762\u7248\u672c\u3002\u8bf7\u786e\u4fdd\u4e24\u53f0\u8ba1\u7b97\u673a\u4e0a\u4f7f\u7528\u7684 Google Chrome \u6d4f\u89c8\u5668\u548c Chrome \u8fdc\u7a0b\u684c\u9762\u90fd\u662f\u6700\u65b0\u7248\u672c\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_invalid_access_code":{"message":"\u8bbf\u95ee\u4ee3\u7801\u65e0\u6548\uff0c\u8bf7\u91cd\u8bd5\u3002"},"error_missing_plugin":{"message":"\u7f3a\u5c11 Chrome \u8fdc\u7a0b\u684c\u9762\u6240\u9700\u7684\u67d0\u4e9b\u7ec4\u4ef6\u3002\u8bf7\u786e\u4fdd\u60a8\u6240\u8fd0\u884c\u7684\u662f Google Chrome \u6d4f\u89c8\u5668\u7684\u6700\u65b0\u7248\u672c\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_no_response":{"message":"\u670d\u52a1\u5668\u65e0\u6cd5\u54cd\u5e94\u7f51\u7edc\u8bf7\u6c42\u3002"},"error_service_unavailable":{"message":"\u6b64\u670d\u52a1\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002"},"error_unexpected":{"message":"\u53d1\u751f\u610f\u5916\u9519\u8bef\u3002\u8bf7\u5c06\u6b64\u95ee\u9898\u62a5\u544a\u7ed9\u5f00\u53d1\u4eba\u5458\u3002"},"footer_waiting":{"message":"\u6b63\u5728\u7b49\u5f85\u5efa\u7acb\u8fde\u63a5..."},"help":{"message":"\u5e2e\u52a9"},"home_access_button":{"message":"\u7acb\u5373\u8bbf\u95ee"},"home_access_description":{"message":"\u67e5\u770b\u548c\u63a7\u5236\u5171\u4eab\u7684\u8ba1\u7b97\u673a\u3002"},"home_my_computers_title":{"message":"\u6211\u7684\u8ba1\u7b97\u673a"},"home_share_button":{"message":"\u7acb\u5373\u5171\u4eab"},"home_share_description":{"message":"\u5171\u4eab\u6b64\u8ba1\u7b97\u673a\u4ee5\u4f9b\u5176\u4ed6\u7528\u6237\u67e5\u770b\u548c\u63a7\u5236\u3002"},"home_share_description_chrome_os":{"message":"\uff08Chromebook \u5c1a\u4e0d\u652f\u6301\u6b64\u529f\u80fd...\u656c\u8bf7\u671f\u5f85\uff09"},"instructions_share_above":{"message":"\u8981\u5f00\u59cb\u5171\u4eab\u60a8\u7684\u684c\u9762\uff0c\u8bf7\u5c06\u4e0b\u9762\u7684\u8bbf\u95ee\u4ee3\u7801\u63d0\u4f9b\u7ed9\u534f\u52a9\u60a8\u7684\u4eba\u5458\u3002"},"instructions_share_below":{"message":"\u4ed6\u4eec\u8f93\u5165\u8bbf\u95ee\u4ee3\u7801\u540e\uff0c\u60a8\u7684\u5171\u4eab\u4f1a\u8bdd\u5c31\u4f1a\u7acb\u5373\u5f00\u59cb\u3002"},"label_connected":{"message":"\u5df2\u8fde\u63a5\uff1a"},"message_connecting":{"message":"\u6b63\u5728\u8fde\u63a5..."},"message_generating":{"message":"\u6b63\u5728\u751f\u6210\u8bbf\u95ee\u4ee3\u7801..."},"message_session_finished":{"message":"\u60a8\u7684 Chrome \u8fdc\u7a0b\u684c\u9762\u4f1a\u8bdd\u5df2\u7ed3\u675f\u3002"},"message_shared":{"message":"\u60a8\u76ee\u524d\u6b63\u4e0e $1 \u5171\u4eab\u60a8\u7684\u684c\u9762\u3002","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u6388\u6743"},"mode_connect":{"message":"\u8fde\u63a5"},"mode_share":{"message":"\u5171\u4eab"},"offline":{"message":"\u79bb\u7ebf"},"ok":{"message":"\u786e\u5b9a"},"product_description":{"message":"\u8bbf\u95ee\u5176\u4ed6\u8ba1\u7b97\u673a\u6216\u5141\u8bb8\u5176\u4ed6\u7528\u6237\u901a\u8fc7\u4e92\u8054\u7f51\u5b89\u5168\u5730\u8bbf\u95ee\u60a8\u7684\u8ba1\u7b97\u673a\u3002"},"product_name":{"message":"Chrome \u8fdc\u7a0b\u684c\u9762"},"sign_out_button":{"message":"\u9000\u51fa"},"stop_sharing_button":{"message":"\u505c\u6b62\u5171\u4eab"},"tooltip_scaling":{"message":"\u7f29\u653e\u81f3\u9002\u5408\u7684\u6bd4\u4f8b"},"warning_nat_disabled":{"message":"\u6ce8\u610f\uff1a\u7b56\u7565\u8bbe\u7f6e\u4ec5\u5141\u8bb8\u60a8\u7f51\u7edc\u5185\u7684\u8ba1\u7b97\u673a\u4e4b\u95f4\u5efa\u7acb\u8fde\u63a5\u3002"}} diff --git a/remoting/webapp/_locales.official/zh_TW/messages.json b/remoting/webapp/_locales.official/zh_TW/messages.json new file mode 100644 index 0000000..33d4129 --- /dev/null +++ b/remoting/webapp/_locales.official/zh_TW/messages.json @@ -0,0 +1 @@ +{"access_code":{"message":"\u5b58\u53d6\u78bc"},"access_code_timer":{"message":"\u9019\u500b\u5b58\u53d6\u78bc\u5c07\u65bc $1 \u5f8c\u5931\u6548","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u53d6\u6d88"},"close_prompt":{"message":"\u5982\u679c\u96e2\u958b\u9019\u500b\u9801\u9762\uff0c\u60a8\u7684\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u5de5\u4f5c\u968e\u6bb5\u4e5f\u6703\u7d50\u675f\u3002"},"connect_button":{"message":"\u9023\u7dda"},"continue_button":{"message":"\u7e7c\u7e8c"},"continue_prompt":{"message":"\u60a8\u76ee\u524d\u8207\u53e6\u4e00\u4f4d\u4f7f\u7528\u8005\u5171\u7528\u9019\u53f0\u96fb\u8166\uff0c\u60a8\u8981\u7e7c\u7e8c\u5171\u7528\u55ce\uff1f"},"description_authorize":{"message":"\u5982\u8981\u4f7f\u7528\u300cChrome \u9060\u7aef\u684c\u9762\u300d\uff0c\u60a8\u5fc5\u9808\u5c07\u96fb\u8166\u7684\u5ef6\u4f38\u5b58\u53d6\u6b0a\u9650\u6388\u4e88\u8a72\u61c9\u7528\u7a0b\u5f0f\uff0c\u9019\u500b\u6b65\u9a5f\u53ea\u9700\u57f7\u884c\u4e00\u6b21\u3002"},"description_connect":{"message":"\u8207\u60a8\u8981\u9023\u7dda\u7684\u96fb\u8166\u6240\u5c6c\u4f7f\u7528\u8005\u806f\u7d61\uff0c\u8981\u6c42\u5c0d\u65b9\u6309\u4e00\u4e0b [\u7acb\u5373\u5171\u7528]\uff0c\u4e26\u544a\u77e5\u60a8\u5b58\u53d6\u78bc\u3002"},"description_home":{"message":"\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u63d0\u4f9b\u4e86\u4e00\u500b\u5b89\u5168\u7684\u6a5f\u5236\uff0c\u8b93\u60a8\u900f\u904e\u7db2\u8def\u8207\u4ed6\u4eba\u5171\u7528\u81ea\u5df1\u7684\u96fb\u8166\u3002\u60a8\u548c\u5171\u7528\u5c0d\u8c61\u90fd\u5fc5\u9808\u57f7\u884c\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u61c9\u7528\u7a0b\u5f0f\uff0c\u8acb\u524d\u5f80 $1 \u5b89\u88dd\u3002","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u4e2d\u65b7\u9023\u7dda (Ctrl+Alt+Esc \u9375)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u4e2d\u65b7\u9023\u7dda (Opt+Ctrl+Esc \u9375)"},"disconnect_button_plus_shortcut_windows":{"message":"\u4e2d\u65b7\u9023\u7dda (Ctrl+Alt+Esc \u9375)"},"disconnect_myself_button":{"message":"\u4e2d\u65b7\u9023\u7dda"},"disconnect_other_button":{"message":"\u4e2d\u65b7\u9023\u7dda"},"error_authentication_failed":{"message":"\u9a57\u8b49\u5931\u6557\u3002\u8acb\u767b\u51fa\u300cChrome \u9060\u7aef\u684c\u9762\u300d\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_bad_plugin_version":{"message":"\u627e\u4e0d\u5230\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u6240\u9700\u7684\u90e8\u5206\u5143\u4ef6\u3002\u8acb\u78ba\u8a8d\u60a8\u5df2\u5b89\u88dd\u6700\u65b0\u7248\u672c\u7684 Google Chrome\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_generic":{"message":"\u767c\u751f\u4e0d\u660e\u932f\u8aa4\u3002\u8acb\u767b\u51fa\u300cChrome \u9060\u7aef\u684c\u9762\u300d\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_host_is_offline":{"message":"\u9060\u7aef\u96fb\u8166\u672a\u56de\u61c9\u60a8\u7684\u9023\u7dda\u8981\u6c42\u3002\u8acb\u78ba\u8a8d\u9060\u7aef\u96fb\u8166\u5df2\u5728\u7dda\u4e0a\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_incompatible_protocol":{"message":"\u5075\u6e2c\u5230\u4e0d\u76f8\u5bb9\u7684\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u7248\u672c\u3002\u8acb\u78ba\u8a8d\u60a8\u8207\u5171\u7528\u5c0d\u8c61\u7684\u96fb\u8166\u5747\u4f7f\u7528\u6700\u65b0\u7248\u672c\u7684 Google Chrome\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_invalid_access_code":{"message":"\u5b58\u53d6\u78bc\u7121\u6548\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002"},"error_missing_plugin":{"message":"\u627e\u4e0d\u5230\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u6240\u9700\u7684\u90e8\u5206\u5143\u4ef6\u3002\u8acb\u78ba\u8a8d\u60a8\u57f7\u884c\u7684\u662f\u6700\u65b0\u7248\u672c\u7684 Google Chrome\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_no_response":{"message":"\u4f3a\u670d\u5668\u7121\u6cd5\u56de\u61c9\u7db2\u8def\u8981\u6c42\u3002"},"error_service_unavailable":{"message":"\u9019\u9805\u670d\u52d9\u66ab\u6642\u7121\u6cd5\u4f7f\u7528\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\u3002"},"error_unexpected":{"message":"\u767c\u751f\u672a\u9810\u671f\u7684\u932f\u8aa4\uff0c\u8acb\u5411\u958b\u767c\u4eba\u54e1\u56de\u5831\u9019\u500b\u554f\u984c\u3002"},"footer_waiting":{"message":"\u6b63\u5728\u7b49\u5f85\u9023\u7dda\u2026"},"help":{"message":"\u8aaa\u660e"},"home_access_button":{"message":"\u7acb\u5373\u5b58\u53d6"},"home_access_description":{"message":"\u700f\u89bd\u53ca\u64cd\u4f5c\u5171\u7528\u7684\u96fb\u8166\u3002"},"home_my_computers_title":{"message":"\u6211\u7684\u96fb\u8166"},"home_share_button":{"message":"\u7acb\u5373\u5171\u7528"},"home_share_description":{"message":"\u5171\u7528\u9019\u53f0\u96fb\u8166\uff0c\u958b\u653e\u7d66\u5176\u4ed6\u4f7f\u7528\u8005\u700f\u89bd\u53ca\u64cd\u4f5c\u3002"},"home_share_description_chrome_os":{"message":"(Chromebook \u76ee\u524d\u66ab\u4e0d\u652f\u63f4\u9019\u9805\u529f\u80fd ... \u656c\u8acb\u5bc6\u5207\u6ce8\u610f\u5f8c\u7e8c\u6d88\u606f)"},"instructions_share_above":{"message":"\u5982\u8981\u958b\u59cb\u5171\u7528\u60a8\u7684\u96fb\u8166\uff0c\u8acb\u5c07\u4e0b\u65b9\u7684\u5b58\u53d6\u78bc\u544a\u77e5\u8981\u5354\u52a9\u60a8\u7684\u4eba\u54e1\u3002"},"instructions_share_below":{"message":"\u5c0d\u65b9\u8f38\u5165\u5b58\u53d6\u78bc\u4e4b\u5f8c\uff0c\u5171\u7528\u5de5\u4f5c\u968e\u6bb5\u96a8\u5373\u958b\u59cb\u3002"},"label_connected":{"message":"\u5df2\u9023\u7dda\u7684\u96fb\u8166\uff1a"},"message_connecting":{"message":"\u9023\u7dda\u4e2d..."},"message_generating":{"message":"\u6b63\u5728\u7522\u751f\u5b58\u53d6\u78bc\u2026"},"message_session_finished":{"message":"\u60a8\u7684\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u5de5\u4f5c\u968e\u6bb5\u5df2\u7d50\u675f\u3002"},"message_shared":{"message":"\u60a8\u76ee\u524d\u8207 $1 \u5171\u7528\u96fb\u8166\u3002","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u6388\u6b0a"},"mode_connect":{"message":"\u9023\u7dda"},"mode_share":{"message":"\u5171\u7528"},"offline":{"message":"\u96e2\u7dda"},"ok":{"message":"\u78ba\u5b9a"},"product_description":{"message":"\u5728\u5b89\u5168\u7684\u9023\u7dda\u6a5f\u5236\u4e0b\uff0c\u900f\u904e\u7db2\u969b\u7db2\u8def\u5b58\u53d6\u5176\u4ed6\u96fb\u8166\uff0c\u6216\u662f\u5141\u8a31\u5176\u4ed6\u4f7f\u7528\u8005\u5b58\u53d6\u60a8\u7684\u96fb\u8166\u3002"},"product_name":{"message":"Chrome \u9060\u7aef\u684c\u9762"},"sign_out_button":{"message":"\u767b\u51fa"},"stop_sharing_button":{"message":"\u505c\u6b62\u5171\u7528"},"tooltip_scaling":{"message":"\u6309\u9069\u7576\u6bd4\u4f8b\u7e2e\u653e"},"warning_nat_disabled":{"message":"\u6ce8\u610f\uff1a\u653f\u7b56\u8a2d\u5b9a\u50c5\u5141\u8a31\u60a8\u7db2\u8def\u4e2d\u7684\u96fb\u8166\u76f8\u4e92\u9023\u7dda\u3002"}} diff --git a/remoting/webapp/_locales/en/messages.json b/remoting/webapp/_locales/en/messages.json new file mode 100644 index 0000000..fa9613d --- /dev/null +++ b/remoting/webapp/_locales/en/messages.json @@ -0,0 +1,228 @@ +{ + "ACCESS_CODE": { + "message": "Access code", + "description": "Label for the access code entry box. This is where the client user enters the code that permits access to the host." + }, + "ACCESS_CODE_TIMER": { + "message": "This access code will expire in $timeout$", + "description": "Text displayed when the access code is due to time out within 30 seconds.", + "placeholders": { + "timeout": { + "content": "$1", + "example": "0:30" + } + } + }, + "CANCEL": { + "message": "Cancel", + "description": "Label for general-purpose Cancel buttons." + }, + "CLOSE_PROMPT": { + "message": "Leaving this page will end your Chromoting session.", + "description": "Message shown when the Chromoting client tab is closed while a connection is active." + }, + "CONNECT_BUTTON": { + "message": "Connect", + "description": "Label for the connect button. Clicking this button will start the Chromoting session if the access code is correct." + }, + "CONTINUE_BUTTON": { + "message": "Continue", + "description": "Label for the continue button on the pre-authorization page. Clicking this button takes the user to the standard Google Accounts authorization page." + }, + "CONTINUE_PROMPT": { + "message": "You are currently sharing this machine with another user. Do you want to continue sharing?", + "description": "Message displayed when the session has lasted longer than five minutes, explaining that the host computer is being shared and asking whether or not the user wants to continue sharing it." + }, + "DESCRIPTION_AUTHORIZE": { + "message": "To use Chromoting you must grant extended access permissions to your computer. You only have to do this once.", + "description": "Text shown when the app first starts, or if the access token is invalidated, explaining the need to authorize the Chromoting app before use." + }, + "DESCRIPTION_CONNECT": { + "message": "Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code.", + "description": "Description for the client app. This is shown to the client user above the access code entry box before the connection is started. Note that the 'Share Now' quote should be copied verbatim from the corresponding translation." + }, + "DESCRIPTION_HOME": { + "message": "Chromoting allows you to securely share your computer over the Web. Both users must be running the Chromoting app, which can be found at $url$.", + "description": "Description for the home screen. This is shown when the app starts up, above buttons to share or connect.", + "placeholders": { + "url": { + "content": "$1", + "example": "g.co/remote" + } + } + }, + "DISCONNECT_BUTTON_PLUS_SHORTCUT_LINUX": { + "message": "Disconnect (Ctrl+Alt+Esc)", + "description": "Label for the disconnect button including the Linux keyboard shortcut. Clicking this button disconnects the remote user." + }, + "DISCONNECT_BUTTON_PLUS_SHORTCUT_MAC_OS_X": { + "message": "Disconnect (Opt+Ctrl+Esc)", + "description": "Label for the disconnect button including the Mac OS X keyboard shortcut. Clicking this button disconnects the remote user." + }, + "DISCONNECT_BUTTON_PLUS_SHORTCUT_WINDOWS": { + "message": "Disconnect (Ctrl+Alt+Esc)", + "description": "Label for the disconnect button including the Windows keyboard shortcut. Clicking this button disconnects the remote user." + }, + "DISCONNECT_MYSELF_BUTTON": { + "message": "Disconnect", + "description": "Label for the client-side disconnect button. Clicking this button disconnects oneself from the host." + }, + "DISCONNECT_OTHER_BUTTON": { + "message": "Disconnect", + "description": "Label for the host-side disconnect button, without keyboard shortcuts. Only used in case we aren't able to enable hot-key support. Clicking this button disconnects the remote user." + }, + "ERROR_AUTHENTICATION_FAILED": { + "message": "Authentication failed. Please sign out of Chromoting and try again.", + "description": "Error displayed if authentication fails. This can be caused by stale credentials, in which logging out of the web-app and retrying can fix the problem." + }, + "ERROR_BAD_PLUGIN_VERSION": { + "message": "Some components required for Chromoting are missing. Please make sure you have installed the latest version and try again.", + "description": "Error displayed if the host or client plugin are missing or if they could not be loaded." + }, + "ERROR_GENERIC": { + "message": "An unknown error occurred. Please sign out of Chromoting and try again.", + "description": "Generic error message, displayed if something went wrong, but we aren't able to determine what, or the cause is too technical to be of use to a typical user." + }, + "ERROR_HOST_IS_OFFLINE": { + "message": "The remote computer is not responding to connection requests. Please verify that it is online and try again.", + "description": "Error that is shown on the client side when we don't get a response from the host." + }, + "ERROR_INCOMPATIBLE_PROTOCOL": { + "message": "An incompatible version of Chromoting was detected. Please make sure that you have the latest version of Chromium and Chromoting on both computers and try again.", + "description": "Error that is shown on the client side when incompatible Chromoting versions are installed on host and client." + }, + "ERROR_INVALID_ACCESS_CODE": { + "message": "The access code is invalid. Please try again.", + "description": "Error displayed if an invalid access code is entered." + }, + "ERROR_MISSING_PLUGIN": { + "message": "Some components required for Chromoting are missing. Please make sure you're running the latest version of Chromium and try again.", + "description": "Error displayed if the client plugin fails to load." + }, + "ERROR_NO_RESPONSE": { + "message": "The server failed to respond to the network request.", + "description": "Error displayed by the client if the server does not respond to a network request." + }, + "ERROR_SERVICE_UNAVAILABLE": { + "message": "The service is temporarily unavailable. Please try again later.", + "description": "Error displayed when the service returns a 503 error. Such errors are usually temporary, and resolve themselves in about 30 seconds." + }, + "ERROR_UNEXPECTED": { + "message": "An unexpected error occurred. Please report this problem to the developers.", + "description": "Error displayed in situations where things go wrong in ways not anticipated by the developers. There is typically no user-workaround to suggest, other than reporting the error so that we can investigate further." + }, + "FOOTER_WAITING": { + "message": "waiting for connection\u2026", + "description": "Footer text displayed at the host after an access code has been generated, but before a client connects." + }, + "HELP": { + "message": "Help", + "description": "Help link, displayed in the top-left (assuming ltr layout) corner of the main screen. Clicking this takes the user to our FAQ." + }, + "HOME_ACCESS_BUTTON": { + "message": "Access Now", + "description": "Clicking this button starts the desktop access process." + }, + "HOME_ACCESS_DESCRIPTION": { + "message": "See and control a shared computer.", + "description": "Description of the 'access' or 'client' functionality, displayed next to a button that instigates an access operation." + }, + "HOME_MY_COMPUTERS_TITLE": { + "message": "My Computers", + "description": "Title for the portion of the home page showing the list of hosts the user has previously registered for remote access at any time." + }, + "HOME_SHARE_BUTTON": { + "message": "Share Now", + "description": "Clicking this button starts the desktop sharing process." + }, + "HOME_SHARE_DESCRIPTION": { + "message": "Share this computer for another user to see and control.", + "description": "Description of the 'share' or 'host' functionality, displayed next to a button that instigates a share operation." + }, + "HOME_SHARE_DESCRIPTION_CHROME_OS": { + "message": "(this feature is not yet available for Chromebooks\u2026 stay tuned)", + "description": "Text displayed below the description of the 'share' or 'host' functionality on ChromeOS devices, where it is not yet supported." + }, + "INSTRUCTIONS_SHARE_ABOVE": { + "message": "To begin sharing your desktop, give the access code below to the person who will be assisting you.", + "description": "Instructions shown above the access code when it is ready to be conveyed to the client." + }, + "INSTRUCTIONS_SHARE_BELOW": { + "message": "Once they enter the code your sharing session will begin.", + "description": "Instructions shown below the access code when it is ready to be conveyed to the client." + }, + "LABEL_CONNECTED": { + "message": "Connected:", + "description": "String displayed in front of the host when a connection is active informing the client user who they are connected to." + }, + "MESSAGE_CONNECTING": { + "message": "Connecting\u2026", + "description": "Message displayed on the client while a connection to the host is being established." + }, + "MESSAGE_GENERATING": { + "message": "Generating access code\u2026", + "description": "Text shown while generating an access code." + }, + "MESSAGE_SESSION_FINISHED": { + "message": "Your Chromoting session has ended.", + "description": "Message displayed when the client or host has disconnected." + }, + "MESSAGE_SHARED": { + "message": "Your desktop is currently being shared with $user$.", + "description": "Message shown on the host computer while a session is active informing them who is connected.", + "placeholders": { + "user": { + "content": "$1", + "example": "user@domain.com" + } + } + }, + "MODE_AUTHORIZE": { + "message": "Authorize", + "description": "Sub-title for the one-time authorization step. Displayed after the product name and separated by a chevron." + }, + "MODE_CONNECT": { + "message": "Connect", + "description": "Sub-title for the client app. Displayed after the product name and separated by a chevron." + }, + "MODE_SHARE": { + "message": "Share", + "description": "Sub-title for the host app. Displayed after the product name and separated by a chevron." + }, + "OK": { + "message": "OK", + "description": "Label for general-purpose OK buttons." + }, + "OFFLINE": { + "message": "Offline", + "description": "Label indicating that a host in the list is not currently available for remote access." + }, + "PIN": { + "message": "PIN", + "description": "Label for the PIN entry box." + }, + "PRODUCT_DESCRIPTION": { + "message": "Access other computers or allow another user to access your computer securely over the Internet.", + "description": "Web-app description. Displayed in Chromium's extensions page." + }, + "PRODUCT_NAME": { + "message": "Chromoting", + "description": "The product name. Displayed in various Chromium pages, including the New Tab page, and displayed prominently on the app's main page." + }, + "SIGN_OUT_BUTTON": { + "message": "Sign out", + "description": "Sign out button, visible if the user has authenticated. Clicking this clears authentication credentials and returns the web-app to the initial 'unauthenticated' state." + }, + "STOP_SHARING_BUTTON": { + "message": "Stop Sharing", + "description": "Label for the 'stop sharing' button on the host-side. Clicking this button disconnects the client." + }, + "TOOLTIP_SCALING": { + "message": "Scale to fit", + "description": "The tool-tip shown when the user hovers over the scale to fit button. Clicking this button toggles between scaling down the remote desktop to fit it inside the Chromium browser window and displaying it at 1:1 scale." + }, + "WARNING_NAT_DISABLED": { + "message": "NOTE: Policy settings permit connections only between computers within your network.", + "description": "Message displayed at the bottom of the host screen if local policy dictates that NAT traversal is disabled, meaning that connections outside the local network will not work." + } +} diff --git a/remoting/webapp/choice.css b/remoting/webapp/choice.css new file mode 100644 index 0000000..4c75c89 --- /dev/null +++ b/remoting/webapp/choice.css @@ -0,0 +1,375 @@ +/* Copyright (c) 2011 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Elements */ +a { + color: rgb(0, 102, 204); + text-decoration: none; +} + +body { + background: -webkit-gradient(radial, center center, 0, center center, 400, + from(rgb(254, 254, 254)), + to(rgb(239, 239, 239))); + font-family: 'Open sans', Arial, sans-serif; + margin:0; + padding:0; + direction: __MSG_@@bidi_dir__; +} + +button, input { + font-family: inherit; + font-size: inherit; +} + +button { + background: -webkit-linear-gradient(#fafafa, #f4f4f4 40%, #e5e5e5); + border: 1px solid #aaa; + min-width: 72px; + -webkit-border-radius: 2px; + -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1); + -webkit-user-select: none; +} + +button:hover { + background: #ebebeb -webkit-linear-gradient(#fefefe, #f8f8f8 40%, #e9e9e9); + border-color: #999; + color: #222; + -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); +} + +button:active, .toggle-button-active, .toggle-button-active:hover { + background: #ebebeb -webkit-linear-gradient(#f4f4f4, #efefef 40%, #dcdcdc); + color: #333; + -webkit-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.2); +} + +button[disabled], .button[disabled]:hover { + background: -webkit-linear-gradient(#fafafa, #f4f4f4 40%, #e5e5e5); + border-color: #aaa; + color: #888; + -webkit-box-shadow: none; +} + +h1 { + font-size: 24px; + font-weight: normal; +} + +label { + color: black; + font-weight: bold; +} + +/* Classes */ + +.access-code-digit-group { + /* + Used for each of the four-digit components of the access code as + displayed by the host. + */ + padding: 0px 6px; +} + +.big-button { + height: 2em; + font-size: 16px; + padding: 6px; +} + +.centered-button { + /* + Used to force buttons to center correctly on Chrome due to a quirk + with laying out buttons. http://crbug.com/84654 + + TODO(ajwong): Either fix Chrome layout behavior, or if Chrome is actually + conforming correctly to the standard, remove this comment. + */ + text-align: center; +} + +.collapsed { + opacity: 0; + height: 0 !important; +} + +.choice-header { + font-size: 24px; + font-weight: normal; + margin-__MSG_@@bidi_start_edge__: 10px; +} + +.choice-footer { + font-size: 14px; +} + +.choice-panel { + margin-top: 17px; + padding-bottom: 20px; +} + +.clickable { + cursor: pointer; +} + +.description { + margin-bottom: 25px; +} + +.error-state { + background-image: url('icon_warning.png'); + background-repeat: no-repeat; + background-position: top __MSG_@@bidi_start_edge__; + padding-__MSG_@@bidi_start_edge__: 30px; + padding-top: 3px; + margin-bottom: 10px; + color: #900; + display: inline-block; +} + +.expiring { + color: #900 !important; +} + +[hidden] { + display: none !important; +} + + +.icon-label { + display: inline-block; + vertical-align: top; + margin-__MSG_@@bidi_start_edge__: 10px; +} + +.information-box { + background-color: #f9edbe; + border: 1px solid #f0c36d; + -webkit-border-radius: 2px; + -webkit-box-shadow: 0px 2px 4px rgba(0,0,0,0.2); + color: #222; + padding: 8px 16px; + text-align: center; + font-size: 12px; +} + +.information-box-centerer { + width: 100%; + bottom: 8px; + position: absolute; + display: -webkit-box; +} + +.information-box-padding { + -webkit-box-flex: 1; +} + +.message { + text-align:center; + margin-bottom: 10px; +} + +.mode-select-button { + width: 100%; + height: 32px; + white-space: nowrap; +} + +.mode-select-label { + padding-__MSG_@@bidi_end_edge__: 20px; +} + +.mode-select-table { + margin-__MSG_@@bidi_start_edge__: 40px; + width: 600px; /* width + margin = body width */ + border-collapse: collapse; + margin-top: 40px; +} + +.mode-select-table-spacer { + height: 20px; +} + +.mode-select-table-underline td { + border-bottom: 1px solid #c6c6c6; +} + +.hide-scrollbars { + overflow-y: hidden; +} + +.host-list-container { + -webkit-transition: all 0.5s; + overflow: hidden; +} + +.host-list-table { + margin-__MSG_@@bidi_start_edge__: 30px; + width: 610px; /* width + margin = body width */ + border-spacing: 0; +} + +.host-list-row { + height: 50px; + color: black; +} + +.host-list-row td { + border-bottom: 1px solid transparent; + border-top: 1px solid transparent; +} + +.host-list-row:hover { + background-color: #e7eef2; +} + +.host-list-rename-icon, .host-list-remove-icon { + opacity: 0; +} + +.host-list-row:hover .host-list-rename-icon { + opacity: 0.8; +} + +.host-list-row:hover .host-list-remove-icon { + opacity: 0.3; +} + +.host-list-edit:hover .host-list-rename-icon { + opacity: 1; +} + +.host-list-edit:hover .host-list-remove-icon { + opacity: 0.5; +} + +.host-list-row:hover td { + border-bottom: 1px solid #c6c6c6; + border-top: 1px solid #c6c6c6; +} + +.host-list-row-end { + padding-__MSG_@@bidi_end_edge__: 10px; +} + +.host-list-row-start { + padding-__MSG_@@bidi_start_edge__: 10px; +} + +.host-offline { + color: #a9a9a9; +} + +.host-offline .host-list-main-icon { + opacity: 0.5; +} + +.small-print { + font-size: 13px; + color: #AAA; +} + +.top-primary { + font-size: 14px; + position: absolute; + top: 0.5em; + __MSG_@@bidi_start_edge__: 0.5em; +} + +.top-secondary { + font-size: 14px; + position: absolute; + top: 0.5em; + __MSG_@@bidi_end_edge__: 0.5em; +} + +.waiting { + color: rgb(180, 180, 180); +} + +/* Ids */ +#access-code-countdown-container { + height: 50px; + text-align: center; +} + +#access-code-display { + margin-top: 50px; + color: rgb(0, 0, 0); + font-weight: bold; + font-size: 26px; + text-align: center; +} + +#access-code-entry { + font-weight: bold; + font-size: 18px; + height: 25px; + margin: 0 10px; + padding-__MSG_@@bidi_start_edge__: 5px; + width: 12em; +} + +#access-code-entry-row { + text-align: center; +} + +#cancel-button { + float: __MSG_@@bidi_end_edge__; +} + +#client-footer-text, #host-footer-text { + text-align: center; +} + +#current-email { + color: rgba(0, 0, 0, 0.5); +} + +#divider-top { + margin: 10px 0 15px 0; +} + +#divider-bottom { + margin: 25px 0 10px 0; +} + +#email-status { + margin-__MSG_@@bidi_end_edge__: 0.5ex; +} + +#icon { + height: 64px; + width: 64px; +} + +#main { + color: rgb(115, 115, 115); + font-size: 16px; + margin: 100px auto 0 auto; + padding: 10px; + width: 640px; +} + +#host-list-error { + margin-__MSG_@@bidi_start_edge__: 40px; +} + +#session-mode { + position: absolute; + -webkit-box-shadow: 0 0 8px 0 black; + -webkit-user-select: none; +} + +#session-client-plugin { + margin: 0 0 -4px 0; +} + +#toggle-scaling { + margin: 1px 0 0 0; + padding: 1px; + min-width: 0; + line-height: 0; +} diff --git a/remoting/webapp/choice.html b/remoting/webapp/choice.html new file mode 100644 index 0000000..270896d --- /dev/null +++ b/remoting/webapp/choice.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Loading… +
+ + + +
+ +
+ + + + + + + + + + + + + diff --git a/remoting/webapp/client_screen.js b/remoting/webapp/client_screen.js new file mode 100644 index 0000000..c89355d --- /dev/null +++ b/remoting/webapp/client_screen.js @@ -0,0 +1,469 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Functions related to the 'client screen' for Chromoting. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @type {boolean} Whether or not the plugin should scale itself. + */ +remoting.scaleToFit = false; + +/** + * @type {remoting.ClientSession} The client session object, set once the + * access code has been successfully verified. + */ +remoting.clientSession = null; + +/** + * @type {string} The normalized access code. + */ +remoting.accessCode = ''; + +/** + * @type {string} The host's JID, returned by the server. + */ +remoting.hostJid = ''; + +/** + * @type {string} For Me2Me connections, the id of the current host. + */ +remoting.hostId = ''; + +/** + * @type {boolean} For Me2Me connections. Set to true if connection + * must be retried on failure. + */ +remoting.retryIfOffline = false; + +/** + * @type {string} The host's public key, returned by the server. + */ +remoting.hostPublicKey = ''; + +/** + * @type {XMLHttpRequest} The XHR object corresponding to the current + * support-hosts request, if there is one outstanding. + * @private + */ +remoting.supportHostsXhr_ = null; + +/** + * @enum {string} + */ +remoting.ConnectionType = { + It2Me: 'It2Me', + Me2Me: 'Me2Me' +}; + +/** + * @type {remoting.ConnectionType?} + */ +remoting.currentConnectionType = null; + +/** + * Entry point for the 'connect' functionality. This function defers to the + * WCS loader to call it back with an access token. + */ +remoting.connectIt2Me = function() { + remoting.currentConnectionType = remoting.ConnectionType.It2Me; + document.getElementById('cancel-button').disabled = false; + remoting.WcsLoader.load(connectIt2MeWithAccessToken_); +}; + +/** + * Cancel an incomplete connect operation. + * + * @return {void} Nothing. + */ +remoting.cancelConnect = function() { + if (remoting.supportHostsXhr_) { + remoting.supportHostsXhr_.abort(); + remoting.supportHostsXhr_ = null; + } + if (remoting.clientSession) { + remoting.clientSession.removePlugin(); + remoting.clientSession = null; + } + remoting.setMode(remoting.AppMode.HOME); +}; + +/** + * Enable or disable scale-to-fit. + * + * @param {Event} event The click event. The style of the target is updated to + * reflect the new scaling state. + * @return {void} Nothing. + */ +remoting.toggleScaleToFit = function(event) { + var button = /** @type Element */(event.target); + remoting.scaleToFit = !remoting.scaleToFit; + if (remoting.scaleToFit) { + addClass(button, 'toggle-button-active'); + } else { + removeClass(button, 'toggle-button-active'); + } + remoting.clientSession.updateDimensions(); +}; + +/** + * Update the remoting client layout in response to a resize event. + * + * @return {void} Nothing. + */ +remoting.onResize = function() { + if (remoting.clientSession) + remoting.clientSession.onResize(); +}; + +/** + * Disconnect the remoting client. + * + * @return {void} Nothing. + */ +remoting.disconnect = function() { + if (remoting.clientSession) { + remoting.clientSession.disconnect(); + remoting.clientSession = null; + remoting.debug.log('Disconnected.'); + if (remoting.currentConnectionType == remoting.ConnectionType.It2Me) { + remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_IT2ME); + } else { + remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_ME2ME); + } + } +}; + +/** + * If WCS was successfully loaded, proceed with the connection, otherwise + * report an error. + * + * @param {string?} token The OAuth2 access token, or null if an error occurred. + * @return {void} Nothing. + */ +function connectIt2MeWithAccessToken_(token) { + if (token) { + var accessCode = document.getElementById('access-code-entry').value; + remoting.accessCode = normalizeAccessCode_(accessCode); + // At present, only 12-digit access codes are supported, of which the first + // 7 characters are the supportId. + var kSupportIdLen = 7; + var kHostSecretLen = 5; + var kAccessCodeLen = kSupportIdLen + kHostSecretLen; + if (remoting.accessCode.length != kAccessCodeLen) { + remoting.debug.log('Bad access code length'); + showConnectError_(remoting.Error.INVALID_ACCESS_CODE); + } else { + var supportId = remoting.accessCode.substring(0, kSupportIdLen); + remoting.setMode(remoting.AppMode.CLIENT_CONNECTING); + resolveSupportId(supportId); + } + } else { + showConnectError_(remoting.Error.AUTHENTICATION_FAILED); + } +} + +/** + * Callback function called when the state of the client plugin changes. The + * current state is available via the |state| member variable. + * + * @param {number} oldState The previous state of the plugin. + * @param {number} newState The current state of the plugin. + */ +// TODO(jamiewalch): Make this pass both the current and old states to avoid +// race conditions. +function onClientStateChange_(oldState, newState) { + if (!remoting.clientSession) { + // If the connection has been cancelled, then we no longer have a reference + // to the session object and should ignore any state changes. + return; + } + if (newState == remoting.ClientSession.State.CREATED) { + remoting.debug.log('Created plugin'); + + } else if (newState == remoting.ClientSession.State.BAD_PLUGIN_VERSION) { + showConnectError_(remoting.Error.BAD_PLUGIN_VERSION); + + } else if (newState == remoting.ClientSession.State.CONNECTING) { + remoting.debug.log('Connecting as ' + remoting.oauth2.getCachedEmail()); + + } else if (newState == remoting.ClientSession.State.INITIALIZING) { + remoting.debug.log('Initializing connection'); + + } else if (newState == remoting.ClientSession.State.CONNECTED) { + if (remoting.clientSession) { + remoting.setMode(remoting.AppMode.IN_SESSION); + remoting.toolbar.center(); + remoting.toolbar.preview(); + updateStatistics_(); + } + + } else if (newState == remoting.ClientSession.State.CLOSED) { + if (oldState == remoting.ClientSession.State.CONNECTED) { + remoting.clientSession.removePlugin(); + remoting.clientSession = null; + remoting.debug.log('Connection closed by host'); + if (remoting.currentConnectionType == remoting.ConnectionType.It2Me) { + remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_IT2ME); + } else { + remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_ME2ME); + } + } else { + // The transition from CONNECTING to CLOSED state may happen + // only with older client plugins. Current version should go the + // FAILED state when connection fails. + showConnectError_(remoting.Error.INVALID_ACCESS_CODE); + } + + } else if (newState == remoting.ClientSession.State.CONNECTION_FAILED) { + remoting.debug.log('Client plugin reported connection failed: ' + + remoting.clientSession.error); + if (remoting.clientSession.error == + remoting.ClientSession.ConnectionError.HOST_IS_OFFLINE) { + retryConnectOrReportOffline_(); + } else if (remoting.clientSession.error == + remoting.ClientSession.ConnectionError.SESSION_REJECTED) { + showConnectError_(remoting.Error.INVALID_ACCESS_CODE); + } else if (remoting.clientSession.error == + remoting.ClientSession.ConnectionError.INCOMPATIBLE_PROTOCOL) { + showConnectError_(remoting.Error.INCOMPATIBLE_PROTOCOL); + } else if (remoting.clientSession.error == + remoting.ClientSession.ConnectionError.NETWORK_FAILURE) { + showConnectError_(remoting.Error.GENERIC); + } else { + showConnectError_(remoting.Error.GENERIC); + } + + } else { + remoting.debug.log('Unexpected client plugin state: ' + newState); + // This should only happen if the web-app and client plugin get out of + // sync, and even then the version check should allow compatibility. + showConnectError_(remoting.Error.MISSING_PLUGIN); + } +} + +/** + * If we have a hostId to retry, try refreshing it and connecting again. If not, + * then show the 'host offline' error message. + * + * @return {void} Nothing. + */ +function retryConnectOrReportOffline_() { + if (remoting.hostId && remoting.retryIfOffline) { + console.log('Connection failed. Retrying.'); + /** @param {boolean} success True if the refresh was successful. */ + var onDone = function(success) { + if (success) { + remoting.connectMe2Me(remoting.hostId, false); + } else { + showConnectError_(remoting.Error.HOST_IS_OFFLINE); + } + }; + remoting.hostList.refresh(onDone); + } else { + console.log('Connection failed. Not retrying.'); + showConnectError_(remoting.Error.HOST_IS_OFFLINE); + } +} + +/** + * Create the client session object and initiate the connection. + * + * @return {void} Nothing. + */ +function startSession_() { + remoting.debug.log('Starting session...'); + var accessCode = document.getElementById('access-code-entry'); + accessCode.value = ''; // The code has been validated and won't work again. + remoting.clientSession = + new remoting.ClientSession( + remoting.hostJid, remoting.hostPublicKey, + remoting.accessCode, + /** @type {string} */ (remoting.oauth2.getCachedEmail()), + onClientStateChange_); + /** @param {string} token The auth token. */ + var createPluginAndConnect = function(token) { + remoting.clientSession.createPluginAndConnect( + document.getElementById('session-mode'), + token); + }; + remoting.oauth2.callWithToken(createPluginAndConnect); +} + +/** + * Show a client-side error message. + * + * @param {remoting.Error} errorTag The error to be localized and + * displayed. + * @return {void} Nothing. + */ +function showConnectError_(errorTag) { + remoting.debug.log('Connection failed: ' + errorTag); + var errorDiv = document.getElementById('connect-error-message'); + l10n.localizeElementFromTag(errorDiv, /** @type {string} */ (errorTag)); + remoting.accessCode = ''; + if (remoting.clientSession) { + remoting.clientSession.disconnect(); + remoting.clientSession = null; + } + if (remoting.currentConnectionType == remoting.ConnectionType.It2Me) { + remoting.setMode(remoting.AppMode.CLIENT_CONNECT_FAILED_IT2ME); + } else { + remoting.setMode(remoting.AppMode.CLIENT_CONNECT_FAILED_ME2ME); + } +} + +/** + * Parse the response from the server to a request to resolve a support id. + * + * @param {XMLHttpRequest} xhr The XMLHttpRequest object. + * @return {void} Nothing. + */ +function parseServerResponse_(xhr) { + remoting.supportHostsXhr_ = null; + remoting.debug.log('parseServerResponse: status = ' + xhr.status); + if (xhr.status == 200) { + var host = /** @type {{data: {jabberId: string, publicKey: string}}} */ + JSON.parse(xhr.responseText); + if (host.data && host.data.jabberId && host.data.publicKey) { + remoting.hostJid = host.data.jabberId; + remoting.hostPublicKey = host.data.publicKey; + var split = remoting.hostJid.split('/'); + document.getElementById('connected-to').innerText = split[0]; + startSession_(); + return; + } + } + var errorMsg = remoting.Error.GENERIC; + if (xhr.status == 404) { + errorMsg = remoting.Error.INVALID_ACCESS_CODE; + } else if (xhr.status == 0) { + errorMsg = remoting.Error.NO_RESPONSE; + } else if (xhr.status == 503) { + errorMsg = remoting.Error.SERVICE_UNAVAILABLE; + } else { + remoting.debug.log('The server responded: ' + xhr.responseText); + } + showConnectError_(errorMsg); +} + +/** + * Normalize the access code entered by the user. + * + * @param {string} accessCode The access code, as entered by the user. + * @return {string} The normalized form of the code (whitespace removed). + */ +function normalizeAccessCode_(accessCode) { + // Trim whitespace. + // TODO(sergeyu): Do we need to do any other normalization here? + return accessCode.replace(/\s/g, ''); +} + +/** + * Initiate a request to the server to resolve a support ID. + * + * @param {string} supportId The canonicalized support ID. + */ +function resolveSupportId(supportId) { + var headers = { + 'Authorization': 'OAuth ' + remoting.oauth2.getAccessToken() + }; + + remoting.supportHostsXhr_ = remoting.xhr.get( + 'https://www.googleapis.com/chromoting/v1/support-hosts/' + + encodeURIComponent(supportId), + parseServerResponse_, + '', + headers); +} + +/** + * Timer callback to update the statistics panel. + */ +function updateStatistics_() { + if (!remoting.clientSession || + remoting.clientSession.state != remoting.ClientSession.State.CONNECTED) { + return; + } + var stats = remoting.clientSession.stats(); + remoting.debug.updateStatistics(stats); + remoting.clientSession.logStatistics(stats); + // Update the stats once per second. + window.setTimeout(updateStatistics_, 1000); +} + + +/** + * Shows PIN entry screen. + * + * @param {string} hostId The unique id of the host. + * @param {boolean} retryIfOffline If true and the host can't be contacted, + * refresh the host list and try again. This allows bookmarked hosts to + * work even if they reregister with Talk and get a different Jid. + * @return {void} Nothing. + */ +remoting.connectMe2Me = function(hostId, retryIfOffline) { + remoting.currentConnectionType = remoting.ConnectionType.Me2Me; + remoting.hostId = hostId; + remoting.retryIfOffline = retryIfOffline; + + // TODO(jamiewalch): Reinstate the PIN screen once it's supported. + // remoting.setMode(remoting.AppMode.CLIENT_PIN_PROMPT); + remoting.connectMe2MeWithPin(); +} + +/** + * Start a connection to the specified host, using the cached details + * and the PIN entered by the user. + * + * @return {void} Nothing. + */ +remoting.connectMe2MeWithPin = function() { + remoting.debug.log('Connecting to host...'); + remoting.setMode(remoting.AppMode.CLIENT_CONNECTING); + + var host = remoting.hostList.getHostForId(remoting.hostId); + if (!host) { + retryConnectOrReportOffline_(); + return; + } + remoting.hostJid = host.jabberId; + remoting.hostPublicKey = host.publicKey; + document.getElementById('connected-to').innerText = host.hostName; + document.title = document.title + ': ' + host.hostName; + + remoting.WcsLoader.load(connectMe2MeWithAccessToken_); +}; + +/** + * Continue making the connection to a host, once WCS has initialized. + * + * @param {string?} token The OAuth2 access token, or null if an error occurred. + * @return {void} Nothing. + */ +function connectMe2MeWithAccessToken_(token) { + if (token) { + /** @type {string} */ + var pin = document.getElementById('pin-entry').value; + document.getElementById('pin-entry').value = ''; + + remoting.clientSession = + new remoting.ClientSession( + remoting.hostJid, remoting.hostPublicKey, + pin, /** @type {string} */ (remoting.oauth2.getCachedEmail()), + onClientStateChange_); + remoting.clientSession.createPluginAndConnect( + document.getElementById('session-mode'), + token); + } else { + showConnectError_(remoting.Error.AUTHENTICATION_FAILED); + } +} diff --git a/remoting/webapp/client_session.js b/remoting/webapp/client_session.js new file mode 100644 index 0000000..da57018 --- /dev/null +++ b/remoting/webapp/client_session.js @@ -0,0 +1,461 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Class handling creation and teardown of a remoting client session. + * + * This abstracts a element and controls the plugin which does the + * actual remoting work. There should be no UI code inside this class. It + * should be purely thought of as a controller of sorts. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @param {string} hostJid The jid of the host to connect to. + * @param {string} hostPublicKey The base64 encoded version of the host's + * public key. + * @param {string} authenticationCode The access code for IT2Me or the + * PIN for Me2Me. + * @param {string} email The username for the talk network. + * @param {function(remoting.ClientSession.State, + remoting.ClientSession.State):void} onStateChange + * The callback to invoke when the session changes state. + * @constructor + */ +remoting.ClientSession = function(hostJid, hostPublicKey, authenticationCode, + email, onStateChange) { + this.state = remoting.ClientSession.State.CREATED; + + this.hostJid = hostJid; + this.hostPublicKey = hostPublicKey; + this.authenticationCode = authenticationCode; + this.email = email; + this.clientJid = ''; + this.sessionId = ''; + /** @type {remoting.ViewerPlugin} */ + this.plugin = null; + this.logToServer = new remoting.LogToServer(); + this.onStateChange = onStateChange; + /** @type {remoting.ClientSession} */ + var that = this; + /** @type {function():void} @private */ + this.refocusPlugin_ = function() { that.plugin.focus(); }; +}; + +// Note that the positive values in both of these enums are copied directly +// from chromoting_scriptable_object.h and must be kept in sync. The negative +// values represent states transitions that occur within the web-app that have +// no corresponding plugin state transition. +/** @enum {number} */ +remoting.ClientSession.State = { + CREATED: -3, + BAD_PLUGIN_VERSION: -2, + UNKNOWN_PLUGIN_ERROR: -1, + UNKNOWN: 0, + CONNECTING: 1, + INITIALIZING: 2, + CONNECTED: 3, + CLOSED: 4, + CONNECTION_FAILED: 5 +}; + +/** @enum {number} */ +remoting.ClientSession.ConnectionError = { + NONE: 0, + HOST_IS_OFFLINE: 1, + SESSION_REJECTED: 2, + INCOMPATIBLE_PROTOCOL: 3, + NETWORK_FAILURE: 4 +}; + +// Keys for connection statistics. +remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH = 'video_bandwidth'; +remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE = 'video_frame_rate'; +remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY = 'capture_latency'; +remoting.ClientSession.STATS_KEY_ENCODE_LATENCY = 'encode_latency'; +remoting.ClientSession.STATS_KEY_DECODE_LATENCY = 'decode_latency'; +remoting.ClientSession.STATS_KEY_RENDER_LATENCY = 'render_latency'; +remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY = 'roundtrip_latency'; + +/** + * The current state of the session. + * @type {remoting.ClientSession.State} + */ +remoting.ClientSession.prototype.state = remoting.ClientSession.State.UNKNOWN; + +/** + * The last connection error. Set when state is set to CONNECTION_FAILED. + * @type {remoting.ClientSession.ConnectionError} + */ +remoting.ClientSession.prototype.error = + remoting.ClientSession.ConnectionError.NONE; + +/** + * Chromoting session API version (for this javascript). + * This is compared with the plugin API version to verify that they are + * compatible. + * + * @const + * @private + */ +remoting.ClientSession.prototype.API_VERSION_ = 2; + +/** + * The oldest API version that we support. + * This will differ from the |API_VERSION_| if we maintain backward + * compatibility with older API versions. + * + * @const + * @private + */ +remoting.ClientSession.prototype.API_MIN_VERSION_ = 1; + +/** + * Server used to bridge into the Jabber network for establishing Jingle + * connections. + * + * @const + * @private + */ +remoting.ClientSession.prototype.HTTP_XMPP_PROXY_ = + 'https://chromoting-httpxmpp-oauth2-dev.corp.google.com'; + +/** + * The id of the client plugin + * + * @const + */ +remoting.ClientSession.prototype.PLUGIN_ID = 'session-client-plugin'; + +/** + * Callback to invoke when the state is changed. + * + * @param {remoting.ClientSession.State} oldState The previous state. + * @param {remoting.ClientSession.State} newState The current state. + */ +remoting.ClientSession.prototype.onStateChange = + function(oldState, newState) { }; + +/** + * Adds element to |container| and readies the sesion object. + * + * @param {Element} container The element to add the plugin to. + * @param {string} oauth2AccessToken A valid OAuth2 access token. + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.createPluginAndConnect = + function(container, oauth2AccessToken) { + this.plugin = /** @type {remoting.ViewerPlugin} */ + document.createElement('embed'); + this.plugin.id = this.PLUGIN_ID; + this.plugin.src = 'about://none'; + this.plugin.type = 'pepper-application/x-chromoting'; + this.plugin.width = 0; + this.plugin.height = 0; + this.plugin.tabIndex = 0; // Required, otherwise focus() doesn't work. + container.appendChild(this.plugin); + + this.plugin.focus(); + this.plugin.addEventListener('blur', this.refocusPlugin_, false); + + if (!this.isPluginVersionSupported_(this.plugin)) { + // TODO(ajwong): Remove from parent. + delete this.plugin; + this.setState_(remoting.ClientSession.State.BAD_PLUGIN_VERSION); + return; + } + + /** @type {remoting.ClientSession} */ var that = this; + /** @param {string} msg The IQ stanza to send. */ + this.plugin.sendIq = function(msg) { that.sendIq_(msg); }; + /** @param {string} msg The message to log. */ + this.plugin.debugInfo = function(msg) { + remoting.debug.log('plugin: ' + msg); + }; + + // TODO(ajwong): Is it even worth having this class handle these events? + // Or would it be better to just allow users to pass in their own handlers + // and leave these blank by default? + /** + * @param {number} status The plugin status. + * @param {number} error The plugin error status, if any. + */ + this.plugin.connectionInfoUpdate = function(status, error) { + that.connectionInfoUpdateCallback(status, error); + }; + this.plugin.desktopSizeUpdate = function() { that.onDesktopSizeChanged_(); }; + + // TODO(garykac): Clean exit if |connect| isn't a function. + if (typeof this.plugin.connect === 'function') { + this.connectPluginToWcs_(oauth2AccessToken); + } else { + remoting.debug.log('ERROR: remoting plugin not loaded'); + this.setState_(remoting.ClientSession.State.UNKNOWN_PLUGIN_ERROR); + } +}; + +/** + * Deletes the element from the container, without sending a + * session_terminate request. This is to be called when the session was + * disconnected by the Host. + * + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.removePlugin = function() { + if (this.plugin) { + this.plugin.removeEventListener('blur', this.refocusPlugin_, false); + var parentNode = this.plugin.parentNode; + parentNode.removeChild(this.plugin); + this.plugin = null; + } +}; + +/** + * Deletes the element from the container and disconnects. + * + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.disconnect = function() { + // The plugin won't send a state change notification, so we explicitly log + // the fact that the connection has closed. + this.logToServer.logClientSessionStateChange( + remoting.ClientSession.State.CLOSED, + remoting.ClientSession.ConnectionError.NONE); + if (remoting.wcs) { + remoting.wcs.setOnIq(function(stanza) {}); + this.sendIq_( + '' + + '' + + '' + + '' + + ''); + } + this.removePlugin(); +}; + +/** + * Sends an IQ stanza via the http xmpp proxy. + * + * @private + * @param {string} msg XML string of IQ stanza to send to server. + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.sendIq_ = function(msg) { + remoting.debug.logIq(true, msg); + // Extract the session id, so we can close the session later. + var parser = new DOMParser(); + var iqNode = parser.parseFromString(msg, 'text/xml').firstChild; + var jingleNode = iqNode.firstChild; + if (jingleNode) { + var action = jingleNode.getAttribute('action'); + if (jingleNode.nodeName == 'jingle' && action == 'session-initiate') { + this.sessionId = jingleNode.getAttribute('sid'); + } + } + + // Send the stanza. + if (remoting.wcs) { + remoting.wcs.sendIq(msg); + } else { + remoting.debug.log('Tried to send IQ before WCS was ready.'); + this.setState_(remoting.ClientSession.State.CONNECTION_FAILED); + } +}; + +/** + * @private + * @param {remoting.ViewerPlugin} plugin The embed element for the plugin. + * @return {boolean} True if the plugin and web-app versions are compatible. + */ +remoting.ClientSession.prototype.isPluginVersionSupported_ = function(plugin) { + return this.API_VERSION_ >= plugin.apiMinVersion && + plugin.apiVersion >= this.API_MIN_VERSION_; +}; + +/** + * Connects the plugin to WCS. + * + * @private + * @param {string} oauth2AccessToken A valid OAuth2 access token. + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.connectPluginToWcs_ = + function(oauth2AccessToken) { + this.clientJid = remoting.wcs.getJid(); + if (this.clientJid == '') { + remoting.debug.log('Tried to connect without a full JID.'); + } + remoting.debug.setJids(this.clientJid, this.hostJid); + /** @type {remoting.ClientSession} */ + var that = this; + /** @param {string} stanza The IQ stanza received. */ + var onIq = function(stanza) { + remoting.debug.logIq(false, stanza); + if (that.plugin.onIq) { + that.plugin.onIq(stanza); + } else { + // plugin.onIq may not be set after the plugin has been shut + // down. Particularly this happens when we receive response to + // session-terminate stanza. + remoting.debug.log( + 'plugin.onIq is not set so dropping incoming message.'); + } + } + remoting.wcs.setOnIq(onIq); + that.plugin.connect(this.hostJid, this.hostPublicKey, this.clientJid, + this.authenticationCode); +}; + +/** + * Callback that the plugin invokes to indicate that the connection + * status has changed. + * + * @param {number} status The plugin's status. + * @param {number} error The plugin's error state, if any. + */ +remoting.ClientSession.prototype.connectionInfoUpdateCallback = + function(status, error) { + // Old plugins didn't pass the status and error values, so get them directly. + // Note that there is a race condition inherent in this approach. + if (typeof(status) == 'undefined') { + status = this.plugin.status; + } + if (typeof(error) == 'undefined') { + error = this.plugin.error; + } + + if (status == this.plugin.STATUS_CONNECTED) { + this.onDesktopSizeChanged_(); + } else if (status == this.plugin.STATUS_FAILED) { + this.error = /** @type {remoting.ClientSession.ConnectionError} */ (error); + } + this.setState_(/** @type {remoting.ClientSession.State} */ (status)); +}; + +/** + * @private + * @param {remoting.ClientSession.State} newState The new state for the session. + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.setState_ = function(newState) { + var oldState = this.state; + this.state = newState; + if (this.onStateChange) { + this.onStateChange(oldState, newState); + } + this.logToServer.logClientSessionStateChange(this.state, this.error); +}; + +/** + * This is a callback that gets called when the window is resized. + * + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.onResize = function() { + this.updateDimensions(); +}; + +/** + * This is a callback that gets called when the plugin notifies us of a change + * in the size of the remote desktop. + * + * @private + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.onDesktopSizeChanged_ = function() { + remoting.debug.log('desktop size changed: ' + + this.plugin.desktopWidth + 'x' + + this.plugin.desktopHeight); + this.updateDimensions(); +}; + +/** + * Refreshes the plugin's dimensions, taking into account the sizes of the + * remote desktop and client window, and the current scale-to-fit setting. + * + * @return {void} Nothing. + */ +remoting.ClientSession.prototype.updateDimensions = function() { + if (this.plugin.desktopWidth == 0 || + this.plugin.desktopHeight == 0) + return; + + var windowWidth = window.innerWidth; + var windowHeight = window.innerHeight; + var scale = 1.0; + + if (remoting.scaleToFit) { + var scaleFitHeight = 1.0 * windowHeight / this.plugin.desktopHeight; + var scaleFitWidth = 1.0 * windowWidth / this.plugin.desktopWidth; + scale = Math.min(1.0, scaleFitHeight, scaleFitWidth); + } + + // Resize the plugin if necessary. + this.plugin.width = this.plugin.desktopWidth * scale; + this.plugin.height = this.plugin.desktopHeight * scale; + + // Position the container. + // TODO(wez): We should take into account scrollbars when positioning. + var parentNode = this.plugin.parentNode; + if (this.plugin.width < windowWidth) + parentNode.style.left = (windowWidth - this.plugin.width) / 2 + 'px'; + else + parentNode.style.left = '0'; + if (this.plugin.height < windowHeight) + parentNode.style.top = (windowHeight - this.plugin.height) / 2 + 'px'; + else + parentNode.style.top = '0'; + + remoting.debug.log('plugin dimensions: ' + + parentNode.style.left + ',' + + parentNode.style.top + '-' + + this.plugin.width + 'x' + this.plugin.height + '.'); + this.plugin.setScaleToFit(remoting.scaleToFit); +}; + +/** + * Returns an associative array with a set of stats for this connection. + * + * @return {Object.} The connection statistics. + */ +remoting.ClientSession.prototype.stats = function() { + var dict = {}; + dict[remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH] = + this.plugin.videoBandwidth; + dict[remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE] = + this.plugin.videoFrameRate; + dict[remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY] = + this.plugin.videoCaptureLatency; + dict[remoting.ClientSession.STATS_KEY_ENCODE_LATENCY] = + this.plugin.videoEncodeLatency; + dict[remoting.ClientSession.STATS_KEY_DECODE_LATENCY] = + this.plugin.videoDecodeLatency; + dict[remoting.ClientSession.STATS_KEY_RENDER_LATENCY] = + this.plugin.videoRenderLatency; + dict[remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY] = + this.plugin.roundTripLatency; + return dict; +}; + +/** + * Logs statistics. + * + * @param {Object.} stats + */ +remoting.ClientSession.prototype.logStatistics = function(stats) { + this.logToServer.logStatistics(stats); +}; diff --git a/remoting/webapp/cs_oauth2_trampoline.js b/remoting/webapp/cs_oauth2_trampoline.js new file mode 100644 index 0000000..c4c31eb --- /dev/null +++ b/remoting/webapp/cs_oauth2_trampoline.js @@ -0,0 +1,6 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +window.location.replace( + chrome.extension.getURL('oauth2_callback.html') + window.location.search); diff --git a/remoting/webapp/debug_log.css b/remoting/webapp/debug_log.css new file mode 100644 index 0000000..3085225 --- /dev/null +++ b/remoting/webapp/debug_log.css @@ -0,0 +1,40 @@ +/* Copyright (c) 2011 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#debug-log { + background-color: white; + bottom: 0; + border-top: 1px solid black; + height: 150px; + margin: 0; + opacity: 0.85; + padding: 0; + position: fixed; + width: 100%; + z-index: 100; + -webkit-user-select: text; +} + +#debug-messages { + border-top: 1px solid black; + overflow: auto; + height: inherit; +} + +#debug-messages > p { + font-family: monospace; + font-weight: bold; + font-size: small; + margin: 0.35em; + padding: 0; +} + +#debug-messages .indent { + margin-left: 20px !important; +} + +#debug-messages .indent2 { + margin-left: 40px !important; +} diff --git a/remoting/webapp/debug_log.gtestjs b/remoting/webapp/debug_log.gtestjs new file mode 100644 index 0000000..002f0fe --- /dev/null +++ b/remoting/webapp/debug_log.gtestjs @@ -0,0 +1,26 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Test fixture for debug logging routines. + * @constructor + * @extends {testing.Test} + */ +function DebugLogUnitTest () {} + +DebugLogUnitTest.prototype = { + __proto__: testing.Test.prototype, + + /** @inheritDoc */ + extraLibraries: [ + 'debug_log.js', + ], +}; + +// Dummy test to verify that the JS Unittest framework is working and that +// debug_log.js loads without console errors. +// TODO(garykac): Replace this with real tests. +TEST_F('DebugLogUnitTest', 'TestJsLoad', function() { + assertTrue(true); +}); diff --git a/remoting/webapp/debug_log.js b/remoting/webapp/debug_log.js new file mode 100644 index 0000000..a7a13e4 --- /dev/null +++ b/remoting/webapp/debug_log.js @@ -0,0 +1,800 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Module to support logging debug messages. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @constructor + * @param {Element} logElement The HTML div to which to add log messages. + * @param {Element} statsElement The HTML div to which to update stats. + */ +remoting.DebugLog = function(logElement, statsElement) { + this.logElement = logElement; + this.statsElement = statsElement; + this.clientJid = ''; + this.hostJid = ''; +}; + +/** + * Maximum number of lines to record in the debug log. Only the most + * recent lines are displayed. + */ +remoting.DebugLog.prototype.MAX_DEBUG_LOG_SIZE = 1000; + +/** + * JID for the remoting bot which is used to bridge communication between + * the Talk network and the Remoting directory service. + */ +remoting.DebugLog.prototype.REMOTING_DIRECTORY_SERVICE_BOT = + 'remoting@bot.talk.google.com'; + +/** + * Add the given message to the debug log. + * + * @param {number} indentLevel The indention level for this message. + * @param {string} message The debug info to add to the log. + */ +remoting.DebugLog.prototype.logIndent = function(indentLevel, message) { + // Remove lines from top if we've hit our max log size. + if (this.logElement.childNodes.length == this.MAX_DEBUG_LOG_SIZE) { + this.logElement.removeChild(this.logElement.firstChild); + } + + // Add the new

to the end of the debug log. + var p = document.createElement('p'); + if (indentLevel == 1) { + p.className = 'indent'; + } else if (indentLevel > 1) { + p.className = 'indent2'; + } + p.appendChild(document.createTextNode(message)); + this.logElement.appendChild(p); + + // Scroll to bottom of div + this.logElement.scrollTop = this.logElement.scrollHeight; +}; + +/** + * Add the given message to the debug log. + * + * @param {string} message The debug info to add to the log. + */ +remoting.DebugLog.prototype.log = function(message) { + this.logIndent(0, message); +} + +/** + * Show or hide the debug log. + */ +remoting.DebugLog.prototype.toggle = function() { + var debugLog = /** @type {Element} */ this.logElement.parentNode; + if (debugLog.hidden) { + debugLog.hidden = false; + } else { + debugLog.hidden = true; + } +}; + +/** + * Update the statistics panel. + * @param {Object.} stats The connection statistics. + */ +remoting.DebugLog.prototype.updateStatistics = function(stats) { + var units = ''; + var videoBandwidth = stats[remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH]; + if (videoBandwidth < 1024) { + units = 'Bps'; + } else if (videoBandwidth < 1048576) { + units = 'KiBps'; + videoBandwidth = videoBandwidth / 1024; + } else if (videoBandwidth < 1073741824) { + units = 'MiBps'; + videoBandwidth = videoBandwidth / 1048576; + } else { + units = 'GiBps'; + videoBandwidth = videoBandwidth / 1073741824; + } + + var statistics = document.getElementById('statistics'); + this.statsElement.innerText = + 'Bandwidth: ' + videoBandwidth.toFixed(2) + units + + ', Frame Rate: ' + + (stats[remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE] ? + stats[remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE].toFixed(2) + + ' fps' : 'n/a') + + ', Capture: ' + + stats[remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY].toFixed(2) + + 'ms' + + ', Encode: ' + + stats[remoting.ClientSession.STATS_KEY_ENCODE_LATENCY].toFixed(2) + + 'ms' + + ', Decode: ' + + stats[remoting.ClientSession.STATS_KEY_DECODE_LATENCY].toFixed(2) + + 'ms' + + ', Render: ' + + stats[remoting.ClientSession.STATS_KEY_RENDER_LATENCY].toFixed(2) + + 'ms' + + ', Latency: ' + + stats[remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY].toFixed(2) + + 'ms'; +}; + +/** + * Check for the debug toggle hot-key. + * + * @param {Event} event The keyboard event. + * @return {void} Nothing. + */ +remoting.DebugLog.onKeydown = function(event) { + var element = /** @type {Element} */ (event.target); + if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') { + return; + } + if (String.fromCharCode(event.which) == 'D') { + remoting.debug.toggle(); + } +}; + +/** + * Verify that the only attributes on the given |node| are those specified + * in the |attrs| string. + * + * @param {Node} node The node to verify. + * @param {string} validAttrs Comma-separated list of valid attributes. + * + * @return {boolean} True if the node contains only valid attributes. + */ +remoting.DebugLog.prototype.verifyAttributes = function(node, validAttrs) { + var attrs = ',' + validAttrs + ','; + var len = node.attributes.length; + for (var i = 0; i < len; i++) { + /** @type {Node} */ + var attrNode = node.attributes[i]; + var attr = attrNode.nodeName; + if (attrs.indexOf(',' + attr + ',') == -1) { + return false; + } + } + return true; +} + +/** + * Record the client and host JIDs so that we can check them against the + * params in the IQ packets. + * + * @param {string} clientJid The client JID string. + * @param {string} hostJid The host JID string. + */ +remoting.DebugLog.prototype.setJids = function(clientJid, hostJid) { + this.clientJid = clientJid; + this.hostJid = hostJid; +} + +/** + * Calculate the 'pretty' version of data from the |server| node and return + * it as a string. + * + * @param {Node} server Xml node with server info. + * + * @return {Array} Array of boolean result and pretty-version of |server| node. + */ +remoting.DebugLog.prototype.calcServerString = function(server) { + if (!this.verifyAttributes(server, 'host,udp,tcp,tcpssl')) { + return [false, '']; + } + var host = server.getAttribute('host'); + var udp = server.getAttribute('udp'); + var tcp = server.getAttribute('tcp'); + var tcpssl = server.getAttribute('tcpssl'); + + var str = "'" + host + "'"; + if (udp) + str = str + ' udp:' + udp; + if (tcp) + str = str + ' tcp:' + tcp; + if (tcpssl) + str = str + ' tcpssl:' + tcpssl; + + str = str + '; '; + return [true, str]; +}; + +/** + * Calc the 'pretty' version of channel data and return it as a string. + * + * @param {Node} channel Xml node with channel info. + * + * @return {Array} Array of result and pretty-version of |channel| node. + */ +remoting.DebugLog.prototype.calcChannelString = function(channel) { + var name = channel.nodeName; + if (!this.verifyAttributes(channel, 'transport,version,codec')) { + return [false, '']; + } + var transport = channel.getAttribute('transport'); + var version = channel.getAttribute('version'); + var desc = name + ' ' + transport + ' v' + version; + if (name == 'video') { + desc = desc + ' codec=' + channel.getAttribute('codec'); + } + return [true, desc + '; ']; +} + +/** + * Pretty print the jingleinfo from the given Xml node. + * + * @param {Node} query Xml query node with jingleinfo in the child nodes. + * + * @return {boolean} True if we were able to pretty-print the information. + */ +remoting.DebugLog.prototype.prettyJingleinfo = function(query) { + var nodes = query.childNodes; + var stun_servers = ''; + for (var i = 0; i < nodes.length; i++) { + /** @type {Node} */ + var node = nodes[i]; + var name = node.nodeName; + if (name == 'stun') { + var sserver = ''; + var stun_nodes = node.childNodes; + for(var s = 0; s < stun_nodes.length; s++) { + /** @type {Node} */ + var stun_node = stun_nodes[s]; + var sname = stun_node.nodeName; + if (sname == 'server') { + var stun_sinfo = this.calcServerString(stun_node); + /** @type {boolean} */ + var stun_success = stun_sinfo[0]; + /** @type {string} */ + var stun_sstring = stun_sinfo[1]; + if (!stun_success) { + return false; + } + sserver = sserver + stun_sstring; + } + } + this.logIndent(1, 'stun ' + sserver); + } else if (name == 'relay') { + var token = 'token: '; + var rserver = ''; + var relay_nodes = node.childNodes; + for(var r = 0; r < relay_nodes.length; r++) { + /** @type {Node} */ + var relay_node = relay_nodes[r]; + var rname = relay_node.nodeName; + if (rname == 'token') { + token = token + relay_node.textContent; + } + if (rname == 'server') { + var relay_sinfo = this.calcServerString(relay_node); + /** @type {boolean} */ + var relay_success = relay_sinfo[0]; + /** @type {string} */ + var relay_sstring = relay_sinfo[1]; + if (!relay_success) { + return false; + } + rserver = rserver + relay_sstring; + } + } + this.logIndent(1, 'relay ' + rserver + token); + } else { + return false; + } + } + + return true; +}; + +/** + * Pretty print the session-initiate or session-accept info from the given + * Xml node. + * + * @param {Node} jingle Xml node with jingle session-initiate or session-accept + * info contained in child nodes. + * + * @return {boolean} True if we were able to pretty-print the information. + */ +remoting.DebugLog.prototype.prettySessionInitiateAccept = function(jingle) { + if (jingle.childNodes.length != 1) { + return false; + } + var content = jingle.firstChild; + if (content.nodeName != 'content') { + return false; + } + var content_children = content.childNodes; + for (var c = 0; c < content_children.length; c++) { + /** @type {Node} */ + var content_child = content_children[c]; + var cname = content_child.nodeName; + if (cname == 'description') { + var channels = ''; + var resolution = ''; + var auth = ''; + var desc_children = content_child.childNodes; + for (var d = 0; d < desc_children.length; d++) { + /** @type {Node} */ + var desc = desc_children[d]; + var dname = desc.nodeName; + if (dname == 'control' || dname == 'event' || dname == 'video') { + var cinfo = this.calcChannelString(desc); + /** @type {boolean} */ + var success = cinfo[0]; + /** @type {string} */ + var cstring = cinfo[1]; + if (!success) { + return false; + } + channels = channels + cstring; + } else if (dname == 'initial-resolution') { + resolution = desc.getAttribute('width') + 'x' + + desc.getAttribute('height'); + } else if (dname == 'authentication') { + var auth_children = desc.childNodes; + for (var a = 0; a < auth_children.length; a++) { + /** @type {Node} */ + var auth_info = auth_children[a]; + if (auth_info.nodeName == 'auth-token') { + auth = auth + ' (auth-token) ' + auth_info.textContent; + } else if (auth_info.nodeName == 'certificate') { + auth = auth + ' (certificate) ' + auth_info.textContent; + } else if (auth_info.nodeName == 'master-key') { + auth = auth + ' (master-key) ' + auth_info.textContent; + } else { + return false; + } + } + } else { + return false; + } + } + this.logIndent(1, 'channels: ' + channels); + this.logIndent(1, 'auth:' + auth); + this.logIndent(1, 'initial resolution: ' + resolution); + } else if (cname == 'transport') { + // The 'transport' node is currently empty. + var transport_children = content_child.childNodes; + if (transport_children.length != 0) { + return false; + } + } else { + return false; + } + } + return true; +}; + +/** + * Pretty print the session-terminate info from the given Xml node. + * + * @param {Node} jingle Xml node with jingle session-terminate info contained in + * child nodes. + * + * @return {boolean} True if we were able to pretty-print the information. + */ +remoting.DebugLog.prototype.prettySessionTerminate = function(jingle) { + if (jingle.childNodes.length != 1) { + return false; + } + var reason = jingle.firstChild; + if (reason.nodeName != 'reason' || reason.childNodes.length != 1) { + return false; + } + var info = reason.firstChild; + if (info.nodeName == 'success') { + this.logIndent(1, 'reason=success'); + } else { + return false; + } + return true; +}; + +/** + * Pretty print the transport-info info from the given Xml node. + * + * @param {Node} jingle Xml node with jingle transport info contained in child + * nodes. + * + * @return {boolean} True if we were able to pretty-print the information. + */ +remoting.DebugLog.prototype.prettyTransportInfo = function(jingle) { + if (jingle.childNodes.length != 1) { + return false; + } + var content = jingle.firstChild; + if (content.nodeName != 'content') { + return false; + } + var transport = content.firstChild; + if (transport.nodeName != 'transport') { + return false; + } + var transport_children = transport.childNodes; + for (var t = 0; t < transport_children.length; t++) { + /** @type {Node} */ + var candidate = transport_children[t]; + if (candidate.nodeName != 'candidate') { + return false; + } + if (!this.verifyAttributes(candidate, 'name,address,port,preference,' + + 'username,protocol,generation,password,type,' + + 'network')) { + return false; + } + var name = candidate.getAttribute('name'); + var address = candidate.getAttribute('address'); + var port = candidate.getAttribute('port'); + var pref = candidate.getAttribute('preference'); + var username = candidate.getAttribute('username'); + var protocol = candidate.getAttribute('protocol'); + var generation = candidate.getAttribute('generation'); + var password = candidate.getAttribute('password'); + var type = candidate.getAttribute('type'); + var network = candidate.getAttribute('network'); + + var info = name + ': ' + address + ':' + port + ' ' + protocol + + ' name:' + username + ' pwd:' + password + + ' pref:' + pref + + ' ' + type; + if (network) { + info = info + " network:'" + network + "'"; + } + this.logIndent(1, info) + } + return true; +}; + +/** + * Pretty print the jingle action contained in the given Xml node. + * + * @param {Node} jingle Xml node with jingle action contained in child nodes. + * @param {string} action String containing the jingle action. + * + * @return {boolean} True if we were able to pretty-print the information. + */ +remoting.DebugLog.prototype.prettyJingleAction = function(jingle, action) { + if (action == 'session-initiate' || action == 'session-accept') { + return this.prettySessionInitiateAccept(jingle); + } + if (action == 'session-terminate') { + return this.prettySessionTerminate(jingle); + } + if (action == 'transport-info') { + return this.prettyTransportInfo(jingle); + } + return false; +}; + +/** + * Pretty print the jingle error information contained in the given Xml node. + * + * @param {Node} error Xml node containing error information in child nodes. + * + * @return {boolean} True if we were able to pretty-print the information. + */ +remoting.DebugLog.prototype.prettyError = function(error) { + if (!this.verifyAttributes(error, 'xmlns:err,code,type,err:hostname,' + + 'err:bnsname,err:stacktrace')) { + return false; + } + var code = error.getAttribute('code'); + var type = error.getAttribute('type'); + var hostname = error.getAttribute('err:hostname'); + var bnsname = error.getAttribute('err:bnsname'); + var stacktrace = error.getAttribute('err:stacktrace'); + this.logIndent(1, 'error ' + code + ' ' + type + " hostname:'" + + hostname + "' bnsname:'" + bnsname + "'"); + var children = error.childNodes; + for (var i = 0; i < children.length; i++) { + /** @type {Node} */ + var child = children[i]; + this.logIndent(1, child.nodeName); + } + if (stacktrace) { + var stack = stacktrace.split(' | '); + this.logIndent(1, 'stacktrace:'); + // We use 'length-1' because the stack trace ends with " | " which results + // in an empty string at the end after the split. + for (var s = 0; s < stack.length - 1; s++) { + this.logIndent(2, stack[s]); + } + } + return true; +}; + +/** + * Print out the heading line for an iq node. + * + * @param {string} action String describing action (send/receive). + * @param {string} id Packet id. + * @param {string} desc Description of iq action for this node. + * @param {string|null} sid Session id. + */ +remoting.DebugLog.prototype.prettyIqHeading = function(action, id, desc, sid) { + var message = 'iq ' + action + ' id=' + id; + if (desc) { + message = message + ' ' + desc; + } + if (sid) { + message = message + ' sid=' + sid; + } + this.log(message); +} + +/** + * Print out an iq 'result'-type node. + * + * @param {string} action String describing action (send/receive). + * @param {NodeList} iq_list Node list containing the 'result' xml. + * + * @return {boolean} True if the data was logged successfully. + */ +remoting.DebugLog.prototype.prettyIqResult = function(action, iq_list) { + /** @type {Node} */ + var iq = iq_list[0]; + var id = iq.getAttribute('id'); + var iq_children = iq.childNodes; + + if (iq_children.length == 0) { + this.prettyIqHeading(action, id, 'result (empty)', null); + return true; + } else if (iq_children.length == 1) { + /** @type {Node} */ + var child = iq_children[0]; + if (child.nodeName == 'query') { + if (!this.verifyAttributes(child, 'xmlns')) { + return false; + } + var xmlns = child.getAttribute('xmlns'); + if (xmlns == 'google:jingleinfo') { + this.prettyIqHeading(action, id, 'result ' + xmlns, null); + return this.prettyJingleinfo(child); + } + return true; + } else if (child.nodeName == 'rem:log-result') { + if (!this.verifyAttributes(child, 'xmlns:rem')) { + return false; + } + this.prettyIqHeading(action, id, 'result (log-result)', null); + return true; + } + } + return false; +} + +/** + * Print out an iq 'get'-type node. + * + * @param {string} action String describing action (send/receive). + * @param {NodeList} iq_list Node containing the 'get' xml. + * + * @return {boolean} True if the data was logged successfully. + */ +remoting.DebugLog.prototype.prettyIqGet = function(action, iq_list) { + /** @type {Node} */ + var iq = iq_list[0]; + var id = iq.getAttribute('id'); + var iq_children = iq.childNodes; + + if (iq_children.length != 1) { + return false; + } + + /** @type {Node} */ + var query = iq_children[0]; + if (query.nodeName != 'query') { + return false; + } + if (!this.verifyAttributes(query, 'xmlns')) { + return false; + } + var xmlns = query.getAttribute('xmlns'); + this.prettyIqHeading(action, id, 'get ' + xmlns, null); + return true; +} + +/** + * Print out an iq 'set'-type node. + * + * @param {string} action String describing action (send/receive). + * @param {NodeList} iq_list Node containing the 'set' xml. + * + * @return {boolean} True if the data was logged successfully. + */ +remoting.DebugLog.prototype.prettyIqSet = function(action, iq_list) { + /** @type {Node} */ + var iq = iq_list[0]; + var id = iq.getAttribute('id'); + var iq_children = iq.childNodes; + + var children = iq_children.length; + if (children >= 1) { + /** @type {Node} */ + var child = iq_children[0]; + if (child.nodeName == 'jingle') { + var jingle = child; + if (!this.verifyAttributes(jingle, 'xmlns,action,sid,initiator')) { + return false; + } + + var jingle_action = jingle.getAttribute('action'); + var sid = jingle.getAttribute('sid'); + + if (children == 1) { + this.prettyIqHeading(action, id, 'set ' + jingle_action, sid); + return this.prettyJingleAction(jingle, jingle_action); + + } else if (children == 2) { + if (jingle_action == 'session-initiate') { + this.prettyIqHeading(action, id, 'set ' + jingle_action, sid); + if (!this.prettySessionInitiateAccept(jingle)) { + return false; + } + + // When there are two child nodes for a 'session-initiate' node, + // the second is a duplicate copy of the 'session' info added by + // libjingle for backward compatability with an older version of + // Jingle (called Gingle). + // Since M16 we no longer use libjingle on the client side and thus + // we no longer generate this duplicate node. + + // Require that second child is 'session' with type='initiate'. + /** @type {Node} */ + var session = iq_children[1]; + if (session.nodeName != 'session') { + return false; + } + var type = session.getAttribute('type'); + if (type != 'initiate') { + return false; + } + // Silently ignore contents of 'session' node. + return true; + } + } + } + } + return false; +}; + +/** + * Print out an iq 'error'-type node. + * + * @param {string} action String describing action (send/receive). + * @param {NodeList} iq_list Node containing the 'error' xml. + * + * @return {boolean} True if the data was logged successfully. + */ +remoting.DebugLog.prototype.prettyIqError = function(action, iq_list) { + /** @type {Node} */ + var iq = iq_list[0]; + var id = iq.getAttribute('id'); + var iq_children = iq.childNodes; + + var children = iq_children.length; + if (children != 2) { + return false; + } + + /** @type {Node} */ + var jingle = iq_children[0]; + if (jingle.nodeName != 'jingle') { + return false; + } + if (!this.verifyAttributes(jingle, 'xmlns,action,sid')) { + return false; + } + var jingle_action = jingle.getAttribute('action'); + var sid = jingle.getAttribute('sid'); + this.prettyIqHeading(action, id, 'error from ' + jingle_action, sid); + if (!this.prettyJingleAction(jingle, jingle_action)) { + return false; + } + + /** @type {Node} */ + var error = iq_children[1]; + if (error.nodeName != 'cli:error') { + return false; + } + return this.prettyError(error); +} + +/** + * Try to log a pretty-print the given IQ stanza (XML). + * Return true if the stanza was successfully printed. + * + * @param {boolean} send True if we're sending this stanza; false for receiving. + * @param {string} message The XML stanza to add to the log. + * + * @return {boolean} True if the stanza was logged. + */ +remoting.DebugLog.prototype.prettyIq = function(send, message) { + var parser = new DOMParser(); + var xml = parser.parseFromString(message, 'text/xml'); + + var iq_list = xml.getElementsByTagName('iq'); + + if (iq_list && iq_list.length > 0) { + /** @type {Node} */ + var iq = iq_list[0]; + if (!this.verifyAttributes(iq, 'xmlns,xmlns:cli,id,to,from,type')) + return false; + + // Verify that the to/from fields match the expected sender/receiver. + var to = iq.getAttribute('to'); + var from = iq.getAttribute('from'); + var action = ''; + var bot = remoting.DebugLog.prototype.REMOTING_DIRECTORY_SERVICE_BOT; + if (send) { + if (to && to != this.hostJid && to != bot) { + this.log('bad to: ' + to); + return false; + } + if (from && from != this.clientJid) { + this.log('bad from: ' + from); + return false; + } + + action = "send"; + if (to == bot) { + action = action + " (to bot)"; + } + } else { + if (to && to != this.clientJid) { + this.log('bad to: ' + to); + return false; + } + if (from && from != this.hostJid && from != bot) { + this.log('bad from: ' + from); + return false; + } + + action = "receive"; + if (from == bot) { + action = action + " (from bot)"; + } + } + + var type = iq.getAttribute('type'); + if (type == 'result') { + return this.prettyIqResult(action, iq_list); + } else if (type == 'get') { + return this.prettyIqGet(action, iq_list); + } else if (type == 'set') { + return this.prettyIqSet(action, iq_list); + } else if (type == 'error') { + return this.prettyIqError(action, iq_list); + } + } + + return false; +}; + +/** + * Add the given IQ stanza to the debug log. + * When possible, the stanza string will be simplified to make it more + * readable. + * + * @param {boolean} send True if we're sending this stanza; false for receiving. + * @param {string} message The XML stanza to add to the log. + */ +remoting.DebugLog.prototype.logIq = function(send, message) { + if (!this.prettyIq(send, message)) { + // Fall back to showing the raw stanza. + var prefix = (send ? 'Sending Iq: ' : 'Receiving Iq: '); + this.log(prefix + message); + } +}; + +/** @type {remoting.DebugLog} */ +remoting.debug = null; diff --git a/remoting/webapp/dividerbottom.png b/remoting/webapp/dividerbottom.png new file mode 100644 index 0000000..3234694 Binary files /dev/null and b/remoting/webapp/dividerbottom.png differ diff --git a/remoting/webapp/dividertop.png b/remoting/webapp/dividertop.png new file mode 100644 index 0000000..50cf995 Binary files /dev/null and b/remoting/webapp/dividertop.png differ diff --git a/remoting/webapp/event_handlers.js b/remoting/webapp/event_handlers.js new file mode 100644 index 0000000..bafb58e --- /dev/null +++ b/remoting/webapp/event_handlers.js @@ -0,0 +1,69 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +function onLoad() { + var goHome = function() { + remoting.setMode(remoting.AppMode.HOME); + }; + var goClient = function() { + remoting.setMode(remoting.AppMode.CLIENT_UNCONNECTED); + }; + /** @param {Event} event */ + var sendAccessCode = function(event) { + remoting.connectIt2Me(); + event.preventDefault(); + }; + /** @param {Event} event */ + var connectHostWithPin = function(event) { + remoting.connectMe2MeWithPin(); + event.preventDefault(); + }; + var doAuthRedirect = function() { + remoting.oauth2.doAuthRedirect(); + } + /** @type {Array.<{event: string, id: string, fn: function(Event):void}>} */ + var actions = [ + { event: 'click', id: 'clear-oauth', fn: remoting.clearOAuth2 }, + { event: 'click', id: 'toolbar-disconnect', fn: remoting.disconnect }, + { event: 'click', id: 'toggle-scaling', fn: remoting.toggleScaleToFit }, + { event: 'click', id: 'auth-button', fn: doAuthRedirect }, + { event: 'click', id: 'share-button', fn: remoting.tryShare }, + { event: 'click', id: 'access-mode-button', fn: goClient }, + { event: 'click', id: 'cancel-share-button', fn: remoting.cancelShare }, + { event: 'click', id: 'host-finished-button', fn: goHome }, + { event: 'click', id: 'client-cancel-button', fn: goHome }, + { event: 'click', id: 'client-finished-button', fn: goClient }, + { event: 'click', id: 'cancel-button', + fn: remoting.cancelPendingOperation }, + { event: 'submit', id: 'access-code-form', fn: sendAccessCode }, + { event: 'submit', id: 'pin-form', fn: connectHostWithPin } + ]; + + for (var i = 0; i < actions.length; ++i) { + var action = actions[i]; + var element = document.getElementById(action.id); + if (element) { + element.addEventListener(action.event, action.fn, false); + } else { + console.error('Could not set ' + action.id + + ' event handler on element ' + action.event + + ': element not found.'); + } + } + remoting.init(); +} + +function onBeforeUnload() { + return remoting.promptClose(); +} + +window.addEventListener('load', onLoad, false); +window.addEventListener('beforeunload', onBeforeUnload, false); +window.addEventListener('resize', remoting.onResize, false); +window.addEventListener('unload', remoting.disconnect, false); diff --git a/remoting/webapp/host_list.js b/remoting/webapp/host_list.js new file mode 100644 index 0000000..8539f28 --- /dev/null +++ b/remoting/webapp/host_list.js @@ -0,0 +1,273 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Class representing the host-list portion of the home screen UI. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * Create a host list consisting of the specified HTML elements, which should + * have a common parent that contains only host-list UI as it will be hidden + * if the host-list is empty. + * + * @constructor + * @param {Element} table The HTML to contain host-list. + * @param {Element} errorDiv The HTML
to display error messages. + */ +remoting.HostList = function(table, errorDiv) { + /** + * @type {Element} + * @private + */ + this.table_ = table; + /** + * @type {Element} + * @private + */ + this.errorDiv_ = errorDiv; + /** + * @type {Array.} + * @private + */ + this.hostTableEntries_ = []; + /** + * @type {Array.} + * @private + */ + this.hosts_ = []; + /** + * @type {string} + * @private + */ + this.lastError_ = ''; + + // Load the cache of the last host-list, if present. + var cached = /** @type {string} */ + (window.localStorage.getItem(remoting.HostList.HOSTS_KEY)); + if (cached) { + try { + this.hosts_ = /** @type {Array} */ JSON.parse(cached); + } catch (err) { + console.error('Invalid host list cache:', /** @type {*} */(err)); + } + } +}; + +/** + * Search the host list for a host with the specified id. + * + * @param {string} hostId The unique id of the host. + * @return {remoting.Host?} The host, if any. + */ +remoting.HostList.prototype.getHostForId = function(hostId) { + for (var i = 0; i < this.hosts_.length; ++i) { + if (this.hosts_[i].hostId == hostId) { + return this.hosts_[i]; + } + } + return null; +}; + +/** + * Query the Remoting Directory for the user's list of hosts. + * + * @param {function(boolean):void} onDone Callback invoked with true on success + * or false on failure. + * @return {void} Nothing. + */ +remoting.HostList.prototype.refresh = function(onDone) { + /** @type {remoting.HostList} */ + var that = this; + /** @param {XMLHttpRequest} xhr The response from the server. */ + var parseHostListResponse = function(xhr) { + that.parseHostListResponse_(xhr, onDone); + } + /** @param {string} token The OAuth2 token. */ + var getHosts = function(token) { + var headers = { 'Authorization': 'OAuth ' + token }; + remoting.xhr.get( + 'https://www.googleapis.com/chromoting/v1/@me/hosts', + parseHostListResponse, '', headers); + }; + remoting.oauth2.callWithToken(getHosts); +}; + +/** + * Handle the results of the host list request. A success response will + * include a JSON-encoded list of host descriptions, which we display if we're + * able to successfully parse it. + * + * @param {XMLHttpRequest} xhr The XHR object for the host list request. + * @param {function(boolean):void} onDone The callback passed to |refresh|. + * @return {void} Nothing. + * @private + */ +remoting.HostList.prototype.parseHostListResponse_ = function(xhr, onDone) { + this.hosts_ = []; + this.lastError_ = ''; + try { + if (xhr.status == 200) { + var parsed_response = + /** @type {{data: {items: Array}}} */ JSON.parse(xhr.responseText); + if (parsed_response.data && parsed_response.data.items) { + this.hosts_ = parsed_response.data.items; + } + } else { + // Some other error. + console.error('Bad status on host list query: ', xhr); + if (xhr.status == 403) { + // The user's account is not enabled for Me2Me, so fail silently. + } else if (xhr.status >= 400 && xhr.status < 500) { + // For other errors, tell the user to re-authorize us. + this.lastError_ = remoting.Error.GENERIC; + } else if (xhr.status == 503) { + this.lastError_ = remoting.Error.SERVICE_UNAVAILABLE; + } else { + this.lastError_ = remoting.Error.UNEXPECTED; + } + } + } catch (er) { + var typed_er = /** @type {Object} */ (er); + console.error('Error processing response: ', xhr, typed_er); + this.lastError_ = remoting.Error.UNEXPECTED; + } + window.localStorage.setItem(remoting.HostList.HOSTS_KEY, + JSON.stringify(this.hosts_)); + onDone(this.lastError_ == ''); +}; + +/** + * Display the list of hosts or error condition. + * + * @return {void} Nothing. + */ +remoting.HostList.prototype.display = function() { + this.table_.innerHTML = ''; + this.errorDiv_.innerText = ''; + this.hostTableEntries_ = []; + + /** + * @type {remoting.HostList} + */ + var that = this; + /** + * @param {remoting.HostTableEntry} hostTableEntry The entry being renamed. + */ + var onRename = function(hostTableEntry) { that.renameHost_(hostTableEntry); } + /** + * @param {remoting.HostTableEntry} hostTableEntry The entry beign deleted. + */ + var onDelete = function(hostTableEntry) { that.deleteHost_(hostTableEntry); } + + for (var i = 0; i < this.hosts_.length; ++i) { + /** @type {remoting.Host} */ + var host = this.hosts_[i]; + // Validate the entry to make sure it has all the fields we expect. + if (host.hostName && host.hostId && host.status && host.jabberId && + host.publicKey) { + var hostTableEntry = new remoting.HostTableEntry(); + hostTableEntry.init(host, onRename, onDelete); + this.hostTableEntries_[i] = hostTableEntry; + this.table_.appendChild(hostTableEntry.tableRow); + } + } + + if (this.lastError_ != '') { + l10n.localizeElementFromTag(this.errorDiv_, this.lastError_); + } + + this.showOrHide_(this.hosts_.length != 0 || this.lastError_ != ''); +}; + +/** + * Show or hide the host-list UI. + * + * @param {boolean} show True to show the UI, or false to hide it. + * @return {void} Nothing. + * @private + */ +remoting.HostList.prototype.showOrHide_ = function(show) { + var parent = /** @type {Element} */ (this.table_.parentNode); + parent.hidden = !show; + if (show) { + parent.style.height = parent.scrollHeight + 'px'; + removeClass(parent, remoting.HostList.COLLAPSED_); + } else { + addClass(parent, remoting.HostList.COLLAPSED_); + } +}; + +/** + * Remove a host from the list, and deregister it. + * @param {remoting.HostTableEntry} hostTableEntry The host to be removed. + * @return {void} Nothing. + * @private + */ +remoting.HostList.prototype.deleteHost_ = function(hostTableEntry) { + this.table_.removeChild(hostTableEntry.tableRow); + var index = this.hostTableEntries_.indexOf(hostTableEntry); + if (index != -1) { + this.hostTableEntries_.splice(index, 1); + } + + /** @param {string} token The OAuth2 token. */ + var deleteHost = function(token) { + var headers = { 'Authorization': 'OAuth ' + token }; + remoting.xhr.remove( + 'https://www.googleapis.com/chromoting/v1/@me/hosts/' + + hostTableEntry.host.hostId, + function() {}, '', headers); + } + remoting.oauth2.callWithToken(deleteHost); + + this.showOrHide_(this.hostTableEntries_.length != 0); +}; + +/** + * Prepare a host for renaming by replacing its name with an edit box. + * @param {remoting.HostTableEntry} hostTableEntry The host to be renamed. + * @return {void} Nothing. + * @private + */ +remoting.HostList.prototype.renameHost_ = function(hostTableEntry) { + /** @param {string} token */ + var renameHost = function(token) { + var headers = { + 'Authorization': 'OAuth ' + token, + 'Content-type' : 'application/json; charset=UTF-8' + }; + var newHostDetails = { data: { + hostId: hostTableEntry.host.hostId, + hostName: hostTableEntry.host.hostName, + publicKey: hostTableEntry.host.publicKey + } }; + remoting.xhr.put( + 'https://www.googleapis.com/chromoting/v1/@me/hosts/' + + hostTableEntry.host.hostId, + function(xhr) {}, + JSON.stringify(newHostDetails), + headers); + } + remoting.oauth2.callWithToken(renameHost); +}; + +/** + * Class name for the host list when it is collapsed. + * @private + */ +remoting.HostList.COLLAPSED_ = 'collapsed'; + +/** + * Key name under which Me2Me hosts are cached. + */ +remoting.HostList.HOSTS_KEY = 'me2me-cached-hosts'; + +/** @type {remoting.HostList} */ +remoting.hostList = null; diff --git a/remoting/webapp/host_plugin_proto.js b/remoting/webapp/host_plugin_proto.js new file mode 100644 index 0000000..a64ac46 --- /dev/null +++ b/remoting/webapp/host_plugin_proto.js @@ -0,0 +1,44 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains type definitions for the host plugin. It is used only +// with JSCompiler to verify the type-correctness of our code. + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @constructor + * @extends HTMLElement + */ +remoting.HostPlugin = function() {}; + +/** @param {string} email The email address of the connector. + * @param {string} token The access token for the connector. + * @return {void} Nothing. */ +remoting.HostPlugin.prototype.connect = function(email, token) {}; + +/** @return {void} Nothing. */ +remoting.HostPlugin.prototype.disconnect = function() {}; + +/** @param {function(string):string} callback Pointer to chrome.i18n.getMessage. + * @return {void} Nothing. */ +remoting.HostPlugin.prototype.localize = function(callback) {}; + +/** @type {number} */ remoting.HostPlugin.prototype.state; + +/** @type {number} */ remoting.HostPlugin.prototype.STARTING; +/** @type {number} */ remoting.HostPlugin.prototype.REQUESTED_ACCESS_CODE; +/** @type {number} */ remoting.HostPlugin.prototype.RECEIVED_ACCESS_CODE; +/** @type {number} */ remoting.HostPlugin.prototype.CONNECTED; +/** @type {number} */ remoting.HostPlugin.prototype.DISCONNECTED; +/** @type {number} */ remoting.HostPlugin.prototype.DISCONNECTING; +/** @type {number} */ remoting.HostPlugin.prototype.ERROR; + +/** @type {string} */ remoting.HostPlugin.prototype.accessCode; +/** @type {number} */ remoting.HostPlugin.prototype.accessCodeLifetime; + +/** @type {string} */ remoting.HostPlugin.prototype.client; + +/** @type {function(boolean):void} */ +remoting.HostPlugin.prototype.onNatTraversalPolicyChanged; diff --git a/remoting/webapp/host_screen.js b/remoting/webapp/host_screen.js new file mode 100644 index 0000000..2af3b84 --- /dev/null +++ b/remoting/webapp/host_screen.js @@ -0,0 +1,271 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Functions related to the 'host screen' for Chromoting. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @type {boolean} Whether or not the last share was cancelled by the user. + * This controls what screen is shown when the host plugin signals + * completion. + * @private + */ +var lastShareWasCancelled_ = false; + +/** + * Start a host session. This is the main entry point for the host screen, + * called directly from the onclick action of a button on the home screen. + */ +remoting.tryShare = function() { + remoting.debug.log('Attempting to share...'); + lastShareWasCancelled_ = false; + if (remoting.oauth2.needsNewAccessToken()) { + remoting.debug.log('Refreshing token...'); + remoting.oauth2.refreshAccessToken(function() { + if (remoting.oauth2.needsNewAccessToken()) { + // If we still need it, we're going to infinite loop. + showShareError_(remoting.Error.AUTHENTICATION_FAILED); + throw 'Unable to get access token'; + } + remoting.tryShare(); + }); + return; + } + + onNatTraversalPolicyChanged_(true); // Hide warning by default. + remoting.setMode(remoting.AppMode.HOST_WAITING_FOR_CODE); + document.getElementById('cancel-button').disabled = false; + disableTimeoutCountdown_(); + + var div = document.getElementById('host-plugin-container'); + remoting.hostSession = new remoting.HostSession(); + remoting.hostSession.createPluginAndConnect( + document.getElementById('host-plugin-container'), + /** @type {string} */(remoting.oauth2.getCachedEmail()), + remoting.oauth2.getAccessToken(), + onNatTraversalPolicyChanged_, + onHostStateChanged_, + logDebugInfo_); +}; + +/** + * Callback for the host plugin to notify the web app of state changes. + * @param {remoting.HostSession.State} state The new state of the plugin. + */ +function onHostStateChanged_(state) { + if (state == remoting.HostSession.State.STARTING) { + // Nothing to do here. + remoting.debug.log('Host plugin state: STARTING'); + + } else if (state == remoting.HostSession.State.REQUESTED_ACCESS_CODE) { + // Nothing to do here. + remoting.debug.log('Host plugin state: REQUESTED_ACCESS_CODE'); + + } else if (state == remoting.HostSession.State.RECEIVED_ACCESS_CODE) { + remoting.debug.log('Host plugin state: RECEIVED_ACCESS_CODE'); + var accessCode = remoting.hostSession.getAccessCode(); + var accessCodeDisplay = document.getElementById('access-code-display'); + accessCodeDisplay.innerText = ''; + // Display the access code in groups of four digits for readability. + var kDigitsPerGroup = 4; + for (var i = 0; i < accessCode.length; i += kDigitsPerGroup) { + var nextFourDigits = document.createElement('span'); + nextFourDigits.className = 'access-code-digit-group'; + nextFourDigits.innerText = accessCode.substring(i, i + kDigitsPerGroup); + accessCodeDisplay.appendChild(nextFourDigits); + } + accessCodeExpiresIn_ = remoting.hostSession.getAccessCodeLifetime(); + if (accessCodeExpiresIn_ > 0) { // Check it hasn't expired. + accessCodeTimerId_ = setInterval( + 'remoting.decrementAccessCodeTimeout_()', 1000); + timerRunning_ = true; + updateAccessCodeTimeoutElement_(); + updateTimeoutStyles_(); + remoting.setMode(remoting.AppMode.HOST_WAITING_FOR_CONNECTION); + } else { + // This can only happen if the cloud tells us that the code lifetime is + // <= 0s, which shouldn't happen so we don't care how clean this UX is. + remoting.debug.log('Access code already invalid on receipt!'); + remoting.cancelShare(); + } + + } else if (state == remoting.HostSession.State.CONNECTED) { + remoting.debug.log('Host plugin state: CONNECTED'); + var element = document.getElementById('host-shared-message'); + var client = remoting.hostSession.getClient(); + l10n.localizeElement(element, client); + remoting.setMode(remoting.AppMode.HOST_SHARED); + disableTimeoutCountdown_(); + + } else if (state == remoting.HostSession.State.DISCONNECTING) { + remoting.debug.log('Host plugin state: DISCONNECTING'); + + } else if (state == remoting.HostSession.State.DISCONNECTED) { + remoting.debug.log('Host plugin state: DISCONNECTED'); + if (remoting.currentMode != remoting.AppMode.HOST_SHARE_FAILED) { + // If an error is being displayed, then the plugin should not be able to + // hide it by setting the state. Errors must be dismissed by the user + // clicking OK, which puts the app into mode HOME. + if (lastShareWasCancelled_) { + remoting.setMode(remoting.AppMode.HOME); + } else { + remoting.setMode(remoting.AppMode.HOST_SHARE_FINISHED); + } + } + remoting.hostSession.removePlugin(); + + } else if (state == remoting.HostSession.State.ERROR) { + remoting.debug.log('Host plugin state: ERROR'); + showShareError_(remoting.Error.GENERIC); + } else { + remoting.debug.log('Unknown state -> ' + state); + } +} + +/** + * This is the callback that the host plugin invokes to indicate that there + * is additional debug log info to display. + * @param {string} msg The message (which will not be localized) to be logged. + */ +function logDebugInfo_(msg) { + remoting.debug.log('plugin: ' + msg); +} + +/** + * Show a host-side error message. + * + * @param {string} errorTag The error message to be localized and displayed. + * @return {void} Nothing. + */ +function showShareError_(errorTag) { + var errorDiv = document.getElementById('host-plugin-error'); + l10n.localizeElementFromTag(errorDiv, errorTag); + remoting.debug.log('Sharing error: ' + errorTag); + remoting.setMode(remoting.AppMode.HOST_SHARE_FAILED); +} + +/** + * Cancel an active or pending share operation. + * + * @return {void} Nothing. + */ +remoting.cancelShare = function() { + remoting.debug.log('Canceling share...'); + remoting.lastShareWasCancelled = true; + try { + remoting.hostSession.disconnect(); + } catch (error) { + // Hack to force JSCompiler type-safety. + var errorTyped = /** @type {{description: string}} */ error; + remoting.debug.log('Error disconnecting: ' + errorTyped.description + + '. The host plugin probably crashed.'); + // TODO(jamiewalch): Clean this up. We should have a class representing + // the host plugin, like we do for the client, which should handle crash + // reporting and it should use a more detailed error message than the + // default 'generic' one. See crbug.com/94624 + showShareError_(remoting.Error.GENERIC); + } + disableTimeoutCountdown_(); +}; + +/** + * @type {boolean} Whether or not the access code timeout countdown is running. + * @private + */ +var timerRunning_ = false; + +/** + * @type {number} The id of the access code expiry countdown timer. + * @private + */ +var accessCodeTimerId_ = 0; + +/** + * @type {number} The number of seconds until the access code expires. + * @private + */ +var accessCodeExpiresIn_ = 0; + +/** + * The timer callback function, which needs to be visible from the global + * namespace. + * @private + */ +remoting.decrementAccessCodeTimeout_ = function() { + --accessCodeExpiresIn_; + updateAccessCodeTimeoutElement_(); +}; + +/** + * Stop the access code timeout countdown if it is running. + */ +function disableTimeoutCountdown_() { + if (timerRunning_) { + clearInterval(accessCodeTimerId_); + timerRunning_ = false; + updateTimeoutStyles_(); + } +} + +/** + * Constants controlling the access code timer countdown display. + * @private + */ +var ACCESS_CODE_TIMER_DISPLAY_THRESHOLD_ = 30; +var ACCESS_CODE_RED_THRESHOLD_ = 10; + +/** + * Show/hide or restyle various elements, depending on the remaining countdown + * and timer state. + * + * @return {boolean} True if the timeout is in progress, false if it has + * expired. + */ +function updateTimeoutStyles_() { + if (timerRunning_) { + if (accessCodeExpiresIn_ <= 0) { + remoting.cancelShare(); + return false; + } + if (accessCodeExpiresIn_ <= ACCESS_CODE_RED_THRESHOLD_) { + addClass(document.getElementById('access-code-display'), 'expiring'); + } else { + removeClass(document.getElementById('access-code-display'), 'expiring'); + } + } + document.getElementById('access-code-countdown').hidden = + (accessCodeExpiresIn_ > ACCESS_CODE_TIMER_DISPLAY_THRESHOLD_) || + !timerRunning_; + return true; +} + +/** + * Update the text and appearance of the access code timeout element to + * reflect the time remaining. + */ +function updateAccessCodeTimeoutElement_() { + var pad = (accessCodeExpiresIn_ < 10) ? '0:0' : '0:'; + l10n.localizeElement(document.getElementById('seconds-remaining'), + pad + accessCodeExpiresIn_); + if (!updateTimeoutStyles_()) { + disableTimeoutCountdown_(); + } +} + +/** + * Callback to show or hide the NAT traversal warning when the policy changes. + * @param {boolean} enabled True if NAT traversal is enabled. + * @return {void} Nothing. + */ +function onNatTraversalPolicyChanged_(enabled) { + var container = document.getElementById('nat-box-container'); + container.hidden = enabled; +} diff --git a/remoting/webapp/host_session.js b/remoting/webapp/host_session.js new file mode 100644 index 0000000..7dfb95a --- /dev/null +++ b/remoting/webapp/host_session.js @@ -0,0 +1,116 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Class handling creation and teardown of a remoting host session. + * + * This abstracts a element and controls the plugin which does the + * actual remoting work. There should be no UI code inside this class. It + * should be purely thought of as a controller of sorts. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @constructor + */ +remoting.HostSession = function() { + /** @private */ + this.HOST_PLUGIN_ID_ = 'host-plugin-id'; +}; + +/** @type {remoting.HostPlugin} */ +remoting.HostSession.prototype.plugin = null; + +// Note that these values are copied directly from host_script_object.h and +// must be kept in sync. +/** @enum {number} */ +remoting.HostSession.State = { + UNKNOWN: -1, + DISCONNECTED: 0, + STARTING: 1, + REQUESTED_ACCESS_CODE: 2, + RECEIVED_ACCESS_CODE: 3, + CONNECTED: 4, + DISCONNECTING: 5, + ERROR: 6 +}; + +/** + * Create the host plugin and initiate a connection. + * @param {Element} container The parent element to which to add the plugin. + * @param {string} email The user's email address. + * @param {string} accessToken A valid OAuth2 access token. + * @param {function(boolean):void} onNatTraversalPolicyChanged Callback + * for notification of changes to the NAT traversal policy. + * @param {function(remoting.HostSession.State):void} onStateChanged + * Callback for notifications of changes to the host plugin's state. + * @param {function(string):void} logDebugInfo Callback allowing the plugin + * to log messages to the debug log. + */ +remoting.HostSession.prototype.createPluginAndConnect = + function(container, email, accessToken, + onNatTraversalPolicyChanged, onStateChanged, logDebugInfo) { + this.plugin = /** @type {remoting.HostPlugin} */ + document.createElement('embed'); + this.plugin.type = remoting.PLUGIN_MIMETYPE; + this.plugin.id = this.HOST_PLUGIN_ID_; + // Hiding the plugin means it doesn't load, so make it size zero instead. + this.plugin.width = 0; + this.plugin.height = 0; + container.appendChild(this.plugin); + this.plugin.onNatTraversalPolicyChanged = onNatTraversalPolicyChanged; + this.plugin.onStateChanged = onStateChanged; + this.plugin.logDebugInfo = logDebugInfo; + this.plugin.localize(chrome.i18n.getMessage); + this.plugin.connect(email, 'oauth2:' + accessToken); +}; + +/** + * Get the access code generated by the host plugin. Valid only after the + * plugin state is RECEIVED_ACCESS_CODE. + * @return {string} The access code. + */ +remoting.HostSession.prototype.getAccessCode = function() { + return this.plugin.accessCode; +}; + +/** + * Get the lifetime for the access code. Valid only after the plugin state is + * RECEIVED_ACCESS_CODE. + * @return {number} The access code lifetime, in seconds. + */ +remoting.HostSession.prototype.getAccessCodeLifetime = function() { + return this.plugin.accessCodeLifetime; +}; + +/** + * Get the email address of the connected client. Valid only after the plugin + * state is CONNECTED. + * @return {string} The client's email address. + */ +remoting.HostSession.prototype.getClient = function() { + return this.plugin.client; +}; + +/** + * Disconnect the client. + * @return {void} Nothing. + */ +remoting.HostSession.prototype.disconnect = function() { + this.plugin.disconnect(); +}; + + +/** + * Remove the plugin element from the document. + * @return {void} Nothing. + */ +remoting.HostSession.prototype.removePlugin = function() { + this.plugin.parentNode.removeChild(this.plugin); +}; diff --git a/remoting/webapp/host_table_entry.js b/remoting/webapp/host_table_entry.js new file mode 100644 index 0000000..86e9409 --- /dev/null +++ b/remoting/webapp/host_table_entry.js @@ -0,0 +1,196 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Class representing an entry in the host-list portion of the home screen. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * The deserialized form of the chromoting host as returned by Apiary. + * Note that the object has more fields than are detailed below--these + * are just the ones that we refer to directly. + * @constructor + */ +remoting.Host = function() { + /** @type {string} */ + this.hostName = ''; + /** @type {string} */ + this.hostId = ''; + /** @type {string} */ + this.status = ''; + /** @type {string} */ + this.jabberId = ''; + /** @type {string} */ + this.publicKey = ''; +}; + +/** + * An entry in the host table. + * @constructor + */ +remoting.HostTableEntry = function() { + /** @type {remoting.Host} */ + this.host = null; + /** @type {Element} */ + this.tableRow = null; + /** @type {Element} @private */ + this.hostNameCell_ = null; + /** @type {function(remoting.HostTableEntry):void} @private */ + this.onRename_ = function(hostId) {}; + /** @type {function():void} @private */ + this.onBlurReference_ = function() {}; +}; + +/** + * Create the HTML elements for this entry. + * @param {remoting.Host} host The host, as obtained from Apiary. + * @param {function(remoting.HostTableEntry):void} onRename Callback for + * rename operations. + * @param {function(remoting.HostTableEntry):void} onDelete Callback for + * delete operations. + */ +remoting.HostTableEntry.prototype.init = function(host, onRename, onDelete) { + this.host = host; + this.onRename_ = onRename; + + /** @type {remoting.HostTableEntry} */ + var that = this; + + this.tableRow = document.createElement('tr'); + addClass(this.tableRow, 'host-list-row'); + + // Create the host icon cell. + var hostIcon = document.createElement('td'); + addClass(hostIcon, 'host-list-row-start'); + var hostIconImage = document.createElement('img'); + hostIconImage.src = 'icon_host.png'; + addClass(hostIconImage, 'host-list-main-icon'); + hostIcon.appendChild(hostIconImage); + this.tableRow.appendChild(hostIcon); + + // Create the host name cell. + this.hostNameCell_ = document.createElement('td'); + addClass(this.hostNameCell_, 'mode-select-label'); + this.hostNameCell_.appendChild( + document.createTextNode(host.hostName)); + this.hostNameCell_.ondblclick = function() { that.beginRename_(); }; + this.tableRow.appendChild(this.hostNameCell_); + + // Create the host status cell. + var hostStatus = document.createElement('td'); + if (host.status == 'ONLINE') { + var hostUrl = chrome.extension.getURL('choice.html') + + '?mode=me2me&hostId=' + encodeURIComponent(host.hostId); + var connectButton = document.createElement('button'); + connectButton.setAttribute('class', 'mode-select-button'); + connectButton.setAttribute('type', 'button'); + var startMe2Me = function() { window.location.replace(hostUrl); }; + connectButton.addEventListener('click', startMe2Me, false); + connectButton.innerHTML = + chrome.i18n.getMessage(/*i18n-content*/'CONNECT_BUTTON'); + hostStatus.appendChild(connectButton); + } else { + addClass(this.tableRow, 'host-offline'); + hostStatus.innerHTML = chrome.i18n.getMessage(/*i18n-content*/'OFFLINE'); + } + hostStatus.className = 'host-list-row-end'; + this.tableRow.appendChild(hostStatus); + + // Create the host rename cell. + var editButton = document.createElement('td'); + editButton.onclick = function() { that.beginRename_(); }; + addClass(editButton, 'clickable'); + addClass(editButton, 'host-list-edit'); + var penImage = document.createElement('img'); + penImage.src = 'icon_pencil.png'; + addClass(penImage, 'host-list-rename-icon'); + editButton.appendChild(penImage); + this.tableRow.appendChild(editButton); + + // Create the host delete cell. + var deleteButton = document.createElement('td'); + deleteButton.onclick = function() { onDelete(that); } + addClass(deleteButton, 'clickable'); + addClass(deleteButton, 'host-list-edit'); + var crossImage = document.createElement('img'); + crossImage.src = 'icon_cross.png'; + addClass(crossImage, 'host-list-remove-icon'); + deleteButton.appendChild(crossImage); + this.tableRow.appendChild(deleteButton); +}; + +/** + * Prepare the host for renaming by replacing its name with an edit box. + * @return {void} Nothing. + * @private + */ +remoting.HostTableEntry.prototype.beginRename_ = function() { + var editBox = /** @type {HTMLInputElement} */ document.createElement('input'); + editBox.type = 'text'; + editBox.value = this.host.hostName; + this.hostNameCell_.innerHTML = ''; + this.hostNameCell_.appendChild(editBox); + editBox.select(); + + /** @type {remoting.HostTableEntry} */ + var that = this; + // Keep a reference to the blur event handler so that we can remove it later. + this.onBlurReference_ = function() { that.commitRename_(); }; + editBox.addEventListener('blur', this.onBlurReference_, false); + + /** @param {Event} event The keydown event. */ + var onKeydown = function(event) { that.onKeydown_(event); } + editBox.addEventListener('keydown', onKeydown, false); +}; + +/** + * Accept the hostname entered by the user. + * @return {void} Nothing. + * @private + */ +remoting.HostTableEntry.prototype.commitRename_ = function() { + var editBox = this.hostNameCell_.querySelector('input'); + if (editBox) { + if (this.host.hostName != editBox.value) { + this.host.hostName = editBox.value; + this.onRename_(this); + } + this.removeEditBox_(); + } +}; + +/** + * Remove the edit box corresponding to the specified host, and reset its name. + * @return {void} Nothing. + * @private + */ +remoting.HostTableEntry.prototype.removeEditBox_ = function() { + var editBox = this.hostNameCell_.querySelector('input'); + if (editBox) { + // onblur will fire when the edit box is removed, so remove the hook. + editBox.removeEventListener('blur', this.onBlurReference_, false); + } + this.hostNameCell_.innerHTML = ''; // Remove the edit box. + this.hostNameCell_.appendChild(document.createTextNode(this.host.hostName)); +}; + +/** + * Handle a key event while the user is typing a host name + * @param {Event} event The keyboard event. + * @return {void} Nothing. + * @private + */ +remoting.HostTableEntry.prototype.onKeydown_ = function(event) { + if (event.which == 27) { // Escape + this.removeEditBox_(); + } else if (event.which == 13) { // Enter + this.commitRename_(); + } +}; diff --git a/remoting/webapp/l10n.js b/remoting/webapp/l10n.js new file mode 100644 index 0000000..487d1c0 --- /dev/null +++ b/remoting/webapp/l10n.js @@ -0,0 +1,62 @@ +/* Copyright (c) 2011 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +var l10n = l10n || {}; + +/** + * Localize an element by setting its innerText according to the specified tag + * and an optional set of substitutions. + * @param {Element} element The element to localize. + * @param {string} tag The localization tag. + * @param {(string|Array)=} opt_substitutions An optional set of substitution + * strings corresponding to the "placeholders" attributes in messages.json. + * @return {boolean} True if the localization was successful; false otherwise. + */ +l10n.localizeElementFromTag = function(element, tag, opt_substitutions) { + var translation = chrome.i18n.getMessage(tag, opt_substitutions); + if (translation) { + element.innerHTML = translation; + } else { + console.error('Missing translation for "' + tag + '":', element); + } + return translation != null; +}; + +/** + * Localize an element by setting its innerText according to its i18n-content + * attribute, and an optional set of substitutions. + * @param {Element} element The element to localize. + * @param {(string|Array)=} opt_substitutions An optional set of substitution + * strings corresponding to the "placeholders" attributes in messages.json. + * @return {boolean} True if the localization was successful; false otherwise. + */ +l10n.localizeElement = function(element, opt_substitutions) { + var tag = element.getAttribute('i18n-content'); + return l10n.localizeElementFromTag(element, tag, opt_substitutions); +}; + +/** + * Localize all tags with the i18n-content attribute, using i18n-data-n + * attributes to specify any placeholder substitutions. + */ +l10n.localize = function() { + var elements = document.querySelectorAll('[i18n-content]'); + for (var i = 0; i < elements.length; ++i) { + /** @type {Element} */ var element = elements[i]; + var substitutions = null; + for (var j = 1; j < 9; ++j) { + var attr = 'i18n-value-' + j; + if (element.hasAttribute(attr)) { + if (!substitutions) { + substitutions = []; + } + substitutions.push(element.getAttribute(attr)); + } else { + break; + } + } + l10n.localizeElement(element, substitutions); + } +}; diff --git a/remoting/webapp/log_to_server.js b/remoting/webapp/log_to_server.js new file mode 100644 index 0000000..92841cc --- /dev/null +++ b/remoting/webapp/log_to_server.js @@ -0,0 +1,237 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Module for sending log entries to the server. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @constructor + */ +remoting.LogToServer = function() { + /** @type Array. */ + this.pendingEntries = []; + /** @type {remoting.StatsAccumulator} */ + this.statsAccumulator = new remoting.StatsAccumulator(); + /** @type string */ + this.sessionId = ''; + /** @type number */ + this.sessionIdGenerationTime = 0; + /** @type number */ + this.sessionStartTime = 0; +}; + +// Constants used for generating a session ID. +/** @private */ +remoting.LogToServer.SESSION_ID_ALPHABET_ = + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; +/** @private */ +remoting.LogToServer.SESSION_ID_LEN_ = 20; + +// The maximum age of a session ID, in milliseconds. +remoting.LogToServer.MAX_SESSION_ID_AGE = 24 * 60 * 60 * 1000; + +// The time over which to accumulate connection statistics before logging them +// to the server, in milliseconds. +remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME = 60 * 1000; + +/** + * Logs a client session state change. + * + * @param {remoting.ClientSession.State} state + * @param {remoting.ClientSession.ConnectionError} connectionError + */ +remoting.LogToServer.prototype.logClientSessionStateChange = + function(state, connectionError) { + this.maybeExpireSessionId(); + // Maybe set the session ID and start time. + if (remoting.LogToServer.isStartOfSession(state)) { + if (this.sessionId == '') { + this.setSessionId(); + } + if (this.sessionStartTime == 0) { + this.sessionStartTime = new Date().getTime(); + } + } + // Log the session state change. + var entry = remoting.ServerLogEntry.makeClientSessionStateChange( + state, connectionError); + entry.addHostFields(); + entry.addChromeVersionField(); + entry.addWebappVersionField(); + entry.addSessionIdField(this.sessionId); + // Maybe clear the session start time, and log the session duration. + if (remoting.LogToServer.isEndOfSession(state) && + (this.sessionStartTime != 0)) { + entry.addSessionDurationField( + (new Date().getTime() - this.sessionStartTime) / 1000.0); + this.sessionStartTime = 0; + } + this.log(entry); + // Don't accumulate connection statistics across state changes. + this.logAccumulatedStatistics(); + this.statsAccumulator.empty(); + // Maybe clear the session ID. + if (remoting.LogToServer.isEndOfSession(state)) { + this.clearSessionId(); + } +}; + +/** + * Whether a session state is one of the states that occurs at the start of + * a session. + * + * @private + * @param {remoting.ClientSession.State} state + * @return {boolean} + */ +remoting.LogToServer.isStartOfSession = function(state) { + return ((state == remoting.ClientSession.State.CONNECTING) || + (state == remoting.ClientSession.State.INITIALIZING) || + (state == remoting.ClientSession.State.CONNECTED)); +}; + +/** + * Whether a session state is one of the states that occurs at the end of + * a session. + * + * @private + * @param {remoting.ClientSession.State} state + * @return {boolean} + */ +remoting.LogToServer.isEndOfSession = function(state) { + return ((state == remoting.ClientSession.State.CLOSED) || + (state == remoting.ClientSession.State.CONNECTION_FAILED)); +}; + +/** + * Logs connection statistics. + * @param {Object.} stats the connection statistics + */ +remoting.LogToServer.prototype.logStatistics = function(stats) { + this.maybeExpireSessionId(); + // Store the statistics. + this.statsAccumulator.add(stats); + // Send statistics to the server if they've been accumulating for at least + // 60 seconds. + if (this.statsAccumulator.getTimeSinceFirstValue() >= + remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME) { + this.logAccumulatedStatistics(); + } +}; + +/** + * Moves connection statistics from the accumulator to the log server. + * + * If all the statistics are zero, then the accumulator is still emptied, + * but the statistics are not sent to the log server. + * + * @private + */ +remoting.LogToServer.prototype.logAccumulatedStatistics = function() { + var entry = remoting.ServerLogEntry.makeStats(this.statsAccumulator); + if (entry) { + entry.addHostFields(); + entry.addChromeVersionField(); + entry.addWebappVersionField(); + entry.addSessionIdField(this.sessionId); + this.log(entry); + } + this.statsAccumulator.empty(); +}; + +/** + * Sends a log entry to the server. + * + * @private + * @param {remoting.ServerLogEntry} entry + */ +remoting.LogToServer.prototype.log = function(entry) { + // Send the stanza to the debug log. + remoting.debug.log('Enqueueing log entry:'); + entry.toDebugLog(1); + // Store a stanza for the entry. + this.pendingEntries.push(entry.toStanza()); + // Stop if there's no connection to the server. + if (!remoting.wcs) { + return; + } + // Send all pending entries to the server. + remoting.debug.log('Sending ' + this.pendingEntries.length + ' log ' + + ((this.pendingEntries.length == 1) ? 'entry' : 'entries') + + ' to the server.'); + var stanza = ''; + while (this.pendingEntries.length > 0) { + stanza += /** @type string */ this.pendingEntries.shift(); + } + stanza += ''; + remoting.wcs.sendIq(stanza); +}; + +/** + * Sets the session ID to a random string. + * + * @private + */ +remoting.LogToServer.prototype.setSessionId = function() { + this.sessionId = remoting.LogToServer.generateSessionId(); + this.sessionIdGenerationTime = new Date().getTime(); +}; + +/** + * Clears the session ID. + * + * @private + */ +remoting.LogToServer.prototype.clearSessionId = function() { + this.sessionId = ''; + this.sessionIdGenerationTime = 0; +}; + +/** + * Sets a new session ID, if the current session ID has reached its maximum age. + * + * This method also logs the old and new session IDs to the server, in separate + * log entries. + * + * @private + */ +remoting.LogToServer.prototype.maybeExpireSessionId = function() { + if ((this.sessionId != '') && + (new Date().getTime() - this.sessionIdGenerationTime >= + remoting.LogToServer.MAX_SESSION_ID_AGE)) { + // Log the old session ID. + var entry = remoting.ServerLogEntry.makeSessionIdOld(this.sessionId); + this.log(entry); + // Generate a new session ID. + this.setSessionId(); + // Log the new session ID. + entry = remoting.ServerLogEntry.makeSessionIdNew(this.sessionId); + this.log(entry); + } +}; + +/** + * Generates a string that can be used as a session ID. + * + * @private + * @return {string} a session ID + */ +remoting.LogToServer.generateSessionId = function() { + var idArray = []; + for (var i = 0; i < remoting.LogToServer.SESSION_ID_LEN_; i++) { + var index = + Math.random() * remoting.LogToServer.SESSION_ID_ALPHABET_.length; + idArray.push( + remoting.LogToServer.SESSION_ID_ALPHABET_.slice(index, index + 1)); + } + return idArray.join(''); +}; diff --git a/remoting/webapp/main.css b/remoting/webapp/main.css new file mode 100644 index 0000000..c05ad44 --- /dev/null +++ b/remoting/webapp/main.css @@ -0,0 +1,8 @@ +/* Copyright (c) 2011 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +form { + display: inline; +} diff --git a/remoting/webapp/manifest.json b/remoting/webapp/manifest.json new file mode 100644 index 0000000..9b64a6f --- /dev/null +++ b/remoting/webapp/manifest.json @@ -0,0 +1,37 @@ +{ + "name": "__MSG_PRODUCT_NAME__ BETA", + "version": "1.3.UNIQUE_VERSION", + "description": "__MSG_PRODUCT_DESCRIPTION__", + "default_locale": "en", + "app": { + "launch": { + "local_path": "choice.html" + } + }, + "icons": { + "128": "chromoting128.png", + "48": "chromoting48.png", + "16": "chromoting16.png" + }, + "content_scripts": [ + { + "matches": [ + "https://talkgadget.google.com/talkgadget/blank", + "https://talkgadget.google.com/talkgadget/blank?*" + ], + "js": [ "cs_oauth2_trampoline.js" ] + } + ], + "permissions": [ + "https://accounts.google.com/o/oauth2/*", + "https://www.google.com/accounts/*", + "https://www.googleapis.com/chromoting/*", + "https://talkgadget.google.com/talkgadget/*" + ], + "plugins": [ + { "path": "remoting_host_plugin.dll", "public": false }, + { "path": "libremoting_host_plugin.ia32.so", "public": false }, + { "path": "libremoting_host_plugin.x64.so", "public": false }, + { "path": "remoting_host_plugin.plugin", "public": false } + ] +} diff --git a/remoting/webapp/me2mom/_locales.official/ar/messages.json b/remoting/webapp/me2mom/_locales.official/ar/messages.json deleted file mode 100644 index 0465096..0000000 --- a/remoting/webapp/me2mom/_locales.official/ar/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644"},"access_code_timer":{"message":"\u0633\u062a\u0646\u062a\u0647\u064a \u0635\u0644\u0627\u062d\u064a\u0629 \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644 \u0647\u0630\u0627 \u062e\u0644\u0627\u0644 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0625\u0644\u063a\u0627\u0621"},"close_prompt":{"message":"\u0633\u062a\u0624\u062f\u064a \u0645\u063a\u0627\u062f\u0631\u0629 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629 \u0625\u0644\u0649 \u0625\u0646\u0647\u0627\u0621 \u062c\u0644\u0633\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome."},"connect_button":{"message":"\u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"continue_button":{"message":"\u0645\u062a\u0627\u0628\u0639\u0629"},"continue_prompt":{"message":"\u0623\u0646\u062a \u062a\u0634\u0627\u0631\u0643 \u0647\u0630\u0627 \u0627\u0644\u062c\u0647\u0627\u0632 \u062d\u0627\u0644\u064a\u064b\u0627 \u0645\u0639 \u0645\u0633\u062a\u062e\u062f\u0645 \u0622\u062e\u0631. \u0647\u0644 \u062a\u0631\u064a\u062f \u0628\u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0645\u062a\u0627\u0628\u0639\u0629 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629\u061f"},"description_authorize":{"message":"\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome\u060c \u064a\u062c\u0628 \u0623\u0648\u0644\u0627\u064b \u0645\u0646\u062d \u0623\u0630\u0648\u0646\u0627\u062a \u0645\u0648\u0633\u0651\u0639\u0629 \u0628\u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631. \u0644\u0646 \u064a\u064f\u0637\u0644\u0628 \u0645\u0646\u0643 \u0625\u062c\u0631\u0627\u0621 \u0630\u0644\u0643 \u0633\u0648\u0649 \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629."},"description_connect":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0645\u0637\u0627\u0644\u0628\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u062e\u0627\u0635 \u0628\u0647 \u0628\u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \"\u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0622\u0646\" \u0648\u0645\u0646\u062d\u0643 \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644."},"description_home":{"message":"\u064a\u0633\u0645\u062d \u0644\u0643 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0628\u0645\u0634\u0627\u0631\u0643\u0629 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0628\u0634\u0643\u0644 \u0622\u0645\u0646 \u0639\u0628\u0631 \u0627\u0644\u0648\u064a\u0628. \u0648\u064a\u062c\u0628 \u0623\u0646 \u064a\u0634\u063a\u0651\u0644 \u0643\u0644\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u062a\u0637\u0628\u064a\u0642 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome\u060c \u0648\u0627\u0644\u0630\u064a \u064a\u0645\u0643\u0646 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u064a\u0647 \u0639\u0644\u0649 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"disconnect_other_button":{"message":"\u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"error_authentication_failed":{"message":"\u0623\u062e\u0641\u0642\u062a \u0627\u0644\u0645\u0635\u0627\u062f\u0642\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0646 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_bad_plugin_version":{"message":"\u0628\u0639\u0636 \u0627\u0644\u0645\u0643\u0648\u0646\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0644\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0645\u0641\u0642\u0648\u062f\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u062a\u062b\u0628\u064a\u062a \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_generic":{"message":"\u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0646 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_host_is_offline":{"message":"\u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u0628\u0639\u064a\u062f \u0644\u0627 \u064a\u0633\u062a\u062c\u064a\u0628 \u0644\u0637\u0644\u0628\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u062a\u0635\u0627\u0644\u0647 \u0628\u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_incompatible_protocol":{"message":"\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0625\u0635\u062f\u0627\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0627\u0641\u0642 \u0645\u0646 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u062a\u062b\u0628\u064a\u062a \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0645\u0646 Google Chrome \u0648\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0639\u0644\u0649 \u062c\u0647\u0627\u0632\u064a \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0643\u0644\u064a\u0647\u0645\u0627 \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_invalid_access_code":{"message":"\u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_missing_plugin":{"message":"\u0628\u0639\u0636 \u0627\u0644\u0645\u0643\u0648\u0646\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0644\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome \u0645\u0641\u0642\u0648\u062f\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u062a\u0634\u063a\u064a\u0644 \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0645\u0646 Google Chrome \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629."},"error_no_response":{"message":"\u0623\u062e\u0641\u0642 \u0627\u0644\u062e\u0627\u062f\u0645 \u0641\u064a \u0627\u0644\u0627\u0633\u062a\u062c\u0627\u0628\u0629 \u0644\u0637\u0644\u0628 \u0627\u0644\u0634\u0628\u0643\u0629."},"error_service_unavailable":{"message":"\u0627\u0644\u062e\u062f\u0645\u0629 \u063a\u064a\u0631 \u0645\u062a\u0627\u062d\u0629 \u0645\u0624\u0642\u062a\u064b\u0627. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u064b\u0627."},"error_unexpected":{"message":"\u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0625\u0628\u0644\u0627\u063a \u0639\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0625\u0644\u0649 \u0645\u0637\u0648\u0631\u064a \u0627\u0644\u0628\u0631\u0627\u0645\u062c."},"footer_waiting":{"message":"\u0641\u064a \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u0627\u062a\u0635\u0627\u0644..."},"help":{"message":"\u0645\u0633\u0627\u0639\u062f\u0629"},"home_access_button":{"message":"\u062f\u062e\u0648\u0644 \u0627\u0644\u0622\u0646"},"home_access_description":{"message":"\u0627\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u062c\u0647\u0627\u0632 \u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u062a\u0645\u062a \u0645\u0634\u0627\u0631\u0643\u062a\u0647 \u0648\u0627\u0644\u062a\u062d\u0643\u0645 \u0641\u064a\u0647."},"home_my_computers_title":{"message":"\u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631"},"home_share_button":{"message":"\u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0622\u0646"},"home_share_description":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0645\u0634\u0627\u0631\u0643\u0629 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0647\u0630\u0627 \u0645\u0639 \u0645\u0633\u062a\u062e\u062f\u0645 \u0622\u062e\u0631 \u0644\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u064a\u0647 \u0648\u0627\u0644\u062a\u062d\u0643\u0645 \u0641\u064a\u0647."},"home_share_description_chrome_os":{"message":"(\u0647\u0630\u0647 \u0627\u0644\u0645\u064a\u0632\u0629 \u063a\u064a\u0631 \u0645\u062a\u0627\u062d\u0629 \u0628\u0639\u062f \u0644\u0623\u062c\u0647\u0632\u0629 Chromebook\u2026 \u062a\u0631\u0642\u0628\u0647\u0627 \u0642\u0631\u064a\u0628\u064b\u0627)"},"instructions_share_above":{"message":"\u0644\u0628\u062f\u0621 \u0645\u0634\u0627\u0631\u0643\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628\u060c \u0627\u0645\u0646\u062d \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0634\u062e\u0635 \u0627\u0644\u0630\u064a \u0633\u064a\u0633\u0627\u0639\u062f\u0643."},"instructions_share_below":{"message":"\u0639\u0646\u062f \u0625\u062f\u062e\u0627\u0644\u0647 \u0627\u0644\u0631\u0645\u0632\u060c \u062a\u0628\u062f\u0623 \u062c\u0644\u0633\u0629 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629."},"label_connected":{"message":"\u0645\u062a\u0635\u0644:"},"message_connecting":{"message":"\u062c\u0627\u0631\u064d \u0627\u0644\u0627\u062a\u0635\u0627\u0644..."},"message_generating":{"message":"\u062c\u0627\u0631\u064d \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0631\u0645\u0632 \u0627\u0644\u062f\u062e\u0648\u0644..."},"message_session_finished":{"message":"\u0627\u0646\u062a\u0647\u062a \u062c\u0644\u0633\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome."},"message_shared":{"message":"\u062a\u062c\u0631\u064a \u0645\u0634\u0627\u0631\u0643\u0629 \u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u062d\u0627\u0644\u064a\u064b\u0627 \u0645\u0639 $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0627\u0644\u062a\u0641\u0648\u064a\u0636"},"mode_connect":{"message":"\u0627\u0644\u0627\u062a\u0635\u0627\u0644"},"mode_share":{"message":"\u0645\u0634\u0627\u0631\u0643\u0629"},"offline":{"message":"\u0628\u0644\u0627 \u0627\u062a\u0635\u0627\u0644"},"ok":{"message":"\u0645\u0648\u0627\u0641\u0642"},"product_description":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u0623\u062c\u0647\u0632\u0629 \u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0623\u062e\u0631\u0649 \u0623\u0648 \u0627\u0644\u0633\u0645\u0627\u062d \u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0622\u062e\u0631 \u0628\u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u062c\u0647\u0627\u0632 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0628\u0634\u0643\u0644 \u0622\u0645\u0646 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a."},"product_name":{"message":"\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628 \u0627\u0644\u0628\u0639\u064a\u062f \u0645\u0646 Chrome"},"sign_out_button":{"message":"\u0627\u0644\u062e\u0631\u0648\u062c"},"stop_sharing_button":{"message":"\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629"},"tooltip_scaling":{"message":"\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u062d\u062c\u0645 \u0644\u0645\u0644\u0627\u0621\u0645\u0629 \u062d\u062c\u0645 \u0627\u0644\u0634\u0627\u0634\u0629"},"warning_nat_disabled":{"message":"\u0645\u0644\u0627\u062d\u0638\u0629: \u0644\u0627 \u062a\u0633\u0645\u062d \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u0633\u0629 \u0633\u0648\u0649 \u0628\u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u064a\u0646 \u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0643\u0645\u0628\u064a\u0648\u062a\u0631 \u062f\u0627\u062e\u0644 \u0634\u0628\u0643\u062a\u0643."}} diff --git a/remoting/webapp/me2mom/_locales.official/bg/messages.json b/remoting/webapp/me2mom/_locales.official/bg/messages.json deleted file mode 100644 index be5e085e..0000000 --- a/remoting/webapp/me2mom/_locales.official/bg/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u041a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f"},"access_code_timer":{"message":"\u0422\u043e\u0437\u0438 \u043a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0449\u0435 \u0438\u0437\u0442\u0435\u0447\u0435 \u0441\u043b\u0435\u0434 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u041e\u0442\u043a\u0430\u0437"},"close_prompt":{"message":"\u0410\u043a\u043e \u0438\u0437\u043b\u0435\u0437\u0435\u0442\u0435 \u043e\u0442 \u0442\u0430\u0437\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u0441\u0435\u0441\u0438\u044f\u0442\u0430 \u0432\u0438 \u0432 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0449\u0435 \u0441\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438."},"connect_button":{"message":"\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435"},"continue_button":{"message":"\u041d\u0430\u043f\u0440\u0435\u0434"},"continue_prompt":{"message":"\u041f\u043e\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435 \u0442\u043e\u0437\u0438 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u0441 \u0434\u0440\u0443\u0433 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435?"},"description_authorize":{"message":"\u0417\u0430 \u0434\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome, \u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0441\u0438. \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u0442\u043e\u0432\u0430 \u0441\u0430\u043c\u043e \u0432\u0435\u0434\u043d\u044a\u0436."},"description_connect":{"message":"\u041f\u043e\u043c\u043e\u043b\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f, \u0434\u043e \u0447\u0438\u0439\u0442\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u043e\u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f, \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435 \u0432\u044a\u0440\u0445\u0443 \u201e\u0421\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435 \u0441\u0435\u0433\u0430\u201c \u0438 \u0434\u0430 \u0432\u0438 \u0434\u0430\u0434\u0435 \u043a\u043e\u0434\u0430 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f."},"description_home":{"message":"\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f\u0442 \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0432\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0430 \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u043d\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0441\u0438 \u043f\u0440\u0435\u0437 \u043c\u0440\u0435\u0436\u0430\u0442\u0430. \u0418 \u0434\u0432\u0430\u043c\u0430\u0442\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e, \u043a\u043e\u0435\u0442\u043e \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043e \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435"},"disconnect_other_button":{"message":"\u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435"},"error_authentication_failed":{"message":"\u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0435 \u0431\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u041c\u043e\u043b\u044f, \u0438\u0437\u043b\u0435\u0437\u0442\u0435 \u043e\u0442 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_bad_plugin_version":{"message":"\u041b\u0438\u043f\u0441\u0432\u0430\u0442 \u043d\u044f\u043a\u043e\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0438 \u0437\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome. \u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043b\u0438 \u043d\u0430\u0439-\u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_generic":{"message":"\u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430. \u041c\u043e\u043b\u044f, \u0438\u0437\u043b\u0435\u0437\u0442\u0435 \u043e\u0442 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_host_is_offline":{"message":"\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f\u0442 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u043d\u0435 \u043e\u0442\u0433\u043e\u0432\u0430\u0440\u044f \u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0438\u0442\u0435 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0430. \u041c\u043e\u043b\u044f, \u043f\u043e\u0442\u0432\u044a\u0440\u0434\u0435\u0442\u0435, \u0447\u0435 \u0435 \u043e\u043d\u043b\u0430\u0439\u043d, \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_incompatible_protocol":{"message":"\u041e\u0442\u043a\u0440\u0438\u0442\u0430 \u0435 \u043d\u0435\u0441\u044a\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome. \u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0440\u0430\u0437\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u0435 \u043d\u0430 \u0434\u0432\u0430\u0442\u0430 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0441 \u043d\u0430\u0439-\u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Google Chrome \u0438 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_invalid_access_code":{"message":"\u041a\u043e\u0434\u044a\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d. \u041c\u043e\u043b\u044f, \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_missing_plugin":{"message":"\u041b\u0438\u043f\u0441\u0432\u0430\u0442 \u043d\u044f\u043a\u043e\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0438 \u0437\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome. \u041c\u043e\u043b\u044f, \u0443\u0432\u0435\u0440\u0435\u0442\u0435 \u0441\u0435, \u0447\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u043d\u0430\u0439-\u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Google Chrome \u0438 \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e."},"error_no_response":{"message":"\u0421\u044a\u0440\u0432\u044a\u0440\u044a\u0442 \u043d\u0435 \u0443\u0441\u043f\u044f \u0434\u0430 \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u0438 \u043d\u0430 \u0437\u0430\u044f\u0432\u043a\u0430\u0442\u0430 \u043e\u0442 \u043c\u0440\u0435\u0436\u0430\u0442\u0430."},"error_service_unavailable":{"message":"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u044f\u043c\u0430\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0443\u0441\u043b\u0443\u0433\u0430\u0442\u0430. \u041c\u043e\u043b\u044f, \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e \u043f\u043e-\u043a\u044a\u0441\u043d\u043e."},"error_unexpected":{"message":"\u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u043d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430. \u041c\u043e\u043b\u044f, \u043f\u043e\u0434\u0430\u0439\u0442\u0435 \u0441\u0438\u0433\u043d\u0430\u043b \u0437\u0430 \u0442\u043e\u0437\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0434\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438\u0441\u0442\u0438\u0442\u0435."},"footer_waiting":{"message":"\u0438\u0437\u0447\u0430\u043a\u0432\u0430 \u0441\u0435 \u0432\u0440\u044a\u0437\u043a\u0430..."},"help":{"message":"\u041f\u043e\u043c\u043e\u0449"},"home_access_button":{"message":"\u0414\u043e\u0441\u0442\u044a\u043f \u0441\u0435\u0433\u0430"},"home_access_description":{"message":"\u0412\u0438\u0436\u0442\u0435 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0430\u0439\u0442\u0435 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440."},"home_my_computers_title":{"message":"\u041c\u043e\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u044e\u0442\u0440\u0438"},"home_share_button":{"message":"\u0421\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435 \u0441\u0435\u0433\u0430"},"home_share_description":{"message":"\u0421\u043f\u043e\u0434\u0435\u043b\u0435\u0442\u0435 \u0442\u043e\u0437\u0438 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440, \u0442\u0430\u043a\u0430 \u0447\u0435 \u0434\u0430 \u0441\u0435 \u0432\u0438\u0436\u0434\u0430 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b."},"home_share_description_chrome_os":{"message":"(\u0442\u0430\u0437\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0449\u0435 \u043d\u0435 \u0435 \u043d\u0430\u043b\u0438\u0446\u0435 \u0437\u0430 Chromebook \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0432\u0430\u0439\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438)"},"instructions_share_above":{"message":"\u0417\u0430 \u0434\u0430 \u0437\u0430\u043f\u043e\u0447\u043d\u0435\u0442\u0435 \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u044f \u0441\u0438 \u043f\u043b\u043e\u0442, \u0434\u0430\u0439\u0442\u0435 \u0434\u043e\u043b\u0443\u043f\u043e\u0441\u043e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0434 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u043d\u0430 \u0447\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0439\u0442\u043e \u0449\u0435 \u0432\u0438 \u043f\u043e\u043c\u0430\u0433\u0430."},"instructions_share_below":{"message":"\u0421\u043b\u0435\u0434 \u043a\u0430\u0442\u043e \u0442\u043e\u0439 \u0432\u044a\u0432\u0435\u0434\u0435 \u043a\u043e\u0434\u0430, \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0430\u0442\u0430 \u0432\u0438 \u0441\u0435\u0441\u0438\u044f \u0449\u0435 \u0437\u0430\u043f\u043e\u0447\u043d\u0435."},"label_connected":{"message":"\u0418\u043c\u0430 \u0432\u0440\u044a\u0437\u043a\u0430:"},"message_connecting":{"message":"\u0421\u0432\u044a\u0440\u0437\u0432\u0430 \u0441\u0435\u2026"},"message_generating":{"message":"\u041a\u043e\u0434\u044a\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u044a\u043f \u0441\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0430..."},"message_session_finished":{"message":"\u0421\u0435\u0441\u0438\u044f\u0442\u0430 \u0432\u0438 \u0432 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438."},"message_shared":{"message":"\u041f\u043e\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c $1 \u0441\u043f\u043e\u0434\u0435\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u044f \u0432\u0438 \u043f\u043b\u043e\u0442.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0423\u043f\u044a\u043b\u043d\u043e\u043c\u043e\u0449\u0430\u0432\u0430\u043d\u0435"},"mode_connect":{"message":"\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435"},"mode_share":{"message":"\u0421\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435"},"offline":{"message":"\u041e\u0444\u043b\u0430\u0439\u043d"},"ok":{"message":"OK"},"product_description":{"message":"\u041e\u0441\u044a\u0449\u0435\u0441\u0442\u0432\u044f\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0434\u0440\u0443\u0433\u0438 \u043a\u043e\u043c\u043f\u044e\u0442\u0440\u0438 \u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u0442\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u0434\u0430 \u043e\u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0438 \u043d\u0430\u0434\u0435\u0436\u0434\u043d\u043e \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440\u0430 \u0432\u0438 \u043f\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"product_name":{"message":"\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u043b\u043e\u0442 \u043d\u0430 Chrome"},"sign_out_button":{"message":"\u0418\u0437\u0445\u043e\u0434"},"stop_sharing_button":{"message":"\u0421\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f\u043d\u0435\u0442\u043e"},"tooltip_scaling":{"message":"\u041f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0430\u0449\u0430\u0431\u0430"},"warning_nat_disabled":{"message":"\u0417\u0410\u0411\u0415\u041b\u0415\u0416\u041a\u0410: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430\u0442 \u0432\u0440\u044a\u0437\u043a\u0438 \u0441\u0430\u043c\u043e \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u044e\u0442\u0440\u0438 \u0432 \u043c\u0440\u0435\u0436\u0430\u0442\u0430 \u0432\u0438."}} diff --git a/remoting/webapp/me2mom/_locales.official/ca/messages.json b/remoting/webapp/me2mom/_locales.official/ca/messages.json deleted file mode 100644 index a8e2e00..0000000 --- a/remoting/webapp/me2mom/_locales.official/ca/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Codi d'acc\u00e9s"},"access_code_timer":{"message":"Aquest codi d'acc\u00e9s caducar\u00e0 d'aqu\u00ed a $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancel\u00b7la"},"close_prompt":{"message":"Si sortiu d'aquesta p\u00e0gina, la sessi\u00f3 de Chrome Remote Desktop finalitzar\u00e0."},"connect_button":{"message":"Connecta"},"continue_button":{"message":"Continua"},"continue_prompt":{"message":"Esteu compartint aquest equip amb un altre usuari. Voleu continuar compartint-lo?"},"description_authorize":{"message":"Per utilitzar Chrome Remote Desktop heu de concedir permisos d'acc\u00e9s ampliat a l'equip. Nom\u00e9s ho heu de fer una vegada."},"description_connect":{"message":"Demaneu a l'usuari de l'equip al qual voleu accedir que faci clic a \"Comparteix ara\" i que us doni el codi d'acc\u00e9s."},"description_home":{"message":"Chrome Remote Desktop us permet compartir el vostre equip de manera segura mitjan\u00e7ant el web. Els dos usuaris han d'executar l'aplicaci\u00f3 Chrome Remote Desktop, que es pot cercar a $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconnecta (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconnecta (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconnecta (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconnecta"},"disconnect_other_button":{"message":"Desconnecta"},"error_authentication_failed":{"message":"L'autenticaci\u00f3 ha fallat. Tanqueu la sessi\u00f3 de Chrome Remote Desktop i torneu-ho a provar."},"error_bad_plugin_version":{"message":"Falten alguns components que es requereixen per a Chrome Remote Desktop. Assegureu-vos que h\u00e0giu instal\u00b7lat la versi\u00f3 m\u00e9s recent de Google Chrome i torneu-ho a provar."},"error_generic":{"message":"S'ha produ\u00eft un error desconegut. Tanqueu la sessi\u00f3 de Chrome Remote Desktop i torneu-ho a provar."},"error_host_is_offline":{"message":"L'equip remot no respon a les sol\u00b7licituds de connexi\u00f3. Verifiqueu que estigui en l\u00ednia i torneu-ho a provar."},"error_incompatible_protocol":{"message":"S'ha detectat una versi\u00f3 incompatible de Chrome Remote Desktop. Assegureu-vos que teniu la versi\u00f3 m\u00e9s recent de Google Chrome i de Chrome Remote Desktop als dos equips i torneu-ho a provar."},"error_invalid_access_code":{"message":"El codi d'acc\u00e9s no \u00e9s v\u00e0lid. Torneu-ho a provar."},"error_missing_plugin":{"message":"Falten alguns components que es requereixen per a Chrome Remote Desktop. Assegureu-vos que executeu la versi\u00f3 m\u00e9s recent de Google Chrome i torneu-ho a provar."},"error_no_response":{"message":"El servidor no ha pogut respondre a la sol\u00b7licitud de xarxa."},"error_service_unavailable":{"message":"El servei no est\u00e0 disponible temporalment. Torneu-ho a provar m\u00e9s tard."},"error_unexpected":{"message":"S'ha produ\u00eft un error inesperat. Informeu d'aquest problema als desenvolupadors."},"footer_waiting":{"message":"s'est\u00e0 esperant la connexi\u00f3..."},"help":{"message":"Ajuda"},"home_access_button":{"message":"Accedeix ara"},"home_access_description":{"message":"Vegeu i controleu un equip compartit."},"home_my_computers_title":{"message":"Els meus equips"},"home_share_button":{"message":"Comparteix-ho ara"},"home_share_description":{"message":"Compartiu aquest equip perqu\u00e8 un altre usuari el vegi i el controli."},"home_share_description_chrome_os":{"message":"(aquesta funci\u00f3 encara no est\u00e0 disponible per als Chromebook... estigueu ben atent)"},"instructions_share_above":{"message":"Per comen\u00e7ar a compartir l'escriptori, doneu el codi d'acc\u00e9s seg\u00fcent a la persona que us ajudar\u00e0."},"instructions_share_below":{"message":"Quan hagin introdu\u00eft el codi, la sessi\u00f3 d'\u00fas compartit comen\u00e7ar\u00e0."},"label_connected":{"message":"Connectat:"},"message_connecting":{"message":"S'est\u00e0 connectant..."},"message_generating":{"message":"S'est\u00e0 generant el codi d'acc\u00e9s..."},"message_session_finished":{"message":"La sessi\u00f3 de Chrome Remote Desktop ha finalitzat."},"message_shared":{"message":"Esteu compartint l'escriptori amb $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoritza"},"mode_connect":{"message":"Connecta"},"mode_share":{"message":"Comparteix"},"offline":{"message":"Fora de l\u00ednia"},"ok":{"message":"D'acord"},"product_description":{"message":"Accediu a altres equips o permeteu que un altre usuari accedeixi al vostre equip de manera segura per Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Tanca la sessi\u00f3"},"stop_sharing_button":{"message":"Deixa de compartir"},"tooltip_scaling":{"message":"Canvia l'escala per ajustar"},"warning_nat_disabled":{"message":"NOTA: La configuraci\u00f3 de pol\u00edtiques permet connexions nom\u00e9s entre equips de la vostra xarxa."}} diff --git a/remoting/webapp/me2mom/_locales.official/cs/messages.json b/remoting/webapp/me2mom/_locales.official/cs/messages.json deleted file mode 100644 index ae76202..0000000 --- a/remoting/webapp/me2mom/_locales.official/cs/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"P\u0159\u00edstupov\u00fd k\u00f3d"},"access_code_timer":{"message":"Platnost tohoto p\u0159\u00edstupov\u00e9ho k\u00f3du vypr\u0161\u00ed za $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Zru\u0161it"},"close_prompt":{"message":"Pokud opust\u00edte tuto str\u00e1nku, relace Vzd\u00e1len\u00e9 plochy Chrome bude ukon\u010dena."},"connect_button":{"message":"P\u0159ipojit"},"continue_button":{"message":"Pokra\u010dovat"},"continue_prompt":{"message":"Moment\u00e1ln\u011b sd\u00edl\u00edte tento po\u010d\u00edta\u010d s jin\u00fdm u\u017eivatelem. Chcete ve sd\u00edlen\u00ed pokra\u010dovat?"},"description_authorize":{"message":"Chcete-li pou\u017e\u00edvat Vzd\u00e1lenou plochu Chrome, je t\u0159eba ud\u011blit roz\u0161\u00ed\u0159en\u00e1 opr\u00e1vn\u011bn\u00ed k p\u0159\u00edstupu do va\u0161eho po\u010d\u00edta\u010de. Tato opr\u00e1vn\u011bn\u00ed je t\u0159eba ud\u011blit pouze jednou."},"description_connect":{"message":"Po\u017e\u00e1dejte u\u017eivatele, jeho\u017e po\u010d\u00edta\u010d chcete sd\u00edlet, aby kliknul na polo\u017eku Sd\u00edlet a poskytl v\u00e1m p\u0159\u00edstupov\u00fd k\u00f3d."},"description_home":{"message":"Vzd\u00e1len\u00e1 plocha Chrome v\u00e1m umo\u017e\u0148uje bezpe\u010dn\u011b sd\u00edlet sv\u016fj po\u010d\u00edta\u010d p\u0159es internet. Oba u\u017eivatel\u00e9 mus\u00ed m\u00edt spu\u0161t\u011bnou aplikaci Vzd\u00e1len\u00e1 plocha Chrome, kterou najdete na adrese $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Odpojit (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Odpojit (Opt + Ctrl + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Odpojit (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"Odpojit"},"disconnect_other_button":{"message":"Odpojit"},"error_authentication_failed":{"message":"Ov\u011b\u0159en\u00ed se nezda\u0159ilo. Odhlaste se pros\u00edm od Vzd\u00e1len\u00e9 plochy Chrome a zkuste to znovu."},"error_bad_plugin_version":{"message":"N\u011bkter\u00e9 sou\u010d\u00e1sti pot\u0159ebn\u00e9 pro Vzd\u00e1lenou plochu Chrome chyb\u00ed. Zkontrolujte, zda je nainstalov\u00e1na nejnov\u011bj\u0161\u00ed verze, a zkuste to znovu."},"error_generic":{"message":"Do\u0161lo k nezn\u00e1m\u00e9 chyb\u011b. Odhlaste se pros\u00edm od Vzd\u00e1len\u00e9 plochy Chrome a zkuste to znovu."},"error_host_is_offline":{"message":"Vzd\u00e1len\u00fd po\u010d\u00edta\u010d nereaguje na \u017e\u00e1dosti o p\u0159ipojen\u00ed. Zkontrolujte, zda je online, a zkuste to znovu."},"error_incompatible_protocol":{"message":"Byla zji\u0161t\u011bna nekompatibiln\u00ed verze Vzd\u00e1len\u00e9 plochy Chrome. Zkontrolujte, zda m\u00e1te nejnov\u011bj\u0161\u00ed verzi prohl\u00ed\u017ee\u010de Google Chrome a Vzd\u00e1len\u00e9 plochy Chrome na obou po\u010d\u00edta\u010d\u00edch, a zkuste to znovu."},"error_invalid_access_code":{"message":"P\u0159\u00edstupov\u00fd k\u00f3d je neplatn\u00fd. Zkuste to pros\u00edm znovu."},"error_missing_plugin":{"message":"N\u011bkter\u00e9 sou\u010d\u00e1sti pot\u0159ebn\u00e9 pro Vzd\u00e1lenou plochu Chrome chyb\u00ed. Zkontrolujte, zda pou\u017e\u00edv\u00e1te nejnov\u011bj\u0161\u00ed verzi prohl\u00ed\u017ee\u010de Google Chrome, a zkuste to znovu."},"error_no_response":{"message":"Serveru se nepoda\u0159ilo odpov\u011bd\u011bt na po\u017eadavek s\u00edt\u011b."},"error_service_unavailable":{"message":"Slu\u017eba je do\u010dasn\u011b nedostupn\u00e1. Zkuste to pros\u00edm znovu pozd\u011bji."},"error_unexpected":{"message":"Do\u0161lo k neo\u010dek\u00e1van\u00e9 chyb\u011b. Nahlaste tento probl\u00e9m pros\u00edm v\u00fdvoj\u00e1\u0159\u016fm."},"footer_waiting":{"message":"\u010dek\u00e1 se na p\u0159ipojen\u00ed..."},"help":{"message":"N\u00e1pov\u011bda"},"home_access_button":{"message":"Z\u00edskat p\u0159\u00edstup"},"home_access_description":{"message":"Umo\u017e\u0148uje zobrazit a ovl\u00e1dat sd\u00edlen\u00fd po\u010d\u00edta\u010d."},"home_my_computers_title":{"message":"M\u00e9 po\u010d\u00edta\u010de"},"home_share_button":{"message":"Sd\u00edlet"},"home_share_description":{"message":"Sd\u00edlet tento po\u010d\u00edta\u010d, aby jej mohl jin\u00fd u\u017eivatel zobrazit a ovl\u00e1dat."},"home_share_description_chrome_os":{"message":"(Tato funkce zat\u00edm pro Chromebooky nen\u00ed k dispozici, ale brzy bude.)"},"instructions_share_above":{"message":"Chcete-li za\u010d\u00edt sd\u00edlet svoji plochu, poskytn\u011bte n\u00ed\u017ee uveden\u00fd p\u0159\u00edstupov\u00fd k\u00f3d osob\u011b, kter\u00e1 v\u00e1m bude pom\u00e1hat."},"instructions_share_below":{"message":"Po zad\u00e1n\u00ed k\u00f3du bude spu\u0161t\u011bna relace sd\u00edlen\u00ed."},"label_connected":{"message":"P\u0159ipojeno:"},"message_connecting":{"message":"P\u0159ipojov\u00e1n\u00ed..."},"message_generating":{"message":"Vytv\u00e1\u0159en\u00ed p\u0159\u00edstupov\u00e9ho k\u00f3du..."},"message_session_finished":{"message":"Relace Vzd\u00e1len\u00e9 plochy Chrome byla ukon\u010dena."},"message_shared":{"message":"Aktu\u00e1ln\u011b sd\u00edl\u00edte plochu s u\u017eivatelem $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizovat"},"mode_connect":{"message":"P\u0159ipojit"},"mode_share":{"message":"Sd\u00edlet"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"P\u0159istupujte k jin\u00fdm po\u010d\u00edta\u010d\u016fm nebo umo\u017en\u011bte dal\u0161\u00edmu u\u017eivateli p\u0159istupovat k va\u0161emu po\u010d\u00edta\u010di bezpe\u010dn\u011b p\u0159es internet."},"product_name":{"message":"Vzd\u00e1len\u00e1 plocha Chrome"},"sign_out_button":{"message":"Odhl\u00e1sit se"},"stop_sharing_button":{"message":"Ukon\u010dit sd\u00edlen\u00ed"},"tooltip_scaling":{"message":"P\u0159izp\u016fsobit velikost"},"warning_nat_disabled":{"message":"POZN\u00c1MKA: Nastaven\u00ed z\u00e1sad umo\u017e\u0148uj\u00ed spojen\u00ed pouze mezi po\u010d\u00edta\u010di v r\u00e1mci va\u0161\u00ed s\u00edt\u011b."}} diff --git a/remoting/webapp/me2mom/_locales.official/da/messages.json b/remoting/webapp/me2mom/_locales.official/da/messages.json deleted file mode 100644 index 5ecbb9c..0000000 --- a/remoting/webapp/me2mom/_locales.official/da/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Adgangskode"},"access_code_timer":{"message":"Denne adgangskode udl\u00f8ber om $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annuller"},"close_prompt":{"message":"Hvis du forlader denne side, afsluttes din session med Chrome Fjernskrivebord."},"connect_button":{"message":"Opret forbindelse"},"continue_button":{"message":"Forts\u00e6t"},"continue_prompt":{"message":"Du deler i \u00f8jeblikket denne maskine med en anden bruger. Vil du forts\u00e6tte med at dele?"},"description_authorize":{"message":"Hvis du vil bruge Chrome Fjernskrivebord, skal du give udvidet tilladelse til adgang til din computer. Du skal kun g\u00f8re dette \u00e9n gang."},"description_connect":{"message":"Bed den bruger, hvis computer, du \u00f8nsker adgang til, om at klikke p\u00e5 \"Del nu\" og give dig adgangskoden."},"description_home":{"message":"Chrome Fjernskrivebord giver dig mulighed for sikkert at dele din computer via internettet. Begge brugere skal k\u00f8re appen Chrome Fjernskrivebord, som kan findes p\u00e5 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Afbryd (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Afbryd (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Afbryd (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Afbryd forbindelsen"},"disconnect_other_button":{"message":"Afbryd forbindelsen"},"error_authentication_failed":{"message":"Godkendelsen mislykkedes. Log ud af Chrome Fjernskrivebord, og pr\u00f8v igen."},"error_bad_plugin_version":{"message":"Nogle komponenter, der kr\u00e6ves til Chrome Fjernskrivebord, mangler. Kontroller, at du har den nyeste version af Google Chrome, og pr\u00f8v igen."},"error_generic":{"message":"Der opstod en ukendt fejl. Log ud af Chrome Fjernskrivebord, og pr\u00f8v igen."},"error_host_is_offline":{"message":"Fjerncomputeren svarer ikke p\u00e5 anmodninger om oprettelse af forbindelse. Kontroller, at den er online, og pr\u00f8v igen."},"error_incompatible_protocol":{"message":"Der er registreret en inkompatibel version af Chrome Fjernskrivebord. Kontroller, at du har den nyeste version af Google Chrome og Chrome Fjernskrivebord p\u00e5 begge computere, og pr\u00f8v igen."},"error_invalid_access_code":{"message":"Adgangskoden er ugyldig. Pr\u00f8v igen."},"error_missing_plugin":{"message":"Nogle komponenter, der kr\u00e6ves til Chrome Fjernskrivebord, mangler. Kontroller, at du har den nyeste version af Google Chrome, og pr\u00f8v igen."},"error_no_response":{"message":"Serveren svarede ikke p\u00e5 netv\u00e6rksanmodningen"},"error_service_unavailable":{"message":"Tjenesten er midlertidigt utilg\u00e6ngelig. Pr\u00f8v igen senere."},"error_unexpected":{"message":"Der opstod en uventet fejl. Rapporter dette problem til udviklerne."},"footer_waiting":{"message":"venter p\u00e5 forbindelse..."},"help":{"message":"Hj\u00e6lp"},"home_access_button":{"message":"F\u00e5 adgang nu"},"home_access_description":{"message":"F\u00e5 vist og kontroller en delt computer."},"home_my_computers_title":{"message":"Mine computere"},"home_share_button":{"message":"Del nu"},"home_share_description":{"message":"Del denne computer, s\u00e5 en anden bruger kan se og kontrollere den."},"home_share_description_chrome_os":{"message":"(denne funktion er endnu ikke tilg\u00e6ngelig for Chromebooks... hold dig opdateret)"},"instructions_share_above":{"message":"Hvis du vil begynde at dele dit skrivebord, skal du give adgangskoden nedenfor til den person, som skal hj\u00e6lpe dig."},"instructions_share_below":{"message":"N\u00e5r personen indtaster koden, startes delingssessionen."},"label_connected":{"message":"Tilsluttet:"},"message_connecting":{"message":"Opretter forbindelse..."},"message_generating":{"message":"Genererer adgangskode..."},"message_session_finished":{"message":"Din session med Chrome Fjernskrivebord er afsluttet."},"message_shared":{"message":"Dit skrivebord deles i \u00f8jeblikket med $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Tillad"},"mode_connect":{"message":"Opret forbindelse"},"mode_share":{"message":"Del"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"F\u00e5 adgang til andre computere, eller giv en anden bruger adgang til din computer sikkert via internettet."},"product_name":{"message":"Chrome Fjernskrivebord"},"sign_out_button":{"message":"Log ud"},"stop_sharing_button":{"message":"Stop deling"},"tooltip_scaling":{"message":"Tilpasset vinduet"},"warning_nat_disabled":{"message":"BEM\u00c6RK! Politikindstillingerne tillader kun forbindelser mellem computere inden for dit netv\u00e6rk."}} diff --git a/remoting/webapp/me2mom/_locales.official/de/messages.json b/remoting/webapp/me2mom/_locales.official/de/messages.json deleted file mode 100644 index c288950..0000000 --- a/remoting/webapp/me2mom/_locales.official/de/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Zugriffscode"},"access_code_timer":{"message":"Dieser Zugriffscode l\u00e4uft in $1 ab.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Abbrechen"},"close_prompt":{"message":"Wenn Sie diese Seite verlassen, wird Ihre Chrome Remote Desktop-Sitzung beendet."},"connect_button":{"message":"Verbinden"},"continue_button":{"message":"Weiter"},"continue_prompt":{"message":"Dieser Computer ist zurzeit f\u00fcr einen anderen Nutzer freigegeben. M\u00f6chten Sie Ihren Computer weiterhin freigeben?"},"description_authorize":{"message":"Zur Verwendung von Chrome Remote Desktop ist es erforderlich, erweiterte Zugriffsberechtigungen f\u00fcr Ihren Computer zu gew\u00e4hren. Dieser Schritt ist nur einmal erforderlich."},"description_connect":{"message":"Bitten Sie den Nutzer, auf dessen Computer Sie zugreifen m\u00f6chten, auf \"Jetzt freigeben\" zu klicken und Ihnen den Zugriffscode mitzuteilen."},"description_home":{"message":"Chrome Remote Desktop erm\u00f6glicht die sichere Freigabe Ihres Computers \u00fcber das Internet. Beide Nutzer m\u00fcssen dazu die Chrome Remote Desktop-App ausf\u00fchren. Diese App finden Sie unter $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Verbindung trennen (Strg+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Verbindung trennen (Wahltaste+Strg+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Verbindung trennen (Strg+Alt+Esc)"},"disconnect_myself_button":{"message":"Verbindung trennen"},"disconnect_other_button":{"message":"Verbindung trennen"},"error_authentication_failed":{"message":"Fehler bei der Authentifizierung. Melden Sie sich von Chrome Remote Desktop ab und versuchen Sie es erneut."},"error_bad_plugin_version":{"message":"Es fehlen einige Komponenten, die f\u00fcr Chrome Remote Desktop erforderlich sind. \u00dcberpr\u00fcfen Sie, ob die neueste Version installiert ist, und versuchen Sie es erneut."},"error_generic":{"message":"Ein unbekannter Fehler ist aufgetreten. Melden Sie sich von Chrome Remote Desktop ab und versuchen Sie es erneut."},"error_host_is_offline":{"message":"Der Remote-Computer reagiert nicht auf Verbindungsanfragen. \u00dcberpr\u00fcfen Sie, ob er online ist, und versuchen Sie es erneut."},"error_incompatible_protocol":{"message":"Eine inkompatible Version von Chrome Remote Desktop wurde erkannt. \u00dcberpr\u00fcfen Sie, ob die neueste Version von Google Chrome und Chrome Remote Desktop auf beiden Computern installiert ist, und versuchen Sie es erneut."},"error_invalid_access_code":{"message":"Der Zugriffscode ist ung\u00fcltig. Versuchen Sie es erneut."},"error_missing_plugin":{"message":"Es fehlen einige Komponenten, die f\u00fcr Chrome Remote Desktop erforderlich sind. \u00dcberpr\u00fcfen Sie, ob Sie die neueste Version von Google Chrome verwenden, und versuchen Sie es erneut."},"error_no_response":{"message":"Der Server reagiert nicht auf die Netzwerkanfrage."},"error_service_unavailable":{"message":"Der Service ist vor\u00fcbergehend nicht verf\u00fcgbar. Bitte versuchen Sie es sp\u00e4ter erneut."},"error_unexpected":{"message":"Ein unerwarteter Fehler ist aufgetreten. Bitte melden Sie dieses Problem an die Entwickler."},"footer_waiting":{"message":"Warten auf Verbindung..."},"help":{"message":"Hilfe"},"home_access_button":{"message":"Jetzt zugreifen"},"home_access_description":{"message":"Freigegebenen Computer sehen und steuern"},"home_my_computers_title":{"message":"Meine Computer"},"home_share_button":{"message":"Jetzt freigeben"},"home_share_description":{"message":"Diesen Computer f\u00fcr einen anderen Nutzer zur Ansicht und Steuerung freigeben"},"home_share_description_chrome_os":{"message":"(Diese Funktion ist noch nicht f\u00fcr Chromebooks verf\u00fcgbar\u2026 Bitte haben Sie noch etwas Geduld.)"},"instructions_share_above":{"message":"Teilen Sie zur Freigabe Ihres Desktops zun\u00e4chst der anderen Person den unten stehenden Zugriffscode mit."},"instructions_share_below":{"message":"Sobald der Nutzer den Code eingibt, beginnt die Freigabesitzung."},"label_connected":{"message":"Verbunden:"},"message_connecting":{"message":"Verbindung wird hergestellt..."},"message_generating":{"message":"Zugriffscode wird generiert..."},"message_session_finished":{"message":"Ihre Chrome Remote Desktop-Sitzung wurde beendet."},"message_shared":{"message":"Ihr Desktop ist derzeit f\u00fcr $1 freigegeben.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorisieren"},"mode_connect":{"message":"Verbinden"},"mode_share":{"message":"Freigeben"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Greifen Sie sicher \u00fcber das Internet auf andere Computer zu oder gew\u00e4hren Sie anderen Nutzern Zugriff auf Ihren Computer."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Abmelden"},"stop_sharing_button":{"message":"Freigabe beenden"},"tooltip_scaling":{"message":"Gr\u00f6\u00dfe anpassen"},"warning_nat_disabled":{"message":"Hinweis: Die Richtlinieneinstellungen erlauben nur Verbindungen zwischen Computern in Ihrem Netzwerk."}} diff --git a/remoting/webapp/me2mom/_locales.official/el/messages.json b/remoting/webapp/me2mom/_locales.official/el/messages.json deleted file mode 100644 index 151c59c..0000000 --- a/remoting/webapp/me2mom/_locales.official/el/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2"},"access_code_timer":{"message":"\u0391\u03c5\u03c4\u03cc\u03c2 \u03bf \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b8\u03b1 \u03bb\u03ae\u03be\u03b5\u03b9 \u03c3\u03b5 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7"},"close_prompt":{"message":"\u0391\u03bd \u03b1\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03bd\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1, \u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c3\u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03b8\u03b1 \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03b9\u03c3\u03c4\u03b5\u03af."},"connect_button":{"message":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"continue_button":{"message":"\u03a3\u03c5\u03bd\u03ad\u03c7\u03b9\u03c3\u03b7"},"continue_prompt":{"message":"\u0391\u03c5\u03c4\u03ae \u03c4\u03b7 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03bc\u03b5 \u03ad\u03bd\u03b1\u03bd \u03ac\u03bb\u03bb\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7. \u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7;"},"description_authorize":{"message":"\u0393\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03b1\u03c1\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b5\u03ba\u03c4\u03b5\u03c4\u03b1\u03bc\u03ad\u03bd\u03b1 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2. \u0391\u03c5\u03c4\u03cc \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03bc\u03cc\u03bd\u03bf \u03bc\u03af\u03b1 \u03c6\u03bf\u03c1\u03ac."},"description_connect":{"message":"\u0396\u03b7\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c4\u03bf\u03c5 \u03bf\u03c0\u03bf\u03af\u03bf\u03c5 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03b9 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \"\u039a\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1\" \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03c3\u03b1\u03c2 \u03b4\u03ce\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2."},"description_home":{"message":"\u0397 \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03c3\u03ac\u03c2 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b1\u03c3\u03c6\u03ac\u03bb\u03b5\u03b9\u03b1 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2 \u03bc\u03ad\u03c3\u03c9 \u0399\u03c3\u03c4\u03bf\u03cd. \u039a\u03b1\u03b9 \u03bf\u03b9 \u03b4\u03cd\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03ba\u03c4\u03b5\u03bb\u03bf\u03cd\u03bd \u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome, \u03b7 \u03bf\u03c0\u03bf\u03af\u03b1 \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"disconnect_other_button":{"message":"\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"error_authentication_failed":{"message":"\u039f \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5. \u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_bad_plugin_version":{"message":"\u039b\u03b5\u03af\u03c0\u03bf\u03c5\u03bd \u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03c5 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_generic":{"message":"\u03a0\u03c1\u03bf\u03ad\u03ba\u03c5\u03c8\u03b5 \u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1. \u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_host_is_offline":{"message":"\u039f \u03b1\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_incompatible_protocol":{"message":"\u0395\u03bd\u03c4\u03bf\u03c0\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03bc\u03b9\u03b1 \u03bc\u03b7 \u03c3\u03c5\u03bc\u03b2\u03b1\u03c4\u03ae \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c4\u03b7\u03c2 \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7\u03c2 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c4\u03bf\u03c5 Google Chrome \u03ba\u03b1\u03b8\u03ce\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03ba\u03b1\u03b9 \u03c3\u03c4\u03bf\u03c5 \u03b4\u03cd\u03bf \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_invalid_access_code":{"message":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_missing_plugin":{"message":"\u039b\u03b5\u03af\u03c0\u03bf\u03c5\u03bd \u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03c5 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c4\u03bf\u03c5 Google Chrome \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac."},"error_no_response":{"message":"\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03bd\u03b1 \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03b9\u03b8\u03b5\u03af \u03c3\u03c4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5."},"error_service_unavailable":{"message":"\u0397 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03bc\u03b1\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c1\u03b9\u03bd\u03ac. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac \u03b1\u03c1\u03b3\u03cc\u03c4\u03b5\u03c1\u03b1."},"error_unexpected":{"message":"\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03bc\u03b7 \u03b1\u03bd\u03b1\u03bc\u03b5\u03bd\u03cc\u03bc\u03b5\u03bd\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1. \u0391\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03c0\u03c1\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03b9\u03c3\u03c4\u03ad\u03c2."},"footer_waiting":{"message":"\u03b1\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae \u03b3\u03b9\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7..."},"help":{"message":"\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1"},"home_access_button":{"message":"\u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1"},"home_access_description":{"message":"\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03b1\u03b9 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03b5\u03bd\u03cc\u03c2 \u03ba\u03bf\u03b9\u03bd\u03cc\u03c7\u03c1\u03b7\u03c3\u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae."},"home_my_computers_title":{"message":"\u039f\u03b9 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2 \u03bc\u03bf\u03c5"},"home_share_button":{"message":"\u039a\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1"},"home_share_description":{"message":"\u03a0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03ce\u03c3\u03c4\u03b5 \u03ad\u03bd\u03b1\u03c2 \u03ac\u03bb\u03bb\u03bf\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03c4\u03b7 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 \u03bd\u03b1 \u03b2\u03bb\u03ad\u03c0\u03b5\u03b9 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03bb\u03ad\u03b3\u03c7\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2."},"home_share_description_chrome_os":{"message":"(\u03b1\u03c5\u03c4\u03ae \u03b7 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03ba\u03cc\u03bc\u03b1 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03b3\u03b9\u03b1 Chromebook\u2026 \u03bc\u03b5\u03af\u03bd\u03b5\u03c4\u03b5 \u03c3\u03c5\u03bd\u03c4\u03bf\u03bd\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03b9)"},"instructions_share_above":{"message":"\u0393\u03b9\u03b1 \u03bd\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2, \u03b4\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03c4\u03c9 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03c3\u03b1\u03c2 \u03b2\u03bf\u03b7\u03b8\u03ae\u03c3\u03b5\u03b9."},"instructions_share_below":{"message":"\u039c\u03cc\u03bb\u03b9\u03c2 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03af\u03c3\u03bf\u03c5\u03bd \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc, \u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03ba\u03bf\u03b9\u03bd\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03b8\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03b9."},"label_connected":{"message":"\u03a3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5 \u03bc\u03b5:"},"message_connecting":{"message":"\u0393\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7..."},"message_generating":{"message":"\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2..."},"message_session_finished":{"message":"\u0397 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03c3\u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03af\u03c3\u03c4\u03b7\u03ba\u03b5."},"message_shared":{"message":"\u0391\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03ba\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0395\u03be\u03bf\u03c5\u03c3\u03b9\u03bf\u03b4\u03cc\u03c4\u03b7\u03c3\u03b7"},"mode_connect":{"message":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"},"mode_share":{"message":"\u039a\u03bf\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7"},"offline":{"message":"\u0395\u03ba\u03c4\u03cc\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2"},"ok":{"message":"OK"},"product_description":{"message":"\u0391\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03ac\u03bb\u03bb\u03bf\u03c5\u03c2 \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ad\u03c2 \u03ae \u03bd\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03ad\u03bd\u03b1\u03bd \u03ac\u03bb\u03bb\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03b7 \u03b1\u03c3\u03c6\u03b1\u03bb\u03ae\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2 \u03bc\u03ad\u03c3\u03c9 \u0394\u03b9\u03b1\u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5."},"product_name":{"message":"\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 Chrome"},"sign_out_button":{"message":"\u0388\u03be\u03bf\u03b4\u03bf\u03c2"},"stop_sharing_button":{"message":"\u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03ba\u03bf\u03b9\u03bd\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2"},"tooltip_scaling":{"message":"\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae \u03bc\u03b5\u03b3\u03ad\u03b8\u03bf\u03c5\u03c2"},"warning_nat_disabled":{"message":"\u03a3\u0397\u039c\u0395\u0399\u03a9\u03a3\u0397: \u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03c0\u03bf\u03bb\u03b9\u03c4\u03b9\u03ba\u03ae\u03c2 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03bf\u03c5\u03bd \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03b9\u03c2 \u03bc\u03cc\u03bd\u03bf \u03bc\u03b5\u03c4\u03b1\u03be\u03cd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b1\u03bd\u03ae\u03ba\u03bf\u03c5\u03bd \u03c3\u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03cc \u03c3\u03b1\u03c2."}} diff --git a/remoting/webapp/me2mom/_locales.official/en/messages.json b/remoting/webapp/me2mom/_locales.official/en/messages.json deleted file mode 100644 index daf776e..0000000 --- a/remoting/webapp/me2mom/_locales.official/en/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Access code"},"access_code_timer":{"message":"This access code will expire in $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancel"},"close_prompt":{"message":"Leaving this page will end your Chrome Remote Desktop session."},"connect_button":{"message":"Connect"},"continue_button":{"message":"Continue"},"continue_prompt":{"message":"You are currently sharing this machine with another user. Do you want to continue sharing?"},"description_authorize":{"message":"To use Chrome Remote Desktop you must grant extended access permissions to your computer. You only have to do this once."},"description_connect":{"message":"Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code."},"description_home":{"message":"Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnect (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnect"},"disconnect_other_button":{"message":"Disconnect"},"error_authentication_failed":{"message":"Authentication failed. Please sign out of Chrome Remote Desktop and try again."},"error_bad_plugin_version":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you have installed the latest version and try again."},"error_generic":{"message":"An unknown error occurred. Please sign out of Chrome Remote Desktop and try again."},"error_host_is_offline":{"message":"The remote computer is not responding to connection requests. Please verify that it is online and try again."},"error_incompatible_protocol":{"message":"An incompatible version of Chrome Remote Desktop was detected. Please make sure that you have the latest version of Google Chrome and Chrome Remote Desktop on both computers and try again."},"error_invalid_access_code":{"message":"The access code is invalid. Please try again."},"error_missing_plugin":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you're running the latest version of Google Chrome and try again."},"error_no_response":{"message":"The server failed to respond to the network request."},"error_service_unavailable":{"message":"The service is temporarily unavailable. Please try again later."},"error_unexpected":{"message":"An unexpected error occurred. Please report this problem to the developers."},"footer_waiting":{"message":"waiting for connection\u2026"},"help":{"message":"Help"},"home_access_button":{"message":"Access Now"},"home_access_description":{"message":"See and control a shared computer."},"home_my_computers_title":{"message":"My Computers"},"home_share_button":{"message":"Share Now"},"home_share_description":{"message":"Share this computer for another user to see and control."},"home_share_description_chrome_os":{"message":"(this feature is not yet available for Chromebooks\u2026 stay tuned)"},"instructions_share_above":{"message":"To begin sharing your desktop, give the access code below to the person who will be assisting you."},"instructions_share_below":{"message":"Once they enter the code your sharing session will begin."},"label_connected":{"message":"Connected:"},"message_connecting":{"message":"Connecting\u2026"},"message_generating":{"message":"Generating access code\u2026"},"message_session_finished":{"message":"Your Chrome Remote Desktop session has ended."},"message_shared":{"message":"Your desktop is currently being shared with $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Authorize"},"mode_connect":{"message":"Connect"},"mode_share":{"message":"Share"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Access other computers or allow another user to access your computer securely over the Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Sign out"},"stop_sharing_button":{"message":"Stop Sharing"},"tooltip_scaling":{"message":"Scale to fit"},"warning_nat_disabled":{"message":"NOTE: Policy settings permit connections only between computers within your network."}} diff --git a/remoting/webapp/me2mom/_locales.official/en_GB/messages.json b/remoting/webapp/me2mom/_locales.official/en_GB/messages.json deleted file mode 100644 index 706d45d..0000000 --- a/remoting/webapp/me2mom/_locales.official/en_GB/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Access code"},"access_code_timer":{"message":"This access code will expire in $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancel"},"close_prompt":{"message":"Leaving this page will end your Chrome Remote Desktop session."},"connect_button":{"message":"Connect"},"continue_button":{"message":"Continue"},"continue_prompt":{"message":"You are currently sharing this machine with another user. Do you want to continue sharing?"},"description_authorize":{"message":"To use Chrome Remote Desktop you must grant extended access permissions to your computer. You only have to do this once."},"description_connect":{"message":"Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code."},"description_home":{"message":"Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnect (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Disconnect (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnect"},"disconnect_other_button":{"message":"Disconnect"},"error_authentication_failed":{"message":"Authentication failed. Please sign out of Chrome Remote Desktop and try again."},"error_bad_plugin_version":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure that you have installed the latest version and try again."},"error_generic":{"message":"An unknown error occurred. Please sign out of Chrome Remote Desktop and try again."},"error_host_is_offline":{"message":"The remote computer is not responding to connection requests. Please verify that it is online and try again."},"error_incompatible_protocol":{"message":"An incompatible version of Chrome Remote Desktop was detected. Please make sure that you have the latest version of Google Chrome and Chrome Remote Desktop on both computers and try again."},"error_invalid_access_code":{"message":"The access code is invalid. Please try again."},"error_missing_plugin":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure that you're running the latest version of Google Chrome and try again."},"error_no_response":{"message":"The server failed to respond to the network request."},"error_service_unavailable":{"message":"Our service is temporarily unavailable. Please try again later."},"error_unexpected":{"message":"An unexpected error occurred. Please report this problem to the developers."},"footer_waiting":{"message":"waiting for connection\u2026"},"help":{"message":"Help"},"home_access_button":{"message":"Access Now"},"home_access_description":{"message":"See and control a shared computer."},"home_my_computers_title":{"message":"My Computers"},"home_share_button":{"message":"Share Now"},"home_share_description":{"message":"Share this computer for another user to see and control."},"home_share_description_chrome_os":{"message":"(this feature is not yet available for Chromebooks\u2026 stay tuned)"},"instructions_share_above":{"message":"To begin sharing your desktop, give the access code below to the person who will be assisting you."},"instructions_share_below":{"message":"Once they have entered the code your sharing session will begin."},"label_connected":{"message":"Connected:"},"message_connecting":{"message":"Connecting\u2026"},"message_generating":{"message":"Generating access code\u2026"},"message_session_finished":{"message":"Your Chrome Remote Desktop session has ended."},"message_shared":{"message":"Your desktop is currently being shared with $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Authorise"},"mode_connect":{"message":"Connect"},"mode_share":{"message":"Share"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Access other computers or allow another user to access your computer securely over the Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Sign out"},"stop_sharing_button":{"message":"Stop Sharing"},"tooltip_scaling":{"message":"Scaled to fit"},"warning_nat_disabled":{"message":"NOTE: Policy settings only permit connections between computers within your network."}} diff --git a/remoting/webapp/me2mom/_locales.official/es/messages.json b/remoting/webapp/me2mom/_locales.official/es/messages.json deleted file mode 100644 index be8bc65..0000000 --- a/remoting/webapp/me2mom/_locales.official/es/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"C\u00f3digo de acceso"},"access_code_timer":{"message":"Este c\u00f3digo de acceso caducar\u00e1 dentro de $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Si abandonas esta p\u00e1gina, finalizar\u00e1 tu sesi\u00f3n en Chrome Remote Desktop."},"connect_button":{"message":"Conectar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"Actualmente est\u00e1s compartiendo este ordenador con otro usuario. \u00bfQuieres seguir comparti\u00e9ndolo?"},"description_authorize":{"message":"Para poder utilizar Chrome Remote Desktop, debes conceder permisos de acceso ampliados a tu ordenador. Solo tienes que realizar esta acci\u00f3n una vez."},"description_connect":{"message":"Pide al propietario del ordenador al que quieras acceder que haga clic en la opci\u00f3n Compartir ahora y que te facilite el c\u00f3digo de acceso."},"description_home":{"message":"Chrome Remote Desktop permite compartir de forma segura tu ordenador a trav\u00e9s de Internet. Ambos usuarios deben estar ejecutando la aplicaci\u00f3n Chrome Remote Desktop, que est\u00e1 disponible en la p\u00e1gina $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconectar (Opci\u00f3n+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconectar"},"disconnect_other_button":{"message":"Desconectar"},"error_authentication_failed":{"message":"Se ha producido un error de autenticaci\u00f3n. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_bad_plugin_version":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de haber instalado la \u00faltima versi\u00f3n y vuelve a intentarlo."},"error_generic":{"message":"Se ha producido un error desconocido. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_host_is_offline":{"message":"El ordenador remoto no responde a las solicitudes de conexi\u00f3n. Comprueba que est\u00e9 conectado y vuelve a intentarlo."},"error_incompatible_protocol":{"message":"Hemos detectado que tu versi\u00f3n de Chrome Remote Desktop no es compatible. Aseg\u00farate de haber instalado en ambos ordenadores la \u00faltima versi\u00f3n de Google Chrome y de Chrome Remote Desktop."},"error_invalid_access_code":{"message":"El c\u00f3digo de acceso no es v\u00e1lido. Vuelve a intentarlo."},"error_missing_plugin":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de estar ejecutando la \u00faltima versi\u00f3n de Google Chrome y vuelve a intentarlo."},"error_no_response":{"message":"El servidor no ha respondido a la solicitud de red."},"error_service_unavailable":{"message":"El servicio no est\u00e1 disponible temporalmente. Vuelve a intentarlo m\u00e1s tarde."},"error_unexpected":{"message":"Se ha producido un error inesperado. Comunica la incidencia a los desarrolladores."},"footer_waiting":{"message":"esperando conexi\u00f3n..."},"help":{"message":"Ayuda"},"home_access_button":{"message":"Acceder ahora"},"home_access_description":{"message":"Permite ver y controlar un ordenador compartido."},"home_my_computers_title":{"message":"Mis ordenadores"},"home_share_button":{"message":"Compartir ahora"},"home_share_description":{"message":"Comparte este ordenador para que otro usuario pueda acceder a \u00e9l y controlarlo."},"home_share_description_chrome_os":{"message":"(esta funci\u00f3n a\u00fan no est\u00e1 disponible para los Chromebook\u2026, sigue atento a las novedades)"},"instructions_share_above":{"message":"Para empezar a compartir tu escritorio, proporciona el c\u00f3digo de acceso que se muestra a continuaci\u00f3n a la persona que te vaya a ayudar."},"instructions_share_below":{"message":"Cuando el usuario introduzca el c\u00f3digo de acceso, empezar\u00e1 la sesi\u00f3n compartida."},"label_connected":{"message":"Conectado:"},"message_connecting":{"message":"Conectando\u2026"},"message_generating":{"message":"Generando c\u00f3digo de acceso..."},"message_session_finished":{"message":"Ha finalizado tu sesi\u00f3n en Chrome Remote Desktop."},"message_shared":{"message":"Actualmente est\u00e1s compartiendo tu escritorio con $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Conectar"},"mode_share":{"message":"Compartir"},"offline":{"message":"Sin conexi\u00f3n"},"ok":{"message":"Aceptar"},"product_description":{"message":"Accede a otros ordenadores o permite que otro usuario acceda a tu ordenador de forma segura a trav\u00e9s de Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Salir"},"stop_sharing_button":{"message":"Dejar de compartir"},"tooltip_scaling":{"message":"Ajusta el tama\u00f1o a la pantalla"},"warning_nat_disabled":{"message":"NOTA: la configuraci\u00f3n de la pol\u00edtica solo permite establecer conexiones entre ordenadores de tu misma red."}} diff --git a/remoting/webapp/me2mom/_locales.official/es_419/messages.json b/remoting/webapp/me2mom/_locales.official/es_419/messages.json deleted file mode 100644 index 335e866..0000000 --- a/remoting/webapp/me2mom/_locales.official/es_419/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"C\u00f3digo de acceso"},"access_code_timer":{"message":"Este c\u00f3digo de acceso caducar\u00e1 en $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Al abandonar esta p\u00e1gina, se cerrar\u00e1 la sesi\u00f3n que iniciaste en Chrome Remote Desktop."},"connect_button":{"message":"Conectar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"En este momento compartes esta computadora con otro usuario. \u00bfDeseas continuar comparti\u00e9ndola?"},"description_authorize":{"message":"Para usar Chrome Remote Desktop debes extender los permisos de acceso a tu computadora. Solo tienes que hacer esto una vez."},"description_connect":{"message":"Solicita que el usuario de la computadora a la que deseas acceder haga clic en \"Compartir ahora\" y te proporcione el c\u00f3digo de acceso."},"description_home":{"message":"Chrome Remote Desktop te permite compartir tu computadora con otro usuario de manera segura en la Web. Tanto t\u00fa como el otro usuario deben ejecutar la aplicaci\u00f3n Chrome Remote Desktop, disponible en $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconectar (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconectar"},"disconnect_other_button":{"message":"Desconectar"},"error_authentication_failed":{"message":"No se pudo realizar la autenticaci\u00f3n. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_bad_plugin_version":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de haber instalado la \u00faltima versi\u00f3n y vuelve a intentarlo."},"error_generic":{"message":"Se produjo un error desconocido. Sal de Chrome Remote Desktop y vuelve a intentarlo."},"error_host_is_offline":{"message":"La computadora remota no responde a las solicitudes de conexi\u00f3n. Verifica que esta se encuentre en l\u00ednea y vuelve a intentarlo."},"error_incompatible_protocol":{"message":"Se detect\u00f3 una versi\u00f3n incompatible de Chrome Remote Desktop. Aseg\u00farate de que se hayan instalado las \u00faltimas versiones de Google Chrome y de Chrome Remote Desktop en ambas computadoras y vuelve a intentarlo."},"error_invalid_access_code":{"message":"El c\u00f3digo de acceso no es v\u00e1lido. Vuelve a intentarlo."},"error_missing_plugin":{"message":"Faltan algunos de los componentes necesarios para Chrome Remote Desktop. Aseg\u00farate de estar ejecutando la \u00faltima versi\u00f3n de Google Chrome y vuelve a intentarlo."},"error_no_response":{"message":"El servidor no pudo responder a la solicitud de red."},"error_service_unavailable":{"message":"El servicio no est\u00e1 disponible temporalmente. Vuelve a intentarlo m\u00e1s adelante."},"error_unexpected":{"message":"Se produjo un error inesperado. Informa este problema a los programadores."},"footer_waiting":{"message":"Aguardando la conexi\u00f3n..."},"help":{"message":"Ayuda"},"home_access_button":{"message":"Acceder ahora"},"home_access_description":{"message":"Ve y controla una computadora compartida."},"home_my_computers_title":{"message":"Mis computadoras"},"home_share_button":{"message":"Compartir ahora"},"home_share_description":{"message":"Comparte esta computadora con otro usuario para que este pueda verla y controlarla."},"home_share_description_chrome_os":{"message":"(Esta funci\u00f3n a\u00fan no est\u00e1 disponible para las Chromebooks\u2026 Queda a la espera de novedades)."},"instructions_share_above":{"message":"Para comenzar a compartir tu escritorio, proporciona el c\u00f3digo de acceso que aparece a continuaci\u00f3n a la persona que te asistir\u00e1."},"instructions_share_below":{"message":"Una vez que se haya ingresado el c\u00f3digo, se iniciar\u00e1 la sesi\u00f3n compartida."},"label_connected":{"message":"Conectado:"},"message_connecting":{"message":"Conectando..."},"message_generating":{"message":"Generando el c\u00f3digo de acceso..."},"message_session_finished":{"message":"Se cerr\u00f3 la sesi\u00f3n que iniciaste en Chrome Remote Desktop."},"message_shared":{"message":"En este momento compartes tu escritorio con $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Conectar"},"mode_share":{"message":"Compartir"},"offline":{"message":"Sin conexi\u00f3n"},"ok":{"message":"Aceptar"},"product_description":{"message":"Accede a otras computadoras o permite que otro usuario acceda a tu computadora de manera segura en Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Salir"},"stop_sharing_button":{"message":"Dejar de compartir"},"tooltip_scaling":{"message":"Ajustar al tama\u00f1o de la ventana"},"warning_nat_disabled":{"message":"NOTA: La configuraci\u00f3n de la pol\u00edtica local solo permite conexiones entre computadoras de tu misma red."}} diff --git a/remoting/webapp/me2mom/_locales.official/et/messages.json b/remoting/webapp/me2mom/_locales.official/et/messages.json deleted file mode 100644 index 3082f7b..0000000 --- a/remoting/webapp/me2mom/_locales.official/et/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"P\u00e4\u00e4sukood"},"access_code_timer":{"message":"See p\u00e4\u00e4sukood aegub $1 p\u00e4rast","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"T\u00fchista"},"close_prompt":{"message":"Lehelt lahkumine l\u00f5petab teie Chrome Remote Desktopi seansi."},"connect_button":{"message":"\u00dchenda"},"continue_button":{"message":"J\u00e4tka"},"continue_prompt":{"message":"Jagate seda seadet praegu teise kasutajaga. Kas soovite jagamist j\u00e4tkata?"},"description_authorize":{"message":"Chrome Remote Desktopi kasutamiseks peate andma arvutile laiendatud p\u00e4\u00e4suload. Peate tegema seda ainult \u00fcks kord."},"description_connect":{"message":"Paluge kasutajal, kelle arvutisse soovite juurde p\u00e4\u00e4seda, kl\u00f5psata valikul \u201eJaga n\u00fc\u00fcd\u201d ja anda teile seej\u00e4rel p\u00e4\u00e4sukood."},"description_home":{"message":"Chrome Remote Desktop v\u00f5imaldab arvutit turvaliselt veebi kaudu jagada. M\u00f5lema kasutaja arvutis peab t\u00f6\u00f6tama rakendus Chrome Remote Desktop, mille leiate aadressilt $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Katkesta \u00fchendus (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Katkesta \u00fchendus (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Katkesta \u00fchendus (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Katkesta \u00fchendus"},"disconnect_other_button":{"message":"Katkesta \u00fchendus"},"error_authentication_failed":{"message":"Autentimine eba\u00f5nnestus. Logige Chrome Remote Desktopist v\u00e4lja ja proovige uuesti."},"error_bad_plugin_version":{"message":"M\u00f5ned Chrome Remote Desktopi jaoks vajalikud komponendid on puudu. Veenduge, et olete installinud uusima versiooni ja proovige uuesti."},"error_generic":{"message":"Ilmnes tundmatu viga. Logige Chrome Remote Desktopist v\u00e4lja ja proovige uuesti."},"error_host_is_offline":{"message":"Kaugarvuti ei reageeri \u00fchenduse taotlusele. Kontrollige, et arvutil oleks v\u00f5rgu\u00fchendus ja proovige uuesti."},"error_incompatible_protocol":{"message":"Tuvastati Chrome Remote Desktopi \u00fchildumatu verisoon. Veenduge, et m\u00f5lemasse arvutisse on installitud Google Chrome'i ja Chrome Remote Desktopi uusim versioon, ning proovige uuesti."},"error_invalid_access_code":{"message":"P\u00e4\u00e4sukood on kehtetu. Proovige uuesti."},"error_missing_plugin":{"message":"M\u00f5ned Chrome Remote Desktopi jaoks vajalikud komponendid on puudu. Veenduge, et arvutis t\u00f6\u00f6tab Google Chrome'i uusim versioon ja proovige uuesti."},"error_no_response":{"message":"Server ei vastanud v\u00f5rgup\u00e4ringule."},"error_service_unavailable":{"message":"Teenus on ajutiselt k\u00e4ttesaamatu. Proovige hiljem uuesti."},"error_unexpected":{"message":"Ilmnes ootamatu viga. Teatage sellest probleemist arendajatele."},"footer_waiting":{"message":"\u00fchenduse ootamine ..."},"help":{"message":"Abi"},"home_access_button":{"message":"Hangi n\u00fc\u00fcd juurdep\u00e4\u00e4s"},"home_access_description":{"message":"Vaadake ja juhtige jagatud arvutit."},"home_my_computers_title":{"message":"Minu arvutid"},"home_share_button":{"message":"Jaga n\u00fc\u00fcd"},"home_share_description":{"message":"Jagage seda arvutit teise kasutajaga, nii et ta n\u00e4eb ja saab arvutit juhtida."},"home_share_description_chrome_os":{"message":"(See funktsioon ei ole veel Chromebooksis saadaval ... j\u00e4\u00e4ge ootele.)"},"instructions_share_above":{"message":"Arvuti jagamise alustamiseks andke allolev p\u00e4\u00e4sukood inimesele, kes teid aitama hakkab."},"instructions_share_below":{"message":"Kui ta on koodi sisestanud, algab teie jagamisseanss."},"label_connected":{"message":"\u00dchendatud:"},"message_connecting":{"message":"\u00dchendamine ..."},"message_generating":{"message":"P\u00e4\u00e4sukoodi loomine ..."},"message_session_finished":{"message":"Teie Chrome Remote Desktopi seanss on l\u00f5ppenud."},"message_shared":{"message":"Teie t\u00f6\u00f6lauda jagatakse praegu kasutajaga $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Volitamine"},"mode_connect":{"message":"\u00dchendamine"},"mode_share":{"message":"Jagamine"},"offline":{"message":"V\u00f5rgu\u00fchenduseta"},"ok":{"message":"OK"},"product_description":{"message":"Hankige turvaliselt Interneti kaudu juurdep\u00e4\u00e4s teistele arvutitele v\u00f5i lubage teisel kasutajal hankida juurdep\u00e4\u00e4s oma arvutile."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Logi v\u00e4lja"},"stop_sharing_button":{"message":"L\u00f5peta jagamine"},"tooltip_scaling":{"message":"Suurusega kohandamine"},"warning_nat_disabled":{"message":"M\u00c4RKUS: reeglite seaded lubavad \u00fchendust ainult teie v\u00f5rku kuuluvate arvutite vahel."}} diff --git a/remoting/webapp/me2mom/_locales.official/fi/messages.json b/remoting/webapp/me2mom/_locales.official/fi/messages.json deleted file mode 100644 index 529fb29..0000000 --- a/remoting/webapp/me2mom/_locales.official/fi/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"K\u00e4ytt\u00f6koodi"},"access_code_timer":{"message":"T\u00e4m\u00e4 k\u00e4ytt\u00f6koodi vanhenee $1 kuluttua.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Peruuta"},"close_prompt":{"message":"Vaihtamalla sivua p\u00e4\u00e4t\u00e4t Chrome-et\u00e4k\u00e4ytt\u00f6kerran."},"connect_button":{"message":"Yhdist\u00e4"},"continue_button":{"message":"Jatka"},"continue_prompt":{"message":"Jaat t\u00e4ll\u00e4 hetkell\u00e4 t\u00e4m\u00e4n tietokoneen toisen k\u00e4ytt\u00e4j\u00e4n kanssa. Haluatko jatkaa jakamista?"},"description_authorize":{"message":"Sinun on annettava laajennetut k\u00e4ytt\u00f6oikeudet tietokoneeseesi, jotta voit k\u00e4ytt\u00e4\u00e4 Chrome-et\u00e4k\u00e4ytt\u00f6\u00e4. T\u00e4m\u00e4 t\u00e4ytyy tehd\u00e4 vain kerran."},"description_connect":{"message":"Pyyd\u00e4 k\u00e4ytt\u00e4j\u00e4\u00e4, jonka tietokonetta haluat k\u00e4ytt\u00e4\u00e4, valitsemaan Jaa nyt ja antamaan sinulle k\u00e4ytt\u00f6koodi."},"description_home":{"message":"Chrome-et\u00e4k\u00e4ytt\u00f6sovelluksen avulla voit jakaa tietokoneesi suojatun verkkoyhteyden kautta. Molempien k\u00e4ytt\u00e4jien t\u00e4ytyy k\u00e4ytt\u00e4\u00e4 osoitteesta $1 l\u00f6ytyv\u00e4\u00e4 Chrome-et\u00e4k\u00e4ytt\u00f6sovellusta.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Katkaise yhteys (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Katkaise yhteys (Opt + Ctrl + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Katkaise yhteys (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"Katkaise yhteys"},"disconnect_other_button":{"message":"Katkaise yhteys"},"error_authentication_failed":{"message":"Todennus ep\u00e4onnistui. Kirjaudu ulos Chrome-et\u00e4k\u00e4yt\u00f6st\u00e4 ja yrit\u00e4 uudelleen."},"error_bad_plugin_version":{"message":"Jotkin Chrome-et\u00e4k\u00e4ytt\u00f6\u00f6n vaadittavat komponentit puuttuvat. Varmista, ett\u00e4 olet asentanut uusimman Google Chrome -version, ja yrit\u00e4 uudelleen."},"error_generic":{"message":"Tuntematon virhe. Kirjaudu ulos Chrome-et\u00e4k\u00e4yt\u00f6st\u00e4 ja yrit\u00e4 uudelleen."},"error_host_is_offline":{"message":"Et\u00e4tietokone ei vastaa yhteyspyynt\u00f6ihin. Vahvista, ett\u00e4 se on online-tilassa, ja yrit\u00e4 uudelleen."},"error_incompatible_protocol":{"message":"Havaittiin yhteensopimaton Chrome-et\u00e4k\u00e4ytt\u00f6versio. Varmista, ett\u00e4 molemmissa tietokoneissa on uusimmat Google Chrome- ja Chrome-et\u00e4k\u00e4ytt\u00f6versiot, ja yrit\u00e4 uudelleen."},"error_invalid_access_code":{"message":"K\u00e4ytt\u00f6koodi on virheellinen. Yrit\u00e4 uudelleen."},"error_missing_plugin":{"message":"Jotkin Chrome-et\u00e4k\u00e4ytt\u00f6\u00f6n vaadittavat komponentit puuttuvat. Varmista, ett\u00e4 k\u00e4yt\u00e4t uusinta Google Chrome -versiota ja yrit\u00e4 uudelleen."},"error_no_response":{"message":"Palvelin ei pystynyt vastaamaan verkkopyynt\u00f6\u00f6n."},"error_service_unavailable":{"message":"Palvelu ei ole t\u00e4ll\u00e4 hetkell\u00e4 k\u00e4ytett\u00e4viss\u00e4. Yrit\u00e4 my\u00f6hemmin uudelleen."},"error_unexpected":{"message":"Odottamaton virhe. Ilmoita t\u00e4st\u00e4 ongelmasta kehitt\u00e4jille."},"footer_waiting":{"message":"odotetaan yhteytt\u00e4..."},"help":{"message":"Ohje"},"home_access_button":{"message":"K\u00e4yt\u00e4 nyt"},"home_access_description":{"message":"Tarkastele ja hallinnoi jaettua tietokonetta."},"home_my_computers_title":{"message":"Omat tietokoneet"},"home_share_button":{"message":"Jaa nyt"},"home_share_description":{"message":"Jaa t\u00e4m\u00e4 tietokone toisen k\u00e4ytt\u00e4j\u00e4n n\u00e4ht\u00e4v\u00e4ksi ja hallinnoitavaksi."},"home_share_description_chrome_os":{"message":"(t\u00e4m\u00e4 ominaisuus ei ole viel\u00e4 saatavilla Chromebookeille ... pysy kuulolla)"},"instructions_share_above":{"message":"Aloita ty\u00f6p\u00f6yd\u00e4n jakaminen antamalla k\u00e4ytt\u00f6koodi sinua avustavalle henkil\u00f6lle."},"instructions_share_below":{"message":"Tietokoneen jakaminen aloitetaan k\u00e4ytt\u00e4j\u00e4n annettua k\u00e4ytt\u00f6koodin."},"label_connected":{"message":"Yhdistetty:"},"message_connecting":{"message":"Yhdistet\u00e4\u00e4n\u2026"},"message_generating":{"message":"Luodaan k\u00e4ytt\u00f6koodia..."},"message_session_finished":{"message":"Chrome-et\u00e4k\u00e4ytt\u00f6kerta on p\u00e4\u00e4ttynyt."},"message_shared":{"message":"Tietokoneesi on jaettu k\u00e4ytt\u00e4j\u00e4n $1 kanssa.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Valtuuta"},"mode_connect":{"message":"Yhdist\u00e4"},"mode_share":{"message":"Jaa"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"K\u00e4yt\u00e4 muita tietokoneita tai salli toisen k\u00e4ytt\u00e4j\u00e4n k\u00e4ytt\u00e4\u00e4 tietokonettasi suojatun internetyhteyden kautta."},"product_name":{"message":"Chrome-et\u00e4k\u00e4ytt\u00f6"},"sign_out_button":{"message":"Kirjaudu ulos"},"stop_sharing_button":{"message":"Lopeta jakaminen"},"tooltip_scaling":{"message":"Sovita koon mukaan"},"warning_nat_disabled":{"message":"HUOMAA: k\u00e4yt\u00e4nt\u00f6asetusten vuoksi vain verkossasi olevien tietokoneiden v\u00e4liset yhteydet sallitaan."}} diff --git a/remoting/webapp/me2mom/_locales.official/fil/messages.json b/remoting/webapp/me2mom/_locales.official/fil/messages.json deleted file mode 100644 index 9722973..0000000 --- a/remoting/webapp/me2mom/_locales.official/fil/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Access code"},"access_code_timer":{"message":"Mag-e-expire ang access code sa $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Kanselahin"},"close_prompt":{"message":"Tatapusin ng pag-alis sa pahinang ito ang iyong session sa Chrome Remote Desktop."},"connect_button":{"message":"Kumonekta"},"continue_button":{"message":"Magpatuloy"},"continue_prompt":{"message":"Kasalukuyan mong ibinabahagi ang machine na ito sa isa pang user. Gusto mo bang ipagpatuloy ang pagbabahagi?"},"description_authorize":{"message":"Upang gamitin ang Chrome Remote Desktop, dapat kang magbigay ng mga pagpapahintulot ng pinalawak na access sa iyong computer. Kailangan mo lamang itong gawin nang isang beses."},"description_connect":{"message":"Hilingin sa user na nagmamay-ari ng computer na gusto mong i-access na i-click ang \u2018Ibahagi Ngayon\u2019 at ibigay sa iyo ang access code."},"description_home":{"message":"Binibigyang-daan ka ng Chrome Remote Desktop na ibahagi sa Web ang iyong computer nang secure. Kailangang nagpapatakbo ng Chrome Remote app ang parehong mga user, na matatagpuan sa $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Idiskonekta (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Idiskonekta (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Idiskonekta (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Idiskonekta"},"disconnect_other_button":{"message":"Idiskonekta"},"error_authentication_failed":{"message":"Nabigo ang pagpapatotoo. Mangyaring mag-sign out sa Chrome Remote Desktop at subukang muli."},"error_bad_plugin_version":{"message":"Nawawala ang ilang bahaging kinakailangan para sa Chrome Remote Desktop. Mangyaring tiyaking na-install mo ang pinakabagong bersyon at subukang muli."},"error_generic":{"message":"Naganap ang isang hindi kilalang error. Mangyaring mag-sign out sa Chrome Remote Desktop at subukang muli."},"error_host_is_offline":{"message":"Hindi tumutugon ang malayuang computer sa mga kahilingan ng koneksyon. Paki-verify na ito ay online at subukang muli."},"error_incompatible_protocol":{"message":"Natukoy ang isang hindi tugmang bersyon ng Chrome Remote Desktop. Mangyaring tiyaking na-install mo ang pinakabagong bersyon ng Google Chrome at Chrome Remote Desktop sa parehong mga computer at subukang muli."},"error_invalid_access_code":{"message":"Di-wasto ang access code. Pakisubukang muli."},"error_missing_plugin":{"message":"Nawawala ang ilang bahaging kinakailangan para sa Chrome Remote Desktop. Mangyaring tiyaking pinapatakbo mo ang pinakabagong bersyon ng Google Chrome at subukang muli."},"error_no_response":{"message":"Nabigo ang server na tumugon sa kahilingan ng network."},"error_service_unavailable":{"message":"Pansamantalang hindi available ang serbisyo. Pakisubukang muli sa ibang pagkakataon."},"error_unexpected":{"message":"May naganap na hindi inaasahang error. Paki-ulat ang problemang ito sa mga developer."},"footer_waiting":{"message":"naghihitay ng koneksyon\u2026"},"help":{"message":"Tulong"},"home_access_button":{"message":"I-access Ngayon"},"home_access_description":{"message":"Tingnan at kontrolin ang isang nakabahaging computer."},"home_my_computers_title":{"message":"Aking Mga Computer"},"home_share_button":{"message":"Ibahagi Ngayon"},"home_share_description":{"message":"Ibahagi ang computer na ito sa isa pang user upang tingnan at kontrolin."},"home_share_description_chrome_os":{"message":"(hindi pa available ang tampok na ito para sa Mga Chromebook\u2026 manatiling nakasubaybay)"},"instructions_share_above":{"message":"Upang simulang ibahagi ang iyong desktop, ibigay sa taong tutulong sa iyo ang access code na nasa ibaba."},"instructions_share_below":{"message":"Sa sandaling ilagay nila ang code ay magsisimula ang iyong session ng pagbabahagi."},"label_connected":{"message":"Nakakonekta:"},"message_connecting":{"message":"Kumukonekta..."},"message_generating":{"message":"Binubuo ang access code\u2026"},"message_session_finished":{"message":"Natapos na ang iyong session sa Chrome Remote Desktop."},"message_shared":{"message":"Kasalukuyang nakabahagi ang iyong desktop kay $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Pahintulutan"},"mode_connect":{"message":"Kumonekta"},"mode_share":{"message":"Ibahagi"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Mag-access ng iba pang mga computer o payagan ang isa pang user na i-access sa Internet ang iyong computer nang secure."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Mag-sign out"},"stop_sharing_button":{"message":"Ihinto ang Pagbabahagi"},"tooltip_scaling":{"message":"Sukatin upang umangkop"},"warning_nat_disabled":{"message":"TANDAAN: Pinapayagan ng mga setting ng patakaran ang mga koneksyon sa pagitan lamang ng mga computer sa loob ng iyong network."}} diff --git a/remoting/webapp/me2mom/_locales.official/fr/messages.json b/remoting/webapp/me2mom/_locales.official/fr/messages.json deleted file mode 100644 index 976df3e..0000000 --- a/remoting/webapp/me2mom/_locales.official/fr/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Code d'acc\u00e8s"},"access_code_timer":{"message":"Ce code d'acc\u00e8s expire dans $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annuler"},"close_prompt":{"message":"En quittant cette page, vous mettrez fin \u00e0 la session du bureau \u00e0 distance Chrome."},"connect_button":{"message":"Connexion"},"continue_button":{"message":"Continuer"},"continue_prompt":{"message":"Vous partagez actuellement cette machine avec un autre utilisateur. Voulez-vous continuer ce partage\u00a0?"},"description_authorize":{"message":"Pour utiliser le bureau \u00e0 distance Chrome, vous devez autoriser l'acc\u00e8s \u00e9tendu \u00e0 votre ordinateur. Vous n'aurez \u00e0 effectuer cette op\u00e9ration qu'une seule fois."},"description_connect":{"message":"Demandez \u00e0 l'utilisateur poss\u00e9dant l'ordinateur auquel vous souhaitez acc\u00e9der de cliquer sur \"Partager\", puis de vous communiquer le code d'acc\u00e8s."},"description_home":{"message":"L'application Bureau \u00e0 distance Chrome vous permet de partager votre ordinateur sur le Web en toute s\u00e9curit\u00e9. Pour ce faire, les deux\u00a0utilisateurs en question doivent ex\u00e9cuter cette application, disponible \u00e0 l'adresse $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"D\u00e9connecter (Ctrl\u00a0+\u00a0Alt\u00a0+\u00a0Echap)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"D\u00e9connecter (Opt + Ctrl + Echap)"},"disconnect_button_plus_shortcut_windows":{"message":"D\u00e9connecter (Ctrl + Alt + Echap)"},"disconnect_myself_button":{"message":"Se d\u00e9connecter"},"disconnect_other_button":{"message":"D\u00e9connecter"},"error_authentication_failed":{"message":"\u00c9chec de l'authentification. Veuillez vous d\u00e9connecter du bureau \u00e0 distance Chrome, puis r\u00e9essayer."},"error_bad_plugin_version":{"message":"Certains composants n\u00e9cessaires \u00e0 l'utilisation du bureau \u00e0 distance Chrome sont introuvables. Veuillez vous assurer que vous utilisez la derni\u00e8re version de Google\u00a0Chrome, puis r\u00e9essayer."},"error_generic":{"message":"Une erreur inconnue s'est produite. Veuillez vous d\u00e9connecter du bureau \u00e0 distance\u00a0Chrome, puis r\u00e9essayer."},"error_host_is_offline":{"message":"L'ordinateur distant ne r\u00e9pond pas aux demandes de connexion. Veuillez v\u00e9rifier qu'il est connect\u00e9, puis r\u00e9essayer."},"error_incompatible_protocol":{"message":"Une version incompatible du bureau \u00e0 distance Chrome a \u00e9t\u00e9 d\u00e9tect\u00e9e. Veuillez vous assurer que vous utilisez la derni\u00e8re version de Google\u00a0Chrome et du bureau \u00e0 distance sur les deux\u00a0ordinateurs, puis r\u00e9essayer."},"error_invalid_access_code":{"message":"Le code d'acc\u00e8s n'est pas valide. Veuillez r\u00e9essayer."},"error_missing_plugin":{"message":"Certains composants n\u00e9cessaires \u00e0 l'utilisation du bureau \u00e0 distance Chrome sont introuvables. Veuillez vous assurer que vous utilisez la derni\u00e8re version de Google\u00a0Chrome, puis r\u00e9essayer."},"error_no_response":{"message":"\u00c9chec de la r\u00e9ponse du serveur \u00e0 la demande du r\u00e9seau."},"error_service_unavailable":{"message":"Le service est momentan\u00e9ment indisponible. Veuillez r\u00e9essayer ult\u00e9rieurement."},"error_unexpected":{"message":"Une erreur inattendue s'est produite. Veuillez signaler le probl\u00e8me aux d\u00e9veloppeurs."},"footer_waiting":{"message":"en attente de connexion\u2026"},"help":{"message":"Aide"},"home_access_button":{"message":"Acc\u00e9der"},"home_access_description":{"message":"Voir et contr\u00f4ler un ordinateur partag\u00e9"},"home_my_computers_title":{"message":"Mes ordinateurs"},"home_share_button":{"message":"Partager"},"home_share_description":{"message":"Partager cet ordinateur et permettre \u00e0 un utilisateur de le voir et de le contr\u00f4ler"},"home_share_description_chrome_os":{"message":"Cette fonctionnalit\u00e9 n'est pas encore disponible pour les Chromebooks. Merci de votre patience."},"instructions_share_above":{"message":"Pour d\u00e9marrer le partage de votre bureau, communiquez le code d'acc\u00e8s ci-dessous \u00e0 la personne qui vous assistera."},"instructions_share_below":{"message":"Votre session de partage d\u00e9butera une fois le code saisi."},"label_connected":{"message":"Connect\u00e9\u00a0:"},"message_connecting":{"message":"Connexion en cours\u2026"},"message_generating":{"message":"G\u00e9n\u00e9ration du code d'acc\u00e8s\u2026"},"message_session_finished":{"message":"La session du bureau \u00e0 distance Chrome est termin\u00e9e."},"message_shared":{"message":"Vous partagez actuellement votre bureau avec $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriser"},"mode_connect":{"message":"Se connecter"},"mode_share":{"message":"Partager"},"offline":{"message":"Hors connexion"},"ok":{"message":"OK"},"product_description":{"message":"Acc\u00e9dez \u00e0 d'autres ordinateurs ou permettez \u00e0 un utilisateur d'acc\u00e9der au v\u00f4tre en toute s\u00e9curit\u00e9 via Internet."},"product_name":{"message":"Bureau \u00e0 distance Chrome"},"sign_out_button":{"message":"D\u00e9connexion"},"stop_sharing_button":{"message":"Arr\u00eater le partage"},"tooltip_scaling":{"message":"Ajuster"},"warning_nat_disabled":{"message":"REMARQUE\u00a0: Les param\u00e8tres des r\u00e8gles n'autorisent que les connexions entre les ordinateurs de votre r\u00e9seau."}} diff --git a/remoting/webapp/me2mom/_locales.official/he/messages.json b/remoting/webapp/me2mom/_locales.official/he/messages.json deleted file mode 100644 index 54d91dd..0000000 --- a/remoting/webapp/me2mom/_locales.official/he/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u05e7\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4"},"access_code_timer":{"message":"\u05ea\u05d5\u05e7\u05e4\u05d5 \u05e9\u05dc \u05e7\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4 \u05d6\u05d4 \u05d9\u05e4\u05d5\u05d2 \u05d1\u05e2\u05d5\u05d3 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u05d1\u05d9\u05d8\u05d5\u05dc"},"close_prompt":{"message":"\u05d9\u05e6\u05d9\u05d0\u05d4 \u05de\u05d3\u05e3 \u05d6\u05d4 \u05ea\u05e1\u05d9\u05d9\u05dd \u05d0\u05ea \u05d4\u05e4\u05e2\u05dc\u05ea '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome'."},"connect_button":{"message":"\u05d4\u05ea\u05d7\u05d1\u05e8"},"continue_button":{"message":"\u05d4\u05de\u05e9\u05da"},"continue_prompt":{"message":"\u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05e3 \u05db\u05e2\u05ea \u05d0\u05ea \u05d4\u05de\u05d7\u05e9\u05d1 \u05d4\u05d6\u05d4 \u05e2\u05dd \u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d7\u05e8. \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da \u05dc\u05e9\u05ea\u05e3?"},"description_authorize":{"message":"\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome', \u05e2\u05dc\u05d9\u05da \u05dc\u05d4\u05e2\u05e0\u05d9\u05e7 \u05d4\u05e8\u05e9\u05d0\u05d5\u05ea \u05d2\u05d9\u05e9\u05d4 \u05de\u05d5\u05e8\u05d7\u05d1\u05d5\u05ea \u05dc\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05da. \u05d9\u05d4\u05d9\u05d4 \u05e2\u05dc\u05d9\u05da \u05dc\u05e2\u05e9\u05d5\u05ea \u05d6\u05d0\u05ea \u05e4\u05e2\u05dd \u05d0\u05d7\u05ea \u05d1\u05dc\u05d1\u05d3."},"description_connect":{"message":"\u05d1\u05e7\u05e9 \u05de\u05d4\u05de\u05e9\u05ea\u05de\u05e9 \u05e9\u05d0\u05dc \u05d4\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05d5 \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d2\u05e9\u05ea \u05dc\u05dc\u05d7\u05d5\u05e5 \u05e2\u05dc '\u05e9\u05ea\u05e3 \u05e2\u05db\u05e9\u05d9\u05d5' \u05d5\u05dc\u05ea\u05ea \u05dc\u05da \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4\u05d2\u05d9\u05e9\u05d4."},"description_home":{"message":"'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05de\u05d0\u05e4\u05e9\u05e8 \u05dc\u05da \u05dc\u05e9\u05ea\u05e3 \u05d0\u05ea \u05d4\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05da \u05d1\u05d0\u05d5\u05e4\u05df \u05de\u05d0\u05d5\u05d1\u05d8\u05d7 \u05d3\u05e8\u05da \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8. \u05e2\u05dc \u05e9\u05e0\u05d9 \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05d9\u05d9\u05e9\u05d5\u05dd '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome', \u05e9\u05e0\u05d9\u05ea\u05df \u05dc\u05de\u05e6\u05d5\u05d0 \u05d1\u05db\u05ea\u05d5\u05d1\u05ea $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u05d4\u05ea\u05e0\u05ea\u05e7 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u05d4\u05ea\u05e0\u05ea\u05e7 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u05d4\u05ea\u05e0\u05ea\u05e7 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u05e0\u05d9\u05ea\u05d5\u05e7"},"disconnect_other_button":{"message":"\u05e0\u05d9\u05ea\u05d5\u05e7"},"error_authentication_failed":{"message":"\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05e0\u05db\u05e9\u05dc. \u05e6\u05d0 \u05de'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_bad_plugin_version":{"message":"\u05d7\u05dc\u05e7 \u05de\u05d4\u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05d4\u05d3\u05e8\u05d5\u05e9\u05d9\u05dd \u05e2\u05d1\u05d5\u05e8 '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d7\u05e1\u05e8\u05d9\u05dd. \u05d5\u05d3\u05d0 \u05e9\u05d4\u05ea\u05e7\u05e0\u05ea \u05d0\u05ea \u05d4\u05d2\u05d9\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_generic":{"message":"\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05de\u05d5\u05db\u05e8\u05ea. \u05e6\u05d0 \u05de'\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_host_is_offline":{"message":"\u05d4\u05de\u05d7\u05e9\u05d1 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d2\u05d9\u05d1 \u05dc\u05d1\u05e7\u05e9\u05d5\u05ea \u05d4\u05d7\u05d9\u05d1\u05d5\u05e8. \u05d5\u05d3\u05d0 \u05e9\u05d4\u05d5\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8 \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_incompatible_protocol":{"message":"\u05d4\u05de\u05e2\u05e8\u05db\u05ea \u05d6\u05d9\u05d4\u05ea\u05d4 \u05d2\u05d9\u05e8\u05e1\u05d4 \u05dc\u05d0 \u05ea\u05d5\u05d0\u05de\u05ea \u05e9\u05dc '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome'. \u05d5\u05d3\u05d0 \u05e9\u05d4\u05d2\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05dc Google Chrome \u05d5\u05e9\u05dc '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05de\u05d5\u05ea\u05e7\u05e0\u05ea \u05d1\u05e9\u05e0\u05d9 \u05d4\u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_invalid_access_code":{"message":"\u05e7\u05d5\u05d3 \u05d4\u05d2\u05d9\u05e9\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05d7\u05d5\u05e7\u05d9. \u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_missing_plugin":{"message":"\u05d7\u05dc\u05e7 \u05de\u05d4\u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05d4\u05d3\u05e8\u05d5\u05e9\u05d9\u05dd \u05e2\u05d1\u05d5\u05e8 '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d7\u05e1\u05e8\u05d9\u05dd. \u05d5\u05d3\u05d0 \u05e9\u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05de\u05e9 \u05d1\u05d2\u05d9\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05dc Google Chrome \u05d5\u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1."},"error_no_response":{"message":"\u05d4\u05e9\u05e8\u05ea \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7 \u05dc\u05d4\u05d2\u05d9\u05d1 \u05dc\u05d1\u05e7\u05e9\u05ea \u05d4\u05e8\u05e9\u05ea."},"error_service_unavailable":{"message":"\u05d4\u05e9\u05d9\u05e8\u05d5\u05ea \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df \u05d6\u05de\u05e0\u05d9\u05ea. \u05e0\u05e1\u05d4 \u05e9\u05d5\u05d1 \u05de\u05d0\u05d5\u05d7\u05e8 \u05d9\u05d5\u05ea\u05e8."},"error_unexpected":{"message":"\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05e6\u05e4\u05d5\u05d9\u05d4. \u05d3\u05d5\u05d5\u05d7 \u05e2\u05dc \u05d1\u05e2\u05d9\u05d4 \u05d6\u05d5 \u05dc\u05de\u05e4\u05ea\u05d7\u05d9\u05dd."},"footer_waiting":{"message":"\u05de\u05de\u05ea\u05d9\u05df \u05dc\u05d7\u05d9\u05d1\u05d5\u05e8..."},"help":{"message":"\u05e2\u05d6\u05e8\u05d4"},"home_access_button":{"message":"\u05d2\u05e9 \u05db\u05e2\u05ea"},"home_access_description":{"message":"\u05d4\u05e6\u05d2 \u05ea\u05d5\u05db\u05df \u05e9\u05dc \u05de\u05d7\u05e9\u05d1 \u05de\u05e9\u05d5\u05ea\u05e3 \u05d5\u05e9\u05dc\u05d5\u05d8 \u05d1\u05d5"},"home_my_computers_title":{"message":"\u05d4\u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05e9\u05dc\u05d9"},"home_share_button":{"message":"\u05e9\u05ea\u05e3 \u05db\u05e2\u05ea"},"home_share_description":{"message":"\u05e9\u05ea\u05e3 \u05de\u05d7\u05e9\u05d1 \u05d6\u05d4 \u05d5\u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d7\u05e8 \u05dc\u05d4\u05e6\u05d9\u05d2 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05e9\u05dc\u05d5 \u05d5\u05dc\u05e9\u05dc\u05d5\u05d8 \u05d1\u05d5."},"home_share_description_chrome_os":{"message":"(\u05ea\u05db\u05d5\u05e0\u05d4 \u05d6\u05d5 \u05d0\u05d9\u05e0\u05d4 \u05d6\u05de\u05d9\u05e0\u05d4 \u05e2\u05d3\u05d9\u05d9\u05df \u05e2\u05d1\u05d5\u05e8 \u05de\u05d7\u05e9\u05d1\u05d9 Chromebook ... \u05d4\u05de\u05e9\u05da \u05dc\u05e2\u05e7\u05d5\u05d1)"},"instructions_share_above":{"message":"\u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05d1\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05e9\u05dc\u05da, \u05ea\u05df \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4\u05d2\u05d9\u05e9\u05d4 \u05d4\u05de\u05d5\u05e4\u05d9\u05e2 \u05d1\u05d4\u05de\u05e9\u05da \u05dc\u05d0\u05d3\u05dd \u05e9\u05d9\u05e1\u05d9\u05d9\u05e2 \u05dc\u05da."},"instructions_share_below":{"message":"\u05dc\u05d0\u05d7\u05e8 \u05e9\u05d4\u05de\u05e9\u05ea\u05de\u05e9 \u05d9\u05d6\u05d9\u05df \u05d0\u05ea \u05d4\u05e7\u05d5\u05d3, \u05e4\u05e2\u05d9\u05dc\u05d5\u05ea \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e9\u05dc\u05db\u05dd \u05ea\u05ea\u05d7\u05d9\u05dc."},"label_connected":{"message":"\u05de\u05d7\u05d5\u05d1\u05e8:"},"message_connecting":{"message":"\u05de\u05ea\u05d7\u05d1\u05e8\u2026"},"message_generating":{"message":"\u05d9\u05d5\u05e6\u05e8 \u05e7\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4..."},"message_session_finished":{"message":"\u05d4\u05e4\u05e2\u05dc\u05ea '\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome' \u05d4\u05e1\u05ea\u05d9\u05d9\u05de\u05d4."},"message_shared":{"message":"\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05e9\u05dc\u05da \u05de\u05e9\u05d5\u05ea\u05e3 \u05db\u05e8\u05d2\u05e2 \u05e2\u05dd $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u05ea\u05df \u05d4\u05e8\u05e9\u05d0\u05d4"},"mode_connect":{"message":"\u05d4\u05ea\u05d7\u05d1\u05e8"},"mode_share":{"message":"\u05e9\u05ea\u05e3"},"offline":{"message":"\u05dc\u05d0 \u05de\u05e7\u05d5\u05d5\u05df"},"ok":{"message":"\u05d0\u05d9\u05e9\u05d5\u05e8"},"product_description":{"message":"\u05d2\u05e9 \u05dc\u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05d0\u05d7\u05e8\u05d9\u05dd \u05d0\u05d5 \u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d7\u05e8 \u05dc\u05d2\u05e9\u05ea \u05dc\u05de\u05d7\u05e9\u05d1 \u05e9\u05dc\u05da \u05d1\u05d0\u05d5\u05e4\u05df \u05de\u05d0\u05d5\u05d1\u05d8\u05d7 \u05d3\u05e8\u05da \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8."},"product_name":{"message":"\u05e9\u05d5\u05dc\u05d7\u05df \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4 \u05d4\u05de\u05e8\u05d5\u05d7\u05e7 \u05e9\u05dc Chrome"},"sign_out_button":{"message":"\u05d9\u05e6\u05d9\u05d0\u05d4"},"stop_sharing_button":{"message":"\u05d4\u05e4\u05e1\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3"},"tooltip_scaling":{"message":"\u05d4\u05ea\u05d0\u05dd \u05d0\u05ea \u05d4\u05d2\u05d5\u05d3\u05dc"},"warning_nat_disabled":{"message":"\u05d4\u05e2\u05e8\u05d4: \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05de\u05d3\u05d9\u05e0\u05d9\u05d5\u05ea \u05de\u05ea\u05d9\u05e8\u05d5\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8\u05d9\u05dd \u05e8\u05e7 \u05d1\u05d9\u05df \u05de\u05d7\u05e9\u05d1\u05d9\u05dd \u05d1\u05ea\u05d5\u05da \u05d4\u05e8\u05e9\u05ea \u05e9\u05dc\u05da."}} diff --git a/remoting/webapp/me2mom/_locales.official/hi/messages.json b/remoting/webapp/me2mom/_locales.official/hi/messages.json deleted file mode 100644 index c26df7b..0000000 --- a/remoting/webapp/me2mom/_locales.official/hi/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921"},"access_code_timer":{"message":"\u092f\u0939 \u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921 $1 \u092e\u0947\u0902 \u0938\u092e\u093e\u092a\u094d\u0924 \u0939\u094b \u091c\u093e\u090f\u0917\u093e","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902"},"close_prompt":{"message":"\u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0915\u094b \u091b\u094b\u095c \u0926\u0947\u0928\u0947 \u092a\u0930 \u0906\u092a\u0915\u093e Chrome Remote Desktop \u0938\u0924\u094d\u0930 \u0938\u092e\u093e\u092a\u094d\u0924 \u0939\u094b \u091c\u093e\u090f\u0917\u093e."},"connect_button":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902"},"continue_button":{"message":"\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902"},"continue_prompt":{"message":"You are currently sharing this machine with another user. Do you want to continue sharing?"},"description_authorize":{"message":"To use Chrome Remote Desktop you must grant extended access permissions to your computer. You only have to do this once."},"description_connect":{"message":"Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code."},"description_home":{"message":"Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0921\u093f\u0938\u094d\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnect (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0921\u093f\u0938\u094d\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnect"},"disconnect_other_button":{"message":"Disconnect"},"error_authentication_failed":{"message":"\u092a\u094d\u0930\u092e\u093e\u0923\u0940\u0915\u0930\u0923 \u0935\u093f\u092b\u0932. \u0915\u0943\u092a\u092f\u093e Chrome Remote Desktop \u0938\u0947 \u0938\u093e\u0907\u0928 \u0906\u0909\u091f \u0915\u0930\u0947\u0902 \u0914\u0930 \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_bad_plugin_version":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you have installed the latest version and try again."},"error_generic":{"message":"\u0915\u094b\u0908 \u0905\u091c\u094d\u091e\u093e\u0924 \u0924\u094d\u0930\u0941\u091f\u093f \u0906\u0908. \u0915\u0943\u092a\u092f\u093e Chrome Remote Desktop \u0938\u0947 \u0938\u093e\u0907\u0928 \u0906\u0909\u091f \u0915\u0930\u0947\u0902 \u0914\u0930 \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_host_is_offline":{"message":"The remote computer is not responding to connection requests. Please verify that it is online and try again."},"error_incompatible_protocol":{"message":"An incompatible version of Chrome Remote Desktop was detected. Please make sure that you have the latest version of Google Chrome and Chrome Remote Desktop on both computers and try again."},"error_invalid_access_code":{"message":"\u092f\u0939 \u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921 \u0905\u092e\u093e\u0928\u094d\u092f \u0939\u0948. \u0915\u0943\u092a\u092f\u093e \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_missing_plugin":{"message":"Some components required for Chrome Remote Desktop are missing. Please make sure you're running the latest version of Google Chrome and try again."},"error_no_response":{"message":"The server failed to respond to the network request."},"error_service_unavailable":{"message":"\u0938\u0947\u0935\u093e \u0905\u0938\u094d\u0925\u093e\u0908 \u0930\u0942\u092a \u0938\u0947 \u0905\u0928\u0941\u092a\u0932\u092c\u094d\u0927 \u0939\u0948. \u0915\u0943\u092a\u092f\u093e \u092c\u093e\u0926 \u092e\u0947\u0902 \u092a\u0941\u0928: \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902."},"error_unexpected":{"message":"\u090f\u0915 \u0905\u0928\u092a\u0947\u0915\u094d\u0937\u093f\u0924 \u0924\u094d\u0930\u0941\u091f\u093f \u0939\u0941\u0908. \u0915\u0943\u092a\u092f\u093e \u0907\u0938 \u0938\u092e\u0938\u094d\u092f\u093e \u0915\u0940 \u0930\u093f\u092a\u094b\u0930\u094d\u091f \u0921\u0947\u0935\u0932\u092a\u0930 \u0938\u0947 \u0915\u0930\u0947\u0902."},"footer_waiting":{"message":"\u0915\u0928\u0947\u0915\u094d\u0936\u0928 \u0915\u0947 \u0932\u093f\u090f \u092a\u094d\u0930\u0924\u0940\u0915\u094d\u0937\u093e \u0915\u0930 \u0930\u0939\u093e \u0939\u0948\u2026"},"help":{"message":"\u0938\u0939\u093e\u092f\u0924\u093e"},"home_access_button":{"message":"Access Now"},"home_access_description":{"message":"See and control a shared computer."},"home_my_computers_title":{"message":"\u092e\u0947\u0930\u0947 \u0915\u0902\u092a\u094d\u092f\u0942\u091f\u0930"},"home_share_button":{"message":"Share Now"},"home_share_description":{"message":"Share this computer for another user to see and control."},"home_share_description_chrome_os":{"message":"(\u092f\u0939 \u0938\u0941\u0935\u093f\u0927\u093e \u0905\u092d\u0940 Chrome \u092c\u0941\u0915 \u0915\u0947 \u0932\u093f\u090f \u0909\u092a\u0932\u092c\u094d\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948 ... \u092c\u0928\u0947 \u0930\u0939\u0947\u0902)"},"instructions_share_above":{"message":"To begin sharing your desktop, give the access code below to the person who will be assisting you."},"instructions_share_below":{"message":"\u0909\u0928\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u0915\u094b\u0921 \u0926\u0930\u094d\u091c \u0915\u0930\u0928\u0947 \u0915\u0947 \u092c\u093e\u0926 \u0906\u092a\u0915\u093e \u0938\u093e\u091d\u093e \u0915\u0930\u0928\u0947 \u0915\u093e \u0938\u0924\u094d\u0930 \u092a\u094d\u0930\u093e\u0930\u0902\u092d \u0939\u094b \u091c\u093e\u090f\u0917\u093e."},"label_connected":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f\u0947\u0921:"},"message_connecting":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948..."},"message_generating":{"message":"\u092a\u0939\u0941\u0902\u091a \u0915\u094b\u0921 \u091c\u0928\u0930\u0947\u091f \u0915\u0930 \u0930\u0939\u093e \u0939\u0948\u2026"},"message_session_finished":{"message":"\u0906\u092a\u0915\u093e Chrome Remote Desktop \u0938\u0924\u094d\u0930 \u0938\u092e\u093e\u092a\u094d\u0924 \u0939\u094b \u091a\u0941\u0915\u093e \u0939\u0948."},"message_shared":{"message":"\u0906\u092a\u0915\u093e \u0921\u0947\u0938\u094d\u0915\u091f\u0949\u092a \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u092e\u0947\u0902 $1 \u0915\u0947 \u0938\u093e\u0925 \u0938\u093e\u091d\u093e \u0915\u093f\u092f\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0905\u0927\u093f\u0915\u0943\u0924 \u0915\u0930\u0947\u0902"},"mode_connect":{"message":"\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902"},"mode_share":{"message":"\u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902"},"offline":{"message":"\u0911\u092b\u093c\u0932\u093e\u0907\u0928"},"ok":{"message":"\u0920\u0940\u0915"},"product_description":{"message":"Access other computers or allow another user to access your computer securely over the Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u0938\u093e\u0907\u0928 \u0906\u0909\u091f \u0915\u0930\u0947\u0902"},"stop_sharing_button":{"message":"\u0938\u093e\u091d\u093e \u0915\u0930\u0928\u093e \u0930\u094b\u0915\u0947\u0902"},"tooltip_scaling":{"message":"Scale to fit"},"warning_nat_disabled":{"message":"NOTE: Policy settings permit connections only between computers within your network."}} diff --git a/remoting/webapp/me2mom/_locales.official/hr/messages.json b/remoting/webapp/me2mom/_locales.official/hr/messages.json deleted file mode 100644 index 234d5f6..0000000 --- a/remoting/webapp/me2mom/_locales.official/hr/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Pristupni k\u00f4d"},"access_code_timer":{"message":"Ovaj pristupni k\u00f4d iste\u0107i \u0107e za $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Odustani"},"close_prompt":{"message":"Ako napustite ovu stranicu, zavr\u0161it \u0107e va\u0161a sesija u aplikaciji Chrome Remote Desktop."},"connect_button":{"message":"Pove\u017ei se"},"continue_button":{"message":"Nastavi"},"continue_prompt":{"message":"Ovaj stroj trenuta\u010dno dijelite s drugim korisnikom. \u017delite li nastaviti dijeljenje?"},"description_authorize":{"message":"Da biste upotrebljavali Chrome Remote Desktop, morate odobriti dozvole za pro\u0161ireni pristup svojem ra\u010dunalu. To morate u\u010diniti samo jednom."},"description_connect":{"message":"Korisnika \u010dijem ra\u010dunalu \u017eelite pristupiti zamolite da klikne \"Dijeli sada\" i da vam pru\u017ei pristupni k\u00f4d."},"description_home":{"message":"Aplikacija Chrome Remote Desktop omogu\u0107uje vam da svoje ra\u010dunalo sigurno dijelite putem weba. Na ra\u010dunalima oba korisnika mora se izvoditi aplikacija Chrome Remote Desktop koju mo\u017eete prona\u0107i na web-lokaciji $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Prekini vezu (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Prekini vezu (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Prekini vezu (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Prekini vezu"},"disconnect_other_button":{"message":"Prekini vezu"},"error_authentication_failed":{"message":"Autentifikacija nije uspjela. Odjavite se iz aplikacije Chrome Remote Desktop i poku\u0161ajte ponovo."},"error_bad_plugin_version":{"message":"Nedostaju neke komponente potrebne za aplikaciju Chrome Remote Desktop. Provjerite jeste li instalirali najnoviju verziju i poku\u0161ajte ponovno."},"error_generic":{"message":"Do\u0161lo je do nepoznate pogre\u0161ke. Odjavite se iz aplikacije Chrome Remote Desktop i poku\u0161ajte ponovo."},"error_host_is_offline":{"message":"Udaljeno ra\u010dunalo ne odgovara na zahtjev za povezivanje. Provjerite je li na mre\u017ei i poku\u0161ajte ponovo."},"error_incompatible_protocol":{"message":"Otkrivena je nekompatibilna verzija aplikacije Chrome Remote Desktop. Provjerite imate li na oba ra\u010dunala najnoviju verziju preglednika Google Chrome i aplikacije Chrome Remote Desktop, a zatim poku\u0161ajte ponovo."},"error_invalid_access_code":{"message":"Pristupni k\u00f4d neva\u017ee\u0107i je. Poku\u0161ajte ponovo."},"error_missing_plugin":{"message":"Nedostaju neke komponente potrebne za aplikaciju Chrome Remote Desktop. Provjerite imate li pokrenutu najnoviju verziju aplikacije Google Chrome i poku\u0161ajte ponovno."},"error_no_response":{"message":"Poslu\u017eitelj nije uspio odgovoriti na zahtjev mre\u017ee."},"error_service_unavailable":{"message":"Usluga je privremeno nedostupna. Poku\u0161ajte ponovo kasnije."},"error_unexpected":{"message":"Pojavila se neo\u010dekivana pogre\u0161ka. Prijavite taj problem razvojnim programerima."},"footer_waiting":{"message":"\u010dekanje na vezu..."},"help":{"message":"Pomo\u0107"},"home_access_button":{"message":"Pristupi sada"},"home_access_description":{"message":"Gledajte dijeljeno ra\u010dunalo i upravljajte njime"},"home_my_computers_title":{"message":"Moja ra\u010dunala"},"home_share_button":{"message":"Dijeli sada"},"home_share_description":{"message":"Dijelite ovo ra\u010dunalo kako bi ga drugi korisnik mogao vidjeti i upravljati njime."},"home_share_description_chrome_os":{"message":"(ova zna\u010dajka jo\u0161 nije dostupna za Chromebookove... pratite nas i dalje)"},"instructions_share_above":{"message":"Da biste zapo\u010deli dijeliti radnu povr\u0161inu, po\u0161aljite pristupni k\u00f4d iz nastavka osobi koja \u0107e vam pomagati."},"instructions_share_below":{"message":"Nakon \u0161to se unese k\u00f4d, po\u010det \u0107e sesija dijeljenja."},"label_connected":{"message":"Povezan:"},"message_connecting":{"message":"Povezivanje\u2026"},"message_generating":{"message":"Generiranje pristupnog koda..."},"message_session_finished":{"message":"Zavr\u0161ila je va\u0161a sesija u aplikaciji Chrome Remote Desktop."},"message_shared":{"message":"Va\u0161a se radna povr\u0161ina trenuta\u010dno dijeli s korisnikom $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriziraj"},"mode_connect":{"message":"Pove\u017ei se"},"mode_share":{"message":"Dijeli"},"offline":{"message":"Izvanmre\u017eno"},"ok":{"message":"U redu"},"product_description":{"message":"Putem interneta pristupajte drugim ra\u010dunalima ili drugim korisnicima omogu\u0107ite siguran pristup svojem ra\u010dunalu."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Odjava"},"stop_sharing_button":{"message":"Zaustavi dijeljenje"},"tooltip_scaling":{"message":"Prilagodi veli\u010dinu prozoru"},"warning_nat_disabled":{"message":"NAPOMENA: Postavke pravila dopu\u0161taju jedino veze izme\u0111u ra\u010dunala u va\u0161oj mre\u017ei."}} diff --git a/remoting/webapp/me2mom/_locales.official/hu/messages.json b/remoting/webapp/me2mom/_locales.official/hu/messages.json deleted file mode 100644 index 02b6b57..0000000 --- a/remoting/webapp/me2mom/_locales.official/hu/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Hozz\u00e1f\u00e9r\u00e9si k\u00f3d"},"access_code_timer":{"message":"Ez a hozz\u00e1f\u00e9r\u00e9si k\u00f3d ennyi id\u0151 m\u00falva lej\u00e1r: $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"M\u00e9gse"},"close_prompt":{"message":"Ha elhagyja ezt az oldalt, akkor befejez\u0151dik a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s munkamenete."},"connect_button":{"message":"Kapcsol\u00f3d\u00e1s"},"continue_button":{"message":"Tov\u00e1bb"},"continue_prompt":{"message":"Ezt a g\u00e9pet jelenleg megosztja egy m\u00e1sik felhaszn\u00e1l\u00f3val. Szeretn\u00e9 folytatni a megoszt\u00e1st?"},"description_authorize":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s haszn\u00e1lat\u00e1hoz kiterjesztett hozz\u00e1f\u00e9r\u00e9si jogosults\u00e1gokat kell adnia a sz\u00e1m\u00edt\u00f3g\u00e9p\u00e9hez. Ezt csak egyszer kell elv\u00e9gezni."},"description_connect":{"message":"K\u00e9rje meg azt a felhaszn\u00e1l\u00f3t, akinek a sz\u00e1m\u00edt\u00f3g\u00e9p\u00e9t haszn\u00e1lni szeretn\u00e9, hogy kattintson a \"Megoszt\u00e1s most\" feliratra, \u00e9s adja meg \u00d6nnek a hozz\u00e1f\u00e9r\u00e9si k\u00f3dot."},"description_home":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s lehet\u0151v\u00e9 teszi a sz\u00e1m\u00edt\u00f3g\u00e9p biztons\u00e1gos megoszt\u00e1s\u00e1t az interneten kereszt\u00fcl. Mindk\u00e9t felhaszn\u00e1l\u00f3n\u00e1l futnia kell a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1snak, amely itt tal\u00e1lhat\u00f3: $1","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Kapcsolat bont\u00e1sa (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Kapcsolat bont\u00e1sa (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Kapcsolat bont\u00e1sa (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Kapcsolat bont\u00e1sa"},"disconnect_other_button":{"message":"Kapcsolat bont\u00e1sa"},"error_authentication_failed":{"message":"A hiteles\u00edt\u00e9s nem siker\u00fclt. K\u00e9rj\u00fck, jelentkezzen ki a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1sb\u00f3l, \u00e9s pr\u00f3b\u00e1lkozzon \u00fajra."},"error_bad_plugin_version":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s egyes sz\u00fcks\u00e9ges \u00f6sszetev\u0151i hi\u00e1nyoznak. K\u00e9rj\u00fck, ellen\u0151rizze, hogy telep\u00edtve van-e a legfrissebb verzi\u00f3, majd pr\u00f3b\u00e1lja \u00fajra."},"error_generic":{"message":"Ismeretlen hiba t\u00f6rt\u00e9nt. K\u00e9rj\u00fck, jelentkezzen ki a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s alkalmaz\u00e1sb\u00f3l, \u00e9s pr\u00f3b\u00e1lkozzon \u00fajra."},"error_host_is_offline":{"message":"A t\u00e1voli sz\u00e1m\u00edt\u00f3g\u00e9p nem v\u00e1laszol a csatlakoz\u00e1si k\u00e9r\u00e9sekre. K\u00e9rj\u00fck, ellen\u0151rizze, hogy kapcsolatban van-e, majd pr\u00f3b\u00e1lja \u00fajra."},"error_incompatible_protocol":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s egy nem kompatibilis verzi\u00f3ja tal\u00e1lhat\u00f3 a sz\u00e1m\u00edt\u00f3g\u00e9pen. K\u00e9rj\u00fck, ellen\u0151rizze, hogy mindk\u00e9t sz\u00e1m\u00edt\u00f3g\u00e9pen a Google Chrome \u00e9s a Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s legfrissebb verzi\u00f3i legyenek, majd pr\u00f3b\u00e1lja \u00fajra."},"error_invalid_access_code":{"message":"A hozz\u00e1f\u00e9r\u00e9si k\u00f3d \u00e9rv\u00e9nytelen. K\u00e9rj\u00fck, pr\u00f3b\u00e1lja \u00fajra."},"error_missing_plugin":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s egyes sz\u00fcks\u00e9ges \u00f6sszetev\u0151i hi\u00e1nyoznak. K\u00e9rj\u00fck, ellen\u0151rizze, hogy a Google Chrome legfrissebb verzi\u00f3j\u00e1t haszn\u00e1lja-e, majd pr\u00f3b\u00e1lja \u00fajra."},"error_no_response":{"message":"A szerver nem v\u00e1laszolt a h\u00e1l\u00f3zati k\u00e9r\u00e9sre."},"error_service_unavailable":{"message":"A szolg\u00e1ltat\u00e1s \u00e1tmenetileg nem \u00e9rhet\u0151 el. K\u00e9rj\u00fck, pr\u00f3b\u00e1lkozzon \u00fajra k\u00e9s\u0151bb."},"error_unexpected":{"message":"V\u00e1ratlan hiba t\u00f6rt\u00e9nt. K\u00e9rj\u00fck, jelentse a probl\u00e9m\u00e1t a fejleszt\u0151knek."},"footer_waiting":{"message":"v\u00e1rakoz\u00e1s a kapcsolatra..."},"help":{"message":"S\u00fag\u00f3"},"home_access_button":{"message":"Hozz\u00e1f\u00e9r\u00e9s most"},"home_access_description":{"message":"Megosztott sz\u00e1m\u00edt\u00f3g\u00e9p megtekint\u00e9se \u00e9s ir\u00e1ny\u00edt\u00e1sa."},"home_my_computers_title":{"message":"Saj\u00e1t sz\u00e1m\u00edt\u00f3g\u00e9pek"},"home_share_button":{"message":"Megoszt\u00e1s most"},"home_share_description":{"message":"E sz\u00e1m\u00edt\u00f3g\u00e9p megoszt\u00e1sa \u00fagy, hogy azt egy m\u00e1sik felhaszn\u00e1l\u00f3 l\u00e1thassa \u00e9s ir\u00e1ny\u00edthassa."},"home_share_description_chrome_os":{"message":"(Ez a funkci\u00f3 m\u00e9g nem \u00e9rhet\u0151 el Chromebookok sz\u00e1m\u00e1ra... l\u00e1togasson vissza k\u00e9s\u0151bb)"},"instructions_share_above":{"message":"Az asztal megoszt\u00e1s\u00e1nak megkezd\u00e9s\u00e9hez adja meg az al\u00e1bbi el\u00e9r\u00e9si k\u00f3dot annak a szem\u00e9lynek, aki seg\u00edt \u00d6nnek."},"instructions_share_below":{"message":"Miut\u00e1n be\u00edrj\u00e1k a k\u00f3dot, megkezd\u0151dik a megoszt\u00e1si munkamenet."},"label_connected":{"message":"Csatlakoztatva:"},"message_connecting":{"message":"Csatlakoz\u00e1s\u2026"},"message_generating":{"message":"Hozz\u00e1f\u00e9r\u00e9si k\u00f3d l\u00e9trehoz\u00e1sa..."},"message_session_finished":{"message":"A Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s munkamenet v\u00e9get \u00e9rt."},"message_shared":{"message":"Az asztalt jelenleg ezzel a felhaszn\u00e1l\u00f3val osztja meg: $1","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Enged\u00e9lyez\u00e9s"},"mode_connect":{"message":"Kapcsol\u00f3d\u00e1s"},"mode_share":{"message":"Megoszt\u00e1s"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"M\u00e1s sz\u00e1m\u00edt\u00f3g\u00e9pek el\u00e9r\u00e9se vagy annak enged\u00e9lyez\u00e9se, hogy egy m\u00e1sik felhaszn\u00e1l\u00f3 a sz\u00e1m\u00edt\u00f3g\u00e9phez biztons\u00e1gosan hozz\u00e1f\u00e9rhessen az interneten kereszt\u00fcl."},"product_name":{"message":"Chrome t\u00e1voliasztal-szolg\u00e1ltat\u00e1s"},"sign_out_button":{"message":"Kijelentkez\u00e9s"},"stop_sharing_button":{"message":"Megoszt\u00e1s le\u00e1ll\u00edt\u00e1sa"},"tooltip_scaling":{"message":"M\u00e9retre igaz\u00edt\u00e1s"},"warning_nat_disabled":{"message":"MEGJEGYZ\u00c9S: a rendszab\u00e1ly-be\u00e1ll\u00edt\u00e1sok a csatlakoz\u00e1st csak a saj\u00e1t h\u00e1l\u00f3zaton bel\u00fcl tal\u00e1lhat\u00f3 sz\u00e1m\u00edt\u00f3g\u00e9pek k\u00f6z\u00f6tt teszik lehet\u0151v\u00e9."}} diff --git a/remoting/webapp/me2mom/_locales.official/id/messages.json b/remoting/webapp/me2mom/_locales.official/id/messages.json deleted file mode 100644 index 6666200..0000000 --- a/remoting/webapp/me2mom/_locales.official/id/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Kode akses"},"access_code_timer":{"message":"Kode akses ini akan kedaluwarsa dalam waktu $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Batal"},"close_prompt":{"message":"Dengan meninggalkan laman ini, Anda akan mengakhiri sesi Chrome Desktop Jarak Jauh."},"connect_button":{"message":"Sambungkan"},"continue_button":{"message":"Lanjutkan"},"continue_prompt":{"message":"Saat ini Anda sedang berbagi mesin ini dengan pengguna lain. Apakah Anda ingin terus berbagi?"},"description_authorize":{"message":"Untuk menggunakan Chrome Desktop Jarak Jauh Anda harus memberikan izin akses yang diperpanjang ke komputer. Anda hanya perlu melakukan ini satu kali."},"description_connect":{"message":"Mintalah kepada pengguna yang ingin Anda akses komputernya agar mengeklik 'Bagikan Sekarang' dan memberikan kode aksesnya kepada Anda."},"description_home":{"message":"Chrome Desktop Jarak Jauh memungkinkan Anda berbagi komputer melalui web dengan aman. Kedua pengguna harus menjalankan apl Chrome Desktop Jarak Jauh yang dapat ditemukan di $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Putuskan sambungan (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Putuskan sambungan (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Putuskan sambungan (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Putuskan sambungan"},"disconnect_other_button":{"message":"Putuskan sambungan"},"error_authentication_failed":{"message":"Autentikasi gagal. Keluarlah dari Chrome Desktop Jarak Jauh lalu coba lagi."},"error_bad_plugin_version":{"message":"Beberapa komponen yang diperlukan untuk Chrome Desktop Jarak Jauh hilang. Pastikan bahwa Anda telah memasang versi teranyar dan coba lagi."},"error_generic":{"message":"Terjadi galat tak dikenal. Keluarlah dari Chrome Desktop Jarak Jauh lalu coba lagi."},"error_host_is_offline":{"message":"Komputer jarak jauh tidak menanggapi permintaan sambungan. Verifikasikan bahwa komputer jarak jauh sedang daring dan coba lagi."},"error_incompatible_protocol":{"message":"Versi Chrome Desktop Jarak Jauh yang tidak kompatibel terdeteksi. Pastikan bahwa Anda memiliki Google Chrome dan Chrome Desktop Jarak Jauh versi teranyar di kedua komputer lalu coba lagi."},"error_invalid_access_code":{"message":"Kode akses tidak valid. Harap coba lagi."},"error_missing_plugin":{"message":"Beberapa komponen yang diperlukan untuk Chrome Desktop Jarak Jauh hilang. Pastikan bahwa Anda menjalankan Google Chrome versi teranyar dan coba lagi."},"error_no_response":{"message":"Server gagal menanggapi permintaan jaringan."},"error_service_unavailable":{"message":"Layanan kami tidak tersedia untuk sementara. Coba lagi nanti."},"error_unexpected":{"message":"Terjadi galat yang tidak terduga. Laporkan masalah ini kepada pengembang."},"footer_waiting":{"message":"menunggu sambungan..."},"help":{"message":"Bantuan"},"home_access_button":{"message":"Akses Sekarang"},"home_access_description":{"message":"Melihat dan mengontrol komputer bersama."},"home_my_computers_title":{"message":"Komputer Saya"},"home_share_button":{"message":"Bagikan Sekarang"},"home_share_description":{"message":"Membagi komputer ini agar pengguna lain dapat melihat dan mengontrol."},"home_share_description_chrome_os":{"message":"(fitur ini belum tersedia untuk Chromebooks... nantikan kabar berikutnya)"},"instructions_share_above":{"message":"Untuk mulai berbagi desktop, berikan kode akses di bawah kepada orang yang akan membantu Anda."},"instructions_share_below":{"message":"Setelah mereka memasukkan kode, sesi berbagi Anda akan dimulai."},"label_connected":{"message":"Tersambung:"},"message_connecting":{"message":"Menyambungkan..."},"message_generating":{"message":"Membuat kode akses..."},"message_session_finished":{"message":"Sesi Chrome Desktop Jarak Jauh Anda telah berakhir."},"message_shared":{"message":"Saat ini desktop Anda sedang dibagikan dengan $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Beri Otorisasi"},"mode_connect":{"message":"Sambungkan"},"mode_share":{"message":"Bagikan"},"offline":{"message":"Luring"},"ok":{"message":"OK"},"product_description":{"message":"Mengakses komputer lain atau mengizinkan pengguna lain mengakses komputer Anda dengan aman melalui internet."},"product_name":{"message":"Chrome Desktop Jarak Jauh"},"sign_out_button":{"message":"Keluar"},"stop_sharing_button":{"message":"Hentikan Berbagi"},"tooltip_scaling":{"message":"Sesuaikan dengan layar"},"warning_nat_disabled":{"message":"CATATAN: Setelan kebijakan hanya mengizinkan sambungan antar-komputer dalam jaringan Anda."}} diff --git a/remoting/webapp/me2mom/_locales.official/it/messages.json b/remoting/webapp/me2mom/_locales.official/it/messages.json deleted file mode 100644 index 282a78c..0000000 --- a/remoting/webapp/me2mom/_locales.official/it/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Codice di accesso"},"access_code_timer":{"message":"Questo codice di accesso scadr\u00e0 tra $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annulla"},"close_prompt":{"message":"Se esci da questa pagina terminer\u00e0 la sessione Chrome Remote Desktop."},"connect_button":{"message":"Connetti"},"continue_button":{"message":"Continua"},"continue_prompt":{"message":"Stai condividendo questo computer con un altro utente. Confermi che desideri continuare la condivisione?"},"description_authorize":{"message":"Per poter utilizzare Chrome Remote Desktop devi concedere autorizzazioni di accesso esteso per il tuo computer. \u00c8 necessario svolgere questa operazione soltanto una volta."},"description_connect":{"message":"Chiedi all'utente del computer a cui desideri accedere di fare clic su \"Condividi ora\" e di fornirti il codice di accesso."},"description_home":{"message":"Chrome Remote Desktop ti consente di condividere in modo sicuro il computer sul Web. Entrambi gli utenti devono eseguire l'applicazione Chrome Remote Desktop, reperibile all'indirizzo $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Disconnetti (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Disconnetti (Opz+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Disconnetti (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Disconnetti"},"disconnect_other_button":{"message":"Disconnetti"},"error_authentication_failed":{"message":"Autenticazione non riuscita. Esci da Chrome Remote Desktop e riprova."},"error_bad_plugin_version":{"message":"Mancano alcuni componenti necessari per Chrome Remote Desktop. Assicurati che sia installata la versione pi\u00f9 recente e riprova."},"error_generic":{"message":"Si \u00e8 verificato un errore sconosciuto. Esci da Chrome Remote Desktop e riprova."},"error_host_is_offline":{"message":"Il computer remoto non sta rispondendo alle richieste di connessione. Verifica che sia online e riprova."},"error_incompatible_protocol":{"message":"\u00c8 stata rilevata una versione incompatibile di Chrome Remote Desktop. Assicurati di disporre della versione pi\u00f9 recente di Google Chrome e di Chrome Remote Desktop su entrambi i computer e riprova."},"error_invalid_access_code":{"message":"Il codice di accesso non \u00e8 valido. Riprova."},"error_missing_plugin":{"message":"Mancano alcuni componenti necessari per Chrome Remote Desktop. Assicurati che sia in uso la versione pi\u00f9 recente di Google Chrome e riprova."},"error_no_response":{"message":"Risposta del server alla richiesta di rete non riuscita."},"error_service_unavailable":{"message":"Il servizio non \u00e8 al momento disponibile. Riprova pi\u00f9 tardi."},"error_unexpected":{"message":"Si \u00e8 verificato un errore imprevisto. Segnala il problema agli sviluppatori."},"footer_waiting":{"message":"in attesa di connessione..."},"help":{"message":"Guida"},"home_access_button":{"message":"Accedi ora"},"home_access_description":{"message":"Visualizza e controlla un computer condiviso."},"home_my_computers_title":{"message":"I miei computer"},"home_share_button":{"message":"Condividi ora"},"home_share_description":{"message":"Condividi questo computer per consentire la visione e il controllo a un altro utente."},"home_share_description_chrome_os":{"message":"(questa funzione non \u00e8 ancora disponibile per i Chromebook... Resta in attesa di ulteriori aggiornamenti)"},"instructions_share_above":{"message":"Per iniziare a condividere il desktop, fornisci il seguente codice di accesso alla persona che ti aiuter\u00e0."},"instructions_share_below":{"message":"Una volta inserito il codice, la sessione di condivisione avr\u00e0 inizio."},"label_connected":{"message":"Connesso:"},"message_connecting":{"message":"Connessione in corso..."},"message_generating":{"message":"Generazione codice di accesso in corso..."},"message_session_finished":{"message":"La sessione Chrome Remote Desktop \u00e8 terminata."},"message_shared":{"message":"Il desktop \u00e8 attualmente condiviso con $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizza"},"mode_connect":{"message":"Connetti"},"mode_share":{"message":"Condividi"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Accedi ad altri computer o consenti a un altro utente di accedere al tuo computer in modo sicuro su Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Esci"},"stop_sharing_button":{"message":"Interrompi condivisione"},"tooltip_scaling":{"message":"Adatta alla pagina"},"warning_nat_disabled":{"message":"NOTA. Le impostazioni dei criteri consentono connessioni solo tra computer all'interno della tua rete."}} diff --git a/remoting/webapp/me2mom/_locales.official/ja/messages.json b/remoting/webapp/me2mom/_locales.official/ja/messages.json deleted file mode 100644 index 61b044c..0000000 --- a/remoting/webapp/me2mom/_locales.official/ja/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9"},"access_code_timer":{"message":"\u3053\u306e\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u306f\u3042\u3068 $1 \u3067\u671f\u9650\u5207\u308c\u3068\u306a\u308a\u307e\u3059\u3002","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u30ad\u30e3\u30f3\u30bb\u30eb"},"close_prompt":{"message":"\u3053\u306e\u30da\u30fc\u30b8\u3092\u9589\u3058\u308b\u3068\u3001Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 \u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u7d42\u4e86\u3057\u307e\u3059\u3002"},"connect_button":{"message":"\u63a5\u7d9a"},"continue_button":{"message":"\u7d9a\u884c"},"continue_prompt":{"message":"\u73fe\u5728\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u3092\u5225\u306e\u30e6\u30fc\u30b6\u30fc\u3068\u5171\u6709\u3057\u3066\u3044\u307e\u3059\u3002\u5171\u6709\u3092\u7d99\u7d9a\u3057\u307e\u3059\u304b\uff1f"},"description_authorize":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u62e1\u5f35\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u3092\u4ed8\u4e0e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u4f5c\u696d\u306f 1 \u56de\u3060\u3051\u5fc5\u8981\u3067\u3059\u3002"},"description_connect":{"message":"\u30a2\u30af\u30bb\u30b9\u3057\u305f\u3044\u30d1\u30bd\u30b3\u30f3\u306e\u30e6\u30fc\u30b6\u30fc\u306b [\u4eca\u3059\u3050\u5171\u6709] \u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3088\u3046\u4f1d\u3048\u3066\u3001\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u3092\u53d7\u3051\u53d6\u3063\u3066\u304f\u3060\u3055\u3044\u3002"},"description_home":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30d1\u30bd\u30b3\u30f3\u3092\u30a6\u30a7\u30d6\u7d4c\u7531\u3067\u5b89\u5168\u306b\u5171\u6709\u3067\u304d\u307e\u3059\u3002\u4e21\u65b9\u306e\u30e6\u30fc\u30b6\u30fc\u304c Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f $1 \u304b\u3089\u5165\u624b\u3067\u304d\u307e\u3059\u3002","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u5207\u65ad\uff08Ctrl+Alt+Esc\uff09"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u5207\u65ad\uff08Opt+Ctrl+Esc\uff09"},"disconnect_button_plus_shortcut_windows":{"message":"\u5207\u65ad\uff08Ctrl+Alt+Esc\uff09"},"disconnect_myself_button":{"message":"\u5207\u65ad\u3059\u308b"},"disconnect_other_button":{"message":"\u5207\u65ad\u3059\u308b"},"error_authentication_failed":{"message":"\u8a8d\u8a3c\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304b\u3089\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_bad_plugin_version":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306b\u5fc5\u8981\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\u6700\u65b0\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_generic":{"message":"\u4e0d\u660e\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304b\u3089\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002"},"error_host_is_offline":{"message":"\u30ea\u30e2\u30fc\u30c8\u306e\u30d1\u30bd\u30b3\u30f3\u304c\u63a5\u7d9a\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002\u305d\u306e\u30d1\u30bd\u30b3\u30f3\u304c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u63a5\u7d9a\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_incompatible_protocol":{"message":"\u4e92\u63db\u6027\u306e\u306a\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Google Chrome \u3068 Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u304c\u4e21\u65b9\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u3001\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_invalid_access_code":{"message":"\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u304c\u7121\u52b9\u3067\u3059\u3002\u3082\u3046\u4e00\u5ea6\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_missing_plugin":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306b\u5fc5\u8981\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\u5b9f\u884c\u3057\u3066\u3044\u308b Google Chrome \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u6700\u65b0\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"error_no_response":{"message":"\u30b5\u30fc\u30d0\u30fc\u304c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u3002"},"error_service_unavailable":{"message":"\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u4e00\u6642\u7684\u306b\u5229\u7528\u3067\u304d\u306a\u304f\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002"},"error_unexpected":{"message":"\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u554f\u984c\u3092\u30c7\u30d9\u30ed\u30c3\u30d1\u30fc\u306b\u5831\u544a\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"footer_waiting":{"message":"\u63a5\u7d9a\u3092\u5f85\u6a5f\u3057\u3066\u3044\u307e\u3059..."},"help":{"message":"\u30d8\u30eb\u30d7"},"home_access_button":{"message":"\u4eca\u3059\u3050\u30a2\u30af\u30bb\u30b9"},"home_access_description":{"message":"\u5171\u6709\u30d1\u30bd\u30b3\u30f3\u306e\u753b\u9762\u3092\u898b\u306a\u304c\u3089\u64cd\u4f5c\u3057\u307e\u3059\u3002"},"home_my_computers_title":{"message":"\u30de\u30a4 \u30d1\u30bd\u30b3\u30f3"},"home_share_button":{"message":"\u4eca\u3059\u3050\u5171\u6709"},"home_share_description":{"message":"\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u304c\u5171\u6709\u3055\u308c\u3001\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u306e\u753b\u9762\u3092\u898b\u306a\u304c\u3089\u64cd\u4f5c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002"},"home_share_description_chrome_os":{"message":"\uff08\u3053\u306e\u6a5f\u80fd\u306f\u73fe\u5728 Chromebook \u306b\u5bfe\u5fdc\u3057\u3066\u304a\u308a\u307e\u305b\u3093\u3002\u3054\u5229\u7528\u53ef\u80fd\u306b\u306a\u308b\u307e\u3067\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002\uff09"},"instructions_share_above":{"message":"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306e\u5171\u6709\u3092\u958b\u59cb\u3059\u308b\u306b\u306f\u3001\u5171\u6709\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306b\u4ee5\u4e0b\u306e\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u3092\u901a\u77e5\u3057\u3066\u304f\u3060\u3055\u3044\u3002"},"instructions_share_below":{"message":"\u5171\u6709\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u304c\u3053\u306e\u30b3\u30fc\u30c9\u3092\u5165\u529b\u3059\u308b\u3068\u3001\u5171\u6709\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u958b\u59cb\u3055\u308c\u307e\u3059\u3002"},"label_connected":{"message":"\u63a5\u7d9a\u6e08\u307f:"},"message_connecting":{"message":"\u63a5\u7d9a\u3057\u3066\u3044\u307e\u3059..."},"message_generating":{"message":"\u30a2\u30af\u30bb\u30b9 \u30b3\u30fc\u30c9\u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059..."},"message_session_finished":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7 \u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002"},"message_shared":{"message":"\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306f\u73fe\u5728 $1 \u3068\u5171\u6709\u3055\u308c\u3066\u3044\u307e\u3059\u3002","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u627f\u8a8d"},"mode_connect":{"message":"\u63a5\u7d9a"},"mode_share":{"message":"\u5171\u6709"},"offline":{"message":"\u30aa\u30d5\u30e9\u30a4\u30f3"},"ok":{"message":"OK"},"product_description":{"message":"\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u304b\u3089\u4ed6\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u3001\u307e\u305f\u306f\u4ed6\u306e\u30d1\u30bd\u30b3\u30f3\u304b\u3089\u3053\u306e\u30d1\u30bd\u30b3\u30f3\u306b\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3092\u7d4c\u7531\u3057\u3066\u5b89\u5168\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002"},"product_name":{"message":"Chrome \u30ea\u30e2\u30fc\u30c8 \u30c7\u30b9\u30af\u30c8\u30c3\u30d7"},"sign_out_button":{"message":"\u30ed\u30b0\u30a2\u30a6\u30c8"},"stop_sharing_button":{"message":"\u5171\u6709\u3092\u505c\u6b62"},"tooltip_scaling":{"message":"\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u5408\u308f\u305b\u308b"},"warning_nat_disabled":{"message":"\u6ce8: \u30dd\u30ea\u30b7\u30fc\u8a2d\u5b9a\u306b\u57fa\u3065\u304d\u3001\u63a5\u7d9a\u304c\u8a31\u53ef\u3055\u308c\u308b\u306e\u306f\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e\u30d1\u30bd\u30b3\u30f3\u9593\u306e\u307f\u3068\u306a\u308a\u307e\u3059\u3002"}} diff --git a/remoting/webapp/me2mom/_locales.official/ko/messages.json b/remoting/webapp/me2mom/_locales.official/ko/messages.json deleted file mode 100644 index 3e6c4156..0000000 --- a/remoting/webapp/me2mom/_locales.official/ko/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc"},"access_code_timer":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc\uac00 $1\ucd08 \ud6c4\uc5d0 \ub9cc\ub8cc\ub429\ub2c8\ub2e4.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\ucde8\uc18c"},"close_prompt":{"message":"\uc774 \ud398\uc774\uc9c0\ub97c \ub2eb\uc73c\uba74 Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1 \uc138\uc158\uc774 \uc885\ub8cc\ub429\ub2c8\ub2e4."},"connect_button":{"message":"\uc5f0\uacb0"},"continue_button":{"message":"\uacc4\uc18d"},"continue_prompt":{"message":"\ud604\uc7ac \uc774 \ucef4\ud4e8\ud130\ub97c \ub2e4\ub978 \uc0ac\uc6a9\uc790\uc640 \uacf5\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uacc4\uc18d \uacf5\uc720\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?"},"description_authorize":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \ub0b4 \ucef4\ud4e8\ud130\uc5d0 \ud655\uc7a5 \uc561\uc138\uc2a4 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 \ud55c \ubc88\ub9cc \uc218\ud589\ud558\uba74 \ub429\ub2c8\ub2e4."},"description_connect":{"message":"\ub0b4\uac00 \uc561\uc138\uc2a4\ud558\uace0 \uc2f6\uc740 \ucef4\ud4e8\ud130\uc758 \uc0ac\uc6a9\uc790\uc5d0\uac8c '\uc9c0\uae08 \uacf5\uc720'\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c \uc561\uc138\uc2a4 \ucf54\ub4dc\ub97c \uc54c\ub824\ub2ec\ub77c\uace0 \uc694\uccad\ud558\uc138\uc694."},"description_home":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc744 \uc0ac\uc6a9\ud558\uba74 \uc6f9\uc744 \ud1b5\ud574 \ub0b4 \ucef4\ud4e8\ud130\ub97c \uc548\uc804\ud558\uac8c \uacf5\uc720\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \ubaa8\ub450 $1 \ud398\uc774\uc9c0\uc5d0 \uc788\ub294 Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1 \uc571\uc744 \uc2e4\ud589\ud574\uc57c \ud569\ub2c8\ub2e4.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\uc5f0\uacb0 \ud574\uc81c(Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\uc5f0\uacb0 \ud574\uc81c(Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\uc5f0\uacb0 \ud574\uc81c(Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\uc5f0\uacb0 \ud574\uc81c"},"disconnect_other_button":{"message":"\uc5f0\uacb0 \ud574\uc81c"},"error_authentication_failed":{"message":"\uc778\uc99d\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0\uc11c \ub85c\uadf8\uc544\uc6c3\ud55c \ub2e4\uc74c \ub2e4\uc2dc \ub85c\uadf8\uc778\ud558\uc138\uc694."},"error_bad_plugin_version":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0 \ud544\uc694\ud55c \uc77c\ubd80 \uad6c\uc131 \uc694\uc18c\uac00 \ub204\ub77d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud588\ub294\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_generic":{"message":"\uc54c \uc218 \uc5c6\ub294 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0\uc11c \ub85c\uadf8\uc544\uc6c3\ud55c \ub4a4 \ub2e4\uc2dc \ub85c\uadf8\uc778\ud558\uc138\uc694."},"error_host_is_offline":{"message":"\uc6d0\uaca9 \ucef4\ud4e8\ud130\uac00 \uc5f0\uacb0 \uc694\uccad\uc5d0 \uc751\ub2f5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc628\ub77c\uc778 \uc0c1\ud0dc\uc778\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_incompatible_protocol":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc758 \ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc774 \uac10\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc591\ucabd \ucef4\ud4e8\ud130\uc758 Chrome\uacfc Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc774 \ubaa8\ub450 \ucd5c\uc2e0 \ubc84\uc804\uc778\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_invalid_access_code":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_missing_plugin":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1\uc5d0 \ud544\uc694\ud55c \uc77c\ubd80 \uad6c\uc131 \uc694\uc18c\uac00 \ub204\ub77d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. Chrome \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc2e4\ud589\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c \ub4a4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_no_response":{"message":"\uc11c\ubc84\uac00 \ub124\ud2b8\uc6cc\ud06c \uc694\uccad\uc5d0 \uc751\ub2f5\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4."},"error_service_unavailable":{"message":"\uc11c\ube44\uc2a4\ub97c \uc77c\uc2dc\uc801\uc73c\ub85c \uc774\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694."},"error_unexpected":{"message":"\uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\uc790\uc5d0\uac8c \ubb38\uc81c\ub97c \uc2e0\uace0\ud574 \uc8fc\uc138\uc694."},"footer_waiting":{"message":"\uc5f0\uacb0 \ub300\uae30 \uc911..."},"help":{"message":"\ub3c4\uc6c0\ub9d0"},"home_access_button":{"message":"\uc9c0\uae08 \uc561\uc138\uc2a4"},"home_access_description":{"message":"\uacf5\uc720\ud55c \ucef4\ud4e8\ud130\ub97c \ubcf4\uace0 \ucee8\ud2b8\ub864\ud569\ub2c8\ub2e4."},"home_my_computers_title":{"message":"\ub0b4 \ucef4\ud4e8\ud130"},"home_share_button":{"message":"\uc9c0\uae08 \uacf5\uc720"},"home_share_description":{"message":"\ub2e4\ub978 \uc0ac\uc6a9\uc790\uac00 \ubcf4\uace0 \ucee8\ud2b8\ub864\ud560 \uc218 \uc788\ub3c4\ub85d \uc774 \ucef4\ud4e8\ud130\ub97c \uacf5\uc720\ud569\ub2c8\ub2e4."},"home_share_description_chrome_os":{"message":"(\uc544\uc9c1 \ud06c\ub86c\ubd81\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub294 \uae30\ub2a5\uc785\ub2c8\ub2e4. \uc870\uae08\ub9cc \uae30\ub2e4\ub824 \uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.)"},"instructions_share_above":{"message":"\ub370\uc2a4\ud06c\ud1b1 \uacf5\uc720\ub97c \uc2dc\uc791\ud558\ub824\uba74 \ub0b4 \ub370\uc2a4\ud06c\ud1b1\uc5d0 \uc561\uc138\uc2a4\ud558\ub824\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc544\ub798 \uc561\uc138\uc2a4 \ucf54\ub4dc\ub97c \uc54c\ub824\uc8fc\uc138\uc694."},"instructions_share_below":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\uba74 \uacf5\uc720 \uc138\uc158\uc774 \uc2dc\uc791\ub429\ub2c8\ub2e4."},"label_connected":{"message":"\uc5f0\uacb0\ub428:"},"message_connecting":{"message":"\uc5f0\uacb0 \uc911..."},"message_generating":{"message":"\uc561\uc138\uc2a4 \ucf54\ub4dc \uc0dd\uc131 \uc911..."},"message_session_finished":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1 \uc138\uc158\uc774 \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4."},"message_shared":{"message":"\ub0b4 \ucef4\ud4e8\ud130\ub97c $1\ub2d8\uacfc \uacf5\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\uc778\uc99d"},"mode_connect":{"message":"\uc5f0\uacb0"},"mode_share":{"message":"\uacf5\uc720"},"offline":{"message":"\uc624\ud504\ub77c\uc778"},"ok":{"message":"\ud655\uc778"},"product_description":{"message":"\ub2e4\ub978 \ucef4\ud4e8\ud130\uc5d0 \uc561\uc138\uc2a4\ud558\uac70\ub098 \ub2e4\ub978 \uc0ac\uc6a9\uc790\uac00 \uc778\ud130\ub137\uc744 \ud1b5\ud574 \uc548\uc804\ud558\uac8c \ub0b4 \ucef4\ud4e8\ud130\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."},"product_name":{"message":"Chrome \uc6d0\uaca9 \ub370\uc2a4\ud06c\ud1b1"},"sign_out_button":{"message":"\ub85c\uadf8\uc544\uc6c3"},"stop_sharing_button":{"message":"\uacf5\uc720 \uc911\uc9c0"},"tooltip_scaling":{"message":"\ud654\uba74 \ud06c\uae30\uc5d0 \ub9de\uac8c \uc870\uc815"},"warning_nat_disabled":{"message":"\ucc38\uace0: \uc815\ucc45 \uc124\uc815\uc5d0 \ub530\ub77c \ub124\ud2b8\uc6cc\ud06c \ub0b4\uc5d0 \uc788\ub294 \ucef4\ud4e8\ud130 \uac04\uc758 \uc5f0\uacb0\ub9cc \ud5c8\uc6a9\ub429\ub2c8\ub2e4."}} diff --git a/remoting/webapp/me2mom/_locales.official/lt/messages.json b/remoting/webapp/me2mom/_locales.official/lt/messages.json deleted file mode 100644 index 8ac5bbb..0000000 --- a/remoting/webapp/me2mom/_locales.official/lt/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Prieigos kodas"},"access_code_timer":{"message":"\u0160io prieigos kodo galiojimo laikas baigsis po $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"At\u0161aukti"},"close_prompt":{"message":"I\u0161\u0117jus i\u0161 \u0161io puslapio, baigsis nuotolinio \u201eChrome\u201c darbalaukio sesija."},"connect_button":{"message":"Prisijungti"},"continue_button":{"message":"T\u0119sti"},"continue_prompt":{"message":"\u0160iuo metu \u0161\u012f \u012frengin\u012f bendrinate su kitu naudotoju. Ar norite toliau bendrinti?"},"description_authorize":{"message":"Jei norite naudoti nuotolin\u012f \u201eChrome\u201c darbalauk\u012f, turite suteikti kompiuterio i\u0161pl\u0117stin\u0117s prieigos leidimus. Tai reik\u0117s atlikti tik vien\u0105 kart\u0105."},"description_connect":{"message":"Papra\u0161ykite, kad naudotojas, kurio kompiuter\u012f norite pasiekti, spustel\u0117t\u0173 \u201eBendrinti dabar\u201c ir suteikt\u0173 jums prieigos kod\u0105."},"description_home":{"message":"Naudodami nuotolin\u012f \u201eChrome\u201c darbalauk\u012f galite saugiai bendrinti kompiuter\u012f \u017einiatinkliu. Abu naudotojai turi paleisti nuotolinio \u201eChrome\u201c darbalaukio program\u0105, kuri\u0105 galima rasti adresu $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Atsijungti (\u201eCtrl\u201c + \u201eAlt\u201c + \u201eEsc\u201c)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Atsijungti (\u201eOpt\u201c + \u201eCtrl\u201c + \u201eEsc\u201c)"},"disconnect_button_plus_shortcut_windows":{"message":"Atsijungti (\u201eCtrl\u201c + \u201eAlt\u201c + \u201eEsc\u201c)"},"disconnect_myself_button":{"message":"Atsijungti"},"disconnect_other_button":{"message":"Atsijungti"},"error_authentication_failed":{"message":"Nepavyko nustatyti tapatyb\u0117s. Atsijunkite nuo nuotolinio \u201eChrome\u201c darbalaukio ir bandykite dar kart\u0105."},"error_bad_plugin_version":{"message":"Tr\u016bksta kai kuri\u0173 nuotoliniam \u201eChrome\u201c darbalaukiui reikaling\u0173 komponent\u0173. \u012esitikinkite, kad \u012fdieg\u0117te naujausi\u0105 versij\u0105, ir bandykite dar kart\u0105."},"error_generic":{"message":"\u012evyko ne\u017einoma klaida. Atsijunkite nuo nuotolinio \u201eChrome\u201c darbalaukio ir bandykite dar kart\u0105."},"error_host_is_offline":{"message":"Nuotolinis kompiuteris nereaguoja \u012f ry\u0161io u\u017eklausas. Patikrinkite, ar jis prijungtas, ir bandykite dar kart\u0105."},"error_incompatible_protocol":{"message":"Aptikta nesuderinama nuotolinio \u201eChrome\u201c darbalaukio versija. \u012esitikinkite, kad naudojate naujausios versijos \u201eGoogle Chrome\u201c ir nuotolin\u012f \u201eChrome\u201c darbalauk\u012f abiejuose kompiuteriuose, ir bandykite dar kart\u0105."},"error_invalid_access_code":{"message":"Netinkamas prieigos kodas. Bandykite dar kart\u0105."},"error_missing_plugin":{"message":"Tr\u016bksta kai kuri\u0173 nuotoliniam \u201eChrome\u201c darbalaukiui reikaling\u0173 komponent\u0173. \u012esitikinkite, kad naudojate naujausios versijos \u201eGoogle Chrome\u201c, ir bandykite dar kart\u0105."},"error_no_response":{"message":"Serveriui nepavyko atsakyti \u012f tinklo u\u017eklaus\u0105."},"error_service_unavailable":{"message":"Paslauga laikinai negalima. Bandykite dar kart\u0105 v\u0117liau."},"error_unexpected":{"message":"\u012evyko netik\u0117ta klaida. Prane\u0161kite apie problem\u0105 k\u016br\u0117jams."},"footer_waiting":{"message":"laukiama ry\u0161io..."},"help":{"message":"Pagalba"},"home_access_button":{"message":"Pasiekti dabar"},"home_access_description":{"message":"\u017di\u016br\u0117kite ir valdykite bendrinam\u0105 kompiuter\u012f."},"home_my_computers_title":{"message":"Mano kompiuteriai"},"home_share_button":{"message":"Bendrinti dabar"},"home_share_description":{"message":"Bendrinkite \u0161\u012f kompiuter\u012f, kad kitas naudotojas gal\u0117t\u0173 j\u012f matyti ir valdyti."},"home_share_description_chrome_os":{"message":"(\u0160i funkcija \u201eChromebook\u201c dar negalima\u2026 Steb\u0117kite naujienas.)"},"instructions_share_above":{"message":"Jei norite prad\u0117ti bendrinti darbalauk\u012f, pateikite toliau nurodyt\u0105 prieigos kod\u0105 asmeniui, kuris jums pad\u0117s."},"instructions_share_below":{"message":"Kai jis \u012fves kod\u0105, prasid\u0117s j\u016bs\u0173 bendrinimo sesija."},"label_connected":{"message":"Prisijungta:"},"message_connecting":{"message":"Jungiamasi\u2026"},"message_generating":{"message":"Generuojamas prieigos kodas..."},"message_session_finished":{"message":"Baig\u0117si nuotolinio \u201eChrome\u201c darbalaukio sesija."},"message_shared":{"message":"\u0160iuo metu darbalaukis bendrinamas su $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Suteikti prieigos teis\u0119"},"mode_connect":{"message":"Prisijungti"},"mode_share":{"message":"Bendrinti"},"offline":{"message":"Neprijungta"},"ok":{"message":"Gerai"},"product_description":{"message":"Pasiekite kitus kompiuterius arba leiskite kitam naudotojui saugiai pasiekti kompiuter\u012f internetu."},"product_name":{"message":"Nuotolinis \u201eChrome\u201c darbalaukis"},"sign_out_button":{"message":"Atsijungti"},"stop_sharing_button":{"message":"Stabdyti bendrinim\u0105"},"tooltip_scaling":{"message":"Keisti mastel\u012f, kad tilpt\u0173"},"warning_nat_disabled":{"message":"PASTABA: pagal politikos nustatymus leid\u017eiama u\u017emegzti tik tinkle esan\u010di\u0173 kompiuteri\u0173 ry\u0161\u012f."}} diff --git a/remoting/webapp/me2mom/_locales.official/lv/messages.json b/remoting/webapp/me2mom/_locales.official/lv/messages.json deleted file mode 100644 index a6c8c5b..0000000 --- a/remoting/webapp/me2mom/_locales.official/lv/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Piek\u013cuves kods"},"access_code_timer":{"message":"\u0160\u012b piek\u013cuves koda der\u012bguma termi\u0146\u0161 beigsies p\u0113c $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Atcelt"},"close_prompt":{"message":"Aizverot \u0161o lapu, Chrome att\u0101l\u0101s darbvirsmas sesija tiks p\u0101rtraukta."},"connect_button":{"message":"Pievienot"},"continue_button":{"message":"Turpin\u0101t"},"continue_prompt":{"message":"\u0160obr\u012bd j\u016bs kop\u012bgojat \u0161o ier\u012bci ar citu lietot\u0101ju. Vai v\u0113laties turpin\u0101t kop\u012bgo\u0161anu?"},"description_authorize":{"message":"Lai izmantotu Chrome att\u0101lo darbvirsmu, vispirms pie\u0161\u0137iriet papla\u0161in\u0101tas piek\u013cuves at\u013caujas savam datoram. Tas ir j\u0101dara tikai vienu reizi."},"description_connect":{"message":"L\u016bdziet lietot\u0101jam, kura datoram v\u0113laties piek\u013c\u016bt, noklik\u0161\u0137in\u0101t uz Kop\u012bgot \u0161o datoru un p\u0113c tam pie\u0161\u0137irt jums piek\u013cuves kodu."},"description_home":{"message":"Izmantojot Chrome att\u0101lo darbvirsmu, varat dro\u0161\u0101 veid\u0101 t\u012bmekl\u012b kop\u012bgot savu datoru. Abiem lietot\u0101jiem ir j\u0101izmanto lietotne Chrome att\u0101l\u0101 darbvirsma, kas atrodama \u0161eit: $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Atvienot (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Atvienot (Ctrl+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Atvienot (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Atvienot"},"disconnect_other_button":{"message":"Atvienot"},"error_authentication_failed":{"message":"Autentifik\u0101cija neizdev\u0101s. Izrakstieties no Chrome att\u0101l\u0101s darbvirsmas un m\u0113\u0123iniet v\u0113lreiz."},"error_bad_plugin_version":{"message":"Tr\u016bkst da\u017eu Chrome att\u0101lajai darbvirsmai nepiecie\u0161amo komponentu. P\u0101rbaudiet, vai esat instal\u0113jis jaun\u0101ko versiju un m\u0113\u0123iniet v\u0113lreiz."},"error_generic":{"message":"Radusies nezin\u0101ma k\u013c\u016bda. Izrakstieties no Chrome att\u0101l\u0101s darbvirsmas un m\u0113\u0123iniet v\u0113lreiz."},"error_host_is_offline":{"message":"Att\u0101lais dators nerea\u0123\u0113 uz savienojuma piepras\u012bjumiem. P\u0101rbaudiet, vai tam ir savienojums ar internetu un m\u0113\u0123iniet v\u0113lreiz."},"error_incompatible_protocol":{"message":"Tika konstat\u0113ta nesader\u012bga Chrome att\u0101l\u0101s darbvirsmas versija. P\u0101rbaudiet, vai lietojat p\u0101rl\u016bka Google Chrome un lietotnes Chrome att\u0101l\u0101 darbvirsma jaun\u0101ko versiju abos datoros un m\u0113\u0123iniet v\u0113lreiz."},"error_invalid_access_code":{"message":"Piek\u013cuves kods nav der\u012bgs. M\u0113\u0123iniet v\u0113lreiz."},"error_missing_plugin":{"message":"Tr\u016bkst da\u017eu Chrome att\u0101lajai darbvirsmai nepiecie\u0161amo komponentu. P\u0101rbaudiet, vai lietojat jaun\u0101ko p\u0101rl\u016bka Google Chrome versiju un m\u0113\u0123iniet v\u0113lreiz."},"error_no_response":{"message":"Serverim neizdev\u0101s atbild\u0113t uz t\u012bkla piepras\u012bjumu."},"error_service_unavailable":{"message":"\u0160obr\u012bd pakalpojums nav pieejams. V\u0113l\u0101k m\u0113\u0123iniet v\u0113lreiz."},"error_unexpected":{"message":"Rad\u0101s neparedz\u0113ta k\u013c\u016bda. Zi\u0146ojiet par \u0161o probl\u0113mu izstr\u0101d\u0101t\u0101jiem."},"footer_waiting":{"message":"tiek gaid\u012bta savienojuma izveide..."},"help":{"message":"Pal\u012bdz\u012bba"},"home_access_button":{"message":"Piek\u013c\u016bt t\u016bl\u012bt"},"home_access_description":{"message":"Skatiet un kontrol\u0113jiet kop\u012bgotu datoru."},"home_my_computers_title":{"message":"Mani datori"},"home_share_button":{"message":"Kop\u012bgot t\u016bl\u012bt"},"home_share_description":{"message":"Kop\u012bgojiet \u0161o cita lietot\u0101ja datoru, lai redz\u0113tu un kontrol\u0113tu t\u0101 darbvirsmu."},"home_share_description_chrome_os":{"message":"(\u0161\u012b funkcija v\u0113l nav pieejama Chromebook datoriem\u2026 sekojiet jaunumiem)"},"instructions_share_above":{"message":"Lai kop\u012bgotu savu darbvirsmu, pie\u0161\u0137iriet t\u0101l\u0101k redzamo piek\u013cuves kodu lietot\u0101jam, kur\u0161 jums pal\u012bdz\u0113s."},"instructions_share_below":{"message":"Tikl\u012bdz kods ir ievad\u012bts, tiek s\u0101kta kop\u012bgo\u0161anas sesija."},"label_connected":{"message":"Pievienots:"},"message_connecting":{"message":"Notiek savienojuma izveide..."},"message_generating":{"message":"Notiek piek\u013cuves koda \u0123ener\u0113\u0161ana..."},"message_session_finished":{"message":"J\u016bsu Chrome att\u0101l\u0101s darbvirsmas sesija ir p\u0101rtraukta."},"message_shared":{"message":"\u0160obr\u012bd j\u016bs kop\u012bgojat savu darbvirsmu ar lietot\u0101ju $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriz\u0113t"},"mode_connect":{"message":"Pievienot"},"mode_share":{"message":"Kop\u012bgot"},"offline":{"message":"Bezsaist\u0113"},"ok":{"message":"Labi"},"product_description":{"message":"Piek\u013c\u016bstiet citiem datoriem vai \u013caujiet citam lietot\u0101jam piek\u013c\u016bt j\u016bsu datoram dro\u0161\u0101 veid\u0101, izmantojot interneta savienojumu."},"product_name":{"message":"Chrome att\u0101l\u0101 darbvirsma"},"sign_out_button":{"message":"Izrakst\u012bties"},"stop_sharing_button":{"message":"P\u0101rtraukt kop\u012bgo\u0161anu"},"tooltip_scaling":{"message":"M\u0113rogot, lai ietilpin\u0101tu"},"warning_nat_disabled":{"message":"PIEZ\u012aME: saska\u0146\u0101 ar politikas iestat\u012bjumiem savienojumi ir at\u013cauti tikai starp datoriem j\u016bsu t\u012bkl\u0101."}} diff --git a/remoting/webapp/me2mom/_locales.official/nb/messages.json b/remoting/webapp/me2mom/_locales.official/nb/messages.json deleted file mode 100644 index 0941d8c..0000000 --- a/remoting/webapp/me2mom/_locales.official/nb/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Tilgangskode"},"access_code_timer":{"message":"Denne tilgangskoden utl\u00f8per om $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Avbryt"},"close_prompt":{"message":"Hvis du forlater denne siden, avsluttes Chrome Eksternt skrivebord-\u00f8kten."},"connect_button":{"message":"Koble til"},"continue_button":{"message":"Fortsett"},"continue_prompt":{"message":"Du deler denne datamaskinen med en annen bruker. Vil du fortsette \u00e5 dele?"},"description_authorize":{"message":"For \u00e5 bruke Chrome Eksternt skrivebord m\u00e5 du gi utvidede tilgangstillatelser til datamaskinen din. Du trenger \u00e5 gj\u00f8re dette bare \u00e9n gang."},"description_connect":{"message":"Be brukeren som har datamaskinen du \u00f8nsker tilgang til, om \u00e5 klikke p\u00e5 \u00abDel n\u00e5\u00bb og gi deg tilgangskoden."},"description_home":{"message":"Med Chrome Eksternt skrivebord kan du trygt dele datamaskinen via Internett. Begge brukerne m\u00e5 kj\u00f8re Chrome Eksternt skrivebord-programmet, som kan lastes ned p\u00e5 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Koble fra (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Koble fra (Opt + Ctrl + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Koble fra (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"Koble fra"},"disconnect_other_button":{"message":"Koble fra"},"error_authentication_failed":{"message":"Autentiseringen mislyktes. Logg deg av Chrome Eksternt skrivebord og pr\u00f8v p\u00e5 nytt."},"error_bad_plugin_version":{"message":"Du mangler noen komponenter som kreves for Chrome Eksternt skrivebord. Kontroller at du har installert den nyeste versjonen, og pr\u00f8v p\u00e5 nytt."},"error_generic":{"message":"Det oppsto en ukjent feil. Logg deg av Chrome Eksternt skrivebord, og pr\u00f8v p\u00e5 nytt."},"error_host_is_offline":{"message":"Den eksterne datamaskinen svarer ikke p\u00e5 tilkoblingsforesp\u00f8rsler. Kontroller at datamaskinen er koblet til Internett, og pr\u00f8v p\u00e5 nytt."},"error_incompatible_protocol":{"message":"En ikke-kompatibel versjon av Chrome Eksternt skrivebord ble oppdaget. Kontroller at du har den nyeste versjonen av Google Chrome og Chrome Eksternt skrivebord p\u00e5 begge maskinene, og pr\u00f8v p\u00e5 nytt."},"error_invalid_access_code":{"message":"Tilgangskoden er ugyldig. Pr\u00f8v p\u00e5 nytt."},"error_missing_plugin":{"message":"Du mangler noen komponenter som kreves for Chrome Eksternt skrivebord. S\u00f8rg for at du kj\u00f8rer den nyeste versjonen av Google Chrome, og pr\u00f8v p\u00e5 nytt."},"error_no_response":{"message":"Tjeneren svarte ikke p\u00e5 nettverksforesp\u00f8rselen."},"error_service_unavailable":{"message":"Tjenesten er ikke tilgjengelig for \u00f8yeblikket. Pr\u00f8v p\u00e5 nytt senere."},"error_unexpected":{"message":"Det oppsto en uventet feil. Rapporter dette problemet til utviklerne."},"footer_waiting":{"message":"venter p\u00e5 tilkobling \u2026"},"help":{"message":"Hjelp"},"home_access_button":{"message":"Start tilgang n\u00e5"},"home_access_description":{"message":"Se og kontroller en delt datamaskin."},"home_my_computers_title":{"message":"Mine datamaskiner"},"home_share_button":{"message":"Del n\u00e5"},"home_share_description":{"message":"Del denne datamaskinen slik at en annen bruker kan se og kontrollere den."},"home_share_description_chrome_os":{"message":"(denne funksjonen er ikke tilgjengelig for Chromebooks enn\u00e5 \u2026 f\u00f8lg med)"},"instructions_share_above":{"message":"Kom i gang med deling av skrivebordet ved \u00e5 gi adgangskoden nedenfor til personen som skal hjelpe deg."},"instructions_share_below":{"message":"N\u00e5r brukeren har skrevet inn koden, starter delings\u00f8kten."},"label_connected":{"message":"Tilkoblet:"},"message_connecting":{"message":"Kobler til \u2026"},"message_generating":{"message":"Genererer tilgangskode \u2026"},"message_session_finished":{"message":"Chrome Eksternt skrivebord-\u00f8kten din er avsluttet."},"message_shared":{"message":"Skrivebordet ditt deles for \u00f8yeblikket med $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Godkjenn"},"mode_connect":{"message":"Koble til"},"mode_share":{"message":"Del"},"offline":{"message":"Frakoblet"},"ok":{"message":"OK"},"product_description":{"message":"F\u00e5 tilgang til andre datamaskiner eller gi en annen bruker sikker tilgang til datamaskinen din via Internett."},"product_name":{"message":"Chrome Eksternt skrivebord"},"sign_out_button":{"message":"Logg av"},"stop_sharing_button":{"message":"Stopp deling"},"tooltip_scaling":{"message":"Tilpass st\u00f8rrelse"},"warning_nat_disabled":{"message":"MERK: I henhold til lokale retningslinjer er tilkobling tillatt bare mellom datamaskiner i nettverket ditt."}} diff --git a/remoting/webapp/me2mom/_locales.official/nl/messages.json b/remoting/webapp/me2mom/_locales.official/nl/messages.json deleted file mode 100644 index 326a312..0000000 --- a/remoting/webapp/me2mom/_locales.official/nl/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Toegangscode"},"access_code_timer":{"message":"Deze toegangscode verloopt over $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Annuleren"},"close_prompt":{"message":"Als u deze pagina verlaat, wordt uw Chrome Remote Desktop-sessie be\u00ebindigd."},"connect_button":{"message":"Verbinding maken"},"continue_button":{"message":"Doorgaan"},"continue_prompt":{"message":"U deelt deze computer momenteel met een andere gebruiker. Wilt u doorgaan met delen?"},"description_authorize":{"message":"Om Chrome Remote Desktop te gebruiken, moet u eerst uitgebreide toegangsrechten voor uw computer verlenen. U hoeft dit slechts \u00e9\u00e9n keer te doen."},"description_connect":{"message":"Vraag de gebruiker tot wiens computer u toegang wilt hebben, op 'Nu delen' te klikken en u de toegangscode te geven."},"description_home":{"message":"Met Chrome Remote Desktop kunt u uw computer veilig delen via internet. Beide gebruikers moeten de app Chrome Remote Desktop uitvoeren, die beschikbaar is op $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Verbinding verbreken (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Verbinding verbreken (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Verbinding verbreken (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Verbinding verbreken"},"disconnect_other_button":{"message":"Verbinding verbreken"},"error_authentication_failed":{"message":"Authenticatie mislukt. Meld u af bij Chrome Remote Desktop en probeer het opnieuw."},"error_bad_plugin_version":{"message":"Er ontbreken enkele componenten die vereist zijn voor Chrome Remote Desktop. Controleer of u de nieuwste versie heeft ge\u00efnstalleerd en probeer het opnieuw."},"error_generic":{"message":"Er is een onbekende fout opgetreden. Meld u af bij Chrome Remote Desktop en probeer het opnieuw."},"error_host_is_offline":{"message":"De externe computer reageert niet op verbindingsverzoeken. Controleer of deze online is en probeer het opnieuw."},"error_incompatible_protocol":{"message":"Er is een incompatibele versie van Chrome Remote Desktop gedetecteerd. Controleer of beide computers beschikken over de nieuwste versie van Google Chrome en Chrome Remote Desktop en probeer het opnieuw."},"error_invalid_access_code":{"message":"De toegangscode is ongeldig. Probeer het opnieuw."},"error_missing_plugin":{"message":"Er ontbreken enkele componenten die vereist zijn voor Chrome Remote Desktop. Controleer of u de nieuwste versie van Google Chrome gebruikt en probeer het opnieuw."},"error_no_response":{"message":"De server heeft niet gereageerd op het netwerkverzoek."},"error_service_unavailable":{"message":"De service is tijdelijk niet beschikbaar. Probeer het later opnieuw."},"error_unexpected":{"message":"Er is een onverwachte fout opgetreden. Meld dit probleem aan de ontwikkelaars."},"footer_waiting":{"message":"wachten op verbinding\u2026"},"help":{"message":"Help"},"home_access_button":{"message":"Nu openen"},"home_access_description":{"message":"Een gedeelde computer bekijken en beheren."},"home_my_computers_title":{"message":"Mijn computers"},"home_share_button":{"message":"Nu delen"},"home_share_description":{"message":"De computer delen zodat een andere gebruiker deze kan bekijken en beheren."},"home_share_description_chrome_os":{"message":"(deze functie is nog niet beschikbaar voor Chromebooks\u2026 nog even geduld)"},"instructions_share_above":{"message":"Om uw bureaublad te delen, geeft u de onderstaande toegangscode aan de persoon die u gaat helpen."},"instructions_share_below":{"message":"Zodra ze de code opgeven, wordt uw deelsessie gestart."},"label_connected":{"message":"Verbonden:"},"message_connecting":{"message":"Verbinding maken..."},"message_generating":{"message":"Toegangscode genereren\u2026"},"message_session_finished":{"message":"Uw Chrome Remote Desktop-sessie is be\u00ebindigd."},"message_shared":{"message":"Uw bureaublad wordt momenteel gedeeld met $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriseren"},"mode_connect":{"message":"Verbinding maken"},"mode_share":{"message":"Delen"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Toegang krijgen tot andere computers of een andere gebruiker toestemming geven veilig toegang te krijgen tot uw computer via internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Afmelden"},"stop_sharing_button":{"message":"Delen stoppen"},"tooltip_scaling":{"message":"Passend schalen"},"warning_nat_disabled":{"message":"OPMERKING: beleidsinstellingen staan alleen verbindingen tussen computers binnen uw netwerk toe."}} diff --git a/remoting/webapp/me2mom/_locales.official/pl/messages.json b/remoting/webapp/me2mom/_locales.official/pl/messages.json deleted file mode 100644 index 58e1779..0000000 --- a/remoting/webapp/me2mom/_locales.official/pl/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Kod dost\u0119pu"},"access_code_timer":{"message":"Ten kod dost\u0119pu wygasa za $1.","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Anuluj"},"close_prompt":{"message":"Je\u015bli opu\u015bcisz t\u0119 stron\u0119, sesja Pulpitu zdalnego Chrome zostanie zako\u0144czona."},"connect_button":{"message":"Po\u0142\u0105cz"},"continue_button":{"message":"Kontynuuj"},"continue_prompt":{"message":"Obecnie udost\u0119pniasz ten komputer innemu u\u017cytkownikowi. Czy chcesz kontynuowa\u0107 udost\u0119pnianie?"},"description_authorize":{"message":"Aby korzysta\u0107 z Pulpitu zdalnego Chrome, musisz przyzna\u0107 rozszerzone pozwolenia dost\u0119pu do swojego komputera. Trzeba to zrobi\u0107 tylko raz."},"description_connect":{"message":"Popro\u015b u\u017cytkownika komputera, do kt\u00f3rego chcesz uzyska\u0107 dost\u0119p, aby klikn\u0105\u0142 \u201eUdost\u0119pnij teraz\u201d i przekaza\u0142 Ci kod dost\u0119pu."},"description_home":{"message":"Pulpit zdalny Chrome pozwala na bezpieczne udost\u0119pnianie komputera za po\u015brednictwem sieci. Obaj u\u017cytkownicy musz\u0105 mie\u0107 uruchomion\u0105 aplikacj\u0119 Pulpit zdalny Chrome, kt\u00f3r\u0105 mo\u017cna znale\u017a\u0107 pod adresem $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Roz\u0142\u0105cz (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Roz\u0142\u0105cz (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Roz\u0142\u0105cz (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Roz\u0142\u0105cz"},"disconnect_other_button":{"message":"Roz\u0142\u0105cz"},"error_authentication_failed":{"message":"Uwierzytelnianie nie powiod\u0142o si\u0119. Wyloguj si\u0119 z Pulpitu zdalnego Chrome i spr\u00f3buj ponownie."},"error_bad_plugin_version":{"message":"Brak niekt\u00f3rych element\u00f3w wymaganych dla Pulpitu zdalnego Chrome. Upewnij si\u0119, \u017ce masz zainstalowan\u0105 najnowsz\u0105 wersj\u0119 i spr\u00f3buj ponownie."},"error_generic":{"message":"Wyst\u0105pi\u0142 nieznany b\u0142\u0105d. Wyloguj si\u0119 z Pulpitu zdalnego Chrome i spr\u00f3buj ponownie."},"error_host_is_offline":{"message":"Komputer zdalny nie odpowiada na \u017c\u0105dania po\u0142\u0105czenia. Sprawd\u017a, czy dzia\u0142a on w trybie online i spr\u00f3buj ponownie."},"error_incompatible_protocol":{"message":"Wykryto niezgodn\u0105 wersj\u0119 Pulpitu zdalnego Chrome. Upewnij si\u0119, \u017ce masz najnowsz\u0105 wersj\u0119 przegl\u0105darki Google Chrome i Pulpitu zdalnego Chrome na obu komputerach i spr\u00f3buj ponownie."},"error_invalid_access_code":{"message":"Kod dost\u0119pu jest nieprawid\u0142owy. Spr\u00f3buj ponownie."},"error_missing_plugin":{"message":"Brak niekt\u00f3rych element\u00f3w wymaganych dla Pulpitu zdalnego Chrome. Upewnij si\u0119, \u017ce korzystasz z najnowszej wersji Google Chrome i spr\u00f3buj ponownie."},"error_no_response":{"message":"Serwer nie odpowiada na \u017c\u0105danie sieciowe."},"error_service_unavailable":{"message":"Us\u0142uga jest tymczasowo niedost\u0119pna. Spr\u00f3buj ponownie p\u00f3\u017aniej."},"error_unexpected":{"message":"Wyst\u0105pi\u0142 nieoczekiwany b\u0142\u0105d. Zg\u0142o\u015b ten problem programistom."},"footer_waiting":{"message":"oczekiwanie na po\u0142\u0105czenie..."},"help":{"message":"Pomoc"},"home_access_button":{"message":"Uzyskaj dost\u0119p teraz"},"home_access_description":{"message":"Zobacz i kontroluj udost\u0119pniony komputer."},"home_my_computers_title":{"message":"Moje komputery"},"home_share_button":{"message":"Udost\u0119pnij teraz"},"home_share_description":{"message":"Udost\u0119pnij ten komputer innemu u\u017cytkownikowi, aby m\u00f3g\u0142 go widzie\u0107 i kontrolowa\u0107."},"home_share_description_chrome_os":{"message":"(Ta funkcja nie jest jeszcze dost\u0119pna dla Chromebook\u00f3w \u2013 prosimy o cierpliwo\u015b\u0107)."},"instructions_share_above":{"message":"Aby udost\u0119pni\u0107 pulpit, podaj poni\u017cszy kod dost\u0119pu osobie, kt\u00f3ra b\u0119dzie Ci pomaga\u0107."},"instructions_share_below":{"message":"Po wprowadzeniu kodu przez drug\u0105 stron\u0119 rozpocznie si\u0119 sesja udost\u0119pniania."},"label_connected":{"message":"Po\u0142\u0105czono:"},"message_connecting":{"message":"\u0141\u0105czenie\u2026"},"message_generating":{"message":"Generowanie kodu dost\u0119pu..."},"message_session_finished":{"message":"Sesja Pulpitu zdalnego Chrome zosta\u0142a zako\u0144czona."},"message_shared":{"message":"Tw\u00f3j pulpit jest obecnie udost\u0119pniany u\u017cytkownikowi: $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoryzuj"},"mode_connect":{"message":"Po\u0142\u0105cz"},"mode_share":{"message":"Udost\u0119pnione"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Uzyskuj dost\u0119p do innych komputer\u00f3w lub zezwalaj innym u\u017cytkownikom na dost\u0119p do swojego komputera przez internet w bezpieczny spos\u00f3b."},"product_name":{"message":"Pulpit zdalny Chrome"},"sign_out_button":{"message":"Wyloguj si\u0119"},"stop_sharing_button":{"message":"Zatrzymaj udost\u0119pnianie"},"tooltip_scaling":{"message":"Przeskaluj, aby dopasowa\u0107"},"warning_nat_disabled":{"message":"UWAGA: ustawienia zasad zezwalaj\u0105 wy\u0142\u0105cznie na po\u0142\u0105czenia mi\u0119dzy komputerami w Twojej sieci."}} diff --git a/remoting/webapp/me2mom/_locales.official/pt_BR/messages.json b/remoting/webapp/me2mom/_locales.official/pt_BR/messages.json deleted file mode 100644 index 4f8f714..0000000 --- a/remoting/webapp/me2mom/_locales.official/pt_BR/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"C\u00f3digo de acesso"},"access_code_timer":{"message":"Este c\u00f3digo de acesso expira em $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Abandonar esta p\u00e1gina encerrar\u00e1 sua sess\u00e3o na \u00c1rea de trabalho remota do Chrome."},"connect_button":{"message":"Conectar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"Esta m\u00e1quina est\u00e1 sendo compartilhada com outro usu\u00e1rio. Deseja continuar compartilhando?"},"description_authorize":{"message":"Para utilizar a \u00c1rea de trabalho remota do Chrome, \u00e9 necess\u00e1rio conceder permiss\u00f5es de acesso estendidas a seu computador. \u00c9 necess\u00e1rio fazer isto apenas uma vez."},"description_connect":{"message":"Solicite ao usu\u00e1rio cujo computador voc\u00ea deseja acessar que clique em \"Compartilhar agora\" e que forne\u00e7a a voc\u00ea o c\u00f3digo de acesso."},"description_home":{"message":"A \u00c1rea de trabalho remota do Chrome permite que voc\u00ea compartilhe seu computador com seguran\u00e7a atrav\u00e9s da web. Para isso, \u00e9 preciso que os usu\u00e1rios executem simultaneamente o aplicativo da \u00c1rea de trabalho remota do Chrome, que \u00e9 poss\u00edvel achar em $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desconectar (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Desconectar"},"disconnect_other_button":{"message":"Desconectar"},"error_authentication_failed":{"message":"Falha na autentica\u00e7\u00e3o. Saia da \u00c1rea de trabalho remota do Chrome e tente novamente."},"error_bad_plugin_version":{"message":"Alguns componentes necess\u00e1rios \u00e0 \u00c1rea de trabalho remota do Chrome est\u00e3o faltando. Certifique-se de que esteja executando a \u00faltima vers\u00e3o do Google Chrome e tente novamente."},"error_generic":{"message":"Ocorreu um erro desconhecido. Saia da \u00c1rea de trabalho remota do Chrome e tente novamente."},"error_host_is_offline":{"message":"O computador remoto n\u00e3o est\u00e1 respondendo \u00e0s solicita\u00e7\u00f5es de conex\u00e3o. Certifique-se de que ele esteja on-line e tente novamente."},"error_incompatible_protocol":{"message":"Uma vers\u00e3o incompat\u00edvel da \u00c1rea de trabalho remota do Chrome foi detectada. Certifique-se de que voc\u00ea possui a vers\u00e3o mais recente do Google Chrome e da \u00c1rea de trabalho remota do Chrome em ambos os computadores e tente novamente."},"error_invalid_access_code":{"message":"C\u00f3digo de acesso inv\u00e1lido. Tente novamente."},"error_missing_plugin":{"message":"Alguns componentes necess\u00e1rios \u00e0 \u00c1rea de trabalho remota do Chrome est\u00e3o faltando. Certifique-se de que esteja executando a \u00faltima vers\u00e3o do Google Chrome e tente novamente."},"error_no_response":{"message":"O servidor falhou ao responder ao pedido de rede."},"error_service_unavailable":{"message":"O servi\u00e7o est\u00e1 temporariamente indispon\u00edvel. Tente novamente mais tarde."},"error_unexpected":{"message":"Ocorreu um erro inesperado. Informe este problema aos desenvolvedores."},"footer_waiting":{"message":"aguardando conex\u00e3o..."},"help":{"message":"Ajuda"},"home_access_button":{"message":"Acessar agora"},"home_access_description":{"message":"Ver e controlar um computador compartilhado."},"home_my_computers_title":{"message":"Meus Computadores"},"home_share_button":{"message":"Compartilhar agora"},"home_share_description":{"message":"Compartilhe este computador para que outro usu\u00e1rio possa visualiz\u00e1-lo e control\u00e1-lo."},"home_share_description_chrome_os":{"message":"Este recurso ainda n\u00e3o est\u00e1 dispon\u00edvel para Chromebooks ... fique ligado"},"instructions_share_above":{"message":"Para compartilhar sua \u00e1rea de trabalho, forne\u00e7a o c\u00f3digo de acesso abaixo \u00e0 pessoa que ajudar\u00e1 voc\u00ea."},"instructions_share_below":{"message":"Assim que o c\u00f3digo for inserido, sua sess\u00e3o de compartilhamento iniciar\u00e1."},"label_connected":{"message":"Connectado:"},"message_connecting":{"message":"Conectando..."},"message_generating":{"message":"Gerando c\u00f3digo de acesso..."},"message_session_finished":{"message":"Sua sess\u00e3o na \u00c1rea de trabalho remota do Chrome foi encerrada."},"message_shared":{"message":"Sua \u00e1rea de trabalho est\u00e1 sendo compartilhada com $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Conectar"},"mode_share":{"message":"Compartilhar"},"offline":{"message":"Off-line"},"ok":{"message":"OK"},"product_description":{"message":"Acesse outros computadores ou permita que outro usu\u00e1rio acesse seu computador de forma segura atrav\u00e9s da Internet."},"product_name":{"message":"\u00c1rea de trabalho remota do Chrome"},"sign_out_button":{"message":"Sair"},"stop_sharing_button":{"message":"Parar compartilhamento"},"tooltip_scaling":{"message":"Ajustar \u00e0 janela"},"warning_nat_disabled":{"message":"NOTA: as configura\u00e7\u00f5es de Pol\u00edtica permitem conex\u00e3o apenas entre computadores em sua rede."}} diff --git a/remoting/webapp/me2mom/_locales.official/pt_PT/messages.json b/remoting/webapp/me2mom/_locales.official/pt_PT/messages.json deleted file mode 100644 index 508a28d..0000000 --- a/remoting/webapp/me2mom/_locales.official/pt_PT/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"C\u00f3digo de acesso"},"access_code_timer":{"message":"Este c\u00f3digo de acesso ir\u00e1 expirar \u00e0s $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Cancelar"},"close_prompt":{"message":"Se sair desta p\u00e1gina, terminar\u00e1 a sess\u00e3o do Ambiente de Trabalho Remoto do Chrome."},"connect_button":{"message":"Ligar"},"continue_button":{"message":"Continuar"},"continue_prompt":{"message":"Est\u00e1 atualmente a partilhar este computador com outro utilizador. Pretende continuar a partilhar?"},"description_authorize":{"message":"Para utilizar o Ambiente de Trabalho Remoto do Chrome, \u00e9 necess\u00e1rio conceder permiss\u00f5es de acesso alargadas ao computador. Apenas tem de efetuar esta opera\u00e7\u00e3o uma vez."},"description_connect":{"message":"Solicite ao utilizador a cujo computador pretende aceder que clique em \"Partilhar Agora\" e que indique o c\u00f3digo de acesso."},"description_home":{"message":"O Ambiente de Trabalho Remoto do Chrome permite partilhar o computador de forma segura atrav\u00e9s da Web. Ambos os utilizadores devem ter em execu\u00e7\u00e3o a aplica\u00e7\u00e3o do Ambiente de Trabalho Remoto do Chrome, que pode ser encontrada em $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Desligar (Ctrl+Alt +Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Desligar (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Desligar (Ctrl+Alt +Esc)"},"disconnect_myself_button":{"message":"Desligar"},"disconnect_other_button":{"message":"Desligar"},"error_authentication_failed":{"message":"Falha na autentica\u00e7\u00e3o. Termine a sess\u00e3o do Ambiente de Trabalho Remoto do Chrome e tente novamente."},"error_bad_plugin_version":{"message":"Faltam alguns componentes necess\u00e1rios ao Ambiente de Trabalho Remoto do Chrome. Certifique-se de que instalou a vers\u00e3o mais recente e tente novamente."},"error_generic":{"message":"Ocorreu um erro desconhecido. Termine sess\u00e3o do Ambiente de Trabalho Remoto do Chrome e tente novamente."},"error_host_is_offline":{"message":"O computador remoto n\u00e3o est\u00e1 a responder aos pedidos de liga\u00e7\u00e3o. Verifique se est\u00e1 on-line e tente novamente."},"error_incompatible_protocol":{"message":"Foi detetada uma vers\u00e3o n\u00e3o compat\u00edvel do Ambiente de Trabalho Remoto do Chrome. Certifique-se de que tem a vers\u00e3o mais recente do Google Chrome e do Ambiente de Trabalho Remoto do Chrome em ambos os computadores e tente novamente."},"error_invalid_access_code":{"message":"O c\u00f3digo de acesso \u00e9 inv\u00e1lido. Tente novamente."},"error_missing_plugin":{"message":"Faltam alguns componentes necess\u00e1rios ao Ambiente de Trabalho Remoto do Chrome. Certifique-se de que est\u00e1 a executar a vers\u00e3o mais recente do Google Chrome e tente novamente."},"error_no_response":{"message":"O servidor n\u00e3o conseguiu responder ao pedido de rede."},"error_service_unavailable":{"message":"O servi\u00e7o est\u00e1 temporariamente indispon\u00edvel. Tente novamente mais tarde."},"error_unexpected":{"message":"Ocorreu um erro inesperado. Comunique este problema aos programadores."},"footer_waiting":{"message":"a aguardar liga\u00e7\u00e3o..."},"help":{"message":"Ajuda"},"home_access_button":{"message":"Aceder Agora"},"home_access_description":{"message":"Ver e controlar um computador partilhado."},"home_my_computers_title":{"message":"Os Meus Computadores"},"home_share_button":{"message":"Partilhar Agora"},"home_share_description":{"message":"Partilhar este computador para que outro utilizador o possa ver e controlar."},"home_share_description_chrome_os":{"message":"(esta funcionalidade ainda n\u00e3o est\u00e1 dispon\u00edvel para Chromebooks... fique atento)"},"instructions_share_above":{"message":"Para come\u00e7ar a partilhar o seu ambiente de trabalho, forne\u00e7a o c\u00f3digo de acesso abaixo \u00e0 pessoa que o ir\u00e1 ajudar."},"instructions_share_below":{"message":"A sess\u00e3o de partilha come\u00e7a assim que introduzirem o c\u00f3digo."},"label_connected":{"message":"Ligado:"},"message_connecting":{"message":"A ligar..."},"message_generating":{"message":"A gerar c\u00f3digo de acesso..."},"message_session_finished":{"message":"A sess\u00e3o do Ambiente de Trabalho Remoto do Chrome terminou."},"message_shared":{"message":"O seu computador est\u00e1 a ser atualmente partilhado com $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizar"},"mode_connect":{"message":"Ligar"},"mode_share":{"message":"Partilhar"},"offline":{"message":"Off-line"},"ok":{"message":"OK"},"product_description":{"message":"Aceder a outros computadores ou permitir que outro utilizador aceda ao seu computador de forma segura atrav\u00e9s da internet."},"product_name":{"message":"Ambiente de Trabalho Remoto do Chrome"},"sign_out_button":{"message":"Terminar sess\u00e3o"},"stop_sharing_button":{"message":"Terminar Partilha"},"tooltip_scaling":{"message":"Ajustar tamanho"},"warning_nat_disabled":{"message":"NOTA: as defini\u00e7\u00f5es da Pol\u00edtica permitem liga\u00e7\u00f5es apenas entre computadores da sua rede."}} diff --git a/remoting/webapp/me2mom/_locales.official/ro/messages.json b/remoting/webapp/me2mom/_locales.official/ro/messages.json deleted file mode 100644 index dace99e..0000000 --- a/remoting/webapp/me2mom/_locales.official/ro/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Cod de acces"},"access_code_timer":{"message":"Acest cod de acces va expira \u00een $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Anula\u0163i"},"close_prompt":{"message":"P\u0103r\u0103sind aceast\u0103 pagin\u0103 ve\u0163i \u00eencheia sesiunea dvs. Desktop la distan\u0163\u0103 Chrome."},"connect_button":{"message":"Conecta\u0163i-v\u0103"},"continue_button":{"message":"Continua\u0163i"},"continue_prompt":{"message":"\u00cen prezent permite\u0163i accesul la acest computer altui utilizator. Dori\u0163i s\u0103 permite\u0163i \u00een continuare accesul?"},"description_authorize":{"message":"Pentru a utiliza aplica\u0163ia Desktop la distan\u0163\u0103 Chrome trebuie s\u0103 acorda\u0163i permisiuni extinse de acces la computerul dvs. Este necesar s\u0103 face\u0163i acest lucru numai o singur\u0103 dat\u0103."},"description_connect":{"message":"Cere\u0163i-i utilizatorului al c\u0103rui computer dori\u0163i s\u0103 \u00eel accesa\u0163i s\u0103 fac\u0103 clic pe \u201ePermite\u0163i accesul acum\u201d \u015fi s\u0103 v\u0103 transmit\u0103 codul de acces."},"description_home":{"message":"Cu aplica\u0163ia Desktop la distan\u0163\u0103 Chrome pute\u0163i permite accesul \u00een siguran\u0163\u0103 la computerul dvs. pe web. Ambii utilizatori trebuie s\u0103 ruleze aplica\u0163ia Desktop la distan\u0163\u0103 Chrome, care poate fi g\u0103sit\u0103 la $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Deconecta\u0163i-v\u0103 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Deconecta\u0163i-v\u0103 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Deconecta\u0163i-v\u0103 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Deconecta\u0163i-v\u0103"},"disconnect_other_button":{"message":"Deconecta\u0163i-v\u0103"},"error_authentication_failed":{"message":"Autentificarea a e\u015fuat. Deconecta\u0163i-v\u0103 de la Desktop la distan\u0163\u0103 Chrome \u015fi \u00eencerca\u0163i din nou."},"error_bad_plugin_version":{"message":"Unele componente necesare pentru Desktop la distan\u0163\u0103 Chrome lipsesc. Asigura\u0163i-v\u0103 c\u0103 a\u0163i instalat cea mai recent\u0103 versiune a aplica\u0163iei \u015fi \u00eencerca\u0163i din nou."},"error_generic":{"message":"A ap\u0103rut o eroare necunoscut\u0103. Deconecta\u0163i-v\u0103 de la Desktop la distan\u0163\u0103 Chrome \u015fi \u00eencerca\u0163i din nou."},"error_host_is_offline":{"message":"Computerul la distan\u0163\u0103 nu r\u0103spunde la solicit\u0103rile de conectare. Verifica\u0163i dac\u0103 respectivul computer este online \u015fi \u00eencerca\u0163i din nou."},"error_incompatible_protocol":{"message":"A fost detectat\u0103 o versiune incompatibil\u0103 a aplica\u0163iei Desktop la distan\u0163\u0103 Chrome. Asigura\u0163i-v\u0103 c\u0103 ave\u0163i cea mai recent\u0103 versiune pentru Google Chrome \u015fi Desktop la distan\u0163\u0103 Chrome pe ambele computere \u015fi \u00eencerca\u0163i din nou."},"error_invalid_access_code":{"message":"Codul de acces nu este valid. \u00cencerca\u0163i din nou."},"error_missing_plugin":{"message":"Unele componente necesare pentru aplica\u0163ia Desktop la distan\u0163\u0103 Chrome lipsesc. Asigura\u0163i-v\u0103 c\u0103 rula\u0163i cea mai recent\u0103 versiune a browserului Google Chrome \u015fi \u00eencerca\u0163i din nou."},"error_no_response":{"message":"Serverul nu a putut r\u0103spunde la solicitarea din re\u0163ea."},"error_service_unavailable":{"message":"Serviciul este temporar indisponibil. \u00cencerca\u0163i din nou mai t\u00e2rziu."},"error_unexpected":{"message":"A ap\u0103rut o eroare nea\u015fteptat\u0103. Raporta\u0163i aceast\u0103 problem\u0103 dezvoltatorilor."},"footer_waiting":{"message":"se a\u015fteapt\u0103 realizarea conexiunii..."},"help":{"message":"Ajutor"},"home_access_button":{"message":"Accesa\u0163i acum"},"home_access_description":{"message":"Vede\u0163i \u015fi controla\u0163i un computer la care se permite accesul."},"home_my_computers_title":{"message":"Computerele mele"},"home_share_button":{"message":"Permite\u0163i accesul acum"},"home_share_description":{"message":"Permite\u0163i accesul la acest computer altui utilizator, pentru ca acesta s\u0103 \u00eel poat\u0103 vedea \u015fi controla."},"home_share_description_chrome_os":{"message":"(aceast\u0103 func\u0163ie nu este \u00eenc\u0103 disponibil\u0103 pentru Chromebooks... urm\u0103ri\u0163i-ne \u00een continuare)"},"instructions_share_above":{"message":"Pentru a \u00eencepe s\u0103 permite\u0163i accesul la desktopul dvs., trimite\u0163i codul de acces de mai jos persoanei care v\u0103 va oferi asisten\u0163\u0103."},"instructions_share_below":{"message":"Dup\u0103 ce persoana respectiv\u0103 introduce codul, sesiunea de permitere a accesului va \u00eencepe."},"label_connected":{"message":"Conectat:"},"message_connecting":{"message":"Se conecteaz\u0103..."},"message_generating":{"message":"Se genereaz\u0103 codul de acces..."},"message_session_finished":{"message":"Sesiunea dvs. Desktop la distan\u0163\u0103 Chrome s-a \u00eencheiat."},"message_shared":{"message":"\u00cen prezent, accesul la desktopul dvs. este permis pentru $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autoriza\u0163i"},"mode_connect":{"message":"Conecta\u0163i-v\u0103"},"mode_share":{"message":"Permite\u0163i accesul"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Accesa\u0163i alte computere sau permite\u0163i altui utilizator s\u0103 acceseze computerul dvs. \u00een siguran\u0163\u0103 pe internet."},"product_name":{"message":"Desktop la distan\u0163\u0103 Chrome"},"sign_out_button":{"message":"Deconecta\u0163i-v\u0103"},"stop_sharing_button":{"message":"Opri\u0163i permiterea accesului"},"tooltip_scaling":{"message":"Redimensiona\u0163i pentru a se potrivi"},"warning_nat_disabled":{"message":"NOT\u0102: set\u0103rile politicii permit conexiuni numai \u00eentre computerele din re\u0163eaua dvs."}} diff --git a/remoting/webapp/me2mom/_locales.official/ru/messages.json b/remoting/webapp/me2mom/_locales.official/ru/messages.json deleted file mode 100644 index fcc5c0c..0000000 --- a/remoting/webapp/me2mom/_locales.official/ru/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430"},"access_code_timer":{"message":"\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u041e\u0442\u043c\u0435\u043d\u0430"},"close_prompt":{"message":"\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043a\u0438\u043d\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0441\u0435\u0430\u043d\u0441 \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d."},"connect_button":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"continue_button":{"message":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},"continue_prompt":{"message":"\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u0435\u0430\u043d\u0441?"},"description_authorize":{"message":"\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437."},"description_connect":{"message":"\u041f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443\" \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430."},"description_home":{"message":"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f (Opt\u00a0+\u00a0Ctrl\u00a0+\u00a0Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f (Ctrl + Alt + Esc)"},"disconnect_myself_button":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"disconnect_other_button":{"message":"\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"error_authentication_failed":{"message":"\u0421\u0431\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0412\u044b\u0439\u0434\u0438\u0442\u0435 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome\" \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_bad_plugin_version":{"message":"\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_generic":{"message":"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b\u0439\u0434\u0438\u0442\u0435 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome\" \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_host_is_offline":{"message":"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043b\u0438 \u043e\u043d \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_incompatible_protocol":{"message":"\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Chrome, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_invalid_access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_missing_plugin":{"message":"\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 Chrome, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443."},"error_no_response":{"message":"\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441."},"error_service_unavailable":{"message":"\u0421\u043b\u0443\u0436\u0431\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435."},"error_unexpected":{"message":"\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c."},"footer_waiting":{"message":"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435..."},"help":{"message":"\u0421\u043f\u0440\u0430\u0432\u043a\u0430"},"home_access_button":{"message":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f"},"home_access_description":{"message":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443."},"home_my_computers_title":{"message":"\u041c\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440"},"home_share_button":{"message":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443"},"home_share_description":{"message":"\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e."},"home_share_description_chrome_os":{"message":"(\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 Chromebooks. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438.)"},"instructions_share_above":{"message":"\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u043e\u043b\u0443, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u0435\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434."},"instructions_share_below":{"message":"\u0421\u0435\u0430\u043d\u0441 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430."},"label_connected":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e:"},"message_connecting":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435..."},"message_generating":{"message":"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430..."},"message_session_finished":{"message":"\u0421\u0435\u0430\u043d\u0441 \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Chrome \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d."},"message_shared":{"message":"\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u043e\u043b\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f"},"mode_connect":{"message":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f"},"mode_share":{"message":"\u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f"},"offline":{"message":"\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e"},"ok":{"message":"\u041e\u041a"},"product_description":{"message":"\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0447\u0443\u0436\u0438\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c \u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"product_name":{"message":"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Chrome"},"sign_out_button":{"message":"\u0412\u044b\u0439\u0442\u0438"},"stop_sharing_button":{"message":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f"},"tooltip_scaling":{"message":"\u041f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u043e\u043a\u043d\u0430"},"warning_nat_disabled":{"message":"\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438."}} diff --git a/remoting/webapp/me2mom/_locales.official/sk/messages.json b/remoting/webapp/me2mom/_locales.official/sk/messages.json deleted file mode 100644 index a4b8caa..0000000 --- a/remoting/webapp/me2mom/_locales.official/sk/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Pr\u00edstupov\u00fd k\u00f3d"},"access_code_timer":{"message":"Platnos\u0165 pr\u00edstupov\u00e9ho k\u00f3du vypr\u0161\u00ed o $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Zru\u0161i\u0165"},"close_prompt":{"message":"Ak opust\u00edte t\u00fato str\u00e1nku, rel\u00e1cia Vzdialenej plochy Chrome sa ukon\u010d\u00ed."},"connect_button":{"message":"Pripoji\u0165"},"continue_button":{"message":"Pokra\u010dova\u0165"},"continue_prompt":{"message":"Moment\u00e1lne zdie\u013eate tento po\u010d\u00edta\u010d s in\u00fdm pou\u017e\u00edvate\u013eom. Chcete pokra\u010dova\u0165 v zdie\u013ean\u00ed?"},"description_authorize":{"message":"Ak chcete pou\u017e\u00edva\u0165 Vzdialen\u00fa plochu Chrome, mus\u00edte najprv udeli\u0165 roz\u0161\u00edren\u00e9 povolenia na pr\u00edstup k v\u00e1\u0161mu po\u010d\u00edta\u010du. Sta\u010d\u00ed to urobi\u0165 len raz."},"description_connect":{"message":"Po\u017eiadajte pou\u017e\u00edvate\u013ea, ku ktor\u00e9ho po\u010d\u00edta\u010du chcete pristupova\u0165, aby klikol na mo\u017enos\u0165 Zdie\u013ea\u0165 tento po\u010d\u00edta\u010d a poskytol v\u00e1m pr\u00edstupov\u00fd k\u00f3d."},"description_home":{"message":"Vzdialen\u00e1 plocha Chrome v\u00e1m umo\u017e\u0148uje bezpe\u010dne zdie\u013ea\u0165 v\u00e1\u0161 po\u010d\u00edta\u010d cez Internet. Obaja pou\u017e\u00edvatelia musia ma\u0165 spusten\u00fa aplik\u00e1ciu Vzdialen\u00e1 plocha Chrome, ktor\u00fa n\u00e1jdete na adrese $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Odpoji\u0165 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Odpoji\u0165 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Odpoji\u0165 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Odpoji\u0165"},"disconnect_other_button":{"message":"Odpoji\u0165"},"error_authentication_failed":{"message":"Overenie toto\u017enosti zlyhalo. Odhl\u00e1ste sa zo slu\u017eby Vzdialen\u00e1 plocha Chrome a sk\u00faste to znova."},"error_bad_plugin_version":{"message":"Niektor\u00e9 s\u00fa\u010dasti potrebn\u00e9 pre Vzdialen\u00fa plochu Chrome ch\u00fdbaj\u00fa. Uistite sa, \u017ee ste nain\u0161talovali najnov\u0161iu verziu a sk\u00faste to znova."},"error_generic":{"message":"Vyskytla sa nezn\u00e1ma chyba. Odhl\u00e1ste sa zo slu\u017eby Vzdialen\u00e1 plocha Chrome a sk\u00faste to znova."},"error_host_is_offline":{"message":"Vzdialen\u00fd po\u010d\u00edta\u010d nereaguje na \u017eiadosti o pripojenie. Skontrolujte, \u010di je online a sk\u00faste to znova."},"error_incompatible_protocol":{"message":"Bola zisten\u00e1 nekompatibiln\u00e1 verzia Vzdialenej plochy Chrome. Uistite sa, \u017ee m\u00e1te najnov\u0161iu verziu prehliada\u010da Google Chrome a Vzdialenej plochy Chrome na oboch po\u010d\u00edta\u010doch a sk\u00faste to znova."},"error_invalid_access_code":{"message":"Pr\u00edstupov\u00fd k\u00f3d je neplatn\u00fd. Sk\u00faste to znova."},"error_missing_plugin":{"message":"Niektor\u00e9 s\u00fa\u010dasti potrebn\u00e9 pre Vzdialen\u00fa plochu Chrome ch\u00fdbaj\u00fa. Uistite sa, \u017ee pou\u017e\u00edvate najnov\u0161iu verziu prehliada\u010da Google Chrome a sk\u00faste to znova."},"error_no_response":{"message":"Serveru sa nepodarilo odpoveda\u0165 na po\u017eiadavku siete."},"error_service_unavailable":{"message":"Slu\u017eba je do\u010dasne nedostupn\u00e1. Sk\u00faste to znova nesk\u00f4r."},"error_unexpected":{"message":"Vyskytla sa neo\u010dak\u00e1van\u00e1 chyba. Nahl\u00e1ste tento probl\u00e9m v\u00fdvoj\u00e1rom."},"footer_waiting":{"message":"\u010dak\u00e1 sa na pripojenie..."},"help":{"message":"Pomocn\u00edk"},"home_access_button":{"message":"Prist\u00fapi\u0165"},"home_access_description":{"message":"Zobrazte a ovl\u00e1dajte zdie\u013ean\u00fd po\u010d\u00edta\u010d."},"home_my_computers_title":{"message":"Moje po\u010d\u00edta\u010de"},"home_share_button":{"message":"Zdie\u013ea\u0165"},"home_share_description":{"message":"Zdie\u013ea\u0165 tento po\u010d\u00edta\u010d, aby ho mohol in\u00fd pou\u017e\u00edvate\u013e zobrazi\u0165 a ovl\u00e1da\u0165."},"home_share_description_chrome_os":{"message":"(t\u00e1to funkcia nie je e\u0161te k dispoz\u00edcii pre Chromebooky... sledujte n\u00e1s aj na\u010falej)"},"instructions_share_above":{"message":"Ak chcete za\u010da\u0165 zdie\u013ea\u0165 svoju pracovn\u00fa plochu, poskytnite ni\u017e\u0161ie uveden\u00fd pr\u00edstupov\u00fd k\u00f3d osobe, ktor\u00e1 v\u00e1m bude pom\u00e1ha\u0165."},"instructions_share_below":{"message":"Va\u0161a rel\u00e1cia zdie\u013eania za\u010dne okam\u017eite po zadan\u00ed k\u00f3du."},"label_connected":{"message":"Pripojen\u00fd:"},"message_connecting":{"message":"Prebieha prip\u00e1janie..."},"message_generating":{"message":"Prebieha generovanie pr\u00edstupov\u00e9ho k\u00f3du..."},"message_session_finished":{"message":"Va\u0161a rel\u00e1cia Vzdialenej plochy Chrome bola ukon\u010den\u00e1."},"message_shared":{"message":"Va\u0161a pracovn\u00e1 plocha je moment\u00e1lne zdie\u013ean\u00e1 s pou\u017e\u00edvate\u013eom $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Autorizova\u0165"},"mode_connect":{"message":"Pripoji\u0165"},"mode_share":{"message":"Zdie\u013ea\u0165"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"Pristupujte k in\u00fdm po\u010d\u00edta\u010dom alebo umo\u017enite \u010fal\u0161iemu pou\u017e\u00edvate\u013eovi pristupova\u0165 k v\u00e1\u0161mu po\u010d\u00edta\u010du bezpe\u010dne cez Internet."},"product_name":{"message":"Vzdialen\u00e1 plocha Chrome"},"sign_out_button":{"message":"Odhl\u00e1si\u0165 sa"},"stop_sharing_button":{"message":"Presta\u0165 zdie\u013ea\u0165"},"tooltip_scaling":{"message":"Prisp\u00f4sobi\u0165 oknu"},"warning_nat_disabled":{"message":"Pozn\u00e1mka: Nastavenia pravidiel umo\u017e\u0148uj\u00fa pripojenie len medzi po\u010d\u00edta\u010dmi v r\u00e1mci va\u0161ej siete."}} diff --git a/remoting/webapp/me2mom/_locales.official/sl/messages.json b/remoting/webapp/me2mom/_locales.official/sl/messages.json deleted file mode 100644 index 1d64a78..0000000 --- a/remoting/webapp/me2mom/_locales.official/sl/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Koda za dostop"},"access_code_timer":{"message":"Ta koda za dostop bo potekla \u010dez $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Prekli\u010di"},"close_prompt":{"message":"\u010ce zapustite to stran, se bo seja oddaljenega namizja Chrome kon\u010dala."},"connect_button":{"message":"Vzpostavi povezavo"},"continue_button":{"message":"Nadaljuj"},"continue_prompt":{"message":"Trenutno delite to napravo z drugim uporabnikom. Ali \u017eelite nadaljevati s skupno rabo?"},"description_authorize":{"message":"\u010ce \u017eelite uporabljati oddaljeno namizje Chrome, morate odobriti raz\u0161irjena dovoljenja za dostop do ra\u010dunalnika. To morate storiti samo enkrat."},"description_connect":{"message":"Uporabnika ra\u010dunalnika, do katerega \u017eelite dostop, prosite, da klikne \u00bbDeli zdaj\u00ab in vam nato po\u0161lje kodo za dostop."},"description_home":{"message":"Oddaljeno namizje Chrome omogo\u010da, da varno delite ra\u010dunalnik v spletu. Oba uporabnika morata uporabljati program Oddaljeno namizje Chrome, ki ga najdete na $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Prekini povezavo (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Prekini povezavo (Ctrl + Alt + Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Prekini povezavo (Ctrl +Alt + Esc)"},"disconnect_myself_button":{"message":"Prekini povezavo"},"disconnect_other_button":{"message":"Prekini povezavo"},"error_authentication_failed":{"message":"Preverjanje pristnosti ni uspelo. Odjavite se iz oddaljenega namizja Chrome in poskusite znova."},"error_bad_plugin_version":{"message":"Ni nekaterih delov, ki so zahtevani za oddaljeno namizje Chrome. Preverite, ali imate najnovej\u0161o razli\u010dico Google Chroma in poskusite znova."},"error_generic":{"message":"Neznana napaka. Odjavite se iz oddaljenega namizja Chrome in poskusite znova."},"error_host_is_offline":{"message":"Oddaljeni ra\u010dunalnik se ne odziva na zahteve za povezavo. Preverite, ali ima vzpostavljeno povezavo, in poskusite znova."},"error_incompatible_protocol":{"message":"Zaznana je bila nezdru\u017eljiva razli\u010dica oddaljenega namizja Chrome. Preverite, ali imate v obeh ra\u010dunalnikih najnovej\u0161i razli\u010dici Google Chroma in oddaljenega namizja Chrome, ter poskusite znova."},"error_invalid_access_code":{"message":"Koda za dostop je neveljavna. Poskusite znova."},"error_missing_plugin":{"message":"Ni nekaterih delov, ki so zahtevani za oddaljeno namizje Chrome. Preverite, ali imate najnovej\u0161o razli\u010dico Google Chroma in poskusite znova."},"error_no_response":{"message":"Stre\u017enik se ni odzval na zahtevo omre\u017eja."},"error_service_unavailable":{"message":"Ta storitev za\u010dasno ni na voljo. Poskusite znova pozneje."},"error_unexpected":{"message":"Nepri\u010dakovana napaka. O tem obvestite razvijalce."},"footer_waiting":{"message":"\u010dakanje na povezavo ..."},"help":{"message":"Pomo\u010d"},"home_access_button":{"message":"Dostopajte zdaj"},"home_access_description":{"message":"Ogled in nadziranje ra\u010dunalnika v skupni rabi."},"home_my_computers_title":{"message":"Moji ra\u010dunalniki"},"home_share_button":{"message":"Deli zdaj"},"home_share_description":{"message":"Delite ta ra\u010dunalnik, ki ga lahko drug uporabnik vidi in nadzira."},"home_share_description_chrome_os":{"message":"(ta funkcija \u0161e ni na voljo za Chromebooke \u2026 preverite pozneje)"},"instructions_share_above":{"message":"\u010ce \u017eelite za\u010deti deliti namizje, po\u0161ljite spodnjo kodo za dostop osebi, ki vam bo pomagala."},"instructions_share_below":{"message":"Ko je koda vnesena, se seja skupne rabe za\u010dne."},"label_connected":{"message":"Povezava vzpostavljena:"},"message_connecting":{"message":"Vzpostavljanje povezave ..."},"message_generating":{"message":"Ustvarjanje kode za dostop ..."},"message_session_finished":{"message":"Seja oddaljenega namizja Chrome je kon\u010dana."},"message_shared":{"message":"Namizje trenutno delite z uporabnikom $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Dovoli"},"mode_connect":{"message":"Vzpostavi povezavo"},"mode_share":{"message":"Skupna raba"},"offline":{"message":"Brez povezave"},"ok":{"message":"V redu"},"product_description":{"message":"Dostopajte do drugih ra\u010dunalnikov ali omogo\u010dite drugemu uporabniku dostop do svojega ra\u010dunalnika varno po internetu."},"product_name":{"message":"Oddaljeno namizje Chrome"},"sign_out_button":{"message":"Odjava"},"stop_sharing_button":{"message":"Prekli\u010di skupno rabo"},"tooltip_scaling":{"message":"Prilagodi, da ustreza"},"warning_nat_disabled":{"message":"OPOMBA: Nastavitve na podlagi pravilnika dovoljujejo povezave samo med ra\u010dunalniki v va\u0161em omre\u017eju."}} diff --git a/remoting/webapp/me2mom/_locales.official/sr/messages.json b/remoting/webapp/me2mom/_locales.official/sr/messages.json deleted file mode 100644 index c6ce164..0000000 --- a/remoting/webapp/me2mom/_locales.official/sr/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434"},"access_code_timer":{"message":"\u041e\u0432\u0430\u0458 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434 \u045b\u0435 \u0438\u0441\u0442\u0435\u045b\u0438 \u0437\u0430 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u041e\u0442\u043a\u0430\u0436\u0438"},"close_prompt":{"message":"\u041d\u0430\u043f\u0443\u0448\u0442\u0430\u045a\u0435\u043c \u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0437\u0430\u0432\u0440\u0448\u0438\u045b\u0435\u0442\u0435 \u0441\u0435\u0441\u0438\u0458\u0443 Chrome Remote Desktop-\u0430."},"connect_button":{"message":"\u041f\u043e\u0432\u0435\u0436\u0438"},"continue_button":{"message":"\u041d\u0430\u0441\u0442\u0430\u0432\u0438"},"continue_prompt":{"message":"\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u0443\u0440\u0435\u0452\u0430\u0458 \u0441\u0430 \u0458\u043e\u0448 \u0458\u0435\u0434\u043d\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c. \u0414\u0430 \u043b\u0438 \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 \u043d\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0434\u0435\u0459\u0435\u045a\u0435?"},"description_authorize":{"message":"\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u043b\u0438 Chrome Remote Desktop, \u043c\u043e\u0440\u0430\u0442\u0435 \u0434\u0430 \u043e\u0434\u043e\u0431\u0440\u0438\u0442\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0435 \u0437\u0430 \u0448\u0438\u0440\u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443. \u0422\u043e \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0443\u0440\u0430\u0434\u0438\u0442\u0435 \u0441\u0430\u043c\u043e \u0458\u0435\u0434\u0430\u043d\u043f\u0443\u0442."},"description_connect":{"message":"\u0417\u0430\u0442\u0440\u0430\u0436\u0438\u0442\u0435 \u043e\u0434 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 \u0447\u0438\u0458\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443 \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u0435 \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435 \u043d\u0430 \u201e\u0414\u0435\u043b\u0438 \u043e\u0434\u043c\u0430\u0445\u201c \u0438 \u0434\u0430 \u0432\u0430\u043c \u0434\u0430 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434."},"description_home":{"message":"Chrome Remote Desktop \u0432\u0430\u043c \u043e\u043c\u043e\u0433\u0443\u045b\u0430\u0432\u0430 \u0434\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0435 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u043d\u0430 \u0412\u0435\u0431\u0443. \u041f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435 \u0434\u0430 \u043e\u0431\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 \u043f\u043e\u043a\u0440\u0435\u043d\u0443 \u0430\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0458\u0443 Chrome Remote Desktop \u043a\u043e\u0458\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043d\u0430\u0452\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0438 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443"},"disconnect_other_button":{"message":"\u041f\u0440\u0435\u043a\u0438\u043d\u0438 \u0432\u0435\u0437\u0443"},"error_authentication_failed":{"message":"\u041f\u043e\u0442\u0432\u0440\u0434\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043b\u0430. \u041e\u0434\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435 \u0438\u0437 Chrome Remote Desktop-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_bad_plugin_version":{"message":"\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0443 \u043d\u0435\u043a\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u043a\u043e\u0458\u0435 \u0441\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0435 \u0437\u0430 Chrome Remote Desktop. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u0441\u0442\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043b\u0438 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_generic":{"message":"\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u043d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u0435 \u0433\u0440\u0435\u0448\u043a\u0435. \u041e\u0434\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435 \u0438\u0437 Chrome Remote Desktop-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_host_is_offline":{"message":"\u0423\u0434\u0430\u0459\u0435\u043d\u0438 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u043d\u0435 \u043e\u0434\u0433\u043e\u0432\u0430\u0440\u0430 \u043d\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0435 \u0437\u0430 \u043f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u0458\u0435 \u043d\u0430 \u043c\u0440\u0435\u0436\u0438 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_incompatible_protocol":{"message":"\u041e\u0442\u043a\u0440\u0438\u0432\u0435\u043d\u0430 \u0458\u0435 \u043d\u0435\u043a\u043e\u043c\u043f\u0430\u0442\u0438\u0431\u0438\u043b\u043d\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Chrome Remote Desktop-\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u043d\u0430 \u043e\u0431\u0430 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0430 \u0438\u043c\u0430\u0442\u0435 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Google Chrome-\u0430 \u0438 Chrome Remote Desktop-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_invalid_access_code":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434 \u0458\u0435 \u043d\u0435\u0432\u0430\u0436\u0435\u045b\u0438. \u041f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_missing_plugin":{"message":"\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0443 \u043d\u0435\u043a\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u043a\u043e\u0458\u0435 \u0441\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0435 \u0437\u0430 Chrome Remote Desktop. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043b\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Google Chrome-\u0430 \u0438 \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e."},"error_no_response":{"message":"\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043e \u0434\u0430 \u043e\u0434\u0433\u043e\u0432\u043e\u0440\u0438 \u043d\u0430 \u0437\u0430\u0445\u0442\u0435\u0432 \u043c\u0440\u0435\u0436\u0435."},"error_service_unavailable":{"message":"\u0423\u0441\u043b\u0443\u0433\u0430 \u0458\u0435 \u043f\u0440\u0438\u0432\u0440\u0435\u043c\u0435\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430. \u041f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u043d\u043e\u0432\u043e \u043a\u0430\u0441\u043d\u0438\u0458\u0435."},"error_unexpected":{"message":"\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u043d\u0435\u043e\u0447\u0435\u043a\u0438\u0432\u0430\u043d\u0435 \u0433\u0440\u0435\u0448\u043a\u0435. \u041f\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0435\u0440\u0438\u043c\u0430."},"footer_waiting":{"message":"\u0447\u0435\u043a\u0430 \u0441\u0435 \u0443\u0441\u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0430\u045a\u0435 \u0432\u0435\u0437\u0435\u2026"},"help":{"message":"\u041f\u043e\u043c\u043e\u045b"},"home_access_button":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438 \u043e\u0434\u043c\u0430\u0445"},"home_access_description":{"message":"\u041f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0458\u0442\u0435 \u0434\u0435\u0459\u0435\u043d\u0438 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u0438 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u0458\u0442\u0435 \u045a\u0438\u043c\u0435."},"home_my_computers_title":{"message":"\u041c\u043e\u0458\u0438 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0438"},"home_share_button":{"message":"\u0414\u0435\u043b\u0438 \u043e\u0434\u043c\u0430\u0445"},"home_share_description":{"message":"\u0414\u0435\u043b\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u0440\u0430\u0447\u0443\u043d\u0430\u0440 \u0434\u0430 \u0431\u0438 \u0434\u0440\u0443\u0433\u0438 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a \u043c\u043e\u0433\u0430\u043e \u0434\u0430 \u0433\u0430 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u0459\u0430 \u045a\u0438\u043c\u0435."},"home_share_description_chrome_os":{"message":"(\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0458\u0430 \u0458\u043e\u0448 \u0443\u0432\u0435\u043a \u043d\u0438\u0458\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0437\u0430 Chromebook-\u043e\u0432\u0435\u2026 \u043f\u0440\u0430\u0442\u0438\u0442\u0435 \u0440\u0430\u0437\u0432\u043e\u0458 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0458\u0435)"},"instructions_share_above":{"message":"\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u043f\u043e\u0447\u0435\u043b\u0438 \u0434\u0430 \u0434\u0435\u043b\u0438\u0442\u0435 \u0440\u0430\u0447\u0443\u043d\u0430\u0440, \u0443 \u043d\u0430\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u0430\u0458\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u0438 \u043a\u00f4\u0434 \u043e\u0441\u043e\u0431\u0438 \u043a\u043e\u0458\u0430 \u045b\u0435 \u0432\u0430\u043c \u043f\u043e\u043c\u0430\u0433\u0430\u0442\u0438."},"instructions_share_below":{"message":"\u041a\u0430\u0434\u0430 \u0443\u043d\u0435\u0441\u0435 \u043a\u00f4\u0434, \u043f\u043e\u0447\u0435\u045b\u0435 \u0441\u0435\u0441\u0438\u0458\u0430 \u0434\u0435\u0459\u0435\u045a\u0430."},"label_connected":{"message":"\u041f\u043e\u0432\u0435\u0437\u0430\u043d \u0441\u0430:"},"message_connecting":{"message":"\u041f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0435\u2026"},"message_generating":{"message":"\u0413\u0435\u043d\u0435\u0440\u0438\u0441\u0430\u045a\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u043d\u043e\u0433 \u043a\u043e\u0434\u0430\u2026"},"message_session_finished":{"message":"\u0421\u0435\u0441\u0438\u0458\u0430 Chrome Remote Desktop-\u0430 \u0458\u0435 \u0437\u0430\u0432\u0440\u0448\u0435\u043d\u0430."},"message_shared":{"message":"\u0420\u0430\u045b\u0443\u043d\u0430\u0440 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0435 \u0441\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u041e\u0432\u043b\u0430\u0441\u0442\u0438"},"mode_connect":{"message":"\u041f\u043e\u0432\u0435\u0436\u0438"},"mode_share":{"message":"\u0414\u0435\u0459\u0435\u045a\u0435"},"offline":{"message":"\u0412\u0430\u043d \u043c\u0440\u0435\u0436\u0435"},"ok":{"message":"\u041f\u043e\u0442\u0432\u0440\u0434\u0438"},"product_description":{"message":"\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0438\u043c\u0430 \u0438\u043b\u0438 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u043c\u0430 \u0434\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0458\u0443 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443 \u043f\u0440\u0435\u043a\u043e \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u041e\u0434\u0458\u0430\u0432\u0438 \u043c\u0435"},"stop_sharing_button":{"message":"\u0417\u0430\u0443\u0441\u0442\u0430\u0432\u0438 \u0434\u0435\u0459\u0435\u045a\u0435"},"tooltip_scaling":{"message":"\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0443\u043a\u043b\u043e\u043f\u0438\u043b\u043e"},"warning_nat_disabled":{"message":"\u041d\u0410\u041f\u041e\u041c\u0415\u041d\u0410: \u041f\u043e\u0434\u0435\u0448\u0430\u0432\u0430\u045a\u0430 \u0441\u043c\u0435\u0440\u043d\u0438\u0446\u0430 \u0434\u043e\u0437\u0432\u043e\u0459\u0430\u0432\u0430\u0458\u0443 \u0432\u0435\u0437\u0435 \u0441\u0430\u043c\u043e \u0438\u0437\u043c\u0435\u0452\u0443 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0430 \u0443 \u043e\u043a\u0432\u0438\u0440\u0443 \u0432\u0430\u0448\u0435 \u043c\u0440\u0435\u0436\u0435."}} diff --git a/remoting/webapp/me2mom/_locales.official/sv/messages.json b/remoting/webapp/me2mom/_locales.official/sv/messages.json deleted file mode 100644 index fdc4d77..0000000 --- a/remoting/webapp/me2mom/_locales.official/sv/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u00c5tkomstkod"},"access_code_timer":{"message":"\u00c5tkomstkoden upph\u00f6r att g\u00e4lla om $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"Avbryt"},"close_prompt":{"message":"Om du l\u00e4mnar sidan avslutas sessionen i Chrome Remote Desktop."},"connect_button":{"message":"Anslut"},"continue_button":{"message":"Forts\u00e4tt"},"continue_prompt":{"message":"Du delar nu den h\u00e4r datorn med en annan anv\u00e4ndare. Vill du forts\u00e4tta att dela?"},"description_authorize":{"message":"Om du vill anv\u00e4nda Chrome Remote Desktop m\u00e5ste du bevilja ut\u00f6kad \u00e5tkomstbeh\u00f6righet till datorn. Du beh\u00f6ver bara g\u00f6ra det en g\u00e5ng."},"description_connect":{"message":"Be anv\u00e4ndaren vars dator du vill f\u00e5 tillg\u00e5ng till att klicka p\u00e5 l\u00e4nken Dela nu och ge dig \u00e5tkomstkoden."},"description_home":{"message":"Med Chrome Remote Desktop kan du dela din dator via Internet p\u00e5 ett s\u00e4kert s\u00e4tt. B\u00e5da anv\u00e4ndarna m\u00e5ste k\u00f6ra appen Chrome Remote Desktop som du hittar p\u00e5 $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Koppla fr\u00e5n (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Koppla fr\u00e5n (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Koppla fr\u00e5n (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Koppla fr\u00e5n"},"disconnect_other_button":{"message":"Koppla fr\u00e5n"},"error_authentication_failed":{"message":"Det gick inte att autentisera. Logga ut fr\u00e5n Chrome Remote Desktop och f\u00f6rs\u00f6k igen."},"error_bad_plugin_version":{"message":"Vissa komponenter som kr\u00e4vs f\u00f6r Chrome Remote Desktop saknas. Kontrollera att du har installerat den senaste versionen och f\u00f6rs\u00f6k igen."},"error_generic":{"message":"Ett ok\u00e4nt fel uppstod. Logga ut fr\u00e5n Chrome Remote Desktop och f\u00f6rs\u00f6k igen."},"error_host_is_offline":{"message":"Fj\u00e4rrdatorn svarar inte p\u00e5 anslutningsbeg\u00e4ran. Kontrollera att den \u00e4r ansluten till Internet och f\u00f6rs\u00f6k igen."},"error_incompatible_protocol":{"message":"Du anv\u00e4nder en inkompatibel version av Chrome Remote Desktop. Se till att den senaste versionen av Google Chrome och Chrome Remote Desktop har installerats p\u00e5 b\u00e5da datorerna och f\u00f6rs\u00f6k igen."},"error_invalid_access_code":{"message":"Koden \u00e4r ogiltig. F\u00f6rs\u00f6k igen."},"error_missing_plugin":{"message":"Vissa komponenter som kr\u00e4vs f\u00f6r Chrome Remote Desktop saknas. Kontrollera att du anv\u00e4nder den senaste versionen av Google Chrome och f\u00f6rs\u00f6k igen."},"error_no_response":{"message":"Servern kunde inte svara p\u00e5 n\u00e4tverkets beg\u00e4ran."},"error_service_unavailable":{"message":"Tj\u00e4nsten \u00e4r inte tillg\u00e4nglig f\u00f6r n\u00e4rvarande. F\u00f6rs\u00f6k igen senare."},"error_unexpected":{"message":"Ett ov\u00e4ntat fel uppstod. Rapportera problemet till utvecklarna."},"footer_waiting":{"message":"v\u00e4ntar p\u00e5 anslutning ..."},"help":{"message":"Hj\u00e4lp"},"home_access_button":{"message":"F\u00e5 \u00e5tkomst nu"},"home_access_description":{"message":"Visa och styra en delad dator."},"home_my_computers_title":{"message":"Mina datorer"},"home_share_button":{"message":"Dela nu"},"home_share_description":{"message":"Dela den h\u00e4r datorn s\u00e5 att en annan anv\u00e4ndare kan visa och styra den."},"home_share_description_chrome_os":{"message":"(funktionen \u00e4r \u00e4nnu inte tillg\u00e4ngligt f\u00f6r Chromebooks ... h\u00e5ll utkik)"},"instructions_share_above":{"message":"Om du vill dela ditt skrivbord ger du \u00e5tkomstkoden nedan till den som ska hj\u00e4lpa dig."},"instructions_share_below":{"message":"N\u00e4r koden anges startar delningssessionen."},"label_connected":{"message":"Ansluten:"},"message_connecting":{"message":"Ansluter ..."},"message_generating":{"message":"\u00c5tkomstkod genereras ..."},"message_session_finished":{"message":"Chrome Remote Desktop-sessionen har avslutats."},"message_shared":{"message":"Ditt skrivbord delas just nu med $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Auktorisera"},"mode_connect":{"message":"Anslut"},"mode_share":{"message":"Dela"},"offline":{"message":"Offline"},"ok":{"message":"OK"},"product_description":{"message":"F\u00e5 \u00e5tkomst till andra datorer eller ge andra \u00e5tkomst till din dator \u00f6ver Internet p\u00e5 ett s\u00e4kert s\u00e4tt."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"Logga ut"},"stop_sharing_button":{"message":"Sluta dela"},"tooltip_scaling":{"message":"Anpassa"},"warning_nat_disabled":{"message":"OBS! Enligt policyinst\u00e4llningarna till\u00e5ts endast anslutning mellan datorer i ditt n\u00e4tverk."}} diff --git a/remoting/webapp/me2mom/_locales.official/th/messages.json b/remoting/webapp/me2mom/_locales.official/th/messages.json deleted file mode 100644 index 5f26b03..0000000 --- a/remoting/webapp/me2mom/_locales.official/th/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07"},"access_code_timer":{"message":"\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e19\u0e35\u0e49\u0e08\u0e30\u0e2b\u0e21\u0e14\u0e2d\u0e32\u0e22\u0e38\u0e43\u0e19\u0e2d\u0e35\u0e01 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01"},"close_prompt":{"message":"\u0e01\u0e32\u0e23\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e19\u0e35\u0e49\u0e08\u0e30\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Chrome Remote Desktop \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13"},"connect_button":{"message":"\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"continue_button":{"message":"\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d"},"continue_prompt":{"message":"\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49\u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49\u0e01\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e37\u0e48\u0e19 \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48"},"description_authorize":{"message":"\u0e43\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 Chrome Remote Desktop \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e04\u0e38\u0e13\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e40\u0e0a\u0e48\u0e19\u0e19\u0e35\u0e49\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27"},"description_connect":{"message":"\u0e02\u0e2d\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e40\u0e02\u0e32\u0e04\u0e25\u0e34\u0e01\u0e17\u0e35\u0e48 \"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e19\u0e35\u0e49\" \u0e41\u0e25\u0e30\u0e43\u0e2b\u0e49\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e41\u0e01\u0e48\u0e04\u0e38\u0e13"},"description_home":{"message":"Chrome Remote Desktop \u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e27\u0e47\u0e1a\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22 \u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2a\u0e2d\u0e07\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e41\u0e2d\u0e1b\u0e1e\u0e25\u0e34\u0e40\u0e04\u0e0a\u0e31\u0e19 Chrome Remote Desktop \u0e0b\u0e36\u0e48\u0e07\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e23\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e17\u0e35\u0e48 $1","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"disconnect_other_button":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"error_authentication_failed":{"message":"\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e42\u0e1b\u0e23\u0e14\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e30\u0e1a\u0e1a Chrome Remote Desktop \u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_bad_plugin_version":{"message":"\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e17\u0e35\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e1a\u0e32\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a Chrome Remote Desktop \u0e02\u0e32\u0e14\u0e2b\u0e32\u0e22\u0e44\u0e1b \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e23\u0e38\u0e48\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_generic":{"message":"\u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e17\u0e23\u0e32\u0e1a\u0e2a\u0e32\u0e40\u0e2b\u0e15\u0e38 \u0e42\u0e1b\u0e23\u0e14\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e30\u0e1a\u0e1a Chrome Remote Desktop \u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_host_is_offline":{"message":"\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e23\u0e30\u0e22\u0e30\u0e44\u0e01\u0e25\u0e44\u0e21\u0e48\u0e15\u0e2d\u0e1a\u0e2a\u0e19\u0e2d\u0e07\u0e04\u0e33\u0e02\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e27\u0e48\u0e32\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e14\u0e31\u0e07\u0e01\u0e25\u0e48\u0e32\u0e27\u0e2d\u0e2d\u0e19\u0e44\u0e25\u0e19\u0e4c\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_incompatible_protocol":{"message":"\u0e15\u0e23\u0e27\u0e08\u0e1e\u0e1a\u0e23\u0e38\u0e48\u0e19\u0e17\u0e35\u0e48\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e19\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e02\u0e2d\u0e07 Chrome Remote Desktop \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e21\u0e35 Google Chrome \u0e41\u0e25\u0e30 Chrome Remote Desktop \u0e23\u0e38\u0e48\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e1a\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2a\u0e2d\u0e07\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_invalid_access_code":{"message":"\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07 \u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_missing_plugin":{"message":"\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e17\u0e35\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e1a\u0e32\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a Chrome Remote Desktop \u0e02\u0e32\u0e14\u0e2b\u0e32\u0e22\u0e44\u0e1b \u0e42\u0e1b\u0e23\u0e14\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e41\u0e19\u0e48\u0e43\u0e08\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e43\u0e0a\u0e49 Google Chrome \u0e23\u0e38\u0e48\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27\u0e41\u0e25\u0e30\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07"},"error_no_response":{"message":"\u0e40\u0e0b\u0e34\u0e23\u0e4c\u0e1f\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e15\u0e2d\u0e1a\u0e2a\u0e19\u0e2d\u0e07\u0e04\u0e33\u0e02\u0e2d\u0e02\u0e2d\u0e07\u0e40\u0e04\u0e23\u0e37\u0e2d\u0e02\u0e48\u0e32\u0e22"},"error_service_unavailable":{"message":"\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49\u0e44\u0e14\u0e49\u0e43\u0e19\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49 \u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e43\u0e19\u0e20\u0e32\u0e22\u0e2b\u0e25\u0e31\u0e07"},"error_unexpected":{"message":"\u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e04\u0e32\u0e14\u0e04\u0e34\u0e14 \u0e42\u0e1b\u0e23\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e1e\u0e31\u0e12\u0e19\u0e32\u0e0b\u0e2d\u0e1f\u0e15\u0e4c\u0e41\u0e27\u0e23\u0e4c\u0e17\u0e23\u0e32\u0e1a"},"footer_waiting":{"message":"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e23\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d..."},"help":{"message":"\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d"},"home_access_button":{"message":"\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e19\u0e35\u0e49"},"home_access_description":{"message":"\u0e40\u0e2b\u0e47\u0e19\u0e41\u0e25\u0e30\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e01\u0e31\u0e19"},"home_my_computers_title":{"message":"\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e09\u0e31\u0e19"},"home_share_button":{"message":"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e19\u0e35\u0e49"},"home_share_description":{"message":"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e19\u0e35\u0e49\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e37\u0e48\u0e19\u0e40\u0e2b\u0e47\u0e19\u0e41\u0e25\u0e30\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e44\u0e14\u0e49"},"home_share_description_chrome_os":{"message":"(\u0e04\u0e38\u0e13\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30\u0e19\u0e35\u0e49\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e43\u0e19 Chromebook... \u0e42\u0e1b\u0e23\u0e14\u0e04\u0e2d\u0e22\u0e15\u0e34\u0e14\u0e15\u0e32\u0e21)"},"instructions_share_above":{"message":"\u0e2b\u0e32\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e23\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e40\u0e14\u0e2a\u0e01\u0e4c\u0e17\u0e47\u0e2d\u0e1b\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e42\u0e1b\u0e23\u0e14\u0e43\u0e2b\u0e49\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e17\u0e35\u0e48\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u0e41\u0e01\u0e48\u0e1a\u0e38\u0e04\u0e04\u0e25\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e2b\u0e49\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e04\u0e38\u0e13"},"instructions_share_below":{"message":"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1e\u0e27\u0e01\u0e40\u0e02\u0e32\u0e1b\u0e49\u0e2d\u0e19\u0e23\u0e2b\u0e31\u0e2a\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e08\u0e30\u0e40\u0e23\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19"},"label_connected":{"message":"\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e41\u0e25\u0e49\u0e27:"},"message_connecting":{"message":"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u2026"},"message_generating":{"message":"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e23\u0e2b\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07..."},"message_session_finished":{"message":"\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Chrome Remote Desktop \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27"},"message_shared":{"message":"\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49\u0e40\u0e14\u0e2a\u0e01\u0e4c\u0e17\u0e47\u0e2d\u0e1b\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e21\u0e35\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e01\u0e31\u0e1a $1","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15"},"mode_connect":{"message":"\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d"},"mode_share":{"message":"\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19"},"offline":{"message":"\u0e2d\u0e2d\u0e1f\u0e44\u0e25\u0e19\u0e4c"},"ok":{"message":"\u0e15\u0e01\u0e25\u0e07"},"product_description":{"message":"\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e37\u0e48\u0e19\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22\u0e1c\u0e48\u0e32\u0e19\u0e17\u0e32\u0e07\u0e2d\u0e34\u0e19\u0e40\u0e17\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e47\u0e15"},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e30\u0e1a\u0e1a"},"stop_sharing_button":{"message":"\u0e2b\u0e22\u0e38\u0e14\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19"},"tooltip_scaling":{"message":"\u0e1b\u0e23\u0e31\u0e1a\u0e02\u0e19\u0e32\u0e14\u0e43\u0e2b\u0e49\u0e1e\u0e2d\u0e14\u0e35"},"warning_nat_disabled":{"message":"\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38: \u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e19\u0e42\u0e22\u0e1a\u0e32\u0e22\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e20\u0e32\u0e22\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e2d\u0e02\u0e48\u0e32\u0e22\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19"}} diff --git a/remoting/webapp/me2mom/_locales.official/tr/messages.json b/remoting/webapp/me2mom/_locales.official/tr/messages.json deleted file mode 100644 index a972025..0000000 --- a/remoting/webapp/me2mom/_locales.official/tr/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"Eri\u015fim kodu"},"access_code_timer":{"message":"Bu eri\u015fim kodunun s\u00fcresi $1 saniye i\u00e7inde sona erecek","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0130ptal"},"close_prompt":{"message":"Bu sayfadan ayr\u0131l\u0131rsan\u0131z Chrome Uzaktan Masa\u00fcst\u00fc oturumunuz sonlan\u0131r."},"connect_button":{"message":"Ba\u011flan"},"continue_button":{"message":"Devam"},"continue_prompt":{"message":"Bu makineyi \u015fu anda ba\u015fka bir kullan\u0131c\u0131yla payla\u015f\u0131yorsunuz. Payla\u015fmaya devam etmek istiyor musunuz?"},"description_authorize":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131n\u0131 kullanabilmek i\u00e7in \u00f6ncelikle, bilgisayar\u0131n\u0131za geni\u015fletilmi\u015f eri\u015fim izinleri vermelisiniz. Bunu yaln\u0131zca bir kez yapman\u0131z gerekir."},"description_connect":{"message":"Bilgisayar\u0131na eri\u015fmek istedi\u011finiz kullan\u0131c\u0131dan, '\u015eimdi Payla\u015f' se\u00e7ene\u011fini t\u0131klamas\u0131n\u0131 ve size eri\u015fim kodunu vermesini isteyin."},"description_home":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc, bilgisayar\u0131n\u0131z\u0131 Web \u00fczerinden g\u00fcvenli bir \u015fekilde payla\u015fabilmenize olanak sa\u011flar. Her iki kullan\u0131c\u0131n\u0131n da Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131yor olmas\u0131 gerekir. Uygulamay\u0131 $1 adresinde bulabilirsiniz.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Ba\u011flant\u0131y\u0131 Kes (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Ba\u011flant\u0131y\u0131 Kes (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Ba\u011flant\u0131y\u0131 Kes (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Ba\u011flant\u0131y\u0131 Kes"},"disconnect_other_button":{"message":"Ba\u011flant\u0131y\u0131 Kes"},"error_authentication_failed":{"message":"Kimlik do\u011frulama ba\u015far\u0131s\u0131z oldu. L\u00fctfen Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131ndan \u00e7\u0131k\u0131\u015f yap\u0131n ve tekrar deneyin."},"error_bad_plugin_version":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc i\u00e7in gereken baz\u0131 bile\u015fenler eksik. L\u00fctfen son s\u00fcr\u00fcm\u00fc y\u00fckledi\u011finizden emin olun ve tekrar deneyin."},"error_generic":{"message":"Bilinmeyen bir hata olu\u015ftu. L\u00fctfen Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131ndan \u00e7\u0131k\u0131\u015f yap\u0131n ve tekrar deneyin."},"error_host_is_offline":{"message":"Uzaktan ba\u011flanaca\u011f\u0131n\u0131z bilgisayar, ba\u011flant\u0131 isteklerine yan\u0131t vermiyor. L\u00fctfen bu bilgisayar\u0131n \u00e7evrimi\u00e7i oldu\u011funu do\u011frulay\u0131n ve tekrar deneyin."},"error_incompatible_protocol":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc uygulamas\u0131n\u0131n uyumsuz bir s\u00fcr\u00fcm\u00fc alg\u0131land\u0131. L\u00fctfen, her iki bilgisayarda Google Chrome ve Chrome Uzaktan Masa\u00fcst\u00fc uygulamalar\u0131n\u0131n son s\u00fcr\u00fcmlerinin oldu\u011fundan emin olun ve tekrar deneyin."},"error_invalid_access_code":{"message":"Eri\u015fim kodu ge\u00e7ersiz. L\u00fctfen tekrar deneyin."},"error_missing_plugin":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc i\u00e7in gereken baz\u0131 bile\u015fenler eksik. L\u00fctfen Google Chrome'un son s\u00fcr\u00fcm\u00fcn\u00fc \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun ve tekrar deneyin."},"error_no_response":{"message":"Sunucu, a\u011f iste\u011fine yan\u0131t veremedi."},"error_service_unavailable":{"message":"Hizmet ge\u00e7ici olarak kullan\u0131lam\u0131yor. L\u00fctfen daha sonra tekrar deneyin."},"error_unexpected":{"message":"Beklenmeyen bir hata olu\u015ftu. L\u00fctfen bu sorunu geli\u015ftiricilere bildirin."},"footer_waiting":{"message":"ba\u011flant\u0131 bekleniyor..."},"help":{"message":"Yard\u0131m"},"home_access_button":{"message":"\u015eimdi Eri\u015f"},"home_access_description":{"message":"Payla\u015f\u0131lan bir bilgisayar\u0131 g\u00f6r\u00fcn ve denetleyin."},"home_my_computers_title":{"message":"Bilgisayarlar\u0131m"},"home_share_button":{"message":"\u015eimdi Payla\u015f"},"home_share_description":{"message":"Bu bilgisayar\u0131 ba\u015fka bir kullan\u0131c\u0131n\u0131n g\u00f6rmesi ve kontrol etmesi i\u00e7in payla\u015f\u0131n."},"home_share_description_chrome_os":{"message":"(bu \u00f6zellik hen\u00fcz Chromebook'larda kullan\u0131lm\u0131yor... bizi izlemeye devam edin)"},"instructions_share_above":{"message":"Masa\u00fcst\u00fcn\u00fcz\u00fc payla\u015fmaya ba\u015flamak i\u00e7in, size yard\u0131mc\u0131 olacak ki\u015fiye a\u015fa\u011f\u0131daki eri\u015fim kodunu verin."},"instructions_share_below":{"message":"Kullan\u0131c\u0131, kodu girdi\u011finde payla\u015f\u0131m oturumunuz ba\u015flar."},"label_connected":{"message":"Ba\u011fl\u0131:"},"message_connecting":{"message":"Ba\u011flan\u0131yor..."},"message_generating":{"message":"Eri\u015fim kodu olu\u015fturuluyor..."},"message_session_finished":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc oturumunuz sonland\u0131."},"message_shared":{"message":"Masa\u00fcst\u00fcn\u00fcz \u015fu anda $1 adl\u0131 kullan\u0131c\u0131yla payla\u015f\u0131l\u0131yor.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Yetkilendir"},"mode_connect":{"message":"Ba\u011flan"},"mode_share":{"message":"Payla\u015f"},"offline":{"message":"\u00c7evrimd\u0131\u015f\u0131"},"ok":{"message":"Tamam"},"product_description":{"message":"\u0130nternet \u00fczerinden g\u00fcvenli bir \u015fekilde di\u011fer bilgisayarlara eri\u015fin veya ba\u015fka kullan\u0131c\u0131lar\u0131n bilgisayar\u0131n\u0131za eri\u015fmesine izin verin."},"product_name":{"message":"Chrome Uzaktan Masa\u00fcst\u00fc"},"sign_out_button":{"message":"\u00c7\u0131k\u0131\u015f yap"},"stop_sharing_button":{"message":"Payla\u015fmay\u0131 Durdur"},"tooltip_scaling":{"message":"S\u0131\u011fd\u0131r"},"warning_nat_disabled":{"message":"NOT: Politika ayarlar\u0131, yaln\u0131zca a\u011f\u0131n\u0131zdaki bilgisayarlar aras\u0131ndaki ba\u011flant\u0131lara izin veriyor."}} diff --git a/remoting/webapp/me2mom/_locales.official/uk/messages.json b/remoting/webapp/me2mom/_locales.official/uk/messages.json deleted file mode 100644 index 68663b4..0000000 --- a/remoting/webapp/me2mom/_locales.official/uk/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443"},"access_code_timer":{"message":"\u0422\u0435\u0440\u043c\u0456\u043d \u0434\u0456\u0457 \u043a\u043e\u0434\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0437\u0430\u043a\u0456\u043d\u0447\u0443\u0454\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438"},"close_prompt":{"message":"\u042f\u043a\u0449\u043e \u0437\u0430\u043b\u0438\u0448\u0438\u0442\u0438 \u0446\u044e \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0443, \u0441\u0435\u0430\u043d\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0437\u0430\u043a\u0456\u043d\u0447\u0438\u0442\u044c\u0441\u044f."},"connect_button":{"message":"\u0417\u2019\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"},"continue_button":{"message":"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438"},"continue_prompt":{"message":"\u0417\u0430\u0440\u0430\u0437 \u0432\u0438 \u043d\u0430\u0434\u0430\u0454\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0456\u043d\u0448\u043e\u043c\u0443 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0443. \u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0441\u043f\u0456\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f?"},"description_authorize":{"message":"\u0429\u043e\u0431 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043e\u044e \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043d\u0430\u0434\u0430\u0442\u0438 \u0440\u043e\u0437\u0448\u0438\u0440\u0435\u043d\u0456 \u0434\u043e\u0437\u0432\u043e\u043b\u0438 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0432\u0430\u0448\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430. \u0426\u0435 \u0442\u0440\u0435\u0431\u0430 \u0437\u0440\u043e\u0431\u0438\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437."},"description_connect":{"message":"\u041f\u043e\u043f\u0440\u043e\u0441\u0456\u0442\u044c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430, \u0434\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u044f\u043a\u043e\u0433\u043e \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f, \u043d\u0430\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\", \u0430 \u043f\u043e\u0442\u0456\u043c \u0434\u0430\u0442\u0438 \u0432\u0430\u043c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443."},"description_home":{"message":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u0454 \u0431\u0435\u0437\u043f\u0435\u0447\u043d\u043e \u043d\u0430\u0434\u0430\u0432\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0406\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0412 \u043e\u0431\u043e\u0445 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432 \u043c\u0430\u0454 \u0431\u0443\u0442\u0438 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome, \u044f\u043a\u0443 \u043c\u043e\u0436\u043d\u0430 \u0437\u043d\u0430\u0439\u0442\u0438 \u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u044e $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"},"disconnect_other_button":{"message":"\u0412\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u0442\u0438"},"error_authentication_failed":{"message":"\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u0457. \u0412\u0438\u0439\u0434\u0456\u0442\u044c \u0456\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_bad_plugin_version":{"message":"\u0412\u0456\u0434\u0441\u0443\u0442\u043d\u0456 \u0434\u0435\u044f\u043a\u0456 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0456 \u0434\u043b\u044f \u0440\u043e\u0431\u043e\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0443 \u0432\u0435\u0440\u0441\u0456\u044e, \u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_generic":{"message":"\u0421\u0442\u0430\u043b\u0430\u0441\u044f \u043d\u0435\u0432\u0456\u0434\u043e\u043c\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430. \u0412\u0438\u0439\u0434\u0456\u0442\u044c \u0456\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_host_is_offline":{"message":"\u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440 \u043d\u0435 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0430\u0454 \u043d\u0430 \u0437\u0430\u043f\u0438\u0442\u0438 \u043d\u0430 \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u0432\u0456\u043d \u043f\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u043d\u0438\u0439 \u0434\u043e \u043c\u0435\u0440\u0435\u0436\u0456, \u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_incompatible_protocol":{"message":"\u0412\u0438\u044f\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u0443\u043c\u0456\u0441\u043d\u0443 \u0432\u0435\u0440\u0441\u0456\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u043d\u0430 \u043e\u0431\u043e\u0445 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430\u0445 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043d\u0456 \u0432\u0435\u0440\u0441\u0456\u0457 \u0432\u0435\u0431-\u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0430\u0447\u0430 Google Chrome \u0456 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome, \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_invalid_access_code":{"message":"\u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043d\u0435 \u0434\u0456\u0439\u0441\u043d\u0438\u0439. \u041f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_missing_plugin":{"message":"\u0412\u0456\u0434\u0441\u0443\u0442\u043d\u0456 \u0434\u0435\u044f\u043a\u0456 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0438, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0456 \u0434\u043b\u044f \u0440\u043e\u0431\u043e\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome. \u041f\u0435\u0440\u0435\u043a\u043e\u043d\u0430\u0439\u0442\u0435\u0441\u044f, \u0449\u043e \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0430 \u0432\u0435\u0440\u0441\u0456\u044f Google Chrome, \u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443."},"error_no_response":{"message":"\u0421\u0435\u0440\u0432\u0435\u0440\u0443 \u043d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0441\u0442\u0438 \u043d\u0430 \u0437\u0430\u043f\u0438\u0442 \u043c\u0435\u0440\u0435\u0436\u0456."},"error_service_unavailable":{"message":"\u0426\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u0442\u0438\u043c\u0447\u0430\u0441\u043e\u0432\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u0456\u0442\u044c \u0441\u043f\u0440\u043e\u0431\u0443 \u043f\u0456\u0437\u043d\u0456\u0448\u0435."},"error_unexpected":{"message":"\u0421\u0442\u0430\u043b\u0430\u0441\u044f \u043d\u0435\u043e\u0447\u0456\u043a\u0443\u0432\u0430\u043d\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430. \u041f\u043e\u0432\u0456\u0434\u043e\u043c\u0442\u0435 \u0440\u043e\u0437\u0440\u043e\u0431\u043d\u0438\u043a\u0430\u043c \u043f\u0440\u043e \u0446\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443."},"footer_waiting":{"message":"\u043e\u0447\u0456\u043a\u0443\u0432\u0430\u043d\u043d\u044f \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f..."},"help":{"message":"\u0414\u043e\u0432\u0456\u0434\u043a\u0430"},"home_access_button":{"message":"\u041e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u0440\u0430\u0437"},"home_access_description":{"message":"\u0412\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0442\u0430 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f \u043d\u0438\u043c."},"home_my_computers_title":{"message":"\u041c\u043e\u0457 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0438"},"home_share_button":{"message":"\u041d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f"},"home_share_description":{"message":"\u0414\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0438 \u0456\u043d\u0448\u043e\u043c\u0443 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u0432\u0456 \u0431\u0430\u0447\u0438\u0442\u0438 \u0446\u0435\u0439 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440 \u0456 \u043a\u0435\u0440\u0443\u0432\u0430\u0442\u0438 \u043d\u0438\u043c."},"home_share_description_chrome_os":{"message":"(\u0446\u044f \u0444\u0443\u043d\u043a\u0446\u0456\u044f \u0449\u0435 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f Chromebooks ... \u0441\u0442\u0435\u0436\u0442\u0435 \u0437\u0430 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f\u043c\u0438)"},"instructions_share_above":{"message":"\u0429\u043e\u0431 \u043d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430, \u0443\u043a\u0430\u0436\u0456\u0442\u044c \u043d\u0438\u0436\u0447\u0435 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043b\u044f \u043b\u044e\u0434\u0438\u043d\u0438, \u044f\u043a\u0430 \u0441\u043f\u0456\u0432\u043f\u0440\u0430\u0446\u044e\u0432\u0430\u0442\u0438\u043c\u0435 \u0437 \u0432\u0430\u043c\u0438."},"instructions_share_below":{"message":"\u041f\u0456\u0441\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043a\u043e\u0434\u0443 \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0435\u0442\u044c\u0441\u044f \u0441\u0435\u0430\u043d\u0441 \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0443."},"label_connected":{"message":"\u041f\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u043d\u043e:"},"message_connecting":{"message":"\u041f\u0456\u0434\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f..."},"message_generating":{"message":"\u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043a\u043e\u0434\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0443..."},"message_session_finished":{"message":"\u0421\u0435\u0430\u043d\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438 \u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome \u0437\u0430\u043a\u0456\u043d\u0447\u0435\u043d\u043e."},"message_shared":{"message":"\u0412\u0430\u0448 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440 \u0437\u0430\u0440\u0430\u0437 \u0443 \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0456 \u0437 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043c $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0456\u044f"},"mode_connect":{"message":"\u0417\u2019\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"},"mode_share":{"message":"\u041d\u0430\u0434\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f"},"offline":{"message":"\u041e\u0444\u043b\u0430\u0439\u043d"},"ok":{"message":"OK"},"product_description":{"message":"\u041e\u0442\u0440\u0438\u043c\u0443\u0439\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0456\u043d\u0448\u0438\u0445 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0456\u0432 \u0430\u0431\u043e \u043d\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0456\u043d\u0448\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043c \u0431\u0435\u0437\u043f\u0435\u0447\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0441\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0406\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"product_name":{"message":"\u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0435 \u043a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f Chrome"},"sign_out_button":{"message":"\u0412\u0438\u0439\u0442\u0438"},"stop_sharing_button":{"message":"\u041f\u0440\u0438\u043f\u0438\u043d\u0438\u0442\u0438 \u043d\u0430\u0434\u0430\u043d\u043d\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443"},"tooltip_scaling":{"message":"\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0437\u0430 \u0440\u043e\u0437\u043c\u0456\u0440\u043e\u043c"},"warning_nat_disabled":{"message":"\u041f\u0420\u0418\u041c\u0406\u0422\u041a\u0410. \u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043f\u043e\u043b\u0456\u0442\u0438\u043a\u0438 \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442\u044c \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u043b\u0438\u0448\u0435 \u0437 \u043a\u043e\u043c\u043f\u2019\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u0443 \u0432\u0430\u0448\u0456\u0439 \u043c\u0435\u0440\u0435\u0436\u0456."}} diff --git a/remoting/webapp/me2mom/_locales.official/vi/messages.json b/remoting/webapp/me2mom/_locales.official/vi/messages.json deleted file mode 100644 index 9e249bc..0000000 --- a/remoting/webapp/me2mom/_locales.official/vi/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"M\u00e3 truy c\u1eadp"},"access_code_timer":{"message":"M\u00e3 truy c\u1eadp n\u00e0y s\u1ebd h\u1ebft h\u1ea1n sau $1","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"H\u1ee7y"},"close_prompt":{"message":"Tho\u00e1t kh\u1ecfi trang n\u00e0y s\u1ebd k\u1ebft th\u00fac phi\u00ean Chrome Remote Desktop c\u1ee7a b\u1ea1n."},"connect_button":{"message":"K\u1ebft n\u1ed1i"},"continue_button":{"message":"Ti\u1ebfp t\u1ee5c"},"continue_prompt":{"message":"B\u1ea1n hi\u1ec7n \u0111ang chia s\u1ebb m\u00e1y n\u00e0y v\u1edbi m\u1ed9t ng\u01b0\u1eddi d\u00f9ng kh\u00e1c. B\u1ea1n c\u00f3 mu\u1ed1n ti\u1ebfp t\u1ee5c chia s\u1ebb kh\u00f4ng?"},"description_authorize":{"message":"\u0110\u1ec3 s\u1eed d\u1ee5ng Chrome Remote Desktop, b\u1ea1n ph\u1ea3i c\u1ea5p c\u00e1c quy\u1ec1n truy c\u1eadp m\u1edf r\u1ed9ng cho m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh. B\u1ea1n ch\u1ec9 ph\u1ea3i th\u1ef1c hi\u1ec7n vi\u1ec7c n\u00e0y m\u1ed9t l\u1ea7n."},"description_connect":{"message":"Y\u00eau c\u1ea7u ng\u01b0\u1eddi d\u00f9ng c\u00f3 m\u00e1y t\u00ednh m\u00e0 b\u1ea1n mu\u1ed1n truy c\u1eadp nh\u1ea5p v\u00e0o \u2018Chia s\u1ebb ngay b\u00e2y gi\u1edd\u2019 v\u00e0 cung c\u1ea5p cho b\u1ea1n m\u00e3 truy c\u1eadp."},"description_home":{"message":"Chrome Remote Desktop cho ph\u00e9p b\u1ea1n chia s\u1ebb m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh m\u1ed9t c\u00e1ch an to\u00e0n qua Web. C\u1ea3 hai ng\u01b0\u1eddi d\u00f9ng \u0111\u1ec1u ph\u1ea3i ch\u1ea1y \u1ee9ng d\u1ee5ng Chrome Remote Desktop m\u00e0 b\u1ea1n c\u00f3 th\u1ec3 t\u00ecm th\u1ea5y t\u1ea1i $1.","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i"},"disconnect_other_button":{"message":"Ng\u1eaft k\u1ebft n\u1ed1i"},"error_authentication_failed":{"message":"X\u00e1c th\u1ef1c kh\u00f4ng th\u00e0nh c\u00f4ng. Vui l\u00f2ng \u0111\u0103ng xu\u1ea5t kh\u1ecfi Chrome Remote Desktop v\u00e0 th\u1eed l\u1ea1i."},"error_bad_plugin_version":{"message":"Thi\u1ebfu m\u1ed9t s\u1ed1 th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft cho Chrome Remote Desktop. Vui l\u00f2ng \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n m\u1edbi nh\u1ea5t v\u00e0 th\u1eed l\u1ea1i."},"error_generic":{"message":"\u0110\u00e3 x\u1ea3y ra l\u1ed7i kh\u00f4ng x\u00e1c \u0111\u1ecbnh. Vui l\u00f2ng \u0111\u0103ng xu\u1ea5t kh\u1ecfi Chrome Remote Desktop v\u00e0 th\u1eed l\u1ea1i."},"error_host_is_offline":{"message":"M\u00e1y t\u00ednh t\u1eeb xa kh\u00f4ng ph\u1ea3n h\u1ed3i y\u00eau c\u1ea7u k\u1ebft n\u1ed1i. Vui l\u00f2ng x\u00e1c minh r\u1eb1ng m\u00e1y t\u00ednh \u0111ang tr\u1ef1c tuy\u1ebfn v\u00e0 th\u1eed l\u1ea1i."},"error_incompatible_protocol":{"message":"\u0110\u00e3 ph\u00e1t hi\u1ec7n ra phi\u00ean b\u1ea3n Chrome Remote Desktop kh\u00f4ng t\u01b0\u01a1ng th\u00edch. Vui l\u00f2ng \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n Google Chrome v\u00e0 Chrome Remote Desktop m\u1edbi nh\u1ea5t tr\u00ean c\u1ea3 hai m\u00e1y t\u00ednh v\u00e0 th\u1eed l\u1ea1i."},"error_invalid_access_code":{"message":"M\u00e3 truy c\u1eadp kh\u00f4ng h\u1ee3p l\u1ec7. Vui l\u00f2ng th\u1eed l\u1ea1i."},"error_missing_plugin":{"message":"Thi\u1ebfu m\u1ed9t s\u1ed1 th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft cho Chrome Remote Desktop. Vui l\u00f2ng \u0111\u1ea3m b\u1ea3o b\u1ea1n \u0111ang ch\u1ea1y phi\u00ean b\u1ea3n Google Chrome m\u1edbi nh\u1ea5t v\u00e0 th\u1eed l\u1ea1i."},"error_no_response":{"message":"M\u00e1y ch\u1ee7 kh\u00f4ng ph\u1ea3n h\u1ed3i y\u00eau c\u1ea7u m\u1ea1ng."},"error_service_unavailable":{"message":"D\u1ecbch v\u1ee5 t\u1ea1m th\u1eddi kh\u00f4ng kh\u1ea3 d\u1ee5ng. Vui l\u00f2ng th\u1eed l\u1ea1i sau."},"error_unexpected":{"message":"\u0110\u00e3 x\u1ea3y ra l\u1ed7i kh\u00f4ng mong mu\u1ed1n. Vui l\u00f2ng b\u00e1o c\u00e1o v\u1ea5n \u0111\u1ec1 n\u00e0y cho nh\u00e0 ph\u00e1t tri\u1ec3n."},"footer_waiting":{"message":"\u0111ang \u0111\u1ee3i k\u1ebft n\u1ed1i\u2026"},"help":{"message":"Tr\u1ee3 gi\u00fap"},"home_access_button":{"message":"Truy c\u1eadp ngay b\u00e2y gi\u1edd"},"home_access_description":{"message":"Xem v\u00e0 ki\u1ec3m so\u00e1t m\u00e1y t\u00ednh d\u00f9ng chung."},"home_my_computers_title":{"message":"M\u00e1y t\u00ednh c\u1ee7a t\u00f4i"},"home_share_button":{"message":"Chia s\u1ebb ngay b\u00e2y gi\u1edd"},"home_share_description":{"message":"Chia s\u1ebb m\u00e1y t\u00ednh n\u00e0y \u0111\u1ec3 ng\u01b0\u1eddi d\u00f9ng kh\u00e1c xem v\u00e0 ki\u1ec3m so\u00e1t."},"home_share_description_chrome_os":{"message":"(t\u00ednh n\u0103ng n\u00e0y ch\u01b0a kh\u1ea3 d\u1ee5ng \u0111\u1ed1i v\u1edbi Chromebook\u2026 h\u00e3y ch\u00fa \u00fd theo d\u00f5i)"},"instructions_share_above":{"message":"\u0110\u1ec3 b\u1eaft \u0111\u1ea7u chia s\u1ebb m\u00e1y t\u00ednh c\u1ee7a b\u1ea1n, h\u00e3y cung c\u1ea5p m\u00e3 truy c\u1eadp b\u00ean d\u01b0\u1edbi cho ng\u01b0\u1eddi s\u1ebd tr\u1ee3 gi\u00fap b\u1ea1n."},"instructions_share_below":{"message":"Sau khi h\u1ecd nh\u1eadp m\u00e3, phi\u00ean chia s\u1ebb c\u1ee7a b\u1ea1n s\u1ebd b\u1eaft \u0111\u1ea7u."},"label_connected":{"message":"\u0110\u00e3 k\u1ebft n\u1ed1i:"},"message_connecting":{"message":"\u0110ang k\u1ebft n\u1ed1i..."},"message_generating":{"message":"\u0110ang t\u1ea1o m\u00e3 truy c\u00e2\u0323p\u2026"},"message_session_finished":{"message":"Phi\u00ean Chrome Remote Desktop c\u1ee7a b\u1ea1n \u0111\u00e3 k\u1ebft th\u00fac."},"message_shared":{"message":"M\u00e1y t\u00ednh c\u1ee7a b\u1ea1n hi\u1ec7n \u0111ang \u0111\u01b0\u1ee3c chia s\u1ebb v\u1edbi $1.","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"Cho ph\u00e9p"},"mode_connect":{"message":"K\u1ebft n\u1ed1i"},"mode_share":{"message":"Chia s\u1ebb"},"offline":{"message":"Ngo\u1ea1i tuy\u1ebfn"},"ok":{"message":"OK"},"product_description":{"message":"Truy c\u1eadp m\u00e1y t\u00ednh kh\u00e1c ho\u1eb7c cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng kh\u00e1c truy c\u1eadp m\u00e1y t\u00ednh c\u1ee7a b\u1ea1n m\u1ed9t c\u00e1ch an to\u00e0n qua Internet."},"product_name":{"message":"Chrome Remote Desktop"},"sign_out_button":{"message":"\u0110\u0103ng xu\u1ea5t"},"stop_sharing_button":{"message":"Ng\u1eebng chia s\u1ebb"},"tooltip_scaling":{"message":"Ch\u1ec9nh t\u1ef7 l\u1ec7 cho v\u1eeba"},"warning_nat_disabled":{"message":"L\u01afU \u00dd: C\u00e0i \u0111\u1eb7t ch\u00ednh s\u00e1ch ch\u1ec9 cho ph\u00e9p k\u1ebft n\u1ed1i gi\u1eefa c\u00e1c m\u00e1y t\u00ednh trong m\u1ea1ng c\u1ee7a b\u1ea1n."}} diff --git a/remoting/webapp/me2mom/_locales.official/zh_CN/messages.json b/remoting/webapp/me2mom/_locales.official/zh_CN/messages.json deleted file mode 100644 index b3fabd2..0000000 --- a/remoting/webapp/me2mom/_locales.official/zh_CN/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u8bbf\u95ee\u4ee3\u7801"},"access_code_timer":{"message":"\u6b64\u8bbf\u95ee\u4ee3\u7801\u5c06\u5728 $1 \u540e\u8fc7\u671f\u3002","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u53d6\u6d88"},"close_prompt":{"message":"\u79bb\u5f00\u6b64\u9875\u4f1a\u7ed3\u675f\u60a8\u7684 Chrome \u8fdc\u7a0b\u684c\u9762\u4f1a\u8bdd\u3002"},"connect_button":{"message":"\u8fde\u63a5"},"continue_button":{"message":"\u7ee7\u7eed"},"continue_prompt":{"message":"\u60a8\u76ee\u524d\u6b63\u5728\u4e0e\u5176\u4ed6\u7528\u6237\u5171\u4eab\u6b64\u8ba1\u7b97\u673a\u3002\u60a8\u5e0c\u671b\u7ee7\u7eed\u5171\u4eab\u5417\uff1f"},"description_authorize":{"message":"\u8981\u4f7f\u7528 Chrome \u8fdc\u7a0b\u684c\u9762\uff0c\u60a8\u5fc5\u987b\u5411\u60a8\u7684\u8ba1\u7b97\u673a\u6388\u4e88\u66f4\u591a\u8bbf\u95ee\u6743\u9650\u3002\u6b64\u64cd\u4f5c\u53ea\u9700\u6267\u884c\u4e00\u6b21\u3002"},"description_connect":{"message":"\u8ba9\u60a8\u60f3\u8981\u8bbf\u95ee\u7684\u8ba1\u7b97\u673a\u7684\u4f7f\u7528\u8005\u70b9\u51fb\u201c\u7acb\u5373\u5171\u4eab\u201d\uff0c\u7136\u540e\u544a\u8bc9\u60a8\u8bbf\u95ee\u4ee3\u7801\u3002"},"description_home":{"message":"Chrome \u8fdc\u7a0b\u684c\u9762\u53ef\u8ba9\u60a8\u901a\u8fc7\u7f51\u7edc\u5b89\u5168\u5730\u5171\u4eab\u60a8\u7684\u8ba1\u7b97\u673a\u3002\u4e24\u4e2a\u7528\u6237\u5fc5\u987b\u540c\u65f6\u8fd0\u884c Chrome \u8fdc\u7a0b\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\u3002\u8981\u4e0b\u8f7d\u8be5\u5e94\u7528\u7a0b\u5e8f\uff0c\u8bf7\u8bbf\u95ee $1\u3002","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u65ad\u5f00\u8fde\u63a5 (Ctrl+Alt+Esc)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u65ad\u5f00\u8fde\u63a5 (Opt+Ctrl+Esc)"},"disconnect_button_plus_shortcut_windows":{"message":"\u65ad\u5f00\u8fde\u63a5 (Ctrl+Alt+Esc)"},"disconnect_myself_button":{"message":"\u65ad\u5f00\u8fde\u63a5"},"disconnect_other_button":{"message":"\u65ad\u5f00\u8fde\u63a5"},"error_authentication_failed":{"message":"\u8eab\u4efd\u9a8c\u8bc1\u5931\u8d25\u3002\u8bf7\u9000\u51fa Chrome \u8fdc\u7a0b\u684c\u9762\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_bad_plugin_version":{"message":"\u7f3a\u5c11 Chrome \u8fdc\u7a0b\u684c\u9762\u6240\u9700\u7684\u67d0\u4e9b\u7ec4\u4ef6\u3002\u8bf7\u786e\u4fdd\u60a8\u5df2\u5b89\u88c5\u6700\u65b0\u7248\u672c\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_generic":{"message":"\u53d1\u751f\u672a\u77e5\u9519\u8bef\u3002\u8bf7\u9000\u51fa Chrome \u8fdc\u7a0b\u684c\u9762\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_host_is_offline":{"message":"\u8fdc\u7a0b\u8ba1\u7b97\u673a\u6ca1\u6709\u5bf9\u8fde\u63a5\u8bf7\u6c42\u505a\u51fa\u54cd\u5e94\u3002\u8bf7\u786e\u4fdd\u5176\u5728\u7ebf\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_incompatible_protocol":{"message":"\u68c0\u6d4b\u5230\u4e00\u4e2a\u4e0d\u517c\u5bb9\u7684 Chrome \u8fdc\u7a0b\u684c\u9762\u7248\u672c\u3002\u8bf7\u786e\u4fdd\u4e24\u53f0\u8ba1\u7b97\u673a\u4e0a\u4f7f\u7528\u7684 Google Chrome \u6d4f\u89c8\u5668\u548c Chrome \u8fdc\u7a0b\u684c\u9762\u90fd\u662f\u6700\u65b0\u7248\u672c\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_invalid_access_code":{"message":"\u8bbf\u95ee\u4ee3\u7801\u65e0\u6548\uff0c\u8bf7\u91cd\u8bd5\u3002"},"error_missing_plugin":{"message":"\u7f3a\u5c11 Chrome \u8fdc\u7a0b\u684c\u9762\u6240\u9700\u7684\u67d0\u4e9b\u7ec4\u4ef6\u3002\u8bf7\u786e\u4fdd\u60a8\u6240\u8fd0\u884c\u7684\u662f Google Chrome \u6d4f\u89c8\u5668\u7684\u6700\u65b0\u7248\u672c\uff0c\u7136\u540e\u91cd\u8bd5\u3002"},"error_no_response":{"message":"\u670d\u52a1\u5668\u65e0\u6cd5\u54cd\u5e94\u7f51\u7edc\u8bf7\u6c42\u3002"},"error_service_unavailable":{"message":"\u6b64\u670d\u52a1\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002"},"error_unexpected":{"message":"\u53d1\u751f\u610f\u5916\u9519\u8bef\u3002\u8bf7\u5c06\u6b64\u95ee\u9898\u62a5\u544a\u7ed9\u5f00\u53d1\u4eba\u5458\u3002"},"footer_waiting":{"message":"\u6b63\u5728\u7b49\u5f85\u5efa\u7acb\u8fde\u63a5..."},"help":{"message":"\u5e2e\u52a9"},"home_access_button":{"message":"\u7acb\u5373\u8bbf\u95ee"},"home_access_description":{"message":"\u67e5\u770b\u548c\u63a7\u5236\u5171\u4eab\u7684\u8ba1\u7b97\u673a\u3002"},"home_my_computers_title":{"message":"\u6211\u7684\u8ba1\u7b97\u673a"},"home_share_button":{"message":"\u7acb\u5373\u5171\u4eab"},"home_share_description":{"message":"\u5171\u4eab\u6b64\u8ba1\u7b97\u673a\u4ee5\u4f9b\u5176\u4ed6\u7528\u6237\u67e5\u770b\u548c\u63a7\u5236\u3002"},"home_share_description_chrome_os":{"message":"\uff08Chromebook \u5c1a\u4e0d\u652f\u6301\u6b64\u529f\u80fd...\u656c\u8bf7\u671f\u5f85\uff09"},"instructions_share_above":{"message":"\u8981\u5f00\u59cb\u5171\u4eab\u60a8\u7684\u684c\u9762\uff0c\u8bf7\u5c06\u4e0b\u9762\u7684\u8bbf\u95ee\u4ee3\u7801\u63d0\u4f9b\u7ed9\u534f\u52a9\u60a8\u7684\u4eba\u5458\u3002"},"instructions_share_below":{"message":"\u4ed6\u4eec\u8f93\u5165\u8bbf\u95ee\u4ee3\u7801\u540e\uff0c\u60a8\u7684\u5171\u4eab\u4f1a\u8bdd\u5c31\u4f1a\u7acb\u5373\u5f00\u59cb\u3002"},"label_connected":{"message":"\u5df2\u8fde\u63a5\uff1a"},"message_connecting":{"message":"\u6b63\u5728\u8fde\u63a5..."},"message_generating":{"message":"\u6b63\u5728\u751f\u6210\u8bbf\u95ee\u4ee3\u7801..."},"message_session_finished":{"message":"\u60a8\u7684 Chrome \u8fdc\u7a0b\u684c\u9762\u4f1a\u8bdd\u5df2\u7ed3\u675f\u3002"},"message_shared":{"message":"\u60a8\u76ee\u524d\u6b63\u4e0e $1 \u5171\u4eab\u60a8\u7684\u684c\u9762\u3002","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u6388\u6743"},"mode_connect":{"message":"\u8fde\u63a5"},"mode_share":{"message":"\u5171\u4eab"},"offline":{"message":"\u79bb\u7ebf"},"ok":{"message":"\u786e\u5b9a"},"product_description":{"message":"\u8bbf\u95ee\u5176\u4ed6\u8ba1\u7b97\u673a\u6216\u5141\u8bb8\u5176\u4ed6\u7528\u6237\u901a\u8fc7\u4e92\u8054\u7f51\u5b89\u5168\u5730\u8bbf\u95ee\u60a8\u7684\u8ba1\u7b97\u673a\u3002"},"product_name":{"message":"Chrome \u8fdc\u7a0b\u684c\u9762"},"sign_out_button":{"message":"\u9000\u51fa"},"stop_sharing_button":{"message":"\u505c\u6b62\u5171\u4eab"},"tooltip_scaling":{"message":"\u7f29\u653e\u81f3\u9002\u5408\u7684\u6bd4\u4f8b"},"warning_nat_disabled":{"message":"\u6ce8\u610f\uff1a\u7b56\u7565\u8bbe\u7f6e\u4ec5\u5141\u8bb8\u60a8\u7f51\u7edc\u5185\u7684\u8ba1\u7b97\u673a\u4e4b\u95f4\u5efa\u7acb\u8fde\u63a5\u3002"}} diff --git a/remoting/webapp/me2mom/_locales.official/zh_TW/messages.json b/remoting/webapp/me2mom/_locales.official/zh_TW/messages.json deleted file mode 100644 index 33d4129..0000000 --- a/remoting/webapp/me2mom/_locales.official/zh_TW/messages.json +++ /dev/null @@ -1 +0,0 @@ -{"access_code":{"message":"\u5b58\u53d6\u78bc"},"access_code_timer":{"message":"\u9019\u500b\u5b58\u53d6\u78bc\u5c07\u65bc $1 \u5f8c\u5931\u6548","placeholders":{"1":{"content":"$1"}}},"cancel":{"message":"\u53d6\u6d88"},"close_prompt":{"message":"\u5982\u679c\u96e2\u958b\u9019\u500b\u9801\u9762\uff0c\u60a8\u7684\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u5de5\u4f5c\u968e\u6bb5\u4e5f\u6703\u7d50\u675f\u3002"},"connect_button":{"message":"\u9023\u7dda"},"continue_button":{"message":"\u7e7c\u7e8c"},"continue_prompt":{"message":"\u60a8\u76ee\u524d\u8207\u53e6\u4e00\u4f4d\u4f7f\u7528\u8005\u5171\u7528\u9019\u53f0\u96fb\u8166\uff0c\u60a8\u8981\u7e7c\u7e8c\u5171\u7528\u55ce\uff1f"},"description_authorize":{"message":"\u5982\u8981\u4f7f\u7528\u300cChrome \u9060\u7aef\u684c\u9762\u300d\uff0c\u60a8\u5fc5\u9808\u5c07\u96fb\u8166\u7684\u5ef6\u4f38\u5b58\u53d6\u6b0a\u9650\u6388\u4e88\u8a72\u61c9\u7528\u7a0b\u5f0f\uff0c\u9019\u500b\u6b65\u9a5f\u53ea\u9700\u57f7\u884c\u4e00\u6b21\u3002"},"description_connect":{"message":"\u8207\u60a8\u8981\u9023\u7dda\u7684\u96fb\u8166\u6240\u5c6c\u4f7f\u7528\u8005\u806f\u7d61\uff0c\u8981\u6c42\u5c0d\u65b9\u6309\u4e00\u4e0b [\u7acb\u5373\u5171\u7528]\uff0c\u4e26\u544a\u77e5\u60a8\u5b58\u53d6\u78bc\u3002"},"description_home":{"message":"\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u63d0\u4f9b\u4e86\u4e00\u500b\u5b89\u5168\u7684\u6a5f\u5236\uff0c\u8b93\u60a8\u900f\u904e\u7db2\u8def\u8207\u4ed6\u4eba\u5171\u7528\u81ea\u5df1\u7684\u96fb\u8166\u3002\u60a8\u548c\u5171\u7528\u5c0d\u8c61\u90fd\u5fc5\u9808\u57f7\u884c\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u61c9\u7528\u7a0b\u5f0f\uff0c\u8acb\u524d\u5f80 $1 \u5b89\u88dd\u3002","placeholders":{"1":{"content":"$1"}}},"disconnect_button_plus_shortcut_linux":{"message":"\u4e2d\u65b7\u9023\u7dda (Ctrl+Alt+Esc \u9375)"},"disconnect_button_plus_shortcut_mac_os_x":{"message":"\u4e2d\u65b7\u9023\u7dda (Opt+Ctrl+Esc \u9375)"},"disconnect_button_plus_shortcut_windows":{"message":"\u4e2d\u65b7\u9023\u7dda (Ctrl+Alt+Esc \u9375)"},"disconnect_myself_button":{"message":"\u4e2d\u65b7\u9023\u7dda"},"disconnect_other_button":{"message":"\u4e2d\u65b7\u9023\u7dda"},"error_authentication_failed":{"message":"\u9a57\u8b49\u5931\u6557\u3002\u8acb\u767b\u51fa\u300cChrome \u9060\u7aef\u684c\u9762\u300d\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_bad_plugin_version":{"message":"\u627e\u4e0d\u5230\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u6240\u9700\u7684\u90e8\u5206\u5143\u4ef6\u3002\u8acb\u78ba\u8a8d\u60a8\u5df2\u5b89\u88dd\u6700\u65b0\u7248\u672c\u7684 Google Chrome\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_generic":{"message":"\u767c\u751f\u4e0d\u660e\u932f\u8aa4\u3002\u8acb\u767b\u51fa\u300cChrome \u9060\u7aef\u684c\u9762\u300d\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_host_is_offline":{"message":"\u9060\u7aef\u96fb\u8166\u672a\u56de\u61c9\u60a8\u7684\u9023\u7dda\u8981\u6c42\u3002\u8acb\u78ba\u8a8d\u9060\u7aef\u96fb\u8166\u5df2\u5728\u7dda\u4e0a\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_incompatible_protocol":{"message":"\u5075\u6e2c\u5230\u4e0d\u76f8\u5bb9\u7684\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u7248\u672c\u3002\u8acb\u78ba\u8a8d\u60a8\u8207\u5171\u7528\u5c0d\u8c61\u7684\u96fb\u8166\u5747\u4f7f\u7528\u6700\u65b0\u7248\u672c\u7684 Google Chrome\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_invalid_access_code":{"message":"\u5b58\u53d6\u78bc\u7121\u6548\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002"},"error_missing_plugin":{"message":"\u627e\u4e0d\u5230\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u6240\u9700\u7684\u90e8\u5206\u5143\u4ef6\u3002\u8acb\u78ba\u8a8d\u60a8\u57f7\u884c\u7684\u662f\u6700\u65b0\u7248\u672c\u7684 Google Chrome\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002"},"error_no_response":{"message":"\u4f3a\u670d\u5668\u7121\u6cd5\u56de\u61c9\u7db2\u8def\u8981\u6c42\u3002"},"error_service_unavailable":{"message":"\u9019\u9805\u670d\u52d9\u66ab\u6642\u7121\u6cd5\u4f7f\u7528\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\u3002"},"error_unexpected":{"message":"\u767c\u751f\u672a\u9810\u671f\u7684\u932f\u8aa4\uff0c\u8acb\u5411\u958b\u767c\u4eba\u54e1\u56de\u5831\u9019\u500b\u554f\u984c\u3002"},"footer_waiting":{"message":"\u6b63\u5728\u7b49\u5f85\u9023\u7dda\u2026"},"help":{"message":"\u8aaa\u660e"},"home_access_button":{"message":"\u7acb\u5373\u5b58\u53d6"},"home_access_description":{"message":"\u700f\u89bd\u53ca\u64cd\u4f5c\u5171\u7528\u7684\u96fb\u8166\u3002"},"home_my_computers_title":{"message":"\u6211\u7684\u96fb\u8166"},"home_share_button":{"message":"\u7acb\u5373\u5171\u7528"},"home_share_description":{"message":"\u5171\u7528\u9019\u53f0\u96fb\u8166\uff0c\u958b\u653e\u7d66\u5176\u4ed6\u4f7f\u7528\u8005\u700f\u89bd\u53ca\u64cd\u4f5c\u3002"},"home_share_description_chrome_os":{"message":"(Chromebook \u76ee\u524d\u66ab\u4e0d\u652f\u63f4\u9019\u9805\u529f\u80fd ... \u656c\u8acb\u5bc6\u5207\u6ce8\u610f\u5f8c\u7e8c\u6d88\u606f)"},"instructions_share_above":{"message":"\u5982\u8981\u958b\u59cb\u5171\u7528\u60a8\u7684\u96fb\u8166\uff0c\u8acb\u5c07\u4e0b\u65b9\u7684\u5b58\u53d6\u78bc\u544a\u77e5\u8981\u5354\u52a9\u60a8\u7684\u4eba\u54e1\u3002"},"instructions_share_below":{"message":"\u5c0d\u65b9\u8f38\u5165\u5b58\u53d6\u78bc\u4e4b\u5f8c\uff0c\u5171\u7528\u5de5\u4f5c\u968e\u6bb5\u96a8\u5373\u958b\u59cb\u3002"},"label_connected":{"message":"\u5df2\u9023\u7dda\u7684\u96fb\u8166\uff1a"},"message_connecting":{"message":"\u9023\u7dda\u4e2d..."},"message_generating":{"message":"\u6b63\u5728\u7522\u751f\u5b58\u53d6\u78bc\u2026"},"message_session_finished":{"message":"\u60a8\u7684\u300cChrome \u9060\u7aef\u684c\u9762\u300d\u5de5\u4f5c\u968e\u6bb5\u5df2\u7d50\u675f\u3002"},"message_shared":{"message":"\u60a8\u76ee\u524d\u8207 $1 \u5171\u7528\u96fb\u8166\u3002","placeholders":{"1":{"content":"$1"}}},"mode_authorize":{"message":"\u6388\u6b0a"},"mode_connect":{"message":"\u9023\u7dda"},"mode_share":{"message":"\u5171\u7528"},"offline":{"message":"\u96e2\u7dda"},"ok":{"message":"\u78ba\u5b9a"},"product_description":{"message":"\u5728\u5b89\u5168\u7684\u9023\u7dda\u6a5f\u5236\u4e0b\uff0c\u900f\u904e\u7db2\u969b\u7db2\u8def\u5b58\u53d6\u5176\u4ed6\u96fb\u8166\uff0c\u6216\u662f\u5141\u8a31\u5176\u4ed6\u4f7f\u7528\u8005\u5b58\u53d6\u60a8\u7684\u96fb\u8166\u3002"},"product_name":{"message":"Chrome \u9060\u7aef\u684c\u9762"},"sign_out_button":{"message":"\u767b\u51fa"},"stop_sharing_button":{"message":"\u505c\u6b62\u5171\u7528"},"tooltip_scaling":{"message":"\u6309\u9069\u7576\u6bd4\u4f8b\u7e2e\u653e"},"warning_nat_disabled":{"message":"\u6ce8\u610f\uff1a\u653f\u7b56\u8a2d\u5b9a\u50c5\u5141\u8a31\u60a8\u7db2\u8def\u4e2d\u7684\u96fb\u8166\u76f8\u4e92\u9023\u7dda\u3002"}} diff --git a/remoting/webapp/me2mom/_locales/en/messages.json b/remoting/webapp/me2mom/_locales/en/messages.json deleted file mode 100644 index fa9613d..0000000 --- a/remoting/webapp/me2mom/_locales/en/messages.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "ACCESS_CODE": { - "message": "Access code", - "description": "Label for the access code entry box. This is where the client user enters the code that permits access to the host." - }, - "ACCESS_CODE_TIMER": { - "message": "This access code will expire in $timeout$", - "description": "Text displayed when the access code is due to time out within 30 seconds.", - "placeholders": { - "timeout": { - "content": "$1", - "example": "0:30" - } - } - }, - "CANCEL": { - "message": "Cancel", - "description": "Label for general-purpose Cancel buttons." - }, - "CLOSE_PROMPT": { - "message": "Leaving this page will end your Chromoting session.", - "description": "Message shown when the Chromoting client tab is closed while a connection is active." - }, - "CONNECT_BUTTON": { - "message": "Connect", - "description": "Label for the connect button. Clicking this button will start the Chromoting session if the access code is correct." - }, - "CONTINUE_BUTTON": { - "message": "Continue", - "description": "Label for the continue button on the pre-authorization page. Clicking this button takes the user to the standard Google Accounts authorization page." - }, - "CONTINUE_PROMPT": { - "message": "You are currently sharing this machine with another user. Do you want to continue sharing?", - "description": "Message displayed when the session has lasted longer than five minutes, explaining that the host computer is being shared and asking whether or not the user wants to continue sharing it." - }, - "DESCRIPTION_AUTHORIZE": { - "message": "To use Chromoting you must grant extended access permissions to your computer. You only have to do this once.", - "description": "Text shown when the app first starts, or if the access token is invalidated, explaining the need to authorize the Chromoting app before use." - }, - "DESCRIPTION_CONNECT": { - "message": "Ask the user whose computer you wish to access to click \u2018Share Now\u2019 and give you the access code.", - "description": "Description for the client app. This is shown to the client user above the access code entry box before the connection is started. Note that the 'Share Now' quote should be copied verbatim from the corresponding translation." - }, - "DESCRIPTION_HOME": { - "message": "Chromoting allows you to securely share your computer over the Web. Both users must be running the Chromoting app, which can be found at $url$.", - "description": "Description for the home screen. This is shown when the app starts up, above buttons to share or connect.", - "placeholders": { - "url": { - "content": "$1", - "example": "g.co/remote" - } - } - }, - "DISCONNECT_BUTTON_PLUS_SHORTCUT_LINUX": { - "message": "Disconnect (Ctrl+Alt+Esc)", - "description": "Label for the disconnect button including the Linux keyboard shortcut. Clicking this button disconnects the remote user." - }, - "DISCONNECT_BUTTON_PLUS_SHORTCUT_MAC_OS_X": { - "message": "Disconnect (Opt+Ctrl+Esc)", - "description": "Label for the disconnect button including the Mac OS X keyboard shortcut. Clicking this button disconnects the remote user." - }, - "DISCONNECT_BUTTON_PLUS_SHORTCUT_WINDOWS": { - "message": "Disconnect (Ctrl+Alt+Esc)", - "description": "Label for the disconnect button including the Windows keyboard shortcut. Clicking this button disconnects the remote user." - }, - "DISCONNECT_MYSELF_BUTTON": { - "message": "Disconnect", - "description": "Label for the client-side disconnect button. Clicking this button disconnects oneself from the host." - }, - "DISCONNECT_OTHER_BUTTON": { - "message": "Disconnect", - "description": "Label for the host-side disconnect button, without keyboard shortcuts. Only used in case we aren't able to enable hot-key support. Clicking this button disconnects the remote user." - }, - "ERROR_AUTHENTICATION_FAILED": { - "message": "Authentication failed. Please sign out of Chromoting and try again.", - "description": "Error displayed if authentication fails. This can be caused by stale credentials, in which logging out of the web-app and retrying can fix the problem." - }, - "ERROR_BAD_PLUGIN_VERSION": { - "message": "Some components required for Chromoting are missing. Please make sure you have installed the latest version and try again.", - "description": "Error displayed if the host or client plugin are missing or if they could not be loaded." - }, - "ERROR_GENERIC": { - "message": "An unknown error occurred. Please sign out of Chromoting and try again.", - "description": "Generic error message, displayed if something went wrong, but we aren't able to determine what, or the cause is too technical to be of use to a typical user." - }, - "ERROR_HOST_IS_OFFLINE": { - "message": "The remote computer is not responding to connection requests. Please verify that it is online and try again.", - "description": "Error that is shown on the client side when we don't get a response from the host." - }, - "ERROR_INCOMPATIBLE_PROTOCOL": { - "message": "An incompatible version of Chromoting was detected. Please make sure that you have the latest version of Chromium and Chromoting on both computers and try again.", - "description": "Error that is shown on the client side when incompatible Chromoting versions are installed on host and client." - }, - "ERROR_INVALID_ACCESS_CODE": { - "message": "The access code is invalid. Please try again.", - "description": "Error displayed if an invalid access code is entered." - }, - "ERROR_MISSING_PLUGIN": { - "message": "Some components required for Chromoting are missing. Please make sure you're running the latest version of Chromium and try again.", - "description": "Error displayed if the client plugin fails to load." - }, - "ERROR_NO_RESPONSE": { - "message": "The server failed to respond to the network request.", - "description": "Error displayed by the client if the server does not respond to a network request." - }, - "ERROR_SERVICE_UNAVAILABLE": { - "message": "The service is temporarily unavailable. Please try again later.", - "description": "Error displayed when the service returns a 503 error. Such errors are usually temporary, and resolve themselves in about 30 seconds." - }, - "ERROR_UNEXPECTED": { - "message": "An unexpected error occurred. Please report this problem to the developers.", - "description": "Error displayed in situations where things go wrong in ways not anticipated by the developers. There is typically no user-workaround to suggest, other than reporting the error so that we can investigate further." - }, - "FOOTER_WAITING": { - "message": "waiting for connection\u2026", - "description": "Footer text displayed at the host after an access code has been generated, but before a client connects." - }, - "HELP": { - "message": "Help", - "description": "Help link, displayed in the top-left (assuming ltr layout) corner of the main screen. Clicking this takes the user to our FAQ." - }, - "HOME_ACCESS_BUTTON": { - "message": "Access Now", - "description": "Clicking this button starts the desktop access process." - }, - "HOME_ACCESS_DESCRIPTION": { - "message": "See and control a shared computer.", - "description": "Description of the 'access' or 'client' functionality, displayed next to a button that instigates an access operation." - }, - "HOME_MY_COMPUTERS_TITLE": { - "message": "My Computers", - "description": "Title for the portion of the home page showing the list of hosts the user has previously registered for remote access at any time." - }, - "HOME_SHARE_BUTTON": { - "message": "Share Now", - "description": "Clicking this button starts the desktop sharing process." - }, - "HOME_SHARE_DESCRIPTION": { - "message": "Share this computer for another user to see and control.", - "description": "Description of the 'share' or 'host' functionality, displayed next to a button that instigates a share operation." - }, - "HOME_SHARE_DESCRIPTION_CHROME_OS": { - "message": "(this feature is not yet available for Chromebooks\u2026 stay tuned)", - "description": "Text displayed below the description of the 'share' or 'host' functionality on ChromeOS devices, where it is not yet supported." - }, - "INSTRUCTIONS_SHARE_ABOVE": { - "message": "To begin sharing your desktop, give the access code below to the person who will be assisting you.", - "description": "Instructions shown above the access code when it is ready to be conveyed to the client." - }, - "INSTRUCTIONS_SHARE_BELOW": { - "message": "Once they enter the code your sharing session will begin.", - "description": "Instructions shown below the access code when it is ready to be conveyed to the client." - }, - "LABEL_CONNECTED": { - "message": "Connected:", - "description": "String displayed in front of the host when a connection is active informing the client user who they are connected to." - }, - "MESSAGE_CONNECTING": { - "message": "Connecting\u2026", - "description": "Message displayed on the client while a connection to the host is being established." - }, - "MESSAGE_GENERATING": { - "message": "Generating access code\u2026", - "description": "Text shown while generating an access code." - }, - "MESSAGE_SESSION_FINISHED": { - "message": "Your Chromoting session has ended.", - "description": "Message displayed when the client or host has disconnected." - }, - "MESSAGE_SHARED": { - "message": "Your desktop is currently being shared with $user$.", - "description": "Message shown on the host computer while a session is active informing them who is connected.", - "placeholders": { - "user": { - "content": "$1", - "example": "user@domain.com" - } - } - }, - "MODE_AUTHORIZE": { - "message": "Authorize", - "description": "Sub-title for the one-time authorization step. Displayed after the product name and separated by a chevron." - }, - "MODE_CONNECT": { - "message": "Connect", - "description": "Sub-title for the client app. Displayed after the product name and separated by a chevron." - }, - "MODE_SHARE": { - "message": "Share", - "description": "Sub-title for the host app. Displayed after the product name and separated by a chevron." - }, - "OK": { - "message": "OK", - "description": "Label for general-purpose OK buttons." - }, - "OFFLINE": { - "message": "Offline", - "description": "Label indicating that a host in the list is not currently available for remote access." - }, - "PIN": { - "message": "PIN", - "description": "Label for the PIN entry box." - }, - "PRODUCT_DESCRIPTION": { - "message": "Access other computers or allow another user to access your computer securely over the Internet.", - "description": "Web-app description. Displayed in Chromium's extensions page." - }, - "PRODUCT_NAME": { - "message": "Chromoting", - "description": "The product name. Displayed in various Chromium pages, including the New Tab page, and displayed prominently on the app's main page." - }, - "SIGN_OUT_BUTTON": { - "message": "Sign out", - "description": "Sign out button, visible if the user has authenticated. Clicking this clears authentication credentials and returns the web-app to the initial 'unauthenticated' state." - }, - "STOP_SHARING_BUTTON": { - "message": "Stop Sharing", - "description": "Label for the 'stop sharing' button on the host-side. Clicking this button disconnects the client." - }, - "TOOLTIP_SCALING": { - "message": "Scale to fit", - "description": "The tool-tip shown when the user hovers over the scale to fit button. Clicking this button toggles between scaling down the remote desktop to fit it inside the Chromium browser window and displaying it at 1:1 scale." - }, - "WARNING_NAT_DISABLED": { - "message": "NOTE: Policy settings permit connections only between computers within your network.", - "description": "Message displayed at the bottom of the host screen if local policy dictates that NAT traversal is disabled, meaning that connections outside the local network will not work." - } -} diff --git a/remoting/webapp/me2mom/choice.css b/remoting/webapp/me2mom/choice.css deleted file mode 100644 index 4c75c89..0000000 --- a/remoting/webapp/me2mom/choice.css +++ /dev/null @@ -1,375 +0,0 @@ -/* Copyright (c) 2011 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/* Elements */ -a { - color: rgb(0, 102, 204); - text-decoration: none; -} - -body { - background: -webkit-gradient(radial, center center, 0, center center, 400, - from(rgb(254, 254, 254)), - to(rgb(239, 239, 239))); - font-family: 'Open sans', Arial, sans-serif; - margin:0; - padding:0; - direction: __MSG_@@bidi_dir__; -} - -button, input { - font-family: inherit; - font-size: inherit; -} - -button { - background: -webkit-linear-gradient(#fafafa, #f4f4f4 40%, #e5e5e5); - border: 1px solid #aaa; - min-width: 72px; - -webkit-border-radius: 2px; - -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1); - -webkit-user-select: none; -} - -button:hover { - background: #ebebeb -webkit-linear-gradient(#fefefe, #f8f8f8 40%, #e9e9e9); - border-color: #999; - color: #222; - -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); -} - -button:active, .toggle-button-active, .toggle-button-active:hover { - background: #ebebeb -webkit-linear-gradient(#f4f4f4, #efefef 40%, #dcdcdc); - color: #333; - -webkit-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.2); -} - -button[disabled], .button[disabled]:hover { - background: -webkit-linear-gradient(#fafafa, #f4f4f4 40%, #e5e5e5); - border-color: #aaa; - color: #888; - -webkit-box-shadow: none; -} - -h1 { - font-size: 24px; - font-weight: normal; -} - -label { - color: black; - font-weight: bold; -} - -/* Classes */ - -.access-code-digit-group { - /* - Used for each of the four-digit components of the access code as - displayed by the host. - */ - padding: 0px 6px; -} - -.big-button { - height: 2em; - font-size: 16px; - padding: 6px; -} - -.centered-button { - /* - Used to force buttons to center correctly on Chrome due to a quirk - with laying out buttons. http://crbug.com/84654 - - TODO(ajwong): Either fix Chrome layout behavior, or if Chrome is actually - conforming correctly to the standard, remove this comment. - */ - text-align: center; -} - -.collapsed { - opacity: 0; - height: 0 !important; -} - -.choice-header { - font-size: 24px; - font-weight: normal; - margin-__MSG_@@bidi_start_edge__: 10px; -} - -.choice-footer { - font-size: 14px; -} - -.choice-panel { - margin-top: 17px; - padding-bottom: 20px; -} - -.clickable { - cursor: pointer; -} - -.description { - margin-bottom: 25px; -} - -.error-state { - background-image: url('icon_warning.png'); - background-repeat: no-repeat; - background-position: top __MSG_@@bidi_start_edge__; - padding-__MSG_@@bidi_start_edge__: 30px; - padding-top: 3px; - margin-bottom: 10px; - color: #900; - display: inline-block; -} - -.expiring { - color: #900 !important; -} - -[hidden] { - display: none !important; -} - - -.icon-label { - display: inline-block; - vertical-align: top; - margin-__MSG_@@bidi_start_edge__: 10px; -} - -.information-box { - background-color: #f9edbe; - border: 1px solid #f0c36d; - -webkit-border-radius: 2px; - -webkit-box-shadow: 0px 2px 4px rgba(0,0,0,0.2); - color: #222; - padding: 8px 16px; - text-align: center; - font-size: 12px; -} - -.information-box-centerer { - width: 100%; - bottom: 8px; - position: absolute; - display: -webkit-box; -} - -.information-box-padding { - -webkit-box-flex: 1; -} - -.message { - text-align:center; - margin-bottom: 10px; -} - -.mode-select-button { - width: 100%; - height: 32px; - white-space: nowrap; -} - -.mode-select-label { - padding-__MSG_@@bidi_end_edge__: 20px; -} - -.mode-select-table { - margin-__MSG_@@bidi_start_edge__: 40px; - width: 600px; /* width + margin = body width */ - border-collapse: collapse; - margin-top: 40px; -} - -.mode-select-table-spacer { - height: 20px; -} - -.mode-select-table-underline td { - border-bottom: 1px solid #c6c6c6; -} - -.hide-scrollbars { - overflow-y: hidden; -} - -.host-list-container { - -webkit-transition: all 0.5s; - overflow: hidden; -} - -.host-list-table { - margin-__MSG_@@bidi_start_edge__: 30px; - width: 610px; /* width + margin = body width */ - border-spacing: 0; -} - -.host-list-row { - height: 50px; - color: black; -} - -.host-list-row td { - border-bottom: 1px solid transparent; - border-top: 1px solid transparent; -} - -.host-list-row:hover { - background-color: #e7eef2; -} - -.host-list-rename-icon, .host-list-remove-icon { - opacity: 0; -} - -.host-list-row:hover .host-list-rename-icon { - opacity: 0.8; -} - -.host-list-row:hover .host-list-remove-icon { - opacity: 0.3; -} - -.host-list-edit:hover .host-list-rename-icon { - opacity: 1; -} - -.host-list-edit:hover .host-list-remove-icon { - opacity: 0.5; -} - -.host-list-row:hover td { - border-bottom: 1px solid #c6c6c6; - border-top: 1px solid #c6c6c6; -} - -.host-list-row-end { - padding-__MSG_@@bidi_end_edge__: 10px; -} - -.host-list-row-start { - padding-__MSG_@@bidi_start_edge__: 10px; -} - -.host-offline { - color: #a9a9a9; -} - -.host-offline .host-list-main-icon { - opacity: 0.5; -} - -.small-print { - font-size: 13px; - color: #AAA; -} - -.top-primary { - font-size: 14px; - position: absolute; - top: 0.5em; - __MSG_@@bidi_start_edge__: 0.5em; -} - -.top-secondary { - font-size: 14px; - position: absolute; - top: 0.5em; - __MSG_@@bidi_end_edge__: 0.5em; -} - -.waiting { - color: rgb(180, 180, 180); -} - -/* Ids */ -#access-code-countdown-container { - height: 50px; - text-align: center; -} - -#access-code-display { - margin-top: 50px; - color: rgb(0, 0, 0); - font-weight: bold; - font-size: 26px; - text-align: center; -} - -#access-code-entry { - font-weight: bold; - font-size: 18px; - height: 25px; - margin: 0 10px; - padding-__MSG_@@bidi_start_edge__: 5px; - width: 12em; -} - -#access-code-entry-row { - text-align: center; -} - -#cancel-button { - float: __MSG_@@bidi_end_edge__; -} - -#client-footer-text, #host-footer-text { - text-align: center; -} - -#current-email { - color: rgba(0, 0, 0, 0.5); -} - -#divider-top { - margin: 10px 0 15px 0; -} - -#divider-bottom { - margin: 25px 0 10px 0; -} - -#email-status { - margin-__MSG_@@bidi_end_edge__: 0.5ex; -} - -#icon { - height: 64px; - width: 64px; -} - -#main { - color: rgb(115, 115, 115); - font-size: 16px; - margin: 100px auto 0 auto; - padding: 10px; - width: 640px; -} - -#host-list-error { - margin-__MSG_@@bidi_start_edge__: 40px; -} - -#session-mode { - position: absolute; - -webkit-box-shadow: 0 0 8px 0 black; - -webkit-user-select: none; -} - -#session-client-plugin { - margin: 0 0 -4px 0; -} - -#toggle-scaling { - margin: 1px 0 0 0; - padding: 1px; - min-width: 0; - line-height: 0; -} diff --git a/remoting/webapp/me2mom/choice.html b/remoting/webapp/me2mom/choice.html deleted file mode 100644 index 270896d..0000000 --- a/remoting/webapp/me2mom/choice.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Loading… -
- - - -
- -
- - - -
- - - - - - - - - - - - - -
-
-
-
- -
- -
- -

- - - -
- -
-
- -
-
-
-
- -
-
-
- -
-
-
- -
-
- -
- -
- -
-
- -
- -
- -
- -
- -
-
-
-
-
- - - - -
-
-
- -
-
- -
-
-
- - - -
-
-
- -
- -
- -
-
- -
- -
- -
- - - -
- - -
- - - - - - - - - - - diff --git a/remoting/webapp/me2mom/client_screen.js b/remoting/webapp/me2mom/client_screen.js deleted file mode 100644 index c89355d..0000000 --- a/remoting/webapp/me2mom/client_screen.js +++ /dev/null @@ -1,469 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Functions related to the 'client screen' for Chromoting. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @type {boolean} Whether or not the plugin should scale itself. - */ -remoting.scaleToFit = false; - -/** - * @type {remoting.ClientSession} The client session object, set once the - * access code has been successfully verified. - */ -remoting.clientSession = null; - -/** - * @type {string} The normalized access code. - */ -remoting.accessCode = ''; - -/** - * @type {string} The host's JID, returned by the server. - */ -remoting.hostJid = ''; - -/** - * @type {string} For Me2Me connections, the id of the current host. - */ -remoting.hostId = ''; - -/** - * @type {boolean} For Me2Me connections. Set to true if connection - * must be retried on failure. - */ -remoting.retryIfOffline = false; - -/** - * @type {string} The host's public key, returned by the server. - */ -remoting.hostPublicKey = ''; - -/** - * @type {XMLHttpRequest} The XHR object corresponding to the current - * support-hosts request, if there is one outstanding. - * @private - */ -remoting.supportHostsXhr_ = null; - -/** - * @enum {string} - */ -remoting.ConnectionType = { - It2Me: 'It2Me', - Me2Me: 'Me2Me' -}; - -/** - * @type {remoting.ConnectionType?} - */ -remoting.currentConnectionType = null; - -/** - * Entry point for the 'connect' functionality. This function defers to the - * WCS loader to call it back with an access token. - */ -remoting.connectIt2Me = function() { - remoting.currentConnectionType = remoting.ConnectionType.It2Me; - document.getElementById('cancel-button').disabled = false; - remoting.WcsLoader.load(connectIt2MeWithAccessToken_); -}; - -/** - * Cancel an incomplete connect operation. - * - * @return {void} Nothing. - */ -remoting.cancelConnect = function() { - if (remoting.supportHostsXhr_) { - remoting.supportHostsXhr_.abort(); - remoting.supportHostsXhr_ = null; - } - if (remoting.clientSession) { - remoting.clientSession.removePlugin(); - remoting.clientSession = null; - } - remoting.setMode(remoting.AppMode.HOME); -}; - -/** - * Enable or disable scale-to-fit. - * - * @param {Event} event The click event. The style of the target is updated to - * reflect the new scaling state. - * @return {void} Nothing. - */ -remoting.toggleScaleToFit = function(event) { - var button = /** @type Element */(event.target); - remoting.scaleToFit = !remoting.scaleToFit; - if (remoting.scaleToFit) { - addClass(button, 'toggle-button-active'); - } else { - removeClass(button, 'toggle-button-active'); - } - remoting.clientSession.updateDimensions(); -}; - -/** - * Update the remoting client layout in response to a resize event. - * - * @return {void} Nothing. - */ -remoting.onResize = function() { - if (remoting.clientSession) - remoting.clientSession.onResize(); -}; - -/** - * Disconnect the remoting client. - * - * @return {void} Nothing. - */ -remoting.disconnect = function() { - if (remoting.clientSession) { - remoting.clientSession.disconnect(); - remoting.clientSession = null; - remoting.debug.log('Disconnected.'); - if (remoting.currentConnectionType == remoting.ConnectionType.It2Me) { - remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_IT2ME); - } else { - remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_ME2ME); - } - } -}; - -/** - * If WCS was successfully loaded, proceed with the connection, otherwise - * report an error. - * - * @param {string?} token The OAuth2 access token, or null if an error occurred. - * @return {void} Nothing. - */ -function connectIt2MeWithAccessToken_(token) { - if (token) { - var accessCode = document.getElementById('access-code-entry').value; - remoting.accessCode = normalizeAccessCode_(accessCode); - // At present, only 12-digit access codes are supported, of which the first - // 7 characters are the supportId. - var kSupportIdLen = 7; - var kHostSecretLen = 5; - var kAccessCodeLen = kSupportIdLen + kHostSecretLen; - if (remoting.accessCode.length != kAccessCodeLen) { - remoting.debug.log('Bad access code length'); - showConnectError_(remoting.Error.INVALID_ACCESS_CODE); - } else { - var supportId = remoting.accessCode.substring(0, kSupportIdLen); - remoting.setMode(remoting.AppMode.CLIENT_CONNECTING); - resolveSupportId(supportId); - } - } else { - showConnectError_(remoting.Error.AUTHENTICATION_FAILED); - } -} - -/** - * Callback function called when the state of the client plugin changes. The - * current state is available via the |state| member variable. - * - * @param {number} oldState The previous state of the plugin. - * @param {number} newState The current state of the plugin. - */ -// TODO(jamiewalch): Make this pass both the current and old states to avoid -// race conditions. -function onClientStateChange_(oldState, newState) { - if (!remoting.clientSession) { - // If the connection has been cancelled, then we no longer have a reference - // to the session object and should ignore any state changes. - return; - } - if (newState == remoting.ClientSession.State.CREATED) { - remoting.debug.log('Created plugin'); - - } else if (newState == remoting.ClientSession.State.BAD_PLUGIN_VERSION) { - showConnectError_(remoting.Error.BAD_PLUGIN_VERSION); - - } else if (newState == remoting.ClientSession.State.CONNECTING) { - remoting.debug.log('Connecting as ' + remoting.oauth2.getCachedEmail()); - - } else if (newState == remoting.ClientSession.State.INITIALIZING) { - remoting.debug.log('Initializing connection'); - - } else if (newState == remoting.ClientSession.State.CONNECTED) { - if (remoting.clientSession) { - remoting.setMode(remoting.AppMode.IN_SESSION); - remoting.toolbar.center(); - remoting.toolbar.preview(); - updateStatistics_(); - } - - } else if (newState == remoting.ClientSession.State.CLOSED) { - if (oldState == remoting.ClientSession.State.CONNECTED) { - remoting.clientSession.removePlugin(); - remoting.clientSession = null; - remoting.debug.log('Connection closed by host'); - if (remoting.currentConnectionType == remoting.ConnectionType.It2Me) { - remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_IT2ME); - } else { - remoting.setMode(remoting.AppMode.CLIENT_SESSION_FINISHED_ME2ME); - } - } else { - // The transition from CONNECTING to CLOSED state may happen - // only with older client plugins. Current version should go the - // FAILED state when connection fails. - showConnectError_(remoting.Error.INVALID_ACCESS_CODE); - } - - } else if (newState == remoting.ClientSession.State.CONNECTION_FAILED) { - remoting.debug.log('Client plugin reported connection failed: ' + - remoting.clientSession.error); - if (remoting.clientSession.error == - remoting.ClientSession.ConnectionError.HOST_IS_OFFLINE) { - retryConnectOrReportOffline_(); - } else if (remoting.clientSession.error == - remoting.ClientSession.ConnectionError.SESSION_REJECTED) { - showConnectError_(remoting.Error.INVALID_ACCESS_CODE); - } else if (remoting.clientSession.error == - remoting.ClientSession.ConnectionError.INCOMPATIBLE_PROTOCOL) { - showConnectError_(remoting.Error.INCOMPATIBLE_PROTOCOL); - } else if (remoting.clientSession.error == - remoting.ClientSession.ConnectionError.NETWORK_FAILURE) { - showConnectError_(remoting.Error.GENERIC); - } else { - showConnectError_(remoting.Error.GENERIC); - } - - } else { - remoting.debug.log('Unexpected client plugin state: ' + newState); - // This should only happen if the web-app and client plugin get out of - // sync, and even then the version check should allow compatibility. - showConnectError_(remoting.Error.MISSING_PLUGIN); - } -} - -/** - * If we have a hostId to retry, try refreshing it and connecting again. If not, - * then show the 'host offline' error message. - * - * @return {void} Nothing. - */ -function retryConnectOrReportOffline_() { - if (remoting.hostId && remoting.retryIfOffline) { - console.log('Connection failed. Retrying.'); - /** @param {boolean} success True if the refresh was successful. */ - var onDone = function(success) { - if (success) { - remoting.connectMe2Me(remoting.hostId, false); - } else { - showConnectError_(remoting.Error.HOST_IS_OFFLINE); - } - }; - remoting.hostList.refresh(onDone); - } else { - console.log('Connection failed. Not retrying.'); - showConnectError_(remoting.Error.HOST_IS_OFFLINE); - } -} - -/** - * Create the client session object and initiate the connection. - * - * @return {void} Nothing. - */ -function startSession_() { - remoting.debug.log('Starting session...'); - var accessCode = document.getElementById('access-code-entry'); - accessCode.value = ''; // The code has been validated and won't work again. - remoting.clientSession = - new remoting.ClientSession( - remoting.hostJid, remoting.hostPublicKey, - remoting.accessCode, - /** @type {string} */ (remoting.oauth2.getCachedEmail()), - onClientStateChange_); - /** @param {string} token The auth token. */ - var createPluginAndConnect = function(token) { - remoting.clientSession.createPluginAndConnect( - document.getElementById('session-mode'), - token); - }; - remoting.oauth2.callWithToken(createPluginAndConnect); -} - -/** - * Show a client-side error message. - * - * @param {remoting.Error} errorTag The error to be localized and - * displayed. - * @return {void} Nothing. - */ -function showConnectError_(errorTag) { - remoting.debug.log('Connection failed: ' + errorTag); - var errorDiv = document.getElementById('connect-error-message'); - l10n.localizeElementFromTag(errorDiv, /** @type {string} */ (errorTag)); - remoting.accessCode = ''; - if (remoting.clientSession) { - remoting.clientSession.disconnect(); - remoting.clientSession = null; - } - if (remoting.currentConnectionType == remoting.ConnectionType.It2Me) { - remoting.setMode(remoting.AppMode.CLIENT_CONNECT_FAILED_IT2ME); - } else { - remoting.setMode(remoting.AppMode.CLIENT_CONNECT_FAILED_ME2ME); - } -} - -/** - * Parse the response from the server to a request to resolve a support id. - * - * @param {XMLHttpRequest} xhr The XMLHttpRequest object. - * @return {void} Nothing. - */ -function parseServerResponse_(xhr) { - remoting.supportHostsXhr_ = null; - remoting.debug.log('parseServerResponse: status = ' + xhr.status); - if (xhr.status == 200) { - var host = /** @type {{data: {jabberId: string, publicKey: string}}} */ - JSON.parse(xhr.responseText); - if (host.data && host.data.jabberId && host.data.publicKey) { - remoting.hostJid = host.data.jabberId; - remoting.hostPublicKey = host.data.publicKey; - var split = remoting.hostJid.split('/'); - document.getElementById('connected-to').innerText = split[0]; - startSession_(); - return; - } - } - var errorMsg = remoting.Error.GENERIC; - if (xhr.status == 404) { - errorMsg = remoting.Error.INVALID_ACCESS_CODE; - } else if (xhr.status == 0) { - errorMsg = remoting.Error.NO_RESPONSE; - } else if (xhr.status == 503) { - errorMsg = remoting.Error.SERVICE_UNAVAILABLE; - } else { - remoting.debug.log('The server responded: ' + xhr.responseText); - } - showConnectError_(errorMsg); -} - -/** - * Normalize the access code entered by the user. - * - * @param {string} accessCode The access code, as entered by the user. - * @return {string} The normalized form of the code (whitespace removed). - */ -function normalizeAccessCode_(accessCode) { - // Trim whitespace. - // TODO(sergeyu): Do we need to do any other normalization here? - return accessCode.replace(/\s/g, ''); -} - -/** - * Initiate a request to the server to resolve a support ID. - * - * @param {string} supportId The canonicalized support ID. - */ -function resolveSupportId(supportId) { - var headers = { - 'Authorization': 'OAuth ' + remoting.oauth2.getAccessToken() - }; - - remoting.supportHostsXhr_ = remoting.xhr.get( - 'https://www.googleapis.com/chromoting/v1/support-hosts/' + - encodeURIComponent(supportId), - parseServerResponse_, - '', - headers); -} - -/** - * Timer callback to update the statistics panel. - */ -function updateStatistics_() { - if (!remoting.clientSession || - remoting.clientSession.state != remoting.ClientSession.State.CONNECTED) { - return; - } - var stats = remoting.clientSession.stats(); - remoting.debug.updateStatistics(stats); - remoting.clientSession.logStatistics(stats); - // Update the stats once per second. - window.setTimeout(updateStatistics_, 1000); -} - - -/** - * Shows PIN entry screen. - * - * @param {string} hostId The unique id of the host. - * @param {boolean} retryIfOffline If true and the host can't be contacted, - * refresh the host list and try again. This allows bookmarked hosts to - * work even if they reregister with Talk and get a different Jid. - * @return {void} Nothing. - */ -remoting.connectMe2Me = function(hostId, retryIfOffline) { - remoting.currentConnectionType = remoting.ConnectionType.Me2Me; - remoting.hostId = hostId; - remoting.retryIfOffline = retryIfOffline; - - // TODO(jamiewalch): Reinstate the PIN screen once it's supported. - // remoting.setMode(remoting.AppMode.CLIENT_PIN_PROMPT); - remoting.connectMe2MeWithPin(); -} - -/** - * Start a connection to the specified host, using the cached details - * and the PIN entered by the user. - * - * @return {void} Nothing. - */ -remoting.connectMe2MeWithPin = function() { - remoting.debug.log('Connecting to host...'); - remoting.setMode(remoting.AppMode.CLIENT_CONNECTING); - - var host = remoting.hostList.getHostForId(remoting.hostId); - if (!host) { - retryConnectOrReportOffline_(); - return; - } - remoting.hostJid = host.jabberId; - remoting.hostPublicKey = host.publicKey; - document.getElementById('connected-to').innerText = host.hostName; - document.title = document.title + ': ' + host.hostName; - - remoting.WcsLoader.load(connectMe2MeWithAccessToken_); -}; - -/** - * Continue making the connection to a host, once WCS has initialized. - * - * @param {string?} token The OAuth2 access token, or null if an error occurred. - * @return {void} Nothing. - */ -function connectMe2MeWithAccessToken_(token) { - if (token) { - /** @type {string} */ - var pin = document.getElementById('pin-entry').value; - document.getElementById('pin-entry').value = ''; - - remoting.clientSession = - new remoting.ClientSession( - remoting.hostJid, remoting.hostPublicKey, - pin, /** @type {string} */ (remoting.oauth2.getCachedEmail()), - onClientStateChange_); - remoting.clientSession.createPluginAndConnect( - document.getElementById('session-mode'), - token); - } else { - showConnectError_(remoting.Error.AUTHENTICATION_FAILED); - } -} diff --git a/remoting/webapp/me2mom/client_session.js b/remoting/webapp/me2mom/client_session.js deleted file mode 100644 index da57018..0000000 --- a/remoting/webapp/me2mom/client_session.js +++ /dev/null @@ -1,461 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Class handling creation and teardown of a remoting client session. - * - * This abstracts a element and controls the plugin which does the - * actual remoting work. There should be no UI code inside this class. It - * should be purely thought of as a controller of sorts. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @param {string} hostJid The jid of the host to connect to. - * @param {string} hostPublicKey The base64 encoded version of the host's - * public key. - * @param {string} authenticationCode The access code for IT2Me or the - * PIN for Me2Me. - * @param {string} email The username for the talk network. - * @param {function(remoting.ClientSession.State, - remoting.ClientSession.State):void} onStateChange - * The callback to invoke when the session changes state. - * @constructor - */ -remoting.ClientSession = function(hostJid, hostPublicKey, authenticationCode, - email, onStateChange) { - this.state = remoting.ClientSession.State.CREATED; - - this.hostJid = hostJid; - this.hostPublicKey = hostPublicKey; - this.authenticationCode = authenticationCode; - this.email = email; - this.clientJid = ''; - this.sessionId = ''; - /** @type {remoting.ViewerPlugin} */ - this.plugin = null; - this.logToServer = new remoting.LogToServer(); - this.onStateChange = onStateChange; - /** @type {remoting.ClientSession} */ - var that = this; - /** @type {function():void} @private */ - this.refocusPlugin_ = function() { that.plugin.focus(); }; -}; - -// Note that the positive values in both of these enums are copied directly -// from chromoting_scriptable_object.h and must be kept in sync. The negative -// values represent states transitions that occur within the web-app that have -// no corresponding plugin state transition. -/** @enum {number} */ -remoting.ClientSession.State = { - CREATED: -3, - BAD_PLUGIN_VERSION: -2, - UNKNOWN_PLUGIN_ERROR: -1, - UNKNOWN: 0, - CONNECTING: 1, - INITIALIZING: 2, - CONNECTED: 3, - CLOSED: 4, - CONNECTION_FAILED: 5 -}; - -/** @enum {number} */ -remoting.ClientSession.ConnectionError = { - NONE: 0, - HOST_IS_OFFLINE: 1, - SESSION_REJECTED: 2, - INCOMPATIBLE_PROTOCOL: 3, - NETWORK_FAILURE: 4 -}; - -// Keys for connection statistics. -remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH = 'video_bandwidth'; -remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE = 'video_frame_rate'; -remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY = 'capture_latency'; -remoting.ClientSession.STATS_KEY_ENCODE_LATENCY = 'encode_latency'; -remoting.ClientSession.STATS_KEY_DECODE_LATENCY = 'decode_latency'; -remoting.ClientSession.STATS_KEY_RENDER_LATENCY = 'render_latency'; -remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY = 'roundtrip_latency'; - -/** - * The current state of the session. - * @type {remoting.ClientSession.State} - */ -remoting.ClientSession.prototype.state = remoting.ClientSession.State.UNKNOWN; - -/** - * The last connection error. Set when state is set to CONNECTION_FAILED. - * @type {remoting.ClientSession.ConnectionError} - */ -remoting.ClientSession.prototype.error = - remoting.ClientSession.ConnectionError.NONE; - -/** - * Chromoting session API version (for this javascript). - * This is compared with the plugin API version to verify that they are - * compatible. - * - * @const - * @private - */ -remoting.ClientSession.prototype.API_VERSION_ = 2; - -/** - * The oldest API version that we support. - * This will differ from the |API_VERSION_| if we maintain backward - * compatibility with older API versions. - * - * @const - * @private - */ -remoting.ClientSession.prototype.API_MIN_VERSION_ = 1; - -/** - * Server used to bridge into the Jabber network for establishing Jingle - * connections. - * - * @const - * @private - */ -remoting.ClientSession.prototype.HTTP_XMPP_PROXY_ = - 'https://chromoting-httpxmpp-oauth2-dev.corp.google.com'; - -/** - * The id of the client plugin - * - * @const - */ -remoting.ClientSession.prototype.PLUGIN_ID = 'session-client-plugin'; - -/** - * Callback to invoke when the state is changed. - * - * @param {remoting.ClientSession.State} oldState The previous state. - * @param {remoting.ClientSession.State} newState The current state. - */ -remoting.ClientSession.prototype.onStateChange = - function(oldState, newState) { }; - -/** - * Adds element to |container| and readies the sesion object. - * - * @param {Element} container The element to add the plugin to. - * @param {string} oauth2AccessToken A valid OAuth2 access token. - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.createPluginAndConnect = - function(container, oauth2AccessToken) { - this.plugin = /** @type {remoting.ViewerPlugin} */ - document.createElement('embed'); - this.plugin.id = this.PLUGIN_ID; - this.plugin.src = 'about://none'; - this.plugin.type = 'pepper-application/x-chromoting'; - this.plugin.width = 0; - this.plugin.height = 0; - this.plugin.tabIndex = 0; // Required, otherwise focus() doesn't work. - container.appendChild(this.plugin); - - this.plugin.focus(); - this.plugin.addEventListener('blur', this.refocusPlugin_, false); - - if (!this.isPluginVersionSupported_(this.plugin)) { - // TODO(ajwong): Remove from parent. - delete this.plugin; - this.setState_(remoting.ClientSession.State.BAD_PLUGIN_VERSION); - return; - } - - /** @type {remoting.ClientSession} */ var that = this; - /** @param {string} msg The IQ stanza to send. */ - this.plugin.sendIq = function(msg) { that.sendIq_(msg); }; - /** @param {string} msg The message to log. */ - this.plugin.debugInfo = function(msg) { - remoting.debug.log('plugin: ' + msg); - }; - - // TODO(ajwong): Is it even worth having this class handle these events? - // Or would it be better to just allow users to pass in their own handlers - // and leave these blank by default? - /** - * @param {number} status The plugin status. - * @param {number} error The plugin error status, if any. - */ - this.plugin.connectionInfoUpdate = function(status, error) { - that.connectionInfoUpdateCallback(status, error); - }; - this.plugin.desktopSizeUpdate = function() { that.onDesktopSizeChanged_(); }; - - // TODO(garykac): Clean exit if |connect| isn't a function. - if (typeof this.plugin.connect === 'function') { - this.connectPluginToWcs_(oauth2AccessToken); - } else { - remoting.debug.log('ERROR: remoting plugin not loaded'); - this.setState_(remoting.ClientSession.State.UNKNOWN_PLUGIN_ERROR); - } -}; - -/** - * Deletes the element from the container, without sending a - * session_terminate request. This is to be called when the session was - * disconnected by the Host. - * - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.removePlugin = function() { - if (this.plugin) { - this.plugin.removeEventListener('blur', this.refocusPlugin_, false); - var parentNode = this.plugin.parentNode; - parentNode.removeChild(this.plugin); - this.plugin = null; - } -}; - -/** - * Deletes the element from the container and disconnects. - * - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.disconnect = function() { - // The plugin won't send a state change notification, so we explicitly log - // the fact that the connection has closed. - this.logToServer.logClientSessionStateChange( - remoting.ClientSession.State.CLOSED, - remoting.ClientSession.ConnectionError.NONE); - if (remoting.wcs) { - remoting.wcs.setOnIq(function(stanza) {}); - this.sendIq_( - '' + - '' + - '' + - '' + - ''); - } - this.removePlugin(); -}; - -/** - * Sends an IQ stanza via the http xmpp proxy. - * - * @private - * @param {string} msg XML string of IQ stanza to send to server. - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.sendIq_ = function(msg) { - remoting.debug.logIq(true, msg); - // Extract the session id, so we can close the session later. - var parser = new DOMParser(); - var iqNode = parser.parseFromString(msg, 'text/xml').firstChild; - var jingleNode = iqNode.firstChild; - if (jingleNode) { - var action = jingleNode.getAttribute('action'); - if (jingleNode.nodeName == 'jingle' && action == 'session-initiate') { - this.sessionId = jingleNode.getAttribute('sid'); - } - } - - // Send the stanza. - if (remoting.wcs) { - remoting.wcs.sendIq(msg); - } else { - remoting.debug.log('Tried to send IQ before WCS was ready.'); - this.setState_(remoting.ClientSession.State.CONNECTION_FAILED); - } -}; - -/** - * @private - * @param {remoting.ViewerPlugin} plugin The embed element for the plugin. - * @return {boolean} True if the plugin and web-app versions are compatible. - */ -remoting.ClientSession.prototype.isPluginVersionSupported_ = function(plugin) { - return this.API_VERSION_ >= plugin.apiMinVersion && - plugin.apiVersion >= this.API_MIN_VERSION_; -}; - -/** - * Connects the plugin to WCS. - * - * @private - * @param {string} oauth2AccessToken A valid OAuth2 access token. - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.connectPluginToWcs_ = - function(oauth2AccessToken) { - this.clientJid = remoting.wcs.getJid(); - if (this.clientJid == '') { - remoting.debug.log('Tried to connect without a full JID.'); - } - remoting.debug.setJids(this.clientJid, this.hostJid); - /** @type {remoting.ClientSession} */ - var that = this; - /** @param {string} stanza The IQ stanza received. */ - var onIq = function(stanza) { - remoting.debug.logIq(false, stanza); - if (that.plugin.onIq) { - that.plugin.onIq(stanza); - } else { - // plugin.onIq may not be set after the plugin has been shut - // down. Particularly this happens when we receive response to - // session-terminate stanza. - remoting.debug.log( - 'plugin.onIq is not set so dropping incoming message.'); - } - } - remoting.wcs.setOnIq(onIq); - that.plugin.connect(this.hostJid, this.hostPublicKey, this.clientJid, - this.authenticationCode); -}; - -/** - * Callback that the plugin invokes to indicate that the connection - * status has changed. - * - * @param {number} status The plugin's status. - * @param {number} error The plugin's error state, if any. - */ -remoting.ClientSession.prototype.connectionInfoUpdateCallback = - function(status, error) { - // Old plugins didn't pass the status and error values, so get them directly. - // Note that there is a race condition inherent in this approach. - if (typeof(status) == 'undefined') { - status = this.plugin.status; - } - if (typeof(error) == 'undefined') { - error = this.plugin.error; - } - - if (status == this.plugin.STATUS_CONNECTED) { - this.onDesktopSizeChanged_(); - } else if (status == this.plugin.STATUS_FAILED) { - this.error = /** @type {remoting.ClientSession.ConnectionError} */ (error); - } - this.setState_(/** @type {remoting.ClientSession.State} */ (status)); -}; - -/** - * @private - * @param {remoting.ClientSession.State} newState The new state for the session. - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.setState_ = function(newState) { - var oldState = this.state; - this.state = newState; - if (this.onStateChange) { - this.onStateChange(oldState, newState); - } - this.logToServer.logClientSessionStateChange(this.state, this.error); -}; - -/** - * This is a callback that gets called when the window is resized. - * - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.onResize = function() { - this.updateDimensions(); -}; - -/** - * This is a callback that gets called when the plugin notifies us of a change - * in the size of the remote desktop. - * - * @private - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.onDesktopSizeChanged_ = function() { - remoting.debug.log('desktop size changed: ' + - this.plugin.desktopWidth + 'x' + - this.plugin.desktopHeight); - this.updateDimensions(); -}; - -/** - * Refreshes the plugin's dimensions, taking into account the sizes of the - * remote desktop and client window, and the current scale-to-fit setting. - * - * @return {void} Nothing. - */ -remoting.ClientSession.prototype.updateDimensions = function() { - if (this.plugin.desktopWidth == 0 || - this.plugin.desktopHeight == 0) - return; - - var windowWidth = window.innerWidth; - var windowHeight = window.innerHeight; - var scale = 1.0; - - if (remoting.scaleToFit) { - var scaleFitHeight = 1.0 * windowHeight / this.plugin.desktopHeight; - var scaleFitWidth = 1.0 * windowWidth / this.plugin.desktopWidth; - scale = Math.min(1.0, scaleFitHeight, scaleFitWidth); - } - - // Resize the plugin if necessary. - this.plugin.width = this.plugin.desktopWidth * scale; - this.plugin.height = this.plugin.desktopHeight * scale; - - // Position the container. - // TODO(wez): We should take into account scrollbars when positioning. - var parentNode = this.plugin.parentNode; - if (this.plugin.width < windowWidth) - parentNode.style.left = (windowWidth - this.plugin.width) / 2 + 'px'; - else - parentNode.style.left = '0'; - if (this.plugin.height < windowHeight) - parentNode.style.top = (windowHeight - this.plugin.height) / 2 + 'px'; - else - parentNode.style.top = '0'; - - remoting.debug.log('plugin dimensions: ' + - parentNode.style.left + ',' + - parentNode.style.top + '-' + - this.plugin.width + 'x' + this.plugin.height + '.'); - this.plugin.setScaleToFit(remoting.scaleToFit); -}; - -/** - * Returns an associative array with a set of stats for this connection. - * - * @return {Object.} The connection statistics. - */ -remoting.ClientSession.prototype.stats = function() { - var dict = {}; - dict[remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH] = - this.plugin.videoBandwidth; - dict[remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE] = - this.plugin.videoFrameRate; - dict[remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY] = - this.plugin.videoCaptureLatency; - dict[remoting.ClientSession.STATS_KEY_ENCODE_LATENCY] = - this.plugin.videoEncodeLatency; - dict[remoting.ClientSession.STATS_KEY_DECODE_LATENCY] = - this.plugin.videoDecodeLatency; - dict[remoting.ClientSession.STATS_KEY_RENDER_LATENCY] = - this.plugin.videoRenderLatency; - dict[remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY] = - this.plugin.roundTripLatency; - return dict; -}; - -/** - * Logs statistics. - * - * @param {Object.} stats - */ -remoting.ClientSession.prototype.logStatistics = function(stats) { - this.logToServer.logStatistics(stats); -}; diff --git a/remoting/webapp/me2mom/cs_oauth2_trampoline.js b/remoting/webapp/me2mom/cs_oauth2_trampoline.js deleted file mode 100644 index c4c31eb..0000000 --- a/remoting/webapp/me2mom/cs_oauth2_trampoline.js +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -window.location.replace( - chrome.extension.getURL('oauth2_callback.html') + window.location.search); diff --git a/remoting/webapp/me2mom/debug_log.css b/remoting/webapp/me2mom/debug_log.css deleted file mode 100644 index 3085225..0000000 --- a/remoting/webapp/me2mom/debug_log.css +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (c) 2011 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#debug-log { - background-color: white; - bottom: 0; - border-top: 1px solid black; - height: 150px; - margin: 0; - opacity: 0.85; - padding: 0; - position: fixed; - width: 100%; - z-index: 100; - -webkit-user-select: text; -} - -#debug-messages { - border-top: 1px solid black; - overflow: auto; - height: inherit; -} - -#debug-messages > p { - font-family: monospace; - font-weight: bold; - font-size: small; - margin: 0.35em; - padding: 0; -} - -#debug-messages .indent { - margin-left: 20px !important; -} - -#debug-messages .indent2 { - margin-left: 40px !important; -} diff --git a/remoting/webapp/me2mom/debug_log.gtestjs b/remoting/webapp/me2mom/debug_log.gtestjs deleted file mode 100644 index 002f0fe..0000000 --- a/remoting/webapp/me2mom/debug_log.gtestjs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * Test fixture for debug logging routines. - * @constructor - * @extends {testing.Test} - */ -function DebugLogUnitTest () {} - -DebugLogUnitTest.prototype = { - __proto__: testing.Test.prototype, - - /** @inheritDoc */ - extraLibraries: [ - 'debug_log.js', - ], -}; - -// Dummy test to verify that the JS Unittest framework is working and that -// debug_log.js loads without console errors. -// TODO(garykac): Replace this with real tests. -TEST_F('DebugLogUnitTest', 'TestJsLoad', function() { - assertTrue(true); -}); diff --git a/remoting/webapp/me2mom/debug_log.js b/remoting/webapp/me2mom/debug_log.js deleted file mode 100644 index a7a13e4..0000000 --- a/remoting/webapp/me2mom/debug_log.js +++ /dev/null @@ -1,800 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Module to support logging debug messages. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @constructor - * @param {Element} logElement The HTML div to which to add log messages. - * @param {Element} statsElement The HTML div to which to update stats. - */ -remoting.DebugLog = function(logElement, statsElement) { - this.logElement = logElement; - this.statsElement = statsElement; - this.clientJid = ''; - this.hostJid = ''; -}; - -/** - * Maximum number of lines to record in the debug log. Only the most - * recent lines are displayed. - */ -remoting.DebugLog.prototype.MAX_DEBUG_LOG_SIZE = 1000; - -/** - * JID for the remoting bot which is used to bridge communication between - * the Talk network and the Remoting directory service. - */ -remoting.DebugLog.prototype.REMOTING_DIRECTORY_SERVICE_BOT = - 'remoting@bot.talk.google.com'; - -/** - * Add the given message to the debug log. - * - * @param {number} indentLevel The indention level for this message. - * @param {string} message The debug info to add to the log. - */ -remoting.DebugLog.prototype.logIndent = function(indentLevel, message) { - // Remove lines from top if we've hit our max log size. - if (this.logElement.childNodes.length == this.MAX_DEBUG_LOG_SIZE) { - this.logElement.removeChild(this.logElement.firstChild); - } - - // Add the new

to the end of the debug log. - var p = document.createElement('p'); - if (indentLevel == 1) { - p.className = 'indent'; - } else if (indentLevel > 1) { - p.className = 'indent2'; - } - p.appendChild(document.createTextNode(message)); - this.logElement.appendChild(p); - - // Scroll to bottom of div - this.logElement.scrollTop = this.logElement.scrollHeight; -}; - -/** - * Add the given message to the debug log. - * - * @param {string} message The debug info to add to the log. - */ -remoting.DebugLog.prototype.log = function(message) { - this.logIndent(0, message); -} - -/** - * Show or hide the debug log. - */ -remoting.DebugLog.prototype.toggle = function() { - var debugLog = /** @type {Element} */ this.logElement.parentNode; - if (debugLog.hidden) { - debugLog.hidden = false; - } else { - debugLog.hidden = true; - } -}; - -/** - * Update the statistics panel. - * @param {Object.} stats The connection statistics. - */ -remoting.DebugLog.prototype.updateStatistics = function(stats) { - var units = ''; - var videoBandwidth = stats[remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH]; - if (videoBandwidth < 1024) { - units = 'Bps'; - } else if (videoBandwidth < 1048576) { - units = 'KiBps'; - videoBandwidth = videoBandwidth / 1024; - } else if (videoBandwidth < 1073741824) { - units = 'MiBps'; - videoBandwidth = videoBandwidth / 1048576; - } else { - units = 'GiBps'; - videoBandwidth = videoBandwidth / 1073741824; - } - - var statistics = document.getElementById('statistics'); - this.statsElement.innerText = - 'Bandwidth: ' + videoBandwidth.toFixed(2) + units + - ', Frame Rate: ' + - (stats[remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE] ? - stats[remoting.ClientSession.STATS_KEY_VIDEO_FRAME_RATE].toFixed(2) - + ' fps' : 'n/a') + - ', Capture: ' + - stats[remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY].toFixed(2) + - 'ms' + - ', Encode: ' + - stats[remoting.ClientSession.STATS_KEY_ENCODE_LATENCY].toFixed(2) + - 'ms' + - ', Decode: ' + - stats[remoting.ClientSession.STATS_KEY_DECODE_LATENCY].toFixed(2) + - 'ms' + - ', Render: ' + - stats[remoting.ClientSession.STATS_KEY_RENDER_LATENCY].toFixed(2) + - 'ms' + - ', Latency: ' + - stats[remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY].toFixed(2) + - 'ms'; -}; - -/** - * Check for the debug toggle hot-key. - * - * @param {Event} event The keyboard event. - * @return {void} Nothing. - */ -remoting.DebugLog.onKeydown = function(event) { - var element = /** @type {Element} */ (event.target); - if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') { - return; - } - if (String.fromCharCode(event.which) == 'D') { - remoting.debug.toggle(); - } -}; - -/** - * Verify that the only attributes on the given |node| are those specified - * in the |attrs| string. - * - * @param {Node} node The node to verify. - * @param {string} validAttrs Comma-separated list of valid attributes. - * - * @return {boolean} True if the node contains only valid attributes. - */ -remoting.DebugLog.prototype.verifyAttributes = function(node, validAttrs) { - var attrs = ',' + validAttrs + ','; - var len = node.attributes.length; - for (var i = 0; i < len; i++) { - /** @type {Node} */ - var attrNode = node.attributes[i]; - var attr = attrNode.nodeName; - if (attrs.indexOf(',' + attr + ',') == -1) { - return false; - } - } - return true; -} - -/** - * Record the client and host JIDs so that we can check them against the - * params in the IQ packets. - * - * @param {string} clientJid The client JID string. - * @param {string} hostJid The host JID string. - */ -remoting.DebugLog.prototype.setJids = function(clientJid, hostJid) { - this.clientJid = clientJid; - this.hostJid = hostJid; -} - -/** - * Calculate the 'pretty' version of data from the |server| node and return - * it as a string. - * - * @param {Node} server Xml node with server info. - * - * @return {Array} Array of boolean result and pretty-version of |server| node. - */ -remoting.DebugLog.prototype.calcServerString = function(server) { - if (!this.verifyAttributes(server, 'host,udp,tcp,tcpssl')) { - return [false, '']; - } - var host = server.getAttribute('host'); - var udp = server.getAttribute('udp'); - var tcp = server.getAttribute('tcp'); - var tcpssl = server.getAttribute('tcpssl'); - - var str = "'" + host + "'"; - if (udp) - str = str + ' udp:' + udp; - if (tcp) - str = str + ' tcp:' + tcp; - if (tcpssl) - str = str + ' tcpssl:' + tcpssl; - - str = str + '; '; - return [true, str]; -}; - -/** - * Calc the 'pretty' version of channel data and return it as a string. - * - * @param {Node} channel Xml node with channel info. - * - * @return {Array} Array of result and pretty-version of |channel| node. - */ -remoting.DebugLog.prototype.calcChannelString = function(channel) { - var name = channel.nodeName; - if (!this.verifyAttributes(channel, 'transport,version,codec')) { - return [false, '']; - } - var transport = channel.getAttribute('transport'); - var version = channel.getAttribute('version'); - var desc = name + ' ' + transport + ' v' + version; - if (name == 'video') { - desc = desc + ' codec=' + channel.getAttribute('codec'); - } - return [true, desc + '; ']; -} - -/** - * Pretty print the jingleinfo from the given Xml node. - * - * @param {Node} query Xml query node with jingleinfo in the child nodes. - * - * @return {boolean} True if we were able to pretty-print the information. - */ -remoting.DebugLog.prototype.prettyJingleinfo = function(query) { - var nodes = query.childNodes; - var stun_servers = ''; - for (var i = 0; i < nodes.length; i++) { - /** @type {Node} */ - var node = nodes[i]; - var name = node.nodeName; - if (name == 'stun') { - var sserver = ''; - var stun_nodes = node.childNodes; - for(var s = 0; s < stun_nodes.length; s++) { - /** @type {Node} */ - var stun_node = stun_nodes[s]; - var sname = stun_node.nodeName; - if (sname == 'server') { - var stun_sinfo = this.calcServerString(stun_node); - /** @type {boolean} */ - var stun_success = stun_sinfo[0]; - /** @type {string} */ - var stun_sstring = stun_sinfo[1]; - if (!stun_success) { - return false; - } - sserver = sserver + stun_sstring; - } - } - this.logIndent(1, 'stun ' + sserver); - } else if (name == 'relay') { - var token = 'token: '; - var rserver = ''; - var relay_nodes = node.childNodes; - for(var r = 0; r < relay_nodes.length; r++) { - /** @type {Node} */ - var relay_node = relay_nodes[r]; - var rname = relay_node.nodeName; - if (rname == 'token') { - token = token + relay_node.textContent; - } - if (rname == 'server') { - var relay_sinfo = this.calcServerString(relay_node); - /** @type {boolean} */ - var relay_success = relay_sinfo[0]; - /** @type {string} */ - var relay_sstring = relay_sinfo[1]; - if (!relay_success) { - return false; - } - rserver = rserver + relay_sstring; - } - } - this.logIndent(1, 'relay ' + rserver + token); - } else { - return false; - } - } - - return true; -}; - -/** - * Pretty print the session-initiate or session-accept info from the given - * Xml node. - * - * @param {Node} jingle Xml node with jingle session-initiate or session-accept - * info contained in child nodes. - * - * @return {boolean} True if we were able to pretty-print the information. - */ -remoting.DebugLog.prototype.prettySessionInitiateAccept = function(jingle) { - if (jingle.childNodes.length != 1) { - return false; - } - var content = jingle.firstChild; - if (content.nodeName != 'content') { - return false; - } - var content_children = content.childNodes; - for (var c = 0; c < content_children.length; c++) { - /** @type {Node} */ - var content_child = content_children[c]; - var cname = content_child.nodeName; - if (cname == 'description') { - var channels = ''; - var resolution = ''; - var auth = ''; - var desc_children = content_child.childNodes; - for (var d = 0; d < desc_children.length; d++) { - /** @type {Node} */ - var desc = desc_children[d]; - var dname = desc.nodeName; - if (dname == 'control' || dname == 'event' || dname == 'video') { - var cinfo = this.calcChannelString(desc); - /** @type {boolean} */ - var success = cinfo[0]; - /** @type {string} */ - var cstring = cinfo[1]; - if (!success) { - return false; - } - channels = channels + cstring; - } else if (dname == 'initial-resolution') { - resolution = desc.getAttribute('width') + 'x' + - desc.getAttribute('height'); - } else if (dname == 'authentication') { - var auth_children = desc.childNodes; - for (var a = 0; a < auth_children.length; a++) { - /** @type {Node} */ - var auth_info = auth_children[a]; - if (auth_info.nodeName == 'auth-token') { - auth = auth + ' (auth-token) ' + auth_info.textContent; - } else if (auth_info.nodeName == 'certificate') { - auth = auth + ' (certificate) ' + auth_info.textContent; - } else if (auth_info.nodeName == 'master-key') { - auth = auth + ' (master-key) ' + auth_info.textContent; - } else { - return false; - } - } - } else { - return false; - } - } - this.logIndent(1, 'channels: ' + channels); - this.logIndent(1, 'auth:' + auth); - this.logIndent(1, 'initial resolution: ' + resolution); - } else if (cname == 'transport') { - // The 'transport' node is currently empty. - var transport_children = content_child.childNodes; - if (transport_children.length != 0) { - return false; - } - } else { - return false; - } - } - return true; -}; - -/** - * Pretty print the session-terminate info from the given Xml node. - * - * @param {Node} jingle Xml node with jingle session-terminate info contained in - * child nodes. - * - * @return {boolean} True if we were able to pretty-print the information. - */ -remoting.DebugLog.prototype.prettySessionTerminate = function(jingle) { - if (jingle.childNodes.length != 1) { - return false; - } - var reason = jingle.firstChild; - if (reason.nodeName != 'reason' || reason.childNodes.length != 1) { - return false; - } - var info = reason.firstChild; - if (info.nodeName == 'success') { - this.logIndent(1, 'reason=success'); - } else { - return false; - } - return true; -}; - -/** - * Pretty print the transport-info info from the given Xml node. - * - * @param {Node} jingle Xml node with jingle transport info contained in child - * nodes. - * - * @return {boolean} True if we were able to pretty-print the information. - */ -remoting.DebugLog.prototype.prettyTransportInfo = function(jingle) { - if (jingle.childNodes.length != 1) { - return false; - } - var content = jingle.firstChild; - if (content.nodeName != 'content') { - return false; - } - var transport = content.firstChild; - if (transport.nodeName != 'transport') { - return false; - } - var transport_children = transport.childNodes; - for (var t = 0; t < transport_children.length; t++) { - /** @type {Node} */ - var candidate = transport_children[t]; - if (candidate.nodeName != 'candidate') { - return false; - } - if (!this.verifyAttributes(candidate, 'name,address,port,preference,' + - 'username,protocol,generation,password,type,' + - 'network')) { - return false; - } - var name = candidate.getAttribute('name'); - var address = candidate.getAttribute('address'); - var port = candidate.getAttribute('port'); - var pref = candidate.getAttribute('preference'); - var username = candidate.getAttribute('username'); - var protocol = candidate.getAttribute('protocol'); - var generation = candidate.getAttribute('generation'); - var password = candidate.getAttribute('password'); - var type = candidate.getAttribute('type'); - var network = candidate.getAttribute('network'); - - var info = name + ': ' + address + ':' + port + ' ' + protocol + - ' name:' + username + ' pwd:' + password + - ' pref:' + pref + - ' ' + type; - if (network) { - info = info + " network:'" + network + "'"; - } - this.logIndent(1, info) - } - return true; -}; - -/** - * Pretty print the jingle action contained in the given Xml node. - * - * @param {Node} jingle Xml node with jingle action contained in child nodes. - * @param {string} action String containing the jingle action. - * - * @return {boolean} True if we were able to pretty-print the information. - */ -remoting.DebugLog.prototype.prettyJingleAction = function(jingle, action) { - if (action == 'session-initiate' || action == 'session-accept') { - return this.prettySessionInitiateAccept(jingle); - } - if (action == 'session-terminate') { - return this.prettySessionTerminate(jingle); - } - if (action == 'transport-info') { - return this.prettyTransportInfo(jingle); - } - return false; -}; - -/** - * Pretty print the jingle error information contained in the given Xml node. - * - * @param {Node} error Xml node containing error information in child nodes. - * - * @return {boolean} True if we were able to pretty-print the information. - */ -remoting.DebugLog.prototype.prettyError = function(error) { - if (!this.verifyAttributes(error, 'xmlns:err,code,type,err:hostname,' + - 'err:bnsname,err:stacktrace')) { - return false; - } - var code = error.getAttribute('code'); - var type = error.getAttribute('type'); - var hostname = error.getAttribute('err:hostname'); - var bnsname = error.getAttribute('err:bnsname'); - var stacktrace = error.getAttribute('err:stacktrace'); - this.logIndent(1, 'error ' + code + ' ' + type + " hostname:'" + - hostname + "' bnsname:'" + bnsname + "'"); - var children = error.childNodes; - for (var i = 0; i < children.length; i++) { - /** @type {Node} */ - var child = children[i]; - this.logIndent(1, child.nodeName); - } - if (stacktrace) { - var stack = stacktrace.split(' | '); - this.logIndent(1, 'stacktrace:'); - // We use 'length-1' because the stack trace ends with " | " which results - // in an empty string at the end after the split. - for (var s = 0; s < stack.length - 1; s++) { - this.logIndent(2, stack[s]); - } - } - return true; -}; - -/** - * Print out the heading line for an iq node. - * - * @param {string} action String describing action (send/receive). - * @param {string} id Packet id. - * @param {string} desc Description of iq action for this node. - * @param {string|null} sid Session id. - */ -remoting.DebugLog.prototype.prettyIqHeading = function(action, id, desc, sid) { - var message = 'iq ' + action + ' id=' + id; - if (desc) { - message = message + ' ' + desc; - } - if (sid) { - message = message + ' sid=' + sid; - } - this.log(message); -} - -/** - * Print out an iq 'result'-type node. - * - * @param {string} action String describing action (send/receive). - * @param {NodeList} iq_list Node list containing the 'result' xml. - * - * @return {boolean} True if the data was logged successfully. - */ -remoting.DebugLog.prototype.prettyIqResult = function(action, iq_list) { - /** @type {Node} */ - var iq = iq_list[0]; - var id = iq.getAttribute('id'); - var iq_children = iq.childNodes; - - if (iq_children.length == 0) { - this.prettyIqHeading(action, id, 'result (empty)', null); - return true; - } else if (iq_children.length == 1) { - /** @type {Node} */ - var child = iq_children[0]; - if (child.nodeName == 'query') { - if (!this.verifyAttributes(child, 'xmlns')) { - return false; - } - var xmlns = child.getAttribute('xmlns'); - if (xmlns == 'google:jingleinfo') { - this.prettyIqHeading(action, id, 'result ' + xmlns, null); - return this.prettyJingleinfo(child); - } - return true; - } else if (child.nodeName == 'rem:log-result') { - if (!this.verifyAttributes(child, 'xmlns:rem')) { - return false; - } - this.prettyIqHeading(action, id, 'result (log-result)', null); - return true; - } - } - return false; -} - -/** - * Print out an iq 'get'-type node. - * - * @param {string} action String describing action (send/receive). - * @param {NodeList} iq_list Node containing the 'get' xml. - * - * @return {boolean} True if the data was logged successfully. - */ -remoting.DebugLog.prototype.prettyIqGet = function(action, iq_list) { - /** @type {Node} */ - var iq = iq_list[0]; - var id = iq.getAttribute('id'); - var iq_children = iq.childNodes; - - if (iq_children.length != 1) { - return false; - } - - /** @type {Node} */ - var query = iq_children[0]; - if (query.nodeName != 'query') { - return false; - } - if (!this.verifyAttributes(query, 'xmlns')) { - return false; - } - var xmlns = query.getAttribute('xmlns'); - this.prettyIqHeading(action, id, 'get ' + xmlns, null); - return true; -} - -/** - * Print out an iq 'set'-type node. - * - * @param {string} action String describing action (send/receive). - * @param {NodeList} iq_list Node containing the 'set' xml. - * - * @return {boolean} True if the data was logged successfully. - */ -remoting.DebugLog.prototype.prettyIqSet = function(action, iq_list) { - /** @type {Node} */ - var iq = iq_list[0]; - var id = iq.getAttribute('id'); - var iq_children = iq.childNodes; - - var children = iq_children.length; - if (children >= 1) { - /** @type {Node} */ - var child = iq_children[0]; - if (child.nodeName == 'jingle') { - var jingle = child; - if (!this.verifyAttributes(jingle, 'xmlns,action,sid,initiator')) { - return false; - } - - var jingle_action = jingle.getAttribute('action'); - var sid = jingle.getAttribute('sid'); - - if (children == 1) { - this.prettyIqHeading(action, id, 'set ' + jingle_action, sid); - return this.prettyJingleAction(jingle, jingle_action); - - } else if (children == 2) { - if (jingle_action == 'session-initiate') { - this.prettyIqHeading(action, id, 'set ' + jingle_action, sid); - if (!this.prettySessionInitiateAccept(jingle)) { - return false; - } - - // When there are two child nodes for a 'session-initiate' node, - // the second is a duplicate copy of the 'session' info added by - // libjingle for backward compatability with an older version of - // Jingle (called Gingle). - // Since M16 we no longer use libjingle on the client side and thus - // we no longer generate this duplicate node. - - // Require that second child is 'session' with type='initiate'. - /** @type {Node} */ - var session = iq_children[1]; - if (session.nodeName != 'session') { - return false; - } - var type = session.getAttribute('type'); - if (type != 'initiate') { - return false; - } - // Silently ignore contents of 'session' node. - return true; - } - } - } - } - return false; -}; - -/** - * Print out an iq 'error'-type node. - * - * @param {string} action String describing action (send/receive). - * @param {NodeList} iq_list Node containing the 'error' xml. - * - * @return {boolean} True if the data was logged successfully. - */ -remoting.DebugLog.prototype.prettyIqError = function(action, iq_list) { - /** @type {Node} */ - var iq = iq_list[0]; - var id = iq.getAttribute('id'); - var iq_children = iq.childNodes; - - var children = iq_children.length; - if (children != 2) { - return false; - } - - /** @type {Node} */ - var jingle = iq_children[0]; - if (jingle.nodeName != 'jingle') { - return false; - } - if (!this.verifyAttributes(jingle, 'xmlns,action,sid')) { - return false; - } - var jingle_action = jingle.getAttribute('action'); - var sid = jingle.getAttribute('sid'); - this.prettyIqHeading(action, id, 'error from ' + jingle_action, sid); - if (!this.prettyJingleAction(jingle, jingle_action)) { - return false; - } - - /** @type {Node} */ - var error = iq_children[1]; - if (error.nodeName != 'cli:error') { - return false; - } - return this.prettyError(error); -} - -/** - * Try to log a pretty-print the given IQ stanza (XML). - * Return true if the stanza was successfully printed. - * - * @param {boolean} send True if we're sending this stanza; false for receiving. - * @param {string} message The XML stanza to add to the log. - * - * @return {boolean} True if the stanza was logged. - */ -remoting.DebugLog.prototype.prettyIq = function(send, message) { - var parser = new DOMParser(); - var xml = parser.parseFromString(message, 'text/xml'); - - var iq_list = xml.getElementsByTagName('iq'); - - if (iq_list && iq_list.length > 0) { - /** @type {Node} */ - var iq = iq_list[0]; - if (!this.verifyAttributes(iq, 'xmlns,xmlns:cli,id,to,from,type')) - return false; - - // Verify that the to/from fields match the expected sender/receiver. - var to = iq.getAttribute('to'); - var from = iq.getAttribute('from'); - var action = ''; - var bot = remoting.DebugLog.prototype.REMOTING_DIRECTORY_SERVICE_BOT; - if (send) { - if (to && to != this.hostJid && to != bot) { - this.log('bad to: ' + to); - return false; - } - if (from && from != this.clientJid) { - this.log('bad from: ' + from); - return false; - } - - action = "send"; - if (to == bot) { - action = action + " (to bot)"; - } - } else { - if (to && to != this.clientJid) { - this.log('bad to: ' + to); - return false; - } - if (from && from != this.hostJid && from != bot) { - this.log('bad from: ' + from); - return false; - } - - action = "receive"; - if (from == bot) { - action = action + " (from bot)"; - } - } - - var type = iq.getAttribute('type'); - if (type == 'result') { - return this.prettyIqResult(action, iq_list); - } else if (type == 'get') { - return this.prettyIqGet(action, iq_list); - } else if (type == 'set') { - return this.prettyIqSet(action, iq_list); - } else if (type == 'error') { - return this.prettyIqError(action, iq_list); - } - } - - return false; -}; - -/** - * Add the given IQ stanza to the debug log. - * When possible, the stanza string will be simplified to make it more - * readable. - * - * @param {boolean} send True if we're sending this stanza; false for receiving. - * @param {string} message The XML stanza to add to the log. - */ -remoting.DebugLog.prototype.logIq = function(send, message) { - if (!this.prettyIq(send, message)) { - // Fall back to showing the raw stanza. - var prefix = (send ? 'Sending Iq: ' : 'Receiving Iq: '); - this.log(prefix + message); - } -}; - -/** @type {remoting.DebugLog} */ -remoting.debug = null; diff --git a/remoting/webapp/me2mom/dividerbottom.png b/remoting/webapp/me2mom/dividerbottom.png deleted file mode 100644 index 3234694..0000000 Binary files a/remoting/webapp/me2mom/dividerbottom.png and /dev/null differ diff --git a/remoting/webapp/me2mom/dividertop.png b/remoting/webapp/me2mom/dividertop.png deleted file mode 100644 index 50cf995..0000000 Binary files a/remoting/webapp/me2mom/dividertop.png and /dev/null differ diff --git a/remoting/webapp/me2mom/event_handlers.js b/remoting/webapp/me2mom/event_handlers.js deleted file mode 100644 index bafb58e..0000000 --- a/remoting/webapp/me2mom/event_handlers.js +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -function onLoad() { - var goHome = function() { - remoting.setMode(remoting.AppMode.HOME); - }; - var goClient = function() { - remoting.setMode(remoting.AppMode.CLIENT_UNCONNECTED); - }; - /** @param {Event} event */ - var sendAccessCode = function(event) { - remoting.connectIt2Me(); - event.preventDefault(); - }; - /** @param {Event} event */ - var connectHostWithPin = function(event) { - remoting.connectMe2MeWithPin(); - event.preventDefault(); - }; - var doAuthRedirect = function() { - remoting.oauth2.doAuthRedirect(); - } - /** @type {Array.<{event: string, id: string, fn: function(Event):void}>} */ - var actions = [ - { event: 'click', id: 'clear-oauth', fn: remoting.clearOAuth2 }, - { event: 'click', id: 'toolbar-disconnect', fn: remoting.disconnect }, - { event: 'click', id: 'toggle-scaling', fn: remoting.toggleScaleToFit }, - { event: 'click', id: 'auth-button', fn: doAuthRedirect }, - { event: 'click', id: 'share-button', fn: remoting.tryShare }, - { event: 'click', id: 'access-mode-button', fn: goClient }, - { event: 'click', id: 'cancel-share-button', fn: remoting.cancelShare }, - { event: 'click', id: 'host-finished-button', fn: goHome }, - { event: 'click', id: 'client-cancel-button', fn: goHome }, - { event: 'click', id: 'client-finished-button', fn: goClient }, - { event: 'click', id: 'cancel-button', - fn: remoting.cancelPendingOperation }, - { event: 'submit', id: 'access-code-form', fn: sendAccessCode }, - { event: 'submit', id: 'pin-form', fn: connectHostWithPin } - ]; - - for (var i = 0; i < actions.length; ++i) { - var action = actions[i]; - var element = document.getElementById(action.id); - if (element) { - element.addEventListener(action.event, action.fn, false); - } else { - console.error('Could not set ' + action.id + - ' event handler on element ' + action.event + - ': element not found.'); - } - } - remoting.init(); -} - -function onBeforeUnload() { - return remoting.promptClose(); -} - -window.addEventListener('load', onLoad, false); -window.addEventListener('beforeunload', onBeforeUnload, false); -window.addEventListener('resize', remoting.onResize, false); -window.addEventListener('unload', remoting.disconnect, false); diff --git a/remoting/webapp/me2mom/host_list.js b/remoting/webapp/me2mom/host_list.js deleted file mode 100644 index 8539f28..0000000 --- a/remoting/webapp/me2mom/host_list.js +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Class representing the host-list portion of the home screen UI. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * Create a host list consisting of the specified HTML elements, which should - * have a common parent that contains only host-list UI as it will be hidden - * if the host-list is empty. - * - * @constructor - * @param {Element} table The HTML to contain host-list. - * @param {Element} errorDiv The HTML
to display error messages. - */ -remoting.HostList = function(table, errorDiv) { - /** - * @type {Element} - * @private - */ - this.table_ = table; - /** - * @type {Element} - * @private - */ - this.errorDiv_ = errorDiv; - /** - * @type {Array.} - * @private - */ - this.hostTableEntries_ = []; - /** - * @type {Array.} - * @private - */ - this.hosts_ = []; - /** - * @type {string} - * @private - */ - this.lastError_ = ''; - - // Load the cache of the last host-list, if present. - var cached = /** @type {string} */ - (window.localStorage.getItem(remoting.HostList.HOSTS_KEY)); - if (cached) { - try { - this.hosts_ = /** @type {Array} */ JSON.parse(cached); - } catch (err) { - console.error('Invalid host list cache:', /** @type {*} */(err)); - } - } -}; - -/** - * Search the host list for a host with the specified id. - * - * @param {string} hostId The unique id of the host. - * @return {remoting.Host?} The host, if any. - */ -remoting.HostList.prototype.getHostForId = function(hostId) { - for (var i = 0; i < this.hosts_.length; ++i) { - if (this.hosts_[i].hostId == hostId) { - return this.hosts_[i]; - } - } - return null; -}; - -/** - * Query the Remoting Directory for the user's list of hosts. - * - * @param {function(boolean):void} onDone Callback invoked with true on success - * or false on failure. - * @return {void} Nothing. - */ -remoting.HostList.prototype.refresh = function(onDone) { - /** @type {remoting.HostList} */ - var that = this; - /** @param {XMLHttpRequest} xhr The response from the server. */ - var parseHostListResponse = function(xhr) { - that.parseHostListResponse_(xhr, onDone); - } - /** @param {string} token The OAuth2 token. */ - var getHosts = function(token) { - var headers = { 'Authorization': 'OAuth ' + token }; - remoting.xhr.get( - 'https://www.googleapis.com/chromoting/v1/@me/hosts', - parseHostListResponse, '', headers); - }; - remoting.oauth2.callWithToken(getHosts); -}; - -/** - * Handle the results of the host list request. A success response will - * include a JSON-encoded list of host descriptions, which we display if we're - * able to successfully parse it. - * - * @param {XMLHttpRequest} xhr The XHR object for the host list request. - * @param {function(boolean):void} onDone The callback passed to |refresh|. - * @return {void} Nothing. - * @private - */ -remoting.HostList.prototype.parseHostListResponse_ = function(xhr, onDone) { - this.hosts_ = []; - this.lastError_ = ''; - try { - if (xhr.status == 200) { - var parsed_response = - /** @type {{data: {items: Array}}} */ JSON.parse(xhr.responseText); - if (parsed_response.data && parsed_response.data.items) { - this.hosts_ = parsed_response.data.items; - } - } else { - // Some other error. - console.error('Bad status on host list query: ', xhr); - if (xhr.status == 403) { - // The user's account is not enabled for Me2Me, so fail silently. - } else if (xhr.status >= 400 && xhr.status < 500) { - // For other errors, tell the user to re-authorize us. - this.lastError_ = remoting.Error.GENERIC; - } else if (xhr.status == 503) { - this.lastError_ = remoting.Error.SERVICE_UNAVAILABLE; - } else { - this.lastError_ = remoting.Error.UNEXPECTED; - } - } - } catch (er) { - var typed_er = /** @type {Object} */ (er); - console.error('Error processing response: ', xhr, typed_er); - this.lastError_ = remoting.Error.UNEXPECTED; - } - window.localStorage.setItem(remoting.HostList.HOSTS_KEY, - JSON.stringify(this.hosts_)); - onDone(this.lastError_ == ''); -}; - -/** - * Display the list of hosts or error condition. - * - * @return {void} Nothing. - */ -remoting.HostList.prototype.display = function() { - this.table_.innerHTML = ''; - this.errorDiv_.innerText = ''; - this.hostTableEntries_ = []; - - /** - * @type {remoting.HostList} - */ - var that = this; - /** - * @param {remoting.HostTableEntry} hostTableEntry The entry being renamed. - */ - var onRename = function(hostTableEntry) { that.renameHost_(hostTableEntry); } - /** - * @param {remoting.HostTableEntry} hostTableEntry The entry beign deleted. - */ - var onDelete = function(hostTableEntry) { that.deleteHost_(hostTableEntry); } - - for (var i = 0; i < this.hosts_.length; ++i) { - /** @type {remoting.Host} */ - var host = this.hosts_[i]; - // Validate the entry to make sure it has all the fields we expect. - if (host.hostName && host.hostId && host.status && host.jabberId && - host.publicKey) { - var hostTableEntry = new remoting.HostTableEntry(); - hostTableEntry.init(host, onRename, onDelete); - this.hostTableEntries_[i] = hostTableEntry; - this.table_.appendChild(hostTableEntry.tableRow); - } - } - - if (this.lastError_ != '') { - l10n.localizeElementFromTag(this.errorDiv_, this.lastError_); - } - - this.showOrHide_(this.hosts_.length != 0 || this.lastError_ != ''); -}; - -/** - * Show or hide the host-list UI. - * - * @param {boolean} show True to show the UI, or false to hide it. - * @return {void} Nothing. - * @private - */ -remoting.HostList.prototype.showOrHide_ = function(show) { - var parent = /** @type {Element} */ (this.table_.parentNode); - parent.hidden = !show; - if (show) { - parent.style.height = parent.scrollHeight + 'px'; - removeClass(parent, remoting.HostList.COLLAPSED_); - } else { - addClass(parent, remoting.HostList.COLLAPSED_); - } -}; - -/** - * Remove a host from the list, and deregister it. - * @param {remoting.HostTableEntry} hostTableEntry The host to be removed. - * @return {void} Nothing. - * @private - */ -remoting.HostList.prototype.deleteHost_ = function(hostTableEntry) { - this.table_.removeChild(hostTableEntry.tableRow); - var index = this.hostTableEntries_.indexOf(hostTableEntry); - if (index != -1) { - this.hostTableEntries_.splice(index, 1); - } - - /** @param {string} token The OAuth2 token. */ - var deleteHost = function(token) { - var headers = { 'Authorization': 'OAuth ' + token }; - remoting.xhr.remove( - 'https://www.googleapis.com/chromoting/v1/@me/hosts/' + - hostTableEntry.host.hostId, - function() {}, '', headers); - } - remoting.oauth2.callWithToken(deleteHost); - - this.showOrHide_(this.hostTableEntries_.length != 0); -}; - -/** - * Prepare a host for renaming by replacing its name with an edit box. - * @param {remoting.HostTableEntry} hostTableEntry The host to be renamed. - * @return {void} Nothing. - * @private - */ -remoting.HostList.prototype.renameHost_ = function(hostTableEntry) { - /** @param {string} token */ - var renameHost = function(token) { - var headers = { - 'Authorization': 'OAuth ' + token, - 'Content-type' : 'application/json; charset=UTF-8' - }; - var newHostDetails = { data: { - hostId: hostTableEntry.host.hostId, - hostName: hostTableEntry.host.hostName, - publicKey: hostTableEntry.host.publicKey - } }; - remoting.xhr.put( - 'https://www.googleapis.com/chromoting/v1/@me/hosts/' + - hostTableEntry.host.hostId, - function(xhr) {}, - JSON.stringify(newHostDetails), - headers); - } - remoting.oauth2.callWithToken(renameHost); -}; - -/** - * Class name for the host list when it is collapsed. - * @private - */ -remoting.HostList.COLLAPSED_ = 'collapsed'; - -/** - * Key name under which Me2Me hosts are cached. - */ -remoting.HostList.HOSTS_KEY = 'me2me-cached-hosts'; - -/** @type {remoting.HostList} */ -remoting.hostList = null; diff --git a/remoting/webapp/me2mom/host_plugin_proto.js b/remoting/webapp/me2mom/host_plugin_proto.js deleted file mode 100644 index a64ac46..0000000 --- a/remoting/webapp/me2mom/host_plugin_proto.js +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file contains type definitions for the host plugin. It is used only -// with JSCompiler to verify the type-correctness of our code. - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @constructor - * @extends HTMLElement - */ -remoting.HostPlugin = function() {}; - -/** @param {string} email The email address of the connector. - * @param {string} token The access token for the connector. - * @return {void} Nothing. */ -remoting.HostPlugin.prototype.connect = function(email, token) {}; - -/** @return {void} Nothing. */ -remoting.HostPlugin.prototype.disconnect = function() {}; - -/** @param {function(string):string} callback Pointer to chrome.i18n.getMessage. - * @return {void} Nothing. */ -remoting.HostPlugin.prototype.localize = function(callback) {}; - -/** @type {number} */ remoting.HostPlugin.prototype.state; - -/** @type {number} */ remoting.HostPlugin.prototype.STARTING; -/** @type {number} */ remoting.HostPlugin.prototype.REQUESTED_ACCESS_CODE; -/** @type {number} */ remoting.HostPlugin.prototype.RECEIVED_ACCESS_CODE; -/** @type {number} */ remoting.HostPlugin.prototype.CONNECTED; -/** @type {number} */ remoting.HostPlugin.prototype.DISCONNECTED; -/** @type {number} */ remoting.HostPlugin.prototype.DISCONNECTING; -/** @type {number} */ remoting.HostPlugin.prototype.ERROR; - -/** @type {string} */ remoting.HostPlugin.prototype.accessCode; -/** @type {number} */ remoting.HostPlugin.prototype.accessCodeLifetime; - -/** @type {string} */ remoting.HostPlugin.prototype.client; - -/** @type {function(boolean):void} */ -remoting.HostPlugin.prototype.onNatTraversalPolicyChanged; diff --git a/remoting/webapp/me2mom/host_screen.js b/remoting/webapp/me2mom/host_screen.js deleted file mode 100644 index 2af3b84..0000000 --- a/remoting/webapp/me2mom/host_screen.js +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Functions related to the 'host screen' for Chromoting. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @type {boolean} Whether or not the last share was cancelled by the user. - * This controls what screen is shown when the host plugin signals - * completion. - * @private - */ -var lastShareWasCancelled_ = false; - -/** - * Start a host session. This is the main entry point for the host screen, - * called directly from the onclick action of a button on the home screen. - */ -remoting.tryShare = function() { - remoting.debug.log('Attempting to share...'); - lastShareWasCancelled_ = false; - if (remoting.oauth2.needsNewAccessToken()) { - remoting.debug.log('Refreshing token...'); - remoting.oauth2.refreshAccessToken(function() { - if (remoting.oauth2.needsNewAccessToken()) { - // If we still need it, we're going to infinite loop. - showShareError_(remoting.Error.AUTHENTICATION_FAILED); - throw 'Unable to get access token'; - } - remoting.tryShare(); - }); - return; - } - - onNatTraversalPolicyChanged_(true); // Hide warning by default. - remoting.setMode(remoting.AppMode.HOST_WAITING_FOR_CODE); - document.getElementById('cancel-button').disabled = false; - disableTimeoutCountdown_(); - - var div = document.getElementById('host-plugin-container'); - remoting.hostSession = new remoting.HostSession(); - remoting.hostSession.createPluginAndConnect( - document.getElementById('host-plugin-container'), - /** @type {string} */(remoting.oauth2.getCachedEmail()), - remoting.oauth2.getAccessToken(), - onNatTraversalPolicyChanged_, - onHostStateChanged_, - logDebugInfo_); -}; - -/** - * Callback for the host plugin to notify the web app of state changes. - * @param {remoting.HostSession.State} state The new state of the plugin. - */ -function onHostStateChanged_(state) { - if (state == remoting.HostSession.State.STARTING) { - // Nothing to do here. - remoting.debug.log('Host plugin state: STARTING'); - - } else if (state == remoting.HostSession.State.REQUESTED_ACCESS_CODE) { - // Nothing to do here. - remoting.debug.log('Host plugin state: REQUESTED_ACCESS_CODE'); - - } else if (state == remoting.HostSession.State.RECEIVED_ACCESS_CODE) { - remoting.debug.log('Host plugin state: RECEIVED_ACCESS_CODE'); - var accessCode = remoting.hostSession.getAccessCode(); - var accessCodeDisplay = document.getElementById('access-code-display'); - accessCodeDisplay.innerText = ''; - // Display the access code in groups of four digits for readability. - var kDigitsPerGroup = 4; - for (var i = 0; i < accessCode.length; i += kDigitsPerGroup) { - var nextFourDigits = document.createElement('span'); - nextFourDigits.className = 'access-code-digit-group'; - nextFourDigits.innerText = accessCode.substring(i, i + kDigitsPerGroup); - accessCodeDisplay.appendChild(nextFourDigits); - } - accessCodeExpiresIn_ = remoting.hostSession.getAccessCodeLifetime(); - if (accessCodeExpiresIn_ > 0) { // Check it hasn't expired. - accessCodeTimerId_ = setInterval( - 'remoting.decrementAccessCodeTimeout_()', 1000); - timerRunning_ = true; - updateAccessCodeTimeoutElement_(); - updateTimeoutStyles_(); - remoting.setMode(remoting.AppMode.HOST_WAITING_FOR_CONNECTION); - } else { - // This can only happen if the cloud tells us that the code lifetime is - // <= 0s, which shouldn't happen so we don't care how clean this UX is. - remoting.debug.log('Access code already invalid on receipt!'); - remoting.cancelShare(); - } - - } else if (state == remoting.HostSession.State.CONNECTED) { - remoting.debug.log('Host plugin state: CONNECTED'); - var element = document.getElementById('host-shared-message'); - var client = remoting.hostSession.getClient(); - l10n.localizeElement(element, client); - remoting.setMode(remoting.AppMode.HOST_SHARED); - disableTimeoutCountdown_(); - - } else if (state == remoting.HostSession.State.DISCONNECTING) { - remoting.debug.log('Host plugin state: DISCONNECTING'); - - } else if (state == remoting.HostSession.State.DISCONNECTED) { - remoting.debug.log('Host plugin state: DISCONNECTED'); - if (remoting.currentMode != remoting.AppMode.HOST_SHARE_FAILED) { - // If an error is being displayed, then the plugin should not be able to - // hide it by setting the state. Errors must be dismissed by the user - // clicking OK, which puts the app into mode HOME. - if (lastShareWasCancelled_) { - remoting.setMode(remoting.AppMode.HOME); - } else { - remoting.setMode(remoting.AppMode.HOST_SHARE_FINISHED); - } - } - remoting.hostSession.removePlugin(); - - } else if (state == remoting.HostSession.State.ERROR) { - remoting.debug.log('Host plugin state: ERROR'); - showShareError_(remoting.Error.GENERIC); - } else { - remoting.debug.log('Unknown state -> ' + state); - } -} - -/** - * This is the callback that the host plugin invokes to indicate that there - * is additional debug log info to display. - * @param {string} msg The message (which will not be localized) to be logged. - */ -function logDebugInfo_(msg) { - remoting.debug.log('plugin: ' + msg); -} - -/** - * Show a host-side error message. - * - * @param {string} errorTag The error message to be localized and displayed. - * @return {void} Nothing. - */ -function showShareError_(errorTag) { - var errorDiv = document.getElementById('host-plugin-error'); - l10n.localizeElementFromTag(errorDiv, errorTag); - remoting.debug.log('Sharing error: ' + errorTag); - remoting.setMode(remoting.AppMode.HOST_SHARE_FAILED); -} - -/** - * Cancel an active or pending share operation. - * - * @return {void} Nothing. - */ -remoting.cancelShare = function() { - remoting.debug.log('Canceling share...'); - remoting.lastShareWasCancelled = true; - try { - remoting.hostSession.disconnect(); - } catch (error) { - // Hack to force JSCompiler type-safety. - var errorTyped = /** @type {{description: string}} */ error; - remoting.debug.log('Error disconnecting: ' + errorTyped.description + - '. The host plugin probably crashed.'); - // TODO(jamiewalch): Clean this up. We should have a class representing - // the host plugin, like we do for the client, which should handle crash - // reporting and it should use a more detailed error message than the - // default 'generic' one. See crbug.com/94624 - showShareError_(remoting.Error.GENERIC); - } - disableTimeoutCountdown_(); -}; - -/** - * @type {boolean} Whether or not the access code timeout countdown is running. - * @private - */ -var timerRunning_ = false; - -/** - * @type {number} The id of the access code expiry countdown timer. - * @private - */ -var accessCodeTimerId_ = 0; - -/** - * @type {number} The number of seconds until the access code expires. - * @private - */ -var accessCodeExpiresIn_ = 0; - -/** - * The timer callback function, which needs to be visible from the global - * namespace. - * @private - */ -remoting.decrementAccessCodeTimeout_ = function() { - --accessCodeExpiresIn_; - updateAccessCodeTimeoutElement_(); -}; - -/** - * Stop the access code timeout countdown if it is running. - */ -function disableTimeoutCountdown_() { - if (timerRunning_) { - clearInterval(accessCodeTimerId_); - timerRunning_ = false; - updateTimeoutStyles_(); - } -} - -/** - * Constants controlling the access code timer countdown display. - * @private - */ -var ACCESS_CODE_TIMER_DISPLAY_THRESHOLD_ = 30; -var ACCESS_CODE_RED_THRESHOLD_ = 10; - -/** - * Show/hide or restyle various elements, depending on the remaining countdown - * and timer state. - * - * @return {boolean} True if the timeout is in progress, false if it has - * expired. - */ -function updateTimeoutStyles_() { - if (timerRunning_) { - if (accessCodeExpiresIn_ <= 0) { - remoting.cancelShare(); - return false; - } - if (accessCodeExpiresIn_ <= ACCESS_CODE_RED_THRESHOLD_) { - addClass(document.getElementById('access-code-display'), 'expiring'); - } else { - removeClass(document.getElementById('access-code-display'), 'expiring'); - } - } - document.getElementById('access-code-countdown').hidden = - (accessCodeExpiresIn_ > ACCESS_CODE_TIMER_DISPLAY_THRESHOLD_) || - !timerRunning_; - return true; -} - -/** - * Update the text and appearance of the access code timeout element to - * reflect the time remaining. - */ -function updateAccessCodeTimeoutElement_() { - var pad = (accessCodeExpiresIn_ < 10) ? '0:0' : '0:'; - l10n.localizeElement(document.getElementById('seconds-remaining'), - pad + accessCodeExpiresIn_); - if (!updateTimeoutStyles_()) { - disableTimeoutCountdown_(); - } -} - -/** - * Callback to show or hide the NAT traversal warning when the policy changes. - * @param {boolean} enabled True if NAT traversal is enabled. - * @return {void} Nothing. - */ -function onNatTraversalPolicyChanged_(enabled) { - var container = document.getElementById('nat-box-container'); - container.hidden = enabled; -} diff --git a/remoting/webapp/me2mom/host_session.js b/remoting/webapp/me2mom/host_session.js deleted file mode 100644 index 7dfb95a..0000000 --- a/remoting/webapp/me2mom/host_session.js +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Class handling creation and teardown of a remoting host session. - * - * This abstracts a element and controls the plugin which does the - * actual remoting work. There should be no UI code inside this class. It - * should be purely thought of as a controller of sorts. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @constructor - */ -remoting.HostSession = function() { - /** @private */ - this.HOST_PLUGIN_ID_ = 'host-plugin-id'; -}; - -/** @type {remoting.HostPlugin} */ -remoting.HostSession.prototype.plugin = null; - -// Note that these values are copied directly from host_script_object.h and -// must be kept in sync. -/** @enum {number} */ -remoting.HostSession.State = { - UNKNOWN: -1, - DISCONNECTED: 0, - STARTING: 1, - REQUESTED_ACCESS_CODE: 2, - RECEIVED_ACCESS_CODE: 3, - CONNECTED: 4, - DISCONNECTING: 5, - ERROR: 6 -}; - -/** - * Create the host plugin and initiate a connection. - * @param {Element} container The parent element to which to add the plugin. - * @param {string} email The user's email address. - * @param {string} accessToken A valid OAuth2 access token. - * @param {function(boolean):void} onNatTraversalPolicyChanged Callback - * for notification of changes to the NAT traversal policy. - * @param {function(remoting.HostSession.State):void} onStateChanged - * Callback for notifications of changes to the host plugin's state. - * @param {function(string):void} logDebugInfo Callback allowing the plugin - * to log messages to the debug log. - */ -remoting.HostSession.prototype.createPluginAndConnect = - function(container, email, accessToken, - onNatTraversalPolicyChanged, onStateChanged, logDebugInfo) { - this.plugin = /** @type {remoting.HostPlugin} */ - document.createElement('embed'); - this.plugin.type = remoting.PLUGIN_MIMETYPE; - this.plugin.id = this.HOST_PLUGIN_ID_; - // Hiding the plugin means it doesn't load, so make it size zero instead. - this.plugin.width = 0; - this.plugin.height = 0; - container.appendChild(this.plugin); - this.plugin.onNatTraversalPolicyChanged = onNatTraversalPolicyChanged; - this.plugin.onStateChanged = onStateChanged; - this.plugin.logDebugInfo = logDebugInfo; - this.plugin.localize(chrome.i18n.getMessage); - this.plugin.connect(email, 'oauth2:' + accessToken); -}; - -/** - * Get the access code generated by the host plugin. Valid only after the - * plugin state is RECEIVED_ACCESS_CODE. - * @return {string} The access code. - */ -remoting.HostSession.prototype.getAccessCode = function() { - return this.plugin.accessCode; -}; - -/** - * Get the lifetime for the access code. Valid only after the plugin state is - * RECEIVED_ACCESS_CODE. - * @return {number} The access code lifetime, in seconds. - */ -remoting.HostSession.prototype.getAccessCodeLifetime = function() { - return this.plugin.accessCodeLifetime; -}; - -/** - * Get the email address of the connected client. Valid only after the plugin - * state is CONNECTED. - * @return {string} The client's email address. - */ -remoting.HostSession.prototype.getClient = function() { - return this.plugin.client; -}; - -/** - * Disconnect the client. - * @return {void} Nothing. - */ -remoting.HostSession.prototype.disconnect = function() { - this.plugin.disconnect(); -}; - - -/** - * Remove the plugin element from the document. - * @return {void} Nothing. - */ -remoting.HostSession.prototype.removePlugin = function() { - this.plugin.parentNode.removeChild(this.plugin); -}; diff --git a/remoting/webapp/me2mom/host_table_entry.js b/remoting/webapp/me2mom/host_table_entry.js deleted file mode 100644 index 86e9409..0000000 --- a/remoting/webapp/me2mom/host_table_entry.js +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Class representing an entry in the host-list portion of the home screen. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * The deserialized form of the chromoting host as returned by Apiary. - * Note that the object has more fields than are detailed below--these - * are just the ones that we refer to directly. - * @constructor - */ -remoting.Host = function() { - /** @type {string} */ - this.hostName = ''; - /** @type {string} */ - this.hostId = ''; - /** @type {string} */ - this.status = ''; - /** @type {string} */ - this.jabberId = ''; - /** @type {string} */ - this.publicKey = ''; -}; - -/** - * An entry in the host table. - * @constructor - */ -remoting.HostTableEntry = function() { - /** @type {remoting.Host} */ - this.host = null; - /** @type {Element} */ - this.tableRow = null; - /** @type {Element} @private */ - this.hostNameCell_ = null; - /** @type {function(remoting.HostTableEntry):void} @private */ - this.onRename_ = function(hostId) {}; - /** @type {function():void} @private */ - this.onBlurReference_ = function() {}; -}; - -/** - * Create the HTML elements for this entry. - * @param {remoting.Host} host The host, as obtained from Apiary. - * @param {function(remoting.HostTableEntry):void} onRename Callback for - * rename operations. - * @param {function(remoting.HostTableEntry):void} onDelete Callback for - * delete operations. - */ -remoting.HostTableEntry.prototype.init = function(host, onRename, onDelete) { - this.host = host; - this.onRename_ = onRename; - - /** @type {remoting.HostTableEntry} */ - var that = this; - - this.tableRow = document.createElement('tr'); - addClass(this.tableRow, 'host-list-row'); - - // Create the host icon cell. - var hostIcon = document.createElement('td'); - addClass(hostIcon, 'host-list-row-start'); - var hostIconImage = document.createElement('img'); - hostIconImage.src = 'icon_host.png'; - addClass(hostIconImage, 'host-list-main-icon'); - hostIcon.appendChild(hostIconImage); - this.tableRow.appendChild(hostIcon); - - // Create the host name cell. - this.hostNameCell_ = document.createElement('td'); - addClass(this.hostNameCell_, 'mode-select-label'); - this.hostNameCell_.appendChild( - document.createTextNode(host.hostName)); - this.hostNameCell_.ondblclick = function() { that.beginRename_(); }; - this.tableRow.appendChild(this.hostNameCell_); - - // Create the host status cell. - var hostStatus = document.createElement('td'); - if (host.status == 'ONLINE') { - var hostUrl = chrome.extension.getURL('choice.html') + - '?mode=me2me&hostId=' + encodeURIComponent(host.hostId); - var connectButton = document.createElement('button'); - connectButton.setAttribute('class', 'mode-select-button'); - connectButton.setAttribute('type', 'button'); - var startMe2Me = function() { window.location.replace(hostUrl); }; - connectButton.addEventListener('click', startMe2Me, false); - connectButton.innerHTML = - chrome.i18n.getMessage(/*i18n-content*/'CONNECT_BUTTON'); - hostStatus.appendChild(connectButton); - } else { - addClass(this.tableRow, 'host-offline'); - hostStatus.innerHTML = chrome.i18n.getMessage(/*i18n-content*/'OFFLINE'); - } - hostStatus.className = 'host-list-row-end'; - this.tableRow.appendChild(hostStatus); - - // Create the host rename cell. - var editButton = document.createElement('td'); - editButton.onclick = function() { that.beginRename_(); }; - addClass(editButton, 'clickable'); - addClass(editButton, 'host-list-edit'); - var penImage = document.createElement('img'); - penImage.src = 'icon_pencil.png'; - addClass(penImage, 'host-list-rename-icon'); - editButton.appendChild(penImage); - this.tableRow.appendChild(editButton); - - // Create the host delete cell. - var deleteButton = document.createElement('td'); - deleteButton.onclick = function() { onDelete(that); } - addClass(deleteButton, 'clickable'); - addClass(deleteButton, 'host-list-edit'); - var crossImage = document.createElement('img'); - crossImage.src = 'icon_cross.png'; - addClass(crossImage, 'host-list-remove-icon'); - deleteButton.appendChild(crossImage); - this.tableRow.appendChild(deleteButton); -}; - -/** - * Prepare the host for renaming by replacing its name with an edit box. - * @return {void} Nothing. - * @private - */ -remoting.HostTableEntry.prototype.beginRename_ = function() { - var editBox = /** @type {HTMLInputElement} */ document.createElement('input'); - editBox.type = 'text'; - editBox.value = this.host.hostName; - this.hostNameCell_.innerHTML = ''; - this.hostNameCell_.appendChild(editBox); - editBox.select(); - - /** @type {remoting.HostTableEntry} */ - var that = this; - // Keep a reference to the blur event handler so that we can remove it later. - this.onBlurReference_ = function() { that.commitRename_(); }; - editBox.addEventListener('blur', this.onBlurReference_, false); - - /** @param {Event} event The keydown event. */ - var onKeydown = function(event) { that.onKeydown_(event); } - editBox.addEventListener('keydown', onKeydown, false); -}; - -/** - * Accept the hostname entered by the user. - * @return {void} Nothing. - * @private - */ -remoting.HostTableEntry.prototype.commitRename_ = function() { - var editBox = this.hostNameCell_.querySelector('input'); - if (editBox) { - if (this.host.hostName != editBox.value) { - this.host.hostName = editBox.value; - this.onRename_(this); - } - this.removeEditBox_(); - } -}; - -/** - * Remove the edit box corresponding to the specified host, and reset its name. - * @return {void} Nothing. - * @private - */ -remoting.HostTableEntry.prototype.removeEditBox_ = function() { - var editBox = this.hostNameCell_.querySelector('input'); - if (editBox) { - // onblur will fire when the edit box is removed, so remove the hook. - editBox.removeEventListener('blur', this.onBlurReference_, false); - } - this.hostNameCell_.innerHTML = ''; // Remove the edit box. - this.hostNameCell_.appendChild(document.createTextNode(this.host.hostName)); -}; - -/** - * Handle a key event while the user is typing a host name - * @param {Event} event The keyboard event. - * @return {void} Nothing. - * @private - */ -remoting.HostTableEntry.prototype.onKeydown_ = function(event) { - if (event.which == 27) { // Escape - this.removeEditBox_(); - } else if (event.which == 13) { // Enter - this.commitRename_(); - } -}; diff --git a/remoting/webapp/me2mom/l10n.js b/remoting/webapp/me2mom/l10n.js deleted file mode 100644 index 487d1c0..0000000 --- a/remoting/webapp/me2mom/l10n.js +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2011 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -var l10n = l10n || {}; - -/** - * Localize an element by setting its innerText according to the specified tag - * and an optional set of substitutions. - * @param {Element} element The element to localize. - * @param {string} tag The localization tag. - * @param {(string|Array)=} opt_substitutions An optional set of substitution - * strings corresponding to the "placeholders" attributes in messages.json. - * @return {boolean} True if the localization was successful; false otherwise. - */ -l10n.localizeElementFromTag = function(element, tag, opt_substitutions) { - var translation = chrome.i18n.getMessage(tag, opt_substitutions); - if (translation) { - element.innerHTML = translation; - } else { - console.error('Missing translation for "' + tag + '":', element); - } - return translation != null; -}; - -/** - * Localize an element by setting its innerText according to its i18n-content - * attribute, and an optional set of substitutions. - * @param {Element} element The element to localize. - * @param {(string|Array)=} opt_substitutions An optional set of substitution - * strings corresponding to the "placeholders" attributes in messages.json. - * @return {boolean} True if the localization was successful; false otherwise. - */ -l10n.localizeElement = function(element, opt_substitutions) { - var tag = element.getAttribute('i18n-content'); - return l10n.localizeElementFromTag(element, tag, opt_substitutions); -}; - -/** - * Localize all tags with the i18n-content attribute, using i18n-data-n - * attributes to specify any placeholder substitutions. - */ -l10n.localize = function() { - var elements = document.querySelectorAll('[i18n-content]'); - for (var i = 0; i < elements.length; ++i) { - /** @type {Element} */ var element = elements[i]; - var substitutions = null; - for (var j = 1; j < 9; ++j) { - var attr = 'i18n-value-' + j; - if (element.hasAttribute(attr)) { - if (!substitutions) { - substitutions = []; - } - substitutions.push(element.getAttribute(attr)); - } else { - break; - } - } - l10n.localizeElement(element, substitutions); - } -}; diff --git a/remoting/webapp/me2mom/log_to_server.js b/remoting/webapp/me2mom/log_to_server.js deleted file mode 100644 index 92841cc..0000000 --- a/remoting/webapp/me2mom/log_to_server.js +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Module for sending log entries to the server. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @constructor - */ -remoting.LogToServer = function() { - /** @type Array. */ - this.pendingEntries = []; - /** @type {remoting.StatsAccumulator} */ - this.statsAccumulator = new remoting.StatsAccumulator(); - /** @type string */ - this.sessionId = ''; - /** @type number */ - this.sessionIdGenerationTime = 0; - /** @type number */ - this.sessionStartTime = 0; -}; - -// Constants used for generating a session ID. -/** @private */ -remoting.LogToServer.SESSION_ID_ALPHABET_ = - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; -/** @private */ -remoting.LogToServer.SESSION_ID_LEN_ = 20; - -// The maximum age of a session ID, in milliseconds. -remoting.LogToServer.MAX_SESSION_ID_AGE = 24 * 60 * 60 * 1000; - -// The time over which to accumulate connection statistics before logging them -// to the server, in milliseconds. -remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME = 60 * 1000; - -/** - * Logs a client session state change. - * - * @param {remoting.ClientSession.State} state - * @param {remoting.ClientSession.ConnectionError} connectionError - */ -remoting.LogToServer.prototype.logClientSessionStateChange = - function(state, connectionError) { - this.maybeExpireSessionId(); - // Maybe set the session ID and start time. - if (remoting.LogToServer.isStartOfSession(state)) { - if (this.sessionId == '') { - this.setSessionId(); - } - if (this.sessionStartTime == 0) { - this.sessionStartTime = new Date().getTime(); - } - } - // Log the session state change. - var entry = remoting.ServerLogEntry.makeClientSessionStateChange( - state, connectionError); - entry.addHostFields(); - entry.addChromeVersionField(); - entry.addWebappVersionField(); - entry.addSessionIdField(this.sessionId); - // Maybe clear the session start time, and log the session duration. - if (remoting.LogToServer.isEndOfSession(state) && - (this.sessionStartTime != 0)) { - entry.addSessionDurationField( - (new Date().getTime() - this.sessionStartTime) / 1000.0); - this.sessionStartTime = 0; - } - this.log(entry); - // Don't accumulate connection statistics across state changes. - this.logAccumulatedStatistics(); - this.statsAccumulator.empty(); - // Maybe clear the session ID. - if (remoting.LogToServer.isEndOfSession(state)) { - this.clearSessionId(); - } -}; - -/** - * Whether a session state is one of the states that occurs at the start of - * a session. - * - * @private - * @param {remoting.ClientSession.State} state - * @return {boolean} - */ -remoting.LogToServer.isStartOfSession = function(state) { - return ((state == remoting.ClientSession.State.CONNECTING) || - (state == remoting.ClientSession.State.INITIALIZING) || - (state == remoting.ClientSession.State.CONNECTED)); -}; - -/** - * Whether a session state is one of the states that occurs at the end of - * a session. - * - * @private - * @param {remoting.ClientSession.State} state - * @return {boolean} - */ -remoting.LogToServer.isEndOfSession = function(state) { - return ((state == remoting.ClientSession.State.CLOSED) || - (state == remoting.ClientSession.State.CONNECTION_FAILED)); -}; - -/** - * Logs connection statistics. - * @param {Object.} stats the connection statistics - */ -remoting.LogToServer.prototype.logStatistics = function(stats) { - this.maybeExpireSessionId(); - // Store the statistics. - this.statsAccumulator.add(stats); - // Send statistics to the server if they've been accumulating for at least - // 60 seconds. - if (this.statsAccumulator.getTimeSinceFirstValue() >= - remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME) { - this.logAccumulatedStatistics(); - } -}; - -/** - * Moves connection statistics from the accumulator to the log server. - * - * If all the statistics are zero, then the accumulator is still emptied, - * but the statistics are not sent to the log server. - * - * @private - */ -remoting.LogToServer.prototype.logAccumulatedStatistics = function() { - var entry = remoting.ServerLogEntry.makeStats(this.statsAccumulator); - if (entry) { - entry.addHostFields(); - entry.addChromeVersionField(); - entry.addWebappVersionField(); - entry.addSessionIdField(this.sessionId); - this.log(entry); - } - this.statsAccumulator.empty(); -}; - -/** - * Sends a log entry to the server. - * - * @private - * @param {remoting.ServerLogEntry} entry - */ -remoting.LogToServer.prototype.log = function(entry) { - // Send the stanza to the debug log. - remoting.debug.log('Enqueueing log entry:'); - entry.toDebugLog(1); - // Store a stanza for the entry. - this.pendingEntries.push(entry.toStanza()); - // Stop if there's no connection to the server. - if (!remoting.wcs) { - return; - } - // Send all pending entries to the server. - remoting.debug.log('Sending ' + this.pendingEntries.length + ' log ' + - ((this.pendingEntries.length == 1) ? 'entry' : 'entries') + - ' to the server.'); - var stanza = ''; - while (this.pendingEntries.length > 0) { - stanza += /** @type string */ this.pendingEntries.shift(); - } - stanza += ''; - remoting.wcs.sendIq(stanza); -}; - -/** - * Sets the session ID to a random string. - * - * @private - */ -remoting.LogToServer.prototype.setSessionId = function() { - this.sessionId = remoting.LogToServer.generateSessionId(); - this.sessionIdGenerationTime = new Date().getTime(); -}; - -/** - * Clears the session ID. - * - * @private - */ -remoting.LogToServer.prototype.clearSessionId = function() { - this.sessionId = ''; - this.sessionIdGenerationTime = 0; -}; - -/** - * Sets a new session ID, if the current session ID has reached its maximum age. - * - * This method also logs the old and new session IDs to the server, in separate - * log entries. - * - * @private - */ -remoting.LogToServer.prototype.maybeExpireSessionId = function() { - if ((this.sessionId != '') && - (new Date().getTime() - this.sessionIdGenerationTime >= - remoting.LogToServer.MAX_SESSION_ID_AGE)) { - // Log the old session ID. - var entry = remoting.ServerLogEntry.makeSessionIdOld(this.sessionId); - this.log(entry); - // Generate a new session ID. - this.setSessionId(); - // Log the new session ID. - entry = remoting.ServerLogEntry.makeSessionIdNew(this.sessionId); - this.log(entry); - } -}; - -/** - * Generates a string that can be used as a session ID. - * - * @private - * @return {string} a session ID - */ -remoting.LogToServer.generateSessionId = function() { - var idArray = []; - for (var i = 0; i < remoting.LogToServer.SESSION_ID_LEN_; i++) { - var index = - Math.random() * remoting.LogToServer.SESSION_ID_ALPHABET_.length; - idArray.push( - remoting.LogToServer.SESSION_ID_ALPHABET_.slice(index, index + 1)); - } - return idArray.join(''); -}; diff --git a/remoting/webapp/me2mom/main.css b/remoting/webapp/me2mom/main.css deleted file mode 100644 index c05ad44..0000000 --- a/remoting/webapp/me2mom/main.css +++ /dev/null @@ -1,8 +0,0 @@ -/* Copyright (c) 2011 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -form { - display: inline; -} diff --git a/remoting/webapp/me2mom/manifest.json b/remoting/webapp/me2mom/manifest.json deleted file mode 100644 index 9b64a6f..0000000 --- a/remoting/webapp/me2mom/manifest.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "__MSG_PRODUCT_NAME__ BETA", - "version": "1.3.UNIQUE_VERSION", - "description": "__MSG_PRODUCT_DESCRIPTION__", - "default_locale": "en", - "app": { - "launch": { - "local_path": "choice.html" - } - }, - "icons": { - "128": "chromoting128.png", - "48": "chromoting48.png", - "16": "chromoting16.png" - }, - "content_scripts": [ - { - "matches": [ - "https://talkgadget.google.com/talkgadget/blank", - "https://talkgadget.google.com/talkgadget/blank?*" - ], - "js": [ "cs_oauth2_trampoline.js" ] - } - ], - "permissions": [ - "https://accounts.google.com/o/oauth2/*", - "https://www.google.com/accounts/*", - "https://www.googleapis.com/chromoting/*", - "https://talkgadget.google.com/talkgadget/*" - ], - "plugins": [ - { "path": "remoting_host_plugin.dll", "public": false }, - { "path": "libremoting_host_plugin.ia32.so", "public": false }, - { "path": "libremoting_host_plugin.x64.so", "public": false }, - { "path": "remoting_host_plugin.plugin", "public": false } - ] -} diff --git a/remoting/webapp/me2mom/oauth2.js b/remoting/webapp/me2mom/oauth2.js deleted file mode 100644 index 5f9b8e3..0000000 --- a/remoting/webapp/me2mom/oauth2.js +++ /dev/null @@ -1,348 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * OAuth2 class that handles retrieval/storage of an OAuth2 token. - * - * Uses a content script to trampoline the OAuth redirect page back into the - * extension context. This works around the lack of native support for - * chrome-extensions in OAuth2. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @type {remoting.OAuth2} */ -remoting.oauth2 = null; - - -/** @constructor */ -remoting.OAuth2 = function() { -}; - -// Constants representing keys used for storing persistent state. -/** @private */ -remoting.OAuth2.prototype.KEY_REFRESH_TOKEN_ = 'oauth2-refresh-token'; -/** @private */ -remoting.OAuth2.prototype.KEY_ACCESS_TOKEN_ = 'oauth2-access-token'; -/** @private */ -remoting.OAuth2.prototype.KEY_EMAIL_ = 'remoting-email'; - -// Constants for parameters used in retrieving the OAuth2 credentials. -/** @private */ -remoting.OAuth2.prototype.CLIENT_ID_ = - '440925447803-2pi3v45bff6tp1rde2f7q6lgbor3o5uj.' + - 'apps.googleusercontent.com'; -/** @private */ -remoting.OAuth2.prototype.CLIENT_SECRET_ = 'W2ieEsG-R1gIA4MMurGrgMc_'; -/** @private */ -remoting.OAuth2.prototype.SCOPE_ = - 'https://www.googleapis.com/auth/chromoting ' + - 'https://www.googleapis.com/auth/googletalk ' + - 'https://www.googleapis.com/auth/userinfo#email'; -/** @private */ -remoting.OAuth2.prototype.REDIRECT_URI_ = - 'https://talkgadget.google.com/talkgadget/blank'; -/** @private */ -remoting.OAuth2.prototype.OAUTH2_TOKEN_ENDPOINT_ = - 'https://accounts.google.com/o/oauth2/token'; - -/** @return {boolean} True if the app is already authenticated. */ -remoting.OAuth2.prototype.isAuthenticated = function() { - if (this.getRefreshToken()) { - return true; - } - return false; -}; - -/** - * Removes all storage, and effectively unauthenticates the user. - * - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.clear = function() { - window.localStorage.removeItem(this.KEY_REFRESH_TOKEN_); - window.localStorage.removeItem(this.KEY_EMAIL_); - this.clearAccessToken(); -}; - -/** - * @param {string} token The new refresh token. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.setRefreshToken = function(token) { - window.localStorage.setItem(this.KEY_REFRESH_TOKEN_, escape(token)); - this.clearAccessToken(); -}; - -/** @return {?string} The refresh token, if authenticated, or NULL. */ -remoting.OAuth2.prototype.getRefreshToken = function() { - var value = window.localStorage.getItem(this.KEY_REFRESH_TOKEN_); - if (typeof value == 'string') { - return unescape(value); - } - return null; -}; - -/** - * @param {string} token The new access token. - * @param {number} expiration Expiration time in milliseconds since epoch. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.setAccessToken = function(token, expiration) { - var access_token = {'token': token, 'expiration': expiration}; - window.localStorage.setItem(this.KEY_ACCESS_TOKEN_, - JSON.stringify(access_token)); -}; - -/** - * Returns the current access token, setting it to a invalid value if none - * existed before. - * - * @private - * @return {{token: string, expiration: number}} The current access token, or - * an invalid token if not authenticated. - */ -remoting.OAuth2.prototype.getAccessTokenInternal_ = function() { - if (!window.localStorage.getItem(this.KEY_ACCESS_TOKEN_)) { - // Always be able to return structured data. - this.setAccessToken('', 0); - } - var accessToken = window.localStorage.getItem(this.KEY_ACCESS_TOKEN_); - if (typeof accessToken == 'string') { - var result = JSON.parse(accessToken); - if ('token' in result && 'expiration' in result) { - return /** @type {{token: string, expiration: number}} */ result; - } - } - console.log('Invalid access token stored.'); - return {'token': '', 'expiration': 0}; -}; - -/** - * Returns true if the access token is expired, or otherwise invalid. - * - * Will throw if !isAuthenticated(). - * - * @return {boolean} True if a new access token is needed. - */ -remoting.OAuth2.prototype.needsNewAccessToken = function() { - if (!this.isAuthenticated()) { - throw 'Not Authenticated.'; - } - var access_token = this.getAccessTokenInternal_(); - if (!access_token['token']) { - return true; - } - if (Date.now() > access_token['expiration']) { - return true; - } - return false; -}; - -/** - * Returns the current access token. - * - * Will throw if !isAuthenticated() or needsNewAccessToken(). - * - * @return {string} The access token. - */ -remoting.OAuth2.prototype.getAccessToken = function() { - if (this.needsNewAccessToken()) { - throw 'Access Token expired.'; - } - return this.getAccessTokenInternal_()['token']; -}; - -/** @return {void} Nothing. */ -remoting.OAuth2.prototype.clearAccessToken = function() { - window.localStorage.removeItem(this.KEY_ACCESS_TOKEN_); -}; - -/** - * Update state based on token response from the OAuth2 /token endpoint. - * - * @private - * @param {XMLHttpRequest} xhr The XHR object for this request. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.processTokenResponse_ = function(xhr) { - if (xhr.status == 200) { - var tokens = JSON.parse(xhr.responseText); - if ('refresh_token' in tokens) { - this.setRefreshToken(tokens['refresh_token']); - } - - // Offset by 120 seconds so that we can guarantee that the token - // we return will be valid for at least 2 minutes. - // If the access token is to be useful, this object must make some - // guarantee as to how long the token will be valid for. - // The choice of 2 minutes is arbitrary, but that length of time - // is part of the contract satisfied by callWithToken(). - // Offset by a further 30 seconds to account for RTT issues. - this.setAccessToken(tokens['access_token'], - (tokens['expires_in'] - (120 + 30)) * 1000 + Date.now()); - } else { - console.log('Failed to get tokens. Status: ' + xhr.status + - ' response: ' + xhr.responseText); - } -}; - -/** - * Asynchronously retrieves a new access token from the server. - * - * Will throw if !isAuthenticated(). - * - * @param {function(XMLHttpRequest): void} onDone Callback to invoke on - * completion. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.refreshAccessToken = function(onDone) { - if (!this.isAuthenticated()) { - throw 'Not Authenticated.'; - } - - var parameters = { - 'client_id': this.CLIENT_ID_, - 'client_secret': this.CLIENT_SECRET_, - 'refresh_token': this.getRefreshToken(), - 'grant_type': 'refresh_token' - }; - - /** @type {remoting.OAuth2} */ - var that = this; - /** @param {XMLHttpRequest} xhr The XHR reply. */ - var processTokenResponse = function(xhr) { - that.processTokenResponse_(xhr); - onDone(xhr); - }; - remoting.xhr.post(this.OAUTH2_TOKEN_ENDPOINT_, - processTokenResponse, - parameters); -}; - -/** - * Redirect page to get a new OAuth2 Refresh Token. - * - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.doAuthRedirect = function() { - var GET_CODE_URL = 'https://accounts.google.com/o/oauth2/auth?' + - remoting.xhr.urlencodeParamHash({ - 'client_id': this.CLIENT_ID_, - 'redirect_uri': this.REDIRECT_URI_, - 'scope': this.SCOPE_, - 'response_type': 'code', - 'access_type': 'offline', - 'approval_prompt': 'force' - }); - window.location.replace(GET_CODE_URL); -}; - -/** - * Asynchronously exchanges an authorization code for a refresh token. - * - * @param {string} code The new refresh token. - * @param {function(XMLHttpRequest):void} onDone Callback to invoke on - * completion. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.exchangeCodeForToken = function(code, onDone) { - var parameters = { - 'client_id': this.CLIENT_ID_, - 'client_secret': this.CLIENT_SECRET_, - 'redirect_uri': this.REDIRECT_URI_, - 'code': code, - 'grant_type': 'authorization_code' - }; - - /** @type {remoting.OAuth2} */ - var that = this; - /** @param {XMLHttpRequest} xhr The XHR reply. */ - var processTokenResponse = function(xhr) { - that.processTokenResponse_(xhr); - onDone(xhr); - }; - remoting.xhr.post(this.OAUTH2_TOKEN_ENDPOINT_, - processTokenResponse, - parameters); -}; - -/** - * Call myfunc with an access token as the only parameter. - * - * This will refresh the access token if necessary. If the access token - * cannot be refreshed, an error is thrown. - * - * The access token will remain valid for at least 2 minutes. - * - * @param {function(string):void} myfunc - * Function to invoke with access token. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.callWithToken = function(myfunc) { - /** @type {remoting.OAuth2} */ - var that = this; - if (remoting.oauth2.needsNewAccessToken()) { - remoting.oauth2.refreshAccessToken(function() { - if (remoting.oauth2.needsNewAccessToken()) { - // If we still need it, we're going to infinite loop. - throw 'Unable to get access token.'; - } - myfunc(that.getAccessToken()); - }); - return; - } - - myfunc(this.getAccessToken()); -}; - -/** - * Get the user's email address. - * - * @param {function(?string):void} setEmail Callback invoked when the email - * address is available, or on error. - * @return {void} Nothing. - */ -remoting.OAuth2.prototype.getEmail = function(setEmail) { - /** @type {remoting.OAuth2} */ - var that = this; - /** @param {XMLHttpRequest} xhr The XHR response. */ - var onResponse = function(xhr) { - that.email = null; - if (xhr.status == 200) { - // TODO(ajwong): See if we can't find a JSON endpoint. - that.email = xhr.responseText.split('&')[0].split('=')[1]; - } - window.localStorage.setItem(that.KEY_EMAIL_, that.email); - setEmail(that.email); - }; - - /** @param {string} token The access token. */ - var getEmailFromToken = function(token) { - var headers = { 'Authorization': 'OAuth ' + token }; - // TODO(ajwong): Update to new v2 API. - remoting.xhr.get('https://www.googleapis.com/userinfo/email', - onResponse, '', headers); - }; - - this.callWithToken(getEmailFromToken); -}; - -/** - * If the user's email address is cached, return it, otherwise return null. - * - * @return {?string} The email address, if it has been cached by a previous call - * to getEmail, otherwise null. - */ -remoting.OAuth2.prototype.getCachedEmail = function() { - var value = window.localStorage.getItem(this.KEY_EMAIL_); - if (typeof value == 'string') { - return value; - } - return null; -}; diff --git a/remoting/webapp/me2mom/oauth2_callback.html b/remoting/webapp/me2mom/oauth2_callback.html deleted file mode 100644 index da5fe1b..0000000 --- a/remoting/webapp/me2mom/oauth2_callback.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - diff --git a/remoting/webapp/me2mom/plugin_settings.js b/remoting/webapp/me2mom/plugin_settings.js deleted file mode 100644 index b195804..0000000 --- a/remoting/webapp/me2mom/plugin_settings.js +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Contains all the settings that may need massaging by the build script. -// Keeping all that centralized here allows us to use symlinks for the other -// files making for a faster compile/run cycle when only modifying HTML/JS. - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * The MIME type of the Host plugin. - * @type {string} - */ -remoting.PLUGIN_MIMETYPE = 'HOST_PLUGIN_MIMETYPE'; diff --git a/remoting/webapp/me2mom/remoting.js b/remoting/webapp/me2mom/remoting.js deleted file mode 100644 index e0d843d..0000000 --- a/remoting/webapp/me2mom/remoting.js +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @type {remoting.HostSession} */ remoting.hostSession = null; - -/** - * @enum {string} All error messages from messages.json - */ -remoting.Error = { - NO_RESPONSE: /*i18n-content*/'ERROR_NO_RESPONSE', - INVALID_ACCESS_CODE: /*i18n-content*/'ERROR_INVALID_ACCESS_CODE', - MISSING_PLUGIN: /*i18n-content*/'ERROR_MISSING_PLUGIN', - AUTHENTICATION_FAILED: /*i18n-content*/'ERROR_AUTHENTICATION_FAILED', - HOST_IS_OFFLINE: /*i18n-content*/'ERROR_HOST_IS_OFFLINE', - INCOMPATIBLE_PROTOCOL: /*i18n-content*/'ERROR_INCOMPATIBLE_PROTOCOL', - BAD_PLUGIN_VERSION: /*i18n-content*/'ERROR_BAD_PLUGIN_VERSION', - GENERIC: /*i18n-content*/'ERROR_GENERIC', - UNEXPECTED: /*i18n-content*/'ERROR_UNEXPECTED', - SERVICE_UNAVAILABLE: /*i18n-content*/'ERROR_SERVICE_UNAVAILABLE' -}; - -/** - * Entry point for app initialization. - */ -remoting.init = function() { - l10n.localize(); - var button = document.getElementById('toggle-scaling'); - button.title = chrome.i18n.getMessage(/*i18n-content*/'TOOLTIP_SCALING'); - // Create global objects. - remoting.oauth2 = new remoting.OAuth2(); - remoting.debug = new remoting.DebugLog( - document.getElementById('debug-messages'), - document.getElementById('statistics')); - remoting.hostList = new remoting.HostList( - document.getElementById('host-list'), - document.getElementById('host-list-error')); - remoting.toolbar = new remoting.Toolbar( - document.getElementById('session-toolbar')); - - refreshEmail_(); - var email = remoting.oauth2.getCachedEmail(); - if (email) { - document.getElementById('current-email').innerText = email; - } - - window.addEventListener('blur', pluginLostFocus_, false); - - // Parse URL parameters. - var urlParams = getUrlParameters(); - if ('mode' in urlParams) { - if (urlParams['mode'] == 'me2me') { - var hostId = urlParams['hostId']; - remoting.connectMe2Me(hostId, true); - return; - } - } - - // No valid URL parameters, start up normally. - remoting.setMode(getAppStartupMode_()); - if (isHostModeSupported_()) { - var noShare = document.getElementById('chrome-os-no-share'); - noShare.parentNode.removeChild(noShare); - } else { - var button = document.getElementById('share-button'); - button.disabled = true; - } -}; - -/** - * If there is an incomplete share or connection in progress, cancel it. - */ -remoting.cancelPendingOperation = function() { - document.getElementById('cancel-button').disabled = true; - switch (remoting.getMajorMode()) { - case remoting.AppMode.HOST: - remoting.cancelShare(); - break; - case remoting.AppMode.CLIENT: - remoting.cancelConnect(); - break; - } -}; - -/** - * If the client is connected, or the host is shared, prompt before closing. - * - * @return {?string} The prompt string if a connection is active. - */ -remoting.promptClose = function() { - switch (remoting.currentMode) { - case remoting.AppMode.CLIENT_CONNECTING: - case remoting.AppMode.HOST_WAITING_FOR_CODE: - case remoting.AppMode.HOST_WAITING_FOR_CONNECTION: - case remoting.AppMode.HOST_SHARED: - case remoting.AppMode.IN_SESSION: - var result = chrome.i18n.getMessage(/*i18n-content*/'CLOSE_PROMPT'); - return result; - default: - return null; - } -}; - -/** - * Sign the user out of Chromoting by clearing the OAuth refresh token. - */ -remoting.clearOAuth2 = function() { - remoting.oauth2.clear(); - window.localStorage.removeItem(KEY_EMAIL_); - remoting.setMode(remoting.AppMode.UNAUTHENTICATED); -}; - -/** - * Callback function called when the browser window loses focus. In this case, - * release all keys to prevent them becoming 'stuck down' on the host. - */ -function pluginLostFocus_() { - if (remoting.clientSession && remoting.clientSession.plugin) { - remoting.clientSession.plugin.releaseAllKeys(); - } -} - -/** - * If the user is authenticated, but there is no email address cached, get one. - */ -function refreshEmail_() { - if (!getEmail_() && remoting.oauth2.isAuthenticated()) { - remoting.oauth2.getEmail(setEmail_); - } -} - -/** - * The key under which the email address is stored. - * @private - */ -var KEY_EMAIL_ = 'remoting-email'; - -/** - * Save the user's email address in local storage. - * - * @param {?string} email The email address to place in local storage. - * @return {void} Nothing. - */ -function setEmail_(email) { - if (email) { - document.getElementById('current-email').innerText = email; - } else { - // TODO(ajwong): Have a better way of showing an error. - document.getElementById('current-email').innerText = '???'; - } -} - -/** - * Read the user's email address from local storage. - * - * @return {?string} The email address associated with the auth credentials. - */ -function getEmail_() { - var result = window.localStorage.getItem(KEY_EMAIL_); - return typeof result == 'string' ? result : null; -} - -/** - * Gets the major-mode that this application should start up in. - * - * @return {remoting.AppMode} The mode to start in. - */ -function getAppStartupMode_() { - return remoting.oauth2.isAuthenticated() ? remoting.AppMode.HOME : - remoting.AppMode.UNAUTHENTICATED; -} - -/** - * Returns whether Host mode is supported on this platform. - * - * @return {boolean} True if Host mode is supported. - */ -function isHostModeSupported_() { - // Currently, sharing on Chromebooks is not supported. - return !navigator.userAgent.match(/\bCrOS\b/); -} diff --git a/remoting/webapp/me2mom/scale-to-fit.png b/remoting/webapp/me2mom/scale-to-fit.png deleted file mode 100644 index fdb44ab..0000000 Binary files a/remoting/webapp/me2mom/scale-to-fit.png and /dev/null differ diff --git a/remoting/webapp/me2mom/server_log_entry.js b/remoting/webapp/me2mom/server_log_entry.js deleted file mode 100644 index ba78f66..0000000 --- a/remoting/webapp/me2mom/server_log_entry.js +++ /dev/null @@ -1,433 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * A class of server log entries. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @private - * @constructor - */ -remoting.ServerLogEntry = function() { - /** @type Object. */ this.dict = {}; -}; - -/** @private */ -remoting.ServerLogEntry.KEY_EVENT_NAME_ = 'event-name'; -/** @private */ -remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_STATE_ = - 'session-state'; - -/** @private */ -remoting.ServerLogEntry.KEY_SESSION_ID_ = 'session-id'; - -/** @private */ -remoting.ServerLogEntry.KEY_ROLE_ = 'role'; -/** @private */ -remoting.ServerLogEntry.VALUE_ROLE_CLIENT_ = 'client'; - -/** @private */ -remoting.ServerLogEntry.KEY_SESSION_STATE_ = 'session-state'; - -/** - * @private - * @param {remoting.ClientSession.State} state - * @return {string} - */ -remoting.ServerLogEntry.getValueForSessionState = function(state) { - switch(state) { - case remoting.ClientSession.State.UNKNOWN: - return 'unknown'; - case remoting.ClientSession.State.CREATED: - return 'created'; - case remoting.ClientSession.State.BAD_PLUGIN_VERSION: - return 'bad-plugin-version'; - case remoting.ClientSession.State.UNKNOWN_PLUGIN_ERROR: - return 'unknown-plugin-error'; - case remoting.ClientSession.State.CONNECTING: - return 'connecting'; - case remoting.ClientSession.State.INITIALIZING: - return 'initializing'; - case remoting.ClientSession.State.CONNECTED: - return 'connected'; - case remoting.ClientSession.State.CLOSED: - return 'closed'; - case remoting.ClientSession.State.CONNECTION_FAILED: - return 'connection-failed'; - default: - return 'undefined-' + state; - } -}; - -/** @private */ -remoting.ServerLogEntry.KEY_CONNECTION_ERROR_ = 'connection-error'; - -/** - * @private - * @param {remoting.ClientSession.ConnectionError} connectionError - * @return {string} - */ -remoting.ServerLogEntry.getValueForConnectionError = - function(connectionError) { - switch(connectionError) { - case remoting.ClientSession.ConnectionError.NONE: - return 'none'; - case remoting.ClientSession.ConnectionError.HOST_IS_OFFLINE: - return 'host-is-offline'; - case remoting.ClientSession.ConnectionError.SESSION_REJECTED: - return 'session-rejected'; - case remoting.ClientSession.ConnectionError.INCOMPATIBLE_PROTOCOL: - return 'incompatible-protocol'; - case remoting.ClientSession.ConnectionError.NETWORK_FAILURE: - return 'network-failure'; - default: - return 'unknown-' + connectionError; - } -}; - -/** @private */ -remoting.ServerLogEntry.KEY_SESSION_DURATION_ = 'session-duration'; - -/** @private */ -remoting.ServerLogEntry.VALUE_EVENT_NAME_CONNECTION_STATISTICS_ = - "connection-statistics"; -/** @private */ -remoting.ServerLogEntry.KEY_VIDEO_BANDWIDTH_ = "video-bandwidth"; -/** @private */ -remoting.ServerLogEntry.KEY_CAPTURE_LATENCY_ = "capture-latency"; -/** @private */ -remoting.ServerLogEntry.KEY_ENCODE_LATENCY_ = "encode-latency"; -/** @private */ -remoting.ServerLogEntry.KEY_DECODE_LATENCY_ = "decode-latency"; -/** @private */ -remoting.ServerLogEntry.KEY_RENDER_LATENCY_ = "render-latency"; -/** @private */ -remoting.ServerLogEntry.KEY_ROUNDTRIP_LATENCY_ = "roundtrip-latency"; - -/** @private */ -remoting.ServerLogEntry.KEY_OS_NAME_ = 'os-name'; -/** @private */ -remoting.ServerLogEntry.VALUE_OS_NAME_WINDOWS_ = 'Windows'; -/** @private */ -remoting.ServerLogEntry.VALUE_OS_NAME_LINUX_ = 'Linux'; -/** @private */ -remoting.ServerLogEntry.VALUE_OS_NAME_MAC_ = 'Mac'; -/** @private */ -remoting.ServerLogEntry.VALUE_OS_NAME_CHROMEOS_ = 'ChromeOS'; - -/** @private */ -remoting.ServerLogEntry.KEY_OS_VERSION_ = 'os-version'; - -/** @private */ -remoting.ServerLogEntry.KEY_CPU_ = 'cpu'; - -/** @private */ -remoting.ServerLogEntry.KEY_BROWSER_VERSION_ = 'browser-version'; - -/** @private */ -remoting.ServerLogEntry.KEY_WEBAPP_VERSION_ = 'webapp-version'; - -/** @private */ -remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_OLD_ = 'session-id-old'; - -/** @private */ -remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_NEW_ = 'session-id-new'; - -/** - * Sets one field in this log entry. - * - * @private - * @param {string} key - * @param {string} value - */ -remoting.ServerLogEntry.prototype.set = function(key, value) { - this.dict[key] = value; -}; - -/** - * Converts this object into an XML stanza. - * - * @return {string} - */ -remoting.ServerLogEntry.prototype.toStanza = function() { - var stanza = ' */ var fields = []; - for (var key in this.dict) { - fields.push(key + ': ' + this.dict[key]); - } - remoting.debug.logIndent(indentLevel, fields.join(', ')); -}; - -/** - * Makes a log entry for a change of client session state. - * - * @param {remoting.ClientSession.State} state - * @param {remoting.ClientSession.ConnectionError} connectionError - * @return {remoting.ServerLogEntry} - */ -remoting.ServerLogEntry.makeClientSessionStateChange = function(state, - connectionError) { - var entry = new remoting.ServerLogEntry(); - entry.set(remoting.ServerLogEntry.KEY_ROLE_, - remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); - entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, - remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_STATE_); - entry.set(remoting.ServerLogEntry.KEY_SESSION_STATE_, - remoting.ServerLogEntry.getValueForSessionState(state)); - if (connectionError != remoting.ClientSession.ConnectionError.NONE) { - entry.set(remoting.ServerLogEntry.KEY_CONNECTION_ERROR_, - remoting.ServerLogEntry.getValueForConnectionError( - connectionError)); - } - return entry; -}; - -/** - * Adds a session duration to a log entry. - * - * @param {number} sessionDuration - */ -remoting.ServerLogEntry.prototype.addSessionDurationField = function( - sessionDuration) { - this.set(remoting.ServerLogEntry.KEY_SESSION_DURATION_, - sessionDuration.toString()); -}; - -/** - * Makes a log entry for a set of connection statistics. - * Returns null if all the statistics were zero. - * - * @param {remoting.StatsAccumulator} statsAccumulator - * @return {?remoting.ServerLogEntry} - */ -remoting.ServerLogEntry.makeStats = function(statsAccumulator) { - var entry = new remoting.ServerLogEntry(); - entry.set(remoting.ServerLogEntry.KEY_ROLE_, - remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); - entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, - remoting.ServerLogEntry.VALUE_EVENT_NAME_CONNECTION_STATISTICS_); - var nonZero = false; - nonZero |= entry.addStatsField( - remoting.ServerLogEntry.KEY_VIDEO_BANDWIDTH_, - remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH, statsAccumulator); - nonZero |= entry.addStatsField( - remoting.ServerLogEntry.KEY_CAPTURE_LATENCY_, - remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY, statsAccumulator); - nonZero |= entry.addStatsField( - remoting.ServerLogEntry.KEY_ENCODE_LATENCY_, - remoting.ClientSession.STATS_KEY_ENCODE_LATENCY, statsAccumulator); - nonZero |= entry.addStatsField( - remoting.ServerLogEntry.KEY_DECODE_LATENCY_, - remoting.ClientSession.STATS_KEY_DECODE_LATENCY, statsAccumulator); - nonZero |= entry.addStatsField( - remoting.ServerLogEntry.KEY_RENDER_LATENCY_, - remoting.ClientSession.STATS_KEY_RENDER_LATENCY, statsAccumulator); - nonZero |= entry.addStatsField( - remoting.ServerLogEntry.KEY_ROUNDTRIP_LATENCY_, - remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY, statsAccumulator); - if (nonZero) { - return entry; - } - return null; -}; - -/** - * Adds one connection statistic to a log entry. - * - * @private - * @param {string} entryKey - * @param {string} statsKey - * @param {remoting.StatsAccumulator} statsAccumulator - * @return {boolean} whether the statistic is non-zero - */ -remoting.ServerLogEntry.prototype.addStatsField = function( - entryKey, statsKey, statsAccumulator) { - var val = statsAccumulator.calcMean(statsKey); - this.set(entryKey, val.toString()); - return (val != 0); -}; - -/** - * Makes a log entry for a "this session ID is old" event. - * - * @param {string} sessionId - * @return {remoting.ServerLogEntry} - */ -remoting.ServerLogEntry.makeSessionIdOld = function(sessionId) { - var entry = new remoting.ServerLogEntry(); - entry.set(remoting.ServerLogEntry.KEY_ROLE_, - remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); - entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, - remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_OLD_); - entry.addSessionIdField(sessionId); - return entry; -}; - -/** - * Makes a log entry for a "this session ID is new" event. - * - * @param {string} sessionId - * @return {remoting.ServerLogEntry} - */ -remoting.ServerLogEntry.makeSessionIdNew = function(sessionId) { - var entry = new remoting.ServerLogEntry(); - entry.set(remoting.ServerLogEntry.KEY_ROLE_, - remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); - entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, - remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_NEW_); - entry.addSessionIdField(sessionId); - return entry; -}; - -/** - * Adds a session ID field to this log entry. - * - * @param {string} sessionId - */ -remoting.ServerLogEntry.prototype.addSessionIdField = function(sessionId) { - this.set(remoting.ServerLogEntry.KEY_SESSION_ID_, sessionId); -} - -/** - * Adds fields describing the host to this log entry. - */ -remoting.ServerLogEntry.prototype.addHostFields = function() { - var host = remoting.ServerLogEntry.getHostData(); - if (host) { - if (host.os_name.length > 0) { - this.set(remoting.ServerLogEntry.KEY_OS_NAME_, host.os_name); - } - if (host.os_version.length > 0) { - this.set(remoting.ServerLogEntry.KEY_OS_VERSION_, host.os_version); - } - if (host.cpu.length > 0) { - this.set(remoting.ServerLogEntry.KEY_CPU_, host.cpu); - } - } -}; - -/** - * Extracts host data from the userAgent string. - * - * @private - * @return {{os_name:string, os_version:string, cpu:string} | null} - */ -remoting.ServerLogEntry.getHostData = function() { - return remoting.ServerLogEntry.extractHostDataFrom(navigator.userAgent); -}; - -/** - * Extracts host data from the given userAgent string. - * - * @private - * @param {string} s - * @return {{os_name:string, os_version:string, cpu:string} | null} - */ -remoting.ServerLogEntry.extractHostDataFrom = function(s) { - // Sample userAgent strings: - // 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 ' + - // '(KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2' - // 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.8 ' + - // '(KHTML, like Gecko) Chrome/17.0.933.0 Safari/535.8' - // 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 ' + - // '(KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1' - // 'Mozilla/5.0 (X11; CrOS i686 14.811.154) AppleWebKit/535.1 ' + - // '(KHTML, like Gecko) Chrome/14.0.835.204 Safari/535.1' - var match = new RegExp('Windows NT ([0-9\\.]*)').exec(s); - if (match && (match.length >= 2)) { - return { - 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_WINDOWS_, - 'os_version': match[1], - 'cpu': '' - }; - } - match = new RegExp('Linux ([a-zA-Z0-9_]*)').exec(s); - if (match && (match.length >= 2)) { - return { - 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_LINUX_, - 'os_version' : '', - 'cpu': match[1] - }; - } - match = new RegExp('([a-zA-Z]*) Mac OS X ([0-9_]*)').exec(s); - if (match && (match.length >= 3)) { - return { - 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_MAC_, - 'os_version': match[2].replace(/_/g, '.'), - 'cpu': match[1] - }; - } - match = new RegExp('CrOS ([a-zA-Z0-9]*) ([0-9.]*)').exec(s); - if (match && (match.length >= 3)) { - return { - 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_CHROMEOS_, - 'os_version': match[2], - 'cpu': match[1] - }; - } - return null; -}; - -/** - * Adds a field specifying the browser version to this log entry. - */ -remoting.ServerLogEntry.prototype.addChromeVersionField = function() { - var version = remoting.ServerLogEntry.getChromeVersion(); - if (version != null) { - this.set(remoting.ServerLogEntry.KEY_BROWSER_VERSION_, version); - } -}; - -/** - * Extracts the Chrome version from the userAgent string. - * - * @private - * @return {string | null} - */ -remoting.ServerLogEntry.getChromeVersion = function() { - return remoting.ServerLogEntry.extractChromeVersionFrom(navigator.userAgent); -}; - -/** - * Extracts the Chrome version from the given userAgent string. - * - * @private - * @param {string} s - * @return {string | null} - */ -remoting.ServerLogEntry.extractChromeVersionFrom = function(s) { - var match = new RegExp('Chrome/([0-9.]*)').exec(s); - if (match && (match.length >= 2)) { - return match[1]; - } - return null; -}; - -/** - * Adds a field specifying the webapp version to this log entry. - */ -remoting.ServerLogEntry.prototype.addWebappVersionField = function() { - this.set(remoting.ServerLogEntry.KEY_WEBAPP_VERSION_, - chrome.app.getDetails().version); -}; diff --git a/remoting/webapp/me2mom/spinner.gif b/remoting/webapp/me2mom/spinner.gif deleted file mode 100644 index 7cec163..0000000 Binary files a/remoting/webapp/me2mom/spinner.gif and /dev/null differ diff --git a/remoting/webapp/me2mom/stats_accumulator.js b/remoting/webapp/me2mom/stats_accumulator.js deleted file mode 100644 index adf89c5..0000000 --- a/remoting/webapp/me2mom/stats_accumulator.js +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * The webapp reads the plugin's connection statistics frequently (once per - * second). It logs statistics to the server less frequently, to keep - * bandwidth and storage costs down. This class bridges that gap, by - * accumulating high-frequency numeric data, and providing statistics - * summarising that data. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @constructor - */ -remoting.StatsAccumulator = function() { - /** - * A map from names to lists of values. - * @private - * @type Object.> - */ - this.valueLists_ = {}; - - /** - * The first time, after this object was most recently initialized or emptied, - * at which a value was added to this object. - * @private - * @type {?number} - */ - this.timeOfFirstValue_ = null; -}; - -/** - * Adds values to this object. - * - * @param {Object.} newValues - */ -remoting.StatsAccumulator.prototype.add = function(newValues) { - for (var key in newValues) { - this.getValueList(key).push(newValues[key]); - } - if (!this.timeOfFirstValue_) { - this.timeOfFirstValue_ = new Date().getTime(); - } -}; - -/** - * Empties this object. - */ -remoting.StatsAccumulator.prototype.empty = function() { - this.valueLists_ = {}; - this.timeOfFirstValue_ = null; -}; - -/** - * Gets the number of milliseconds since the first value was added to this - * object, after this object was most recently initialized or emptied. - * - * @return {number} milliseconds since the first value - */ -remoting.StatsAccumulator.prototype.getTimeSinceFirstValue = function() { - if (!this.timeOfFirstValue_) { - return 0; - } - return new Date().getTime() - this.timeOfFirstValue_; -}; - -/** - * Calculates the mean of the values for a given key. - * - * @param {string} key - * @return {number} the mean of the values for that key - */ -remoting.StatsAccumulator.prototype.calcMean = function(key) { - /** - * @param {Array.} values - * @return {number} - */ - var calcMean = function(values) { - if (values.length == 0) { - return 0.0; - } - var sum = 0; - for (var i = 0; i < values.length; i++) { - sum += values[i]; - } - return sum / values.length; - }; - return this.map(key, calcMean); -}; - -/** - * Applies a given map to the list of values for a given key. - * - * @param {string} key - * @param {function(Array.): number} map - * @return {number} the result of applying that map to the list of values for - * that key - */ -remoting.StatsAccumulator.prototype.map = function(key, map) { - return map(this.getValueList(key)); -}; - -/** - * Gets the list of values for a given key. - * If this object contains no values for that key, then this routine creates - * an empty list, stores it in this object, and returns it. - * - * @private - * @param {string} key - * @return {Array.} the list of values for that key - */ -remoting.StatsAccumulator.prototype.getValueList = function(key) { - var valueList = this.valueLists_[key]; - if (!valueList) { - valueList = []; - this.valueLists_[key] = valueList; - } - return valueList; -}; diff --git a/remoting/webapp/me2mom/toolbar.css b/remoting/webapp/me2mom/toolbar.css deleted file mode 100644 index 9a56d1e..0000000 --- a/remoting/webapp/me2mom/toolbar.css +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (c) 2011 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -.toolbar-container { - position: fixed; - top: -45px; - width: 640px; - -webkit-transition: top 0.2s linear; - -webkit-transition-delay: 0.7s; - font-size: 13px; - pointer-events: none; - z-index: 1; -} - -.toolbar-container button { - padding: 3px 9px; -} - -.toolbar-visible { - top: -8px; - -webkit-transition-delay: 0s; -} - -.toolbar-container div { - margin-left: auto; - margin-right: auto; -} - -.toolbar-stub { - position: absolute; - width: 134px; - height: 7px; - left: 253px; - border-bottom-left-radius: 7px; - border-bottom-right-radius: 7px; - background-color: #4695ff; - -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); - pointer-events: all; - clip: rect(0, 999px, 999px, -999px); -} - -.toolbar-border { - border-radius: 7px; - border: 3px solid #4695ff; - width: 620px; - padding: 10px 7px 5px 7px; - background-color: #e9e9e9; - -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); - pointer-events: all; -} - -/* Ensure that the 'connected to' string doesn't make the tool-bar overflow */ -#connected-to { - display: inline-block; - max-width: 280px; - overflow: hidden; - margin-__MSG_@@bidi_end_edge__: 8px; - white-space: nowrap; -} - -.end-align { - float: __MSG_@@bidi_end_edge__; -} - -.arrow-down { - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid white; - left: auto; - right: auto; -} diff --git a/remoting/webapp/me2mom/toolbar.js b/remoting/webapp/me2mom/toolbar.js deleted file mode 100644 index 85ad48b..0000000 --- a/remoting/webapp/me2mom/toolbar.js +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Class representing the client tool-bar. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** - * @param {Element} toolbar The HTML element representing the tool-bar. - * @constructor - */ -remoting.Toolbar = function(toolbar) { - /** - * @type {Element} - * @private - */ - this.toolbar_ = toolbar; - /** - * @type {boolean} False if the tool-bar is currently hidden, or should be - * hidden once the over-shoot timer expires; true otherwise. - */ - this.visible = false; - /** - * @type {number?} The id of the current timer, if any. - */ - this.timerId = null; - - /** @type {remoting.Toolbar} */ - var that = this; - - /** - * @param {Event} event The mouseout event, used to determine whether or - * not the mouse is leaving the tool-bar or (due to event-bubbling) - * one of its children. - */ - var onMouseOut = function(event) { - for (var e = event.toElement; e != null; e = e.parentElement) { - if (e == that.toolbar_) { - return; // Still over a child element => ignore. - } - } - that.hide_(); - }; - this.toolbar_.onmouseout = onMouseOut; - - this.toolbar_.onmouseover = function() { - that.showForAtLeast_(1000); - }; - - window.addEventListener('resize', function() { that.center(); }, false); -}; - -/** - * Preview the tool-bar functionality by showing it for 3s if it is not - * already visible. - * @return {void} Nothing. - */ -remoting.Toolbar.prototype.preview = function() { - this.showForAtLeast_(3000); - this.visible = false; -}; - -/** - * Center the tool-bar horizonally. - */ -remoting.Toolbar.prototype.center = function() { - var toolbarX = (window.innerWidth - this.toolbar_.clientWidth) / 2; - this.toolbar_.style['left'] = toolbarX + 'px'; -}; - -/** - * If the tool-bar is not currently visible, show it and start a timer to - * prevent it from being hidden again for a short time. This is to guard - * against users over-shooting the tool-bar stub when trying to access it. - * - * @param {number} timeout The minimum length of time, in ms, for which to - * show the tool-bar. If the hide_() method is called within this time, - * it will not take effect until the timeout expires. - * @return {void} Nothing. - * @private - */ -remoting.Toolbar.prototype.showForAtLeast_ = function(timeout) { - if (this.visible) { - return; - } - addClass(this.toolbar_, remoting.Toolbar.VISIBLE_CLASS_); - this.visible = true; - if (this.timerId) { - window.clearTimeout(this.timerId); - this.timerId = null; - } - /** @type {remoting.Toolbar} */ - var that = this; - var checkVisibility = function() { that.checkVisibility_(); }; - this.timerId = window.setTimeout(checkVisibility, timeout); -}; - -/** - * Hide the tool-bar if it is visible. If there is a visibility timer running, - * the tool-bar will not be hidden until it expires. - * - * @return {void} Nothing. - * @private - */ -remoting.Toolbar.prototype.hide_ = function() { - if (!this.visible) { - return; - } - this.visible = false; - if (!this.timerId) { - this.checkVisibility_(); - } -}; - -/** - * Hide the tool-bar if it is visible and should not be. - * - * @return {void} Nothing. - * @private - */ -remoting.Toolbar.prototype.checkVisibility_ = function() { - this.timerId = null; - if (!this.visible) { - removeClass(this.toolbar_, remoting.Toolbar.VISIBLE_CLASS_); - } -}; - -/** @type {remoting.Toolbar} */ -remoting.toolbar = null; - -/** @private */ -remoting.Toolbar.VISIBLE_CLASS_ = 'toolbar-visible'; diff --git a/remoting/webapp/me2mom/ui_mode.js b/remoting/webapp/me2mom/ui_mode.js deleted file mode 100644 index da0253c..0000000 --- a/remoting/webapp/me2mom/ui_mode.js +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Functions related to controlling the modal ui state of the app. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @enum {string} */ -remoting.AppMode = { - HOME: 'home', - UNAUTHENTICATED: 'auth', - CLIENT: 'client', - CLIENT_UNCONNECTED: 'client.unconnected', - CLIENT_PIN_PROMPT: 'client.pin-prompt', - CLIENT_CONNECTING: 'client.connecting', - CLIENT_CONNECT_FAILED_IT2ME: 'client.connect-failed.it2me', - CLIENT_CONNECT_FAILED_ME2ME: 'client.connect-failed.me2me', - CLIENT_SESSION_FINISHED_IT2ME: 'client.session-finished.it2me', - CLIENT_SESSION_FINISHED_ME2ME: 'client.session-finished.me2me', - HOST: 'host', - HOST_WAITING_FOR_CODE: 'host.waiting-for-code', - HOST_WAITING_FOR_CONNECTION: 'host.waiting-for-connection', - HOST_SHARED: 'host.shared', - HOST_SHARE_FAILED: 'host.share-failed', - HOST_SHARE_FINISHED: 'host.share-finished', - IN_SESSION: 'in-session' -}; - -/** - * @type {remoting.AppMode} The current app mode - */ -remoting.currentMode = remoting.AppMode.HOME; - -/** - * Change the app's modal state to |mode|, which is considered to be a dotted - * hierachy of modes. For example, setMode('host.shared') will show any modal - * elements with an data-ui-mode attribute of 'host' or 'host.shared' and hide - * all others. - * - * @param {remoting.AppMode} mode The new modal state, expressed as a dotted - * hiearchy. - */ -remoting.setMode = function(mode) { - var modes = mode.split('.'); - for (var i = 1; i < modes.length; ++i) - modes[i] = modes[i - 1] + '.' + modes[i]; - var elements = document.querySelectorAll('[data-ui-mode]'); - for (var i = 0; i < elements.length; ++i) { - var element = /** @type {Element} */ elements[i]; - var hidden = true; - for (var m = 0; m < modes.length; ++m) { - if (hasClass(element.getAttribute('data-ui-mode'), modes[m])) { - hidden = false; - break; - } - } - element.hidden = hidden; - } - remoting.debug.log('App mode: ' + mode); - remoting.currentMode = mode; - if (mode == remoting.AppMode.IN_SESSION) { - document.removeEventListener('keydown', remoting.DebugLog.onKeydown, false); - } else { - document.addEventListener('keydown', remoting.DebugLog.onKeydown, false); - } - if (mode == remoting.AppMode.HOME) { - var display = function() { remoting.hostList.display(); }; - remoting.hostList.refresh(display); - } -}; - -/** - * Get the major mode that the app is running in. - * @return {string} The app's current major mode. - */ -remoting.getMajorMode = function() { - return remoting.currentMode.split('.')[0]; -}; diff --git a/remoting/webapp/me2mom/util.js b/remoting/webapp/me2mom/util.js deleted file mode 100644 index f6899c3..0000000 --- a/remoting/webapp/me2mom/util.js +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Simple utility functions for Chromoting. - */ - -/** - * @param {string} classes A space-separated list of classes. - * @param {string} cls The class to check for. - * @return {boolean} True if |cls| is found within |classes|. - */ -function hasClass(classes, cls) { - return classes.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) != null; -} - -/** - * @param {Element} element The element to which to add the class. - * @param {string} cls The new class. - * @return {void} Nothing. - */ -function addClass(element, cls) { - if (!hasClass(element.className, cls)) { - var padded = element.className == '' ? '' : element.className + ' '; - element.className = padded + cls; - } -} - -/** - * @param {Element} element The element from which to remove the class. - * @param {string} cls The new class. - * @return {void} Nothing. - */ -function removeClass(element, cls) { - element.className = - element.className.replace(new RegExp('\\b' + cls + '\\b', 'g'), '') - .replace(' ', ' '); -} - -/** - * @return {Object.} The URL parameters. - */ -function getUrlParameters() { - var result = {}; - var parts = window.location.search.substring(1).split('&'); - for (var i = 0; i < parts.length; i++) { - var pair = parts[i].split('='); - result[pair[0]] = decodeURIComponent(pair[1]); - } - return result; -} diff --git a/remoting/webapp/me2mom/viewer_plugin_proto.js b/remoting/webapp/me2mom/viewer_plugin_proto.js deleted file mode 100644 index 18d6461..0000000 --- a/remoting/webapp/me2mom/viewer_plugin_proto.js +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file contains type definitions for the viewer plugin. It is used only -// with JSCompiler to verify the type-correctness of our code. - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @constructor - * @extends HTMLElement - */ -remoting.ViewerPlugin = function() {}; - -/** @param {string} iq The Iq stanza received from the host. */ -remoting.ViewerPlugin.prototype.onIq = function(iq) {}; - -/** @param {boolean} scale True to enable scaling, false to disable. */ -remoting.ViewerPlugin.prototype.setScaleToFit = function(scale) {}; - -/** Release all keys currently pressed by this client. */ -remoting.ViewerPlugin.prototype.releaseAllKeys = function() {}; - -/** - * @param {string} hostJid The host's JID. - * @param {string} hostPublicKey The host's public key. - * @param {string} clientJid The client's JID. - * @param {string} authenticationCode The access code for IT2Me or the - * PIN for Me2Me. - * @return {void} Nothing. -*/ -remoting.ViewerPlugin.prototype.connect = - function(hostJid, hostPublicKey, clientJid, authenticationCode) {}; - -/** @type {function(number, number): void} State change callback function. */ -remoting.ViewerPlugin.prototype.connectionInfoUpdate; - -/** @type {number} */ remoting.ViewerPlugin.prototype.apiMinVersion; -/** @type {number} */ remoting.ViewerPlugin.prototype.apiVersion; - -/** @type {number} */ remoting.ViewerPlugin.prototype.desktopHeight; -/** @type {number} */ remoting.ViewerPlugin.prototype.desktopWidth; - -/** @type {number} */ remoting.ViewerPlugin.prototype.status; -/** @type {number} */ remoting.ViewerPlugin.prototype.error; - -/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_UNKNOWN; -/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_CONNECTING; -/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_INITIALIZING; -/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_CONNECTED; -/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_CLOSED; -/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_FAILED; - -/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_NONE; -/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_HOST_IS_OFFLINE; -/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_SESSION_REJECTED; -/** @type {number} */ - remoting.ViewerPlugin.prototype.ERROR_INCOMPATIBLE_PROTOCOL; -/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_NETWORK_FAILURE; - -/** @type {number} */ remoting.ViewerPlugin.prototype.videoBandwidth; -/** @type {number} */ remoting.ViewerPlugin.prototype.videoCaptureLatency; -/** @type {number} */ remoting.ViewerPlugin.prototype.videoDecodeLatency; -/** @type {number} */ remoting.ViewerPlugin.prototype.videoEncodeLatency; -/** @type {number} */ remoting.ViewerPlugin.prototype.videoFrameRate; -/** @type {number} */ remoting.ViewerPlugin.prototype.videoRenderLatency; -/** @type {number} */ remoting.ViewerPlugin.prototype.roundTripLatency; diff --git a/remoting/webapp/me2mom/wcs.js b/remoting/webapp/me2mom/wcs.js deleted file mode 100644 index a6e5049..0000000 --- a/remoting/webapp/me2mom/wcs.js +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (c) 2012 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/** - * @fileoverview - * A class that provides an interface to a WCS connection. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @type {remoting.Wcs} */ -remoting.wcs = null; - -/** - * @constructor - * @param {remoting.WcsIqClient} wcsIqClient The WCS client. - * @param {string} token An OAuth2 access token. - * @param {function(boolean): void} onReady A function called when the WCS - * client has received a full JID. - */ -remoting.Wcs = function(wcsIqClient, token, onReady) { - /** - * The WCS client. - * @type {remoting.WcsIqClient} - * @private - */ - this.wcsIqClient_ = wcsIqClient; - - /** - * The OAuth2 access token. - * @type {string} - * @private - */ - this.token_ = token; - - /** - * The function called when the WCS client has received a full JID. - * @type {function(boolean): void} - * @private - */ - this.onReady_ = onReady; - - /** - * The full JID of the WCS client. - * @type {string} - * @private - */ - this.clientFullJid_ = ''; - - /** @type {remoting.Wcs} */ - var that = this; - /** - * A timer that polls for an updated access token. - * @type {number} - * @private - */ - this.pollForUpdatedToken_ = setInterval( - function() { - /** @param {string} token */ - var updateAccessToken = function(token) { - that.updateAccessToken_(token); - } - remoting.oauth2.callWithToken(updateAccessToken); - }, - 60 * 1000); - - /** - * A function called when an IQ stanza is received. - * @param {string} stanza The IQ stanza. - * @private - */ - this.onIq_ = function(stanza) {}; - - // Handle messages from the WcsIqClient. - /** @param {Array.} msg An array of message strings. */ - var onMessage = function(msg) { that.onMessage_(msg); }; - this.wcsIqClient_.setOnMessage(onMessage); - - // Start the WcsIqClient. - this.wcsIqClient_.connectChannel(); -}; - -/** - * Passes an access token to the WcsIqClient, if the token has been updated. - * - * @param {string} tokenNew A (possibly updated) access token. - * @return {void} Nothing. - * @private - */ -remoting.Wcs.prototype.updateAccessToken_ = function(tokenNew) { - if (tokenNew != this.token_) { - this.token_ = tokenNew; - this.wcsIqClient_.updateAccessToken(this.token_); - } -}; - -/** - * Handles a message coming from the WcsIqClient. - * - * @param {Array.} msg The message. - * @return {void} Nothing. - * @private - */ -remoting.Wcs.prototype.onMessage_ = function(msg) { - if (msg[0] == 'is') { - this.onIq_(msg[1]); - } else if (msg[0] == 'cfj') { - this.clientFullJid_ = msg[1]; - remoting.debug.log('Received JID: ' + this.clientFullJid_); - this.onReady_(true); - this.onReady_ = function(success) {}; - } -}; - -/** - * Gets the full JID of the WCS client. - * - * @return {string} The full JID. - */ -remoting.Wcs.prototype.getJid = function() { - return this.clientFullJid_; -}; - -/** - * Sends an IQ stanza. - * - * @param {string} stanza An IQ stanza. - * @return {void} Nothing. - */ -remoting.Wcs.prototype.sendIq = function(stanza) { - this.wcsIqClient_.sendIq(stanza); -}; - -/** - * Sets the function called when an IQ stanza is received. - * - * @param {function(string): void} onIq The function called when an IQ stanza - * is received. - * @return {void} Nothing. - */ -remoting.Wcs.prototype.setOnIq = function(onIq) { - this.onIq_ = onIq; -}; diff --git a/remoting/webapp/me2mom/wcs_iq_client_proto.js b/remoting/webapp/me2mom/wcs_iq_client_proto.js deleted file mode 100644 index 3a484260..0000000 --- a/remoting/webapp/me2mom/wcs_iq_client_proto.js +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file contains type definitions for the WCS IQ client. It is used only -// with JSCompiler to verify the type-correctness of our code. - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @constructor - */ -remoting.WcsIqClient = function() {}; - -/** @param {function(Array.): void} onMsg The function called when a - * message is received. - * @return {void} Nothing. */ -remoting.WcsIqClient.prototype.setOnMessage = function(onMsg) {}; - -/** @return {void} Nothing. */ -remoting.WcsIqClient.prototype.connectChannel = function() {}; - -/** @param {string} stanza An IQ stanza. - * @return {void} Nothing. */ -remoting.WcsIqClient.prototype.sendIq = function(stanza) {}; - -/** @param {string} token An OAuth2 access token. - * @return {void} Nothing. */ -remoting.WcsIqClient.prototype.updateAccessToken = function(token) {}; diff --git a/remoting/webapp/me2mom/wcs_loader.js b/remoting/webapp/me2mom/wcs_loader.js deleted file mode 100644 index 54fd3cc..0000000 --- a/remoting/webapp/me2mom/wcs_loader.js +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2012 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -/** - * @fileoverview - * A class that loads a WCS IQ client and constructs remoting.wcs as a - * wrapper for it. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** @type {remoting.WcsLoader} */ -remoting.wcsLoader = null; - -/** - * @constructor - * @private - */ -remoting.WcsLoader = function() { - /** - * The WCS client that will be downloaded. This variable is initialized (via - * remoting.wcsLoader) by the downloaded Javascript. - * @type {remoting.WcsIqClient} - */ - this.wcsIqClient = null; -}; - -/** - * Load WCS if necessary, then invoke the callback with an access token. - * - * @param {function(string?): void} onReady The callback function, called with - * an OAuth2 access token when WCS has been loaded, or with null on error. - * @return {void} Nothing. - */ -remoting.WcsLoader.load = function(onReady) { - if (!remoting.wcsLoader) { - remoting.wcsLoader = new remoting.WcsLoader(); - } - /** @param {string} token The OAuth2 access token. */ - var start = function(token) { - remoting.wcsLoader.start_(token, onReady); - }; - remoting.oauth2.callWithToken(start); -}; - -/** - * The URL of the GTalk gadget. - * @type {string} - * @private - */ -remoting.WcsLoader.prototype.TALK_GADGET_URL_ = - 'https://talkgadget.google.com/talkgadget/'; - -/** - * The id of the script node. - * @type {string} - * @private - */ -remoting.WcsLoader.prototype.SCRIPT_NODE_ID_ = 'wcs-script-node'; - -/** - * The attribute name indicating that the WCS has finished loading. - * @type {string} - * @private - */ -remoting.WcsLoader.prototype.SCRIPT_NODE_LOADED_FLAG_ = 'wcs-script-loaded'; - -/** - * Starts loading the WCS IQ client. - * - * When it's loaded, construct remoting.wcs as a wrapper for it. - * When the WCS connection is ready, or on error, call |onReady|. - * - * @param {string} token An OAuth2 access token. - * @param {function(string?): void} onReady The callback function, called with - * an OAuth2 access token when WCS has been loaded, or with null on error. - * @return {void} Nothing. - * @private - */ -remoting.WcsLoader.prototype.start_ = function(token, onReady) { - var node = document.getElementById(this.SCRIPT_NODE_ID_); - if (!node) { - // The first time, there will be no script node, so create one. - node = document.createElement('script'); - node.id = this.SCRIPT_NODE_ID_; - node.src = this.TALK_GADGET_URL_ + 'iq?access_token=' + token; - node.type = 'text/javascript'; - document.body.insertBefore(node, document.body.firstChild); - } else if (node.hasAttribute(this.SCRIPT_NODE_LOADED_FLAG_)) { - // Subsequently, explicitly invoke onReady if onload has already fired. - // TODO(jamiewalch): It's possible that the WCS client has not finished - // initializing. Add support for multiple callbacks to the remoting.Wcs - // class to address this. - onReady(token); - return; - } - /** @type {remoting.WcsLoader} */ - var that = this; - var onLoad = function() { - var typedNode = /** @type {Element} */ (node); - typedNode.setAttribute(that.SCRIPT_NODE_LOADED_FLAG_, true); - that.constructWcs_(token, onReady); - }; - var onError = function() { - var typedNode = /** @type {Element} */ (node); - typedNode.parentNode.removeChild(node); - onReady(null); - }; - node.addEventListener('load', onLoad, false); - node.addEventListener('error', onError, false); -}; - -/** - * Constructs the remoting.wcs object. - * - * @param {string} token An OAuth2 access token. - * @param {function(string?): void} onReady The callback function, called with - * an OAuth2 access token when WCS has been loaded, or with null on error. - * @return {void} Nothing. - * @private - */ -remoting.WcsLoader.prototype.constructWcs_ = function(token, onReady) { - remoting.wcs = new remoting.Wcs( - remoting.wcsLoader.wcsIqClient, - token, - function() { onReady(token); }); -}; diff --git a/remoting/webapp/me2mom/xhr.js b/remoting/webapp/me2mom/xhr.js deleted file mode 100644 index 2a48077..0000000 --- a/remoting/webapp/me2mom/xhr.js +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - * Simple utilities for making XHRs more pleasant. - */ - -'use strict'; - -/** @suppress {duplicate} */ -var remoting = remoting || {}; - -/** Namespace for XHR functions */ -/** @type {Object} */ -remoting.xhr = remoting.xhr || {}; - -/** - * Takes an associative array of parameters and urlencodes it. - * - * @param {Object.} paramHash The parameter key/value pairs. - * @return {string} URLEncoded version of paramHash. - */ -remoting.xhr.urlencodeParamHash = function(paramHash) { - var paramArray = []; - for (var key in paramHash) { - paramArray.push(encodeURIComponent(key) + - '=' + encodeURIComponent(paramHash[key])); - } - if (paramArray.length > 0) { - return paramArray.join('&'); - } - return ''; -}; - -/** - * Execute an XHR GET asynchronously. - * - * @param {string} url The base URL to GET, excluding parameters. - * @param {function(XMLHttpRequest):void} onDone The function to call on - * completion. - * @param {(string|Object.)=} opt_parameters The request parameters, - * either as an associative array, or a string. If it is a string, do - * not include the ? and be sure it is correctly URLEncoded. - * @param {Object.=} opt_headers Additional headers to include on the - * request. - * @param {boolean=} opt_withCredentials Set the withCredentials flags in the - * XHR. - * @return {XMLHttpRequest} The request object. - */ -remoting.xhr.get = function(url, onDone, opt_parameters, opt_headers, - opt_withCredentials) { - return remoting.xhr.doMethod('GET', url, onDone, opt_parameters, - opt_headers, opt_withCredentials); -}; - -/** - * Execute an XHR POST asynchronously. - * - * @param {string} url The base URL to POST, excluding parameters. - * @param {function(XMLHttpRequest):void} onDone The function to call on - * completion. - * @param {(string|Object.)=} opt_parameters The request parameters, - * either as an associative array, or a string. If it is a string, be - * sure it is correctly URLEncoded. - * @param {Object.=} opt_headers Additional headers to include on the - * request. - * @param {boolean=} opt_withCredentials Set the withCredentials flags in the - * XHR. - * @return {XMLHttpRequest} The request object. - */ -remoting.xhr.post = function(url, onDone, opt_parameters, opt_headers, - opt_withCredentials) { - return remoting.xhr.doMethod('POST', url, onDone, opt_parameters, - opt_headers, opt_withCredentials); -}; - -/** - * Execute an XHR DELETE asynchronously. - * - * @param {string} url The base URL to DELETE, excluding parameters. - * @param {function(XMLHttpRequest):void} onDone The function to call on - * completion. - * @param {(string|Object.)=} opt_parameters The request parameters, - * either as an associative array, or a string. If it is a string, be - * sure it is correctly URLEncoded. - * @param {Object.=} opt_headers Additional headers to include on the - * request. - * @param {boolean=} opt_withCredentials Set the withCredentials flags in the - * XHR. - * @return {XMLHttpRequest} The request object. - */ -remoting.xhr.remove = function(url, onDone, opt_parameters, opt_headers, - opt_withCredentials) { - return remoting.xhr.doMethod('DELETE', url, onDone, opt_parameters, - opt_headers, opt_withCredentials); -}; - -/** - * Execute an XHR PUT asynchronously. - * - * @param {string} url The base URL to PUT, excluding parameters. - * @param {function(XMLHttpRequest):void} onDone The function to call on - * completion. - * @param {(string|Object.)=} opt_parameters The request parameters, - * either as an associative array, or a string. If it is a string, be - * sure it is correctly URLEncoded. - * @param {Object.=} opt_headers Additional headers to include on the - * request. - * @param {boolean=} opt_withCredentials Set the withCredentials flags in the - * XHR. - * @return {XMLHttpRequest} The request object. - */ -remoting.xhr.put = function(url, onDone, opt_parameters, opt_headers, - opt_withCredentials) { - return remoting.xhr.doMethod('PUT', url, onDone, opt_parameters, - opt_headers, opt_withCredentials); -}; - -/** - * Execute an arbitrary HTTP method asynchronously. - * - * @param {string} methodName The HTTP method name, e.g. "GET", "POST" etc. - * @param {string} url The base URL, excluding parameters. - * @param {function(XMLHttpRequest):void} onDone The function to call on - * completion. - * @param {(string|Object.)=} opt_parameters The request parameters, - * either as an associative array, or a string. If it is a string, be - * sure it is correctly URLEncoded. - * @param {Object.=} opt_headers Additional headers to include on the - * request. - * @param {boolean=} opt_withCredentials Set the withCredentials flags in the - * XHR. - * @return {XMLHttpRequest} The XMLHttpRequest object. - */ -remoting.xhr.doMethod = function(methodName, url, onDone, - opt_parameters, opt_headers, - opt_withCredentials) { - /** @type {XMLHttpRequest} */ - var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = function() { - if (xhr.readyState != 4) { - return; - } - onDone(xhr); - }; - - var parameterString = ''; - if (typeof(opt_parameters) === 'string') { - parameterString = opt_parameters; - } else if (typeof(opt_parameters) === 'object') { - parameterString = remoting.xhr.urlencodeParamHash(opt_parameters); - } else if (opt_parameters === undefined) { - // No problem here. Do nothing. - } else { - throw 'opt_parameters must be string or associated array.'; - } - - var useBody = (methodName == 'POST') || (methodName == 'PUT'); - - if (!useBody && parameterString != '') { - url = url + '?' + parameterString; - } - - xhr.open(methodName, url, true); - if (methodName == 'POST') { - xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); - } - // Add in request headers. - if (typeof(opt_headers) === 'object') { - for (var key in opt_headers) { - xhr.setRequestHeader(key, opt_headers[key]); - } - } else if (opt_headers === undefined) { - // No problem here. Do nothing. - } else { - throw 'opt_headers must be associative array.'; - } - - if (opt_withCredentials) { - xhr.withCredentials = true; - } - - xhr.send(useBody ? parameterString : null); - return xhr; -}; diff --git a/remoting/webapp/oauth2.js b/remoting/webapp/oauth2.js new file mode 100644 index 0000000..5f9b8e3 --- /dev/null +++ b/remoting/webapp/oauth2.js @@ -0,0 +1,348 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * OAuth2 class that handles retrieval/storage of an OAuth2 token. + * + * Uses a content script to trampoline the OAuth redirect page back into the + * extension context. This works around the lack of native support for + * chrome-extensions in OAuth2. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @type {remoting.OAuth2} */ +remoting.oauth2 = null; + + +/** @constructor */ +remoting.OAuth2 = function() { +}; + +// Constants representing keys used for storing persistent state. +/** @private */ +remoting.OAuth2.prototype.KEY_REFRESH_TOKEN_ = 'oauth2-refresh-token'; +/** @private */ +remoting.OAuth2.prototype.KEY_ACCESS_TOKEN_ = 'oauth2-access-token'; +/** @private */ +remoting.OAuth2.prototype.KEY_EMAIL_ = 'remoting-email'; + +// Constants for parameters used in retrieving the OAuth2 credentials. +/** @private */ +remoting.OAuth2.prototype.CLIENT_ID_ = + '440925447803-2pi3v45bff6tp1rde2f7q6lgbor3o5uj.' + + 'apps.googleusercontent.com'; +/** @private */ +remoting.OAuth2.prototype.CLIENT_SECRET_ = 'W2ieEsG-R1gIA4MMurGrgMc_'; +/** @private */ +remoting.OAuth2.prototype.SCOPE_ = + 'https://www.googleapis.com/auth/chromoting ' + + 'https://www.googleapis.com/auth/googletalk ' + + 'https://www.googleapis.com/auth/userinfo#email'; +/** @private */ +remoting.OAuth2.prototype.REDIRECT_URI_ = + 'https://talkgadget.google.com/talkgadget/blank'; +/** @private */ +remoting.OAuth2.prototype.OAUTH2_TOKEN_ENDPOINT_ = + 'https://accounts.google.com/o/oauth2/token'; + +/** @return {boolean} True if the app is already authenticated. */ +remoting.OAuth2.prototype.isAuthenticated = function() { + if (this.getRefreshToken()) { + return true; + } + return false; +}; + +/** + * Removes all storage, and effectively unauthenticates the user. + * + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.clear = function() { + window.localStorage.removeItem(this.KEY_REFRESH_TOKEN_); + window.localStorage.removeItem(this.KEY_EMAIL_); + this.clearAccessToken(); +}; + +/** + * @param {string} token The new refresh token. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.setRefreshToken = function(token) { + window.localStorage.setItem(this.KEY_REFRESH_TOKEN_, escape(token)); + this.clearAccessToken(); +}; + +/** @return {?string} The refresh token, if authenticated, or NULL. */ +remoting.OAuth2.prototype.getRefreshToken = function() { + var value = window.localStorage.getItem(this.KEY_REFRESH_TOKEN_); + if (typeof value == 'string') { + return unescape(value); + } + return null; +}; + +/** + * @param {string} token The new access token. + * @param {number} expiration Expiration time in milliseconds since epoch. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.setAccessToken = function(token, expiration) { + var access_token = {'token': token, 'expiration': expiration}; + window.localStorage.setItem(this.KEY_ACCESS_TOKEN_, + JSON.stringify(access_token)); +}; + +/** + * Returns the current access token, setting it to a invalid value if none + * existed before. + * + * @private + * @return {{token: string, expiration: number}} The current access token, or + * an invalid token if not authenticated. + */ +remoting.OAuth2.prototype.getAccessTokenInternal_ = function() { + if (!window.localStorage.getItem(this.KEY_ACCESS_TOKEN_)) { + // Always be able to return structured data. + this.setAccessToken('', 0); + } + var accessToken = window.localStorage.getItem(this.KEY_ACCESS_TOKEN_); + if (typeof accessToken == 'string') { + var result = JSON.parse(accessToken); + if ('token' in result && 'expiration' in result) { + return /** @type {{token: string, expiration: number}} */ result; + } + } + console.log('Invalid access token stored.'); + return {'token': '', 'expiration': 0}; +}; + +/** + * Returns true if the access token is expired, or otherwise invalid. + * + * Will throw if !isAuthenticated(). + * + * @return {boolean} True if a new access token is needed. + */ +remoting.OAuth2.prototype.needsNewAccessToken = function() { + if (!this.isAuthenticated()) { + throw 'Not Authenticated.'; + } + var access_token = this.getAccessTokenInternal_(); + if (!access_token['token']) { + return true; + } + if (Date.now() > access_token['expiration']) { + return true; + } + return false; +}; + +/** + * Returns the current access token. + * + * Will throw if !isAuthenticated() or needsNewAccessToken(). + * + * @return {string} The access token. + */ +remoting.OAuth2.prototype.getAccessToken = function() { + if (this.needsNewAccessToken()) { + throw 'Access Token expired.'; + } + return this.getAccessTokenInternal_()['token']; +}; + +/** @return {void} Nothing. */ +remoting.OAuth2.prototype.clearAccessToken = function() { + window.localStorage.removeItem(this.KEY_ACCESS_TOKEN_); +}; + +/** + * Update state based on token response from the OAuth2 /token endpoint. + * + * @private + * @param {XMLHttpRequest} xhr The XHR object for this request. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.processTokenResponse_ = function(xhr) { + if (xhr.status == 200) { + var tokens = JSON.parse(xhr.responseText); + if ('refresh_token' in tokens) { + this.setRefreshToken(tokens['refresh_token']); + } + + // Offset by 120 seconds so that we can guarantee that the token + // we return will be valid for at least 2 minutes. + // If the access token is to be useful, this object must make some + // guarantee as to how long the token will be valid for. + // The choice of 2 minutes is arbitrary, but that length of time + // is part of the contract satisfied by callWithToken(). + // Offset by a further 30 seconds to account for RTT issues. + this.setAccessToken(tokens['access_token'], + (tokens['expires_in'] - (120 + 30)) * 1000 + Date.now()); + } else { + console.log('Failed to get tokens. Status: ' + xhr.status + + ' response: ' + xhr.responseText); + } +}; + +/** + * Asynchronously retrieves a new access token from the server. + * + * Will throw if !isAuthenticated(). + * + * @param {function(XMLHttpRequest): void} onDone Callback to invoke on + * completion. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.refreshAccessToken = function(onDone) { + if (!this.isAuthenticated()) { + throw 'Not Authenticated.'; + } + + var parameters = { + 'client_id': this.CLIENT_ID_, + 'client_secret': this.CLIENT_SECRET_, + 'refresh_token': this.getRefreshToken(), + 'grant_type': 'refresh_token' + }; + + /** @type {remoting.OAuth2} */ + var that = this; + /** @param {XMLHttpRequest} xhr The XHR reply. */ + var processTokenResponse = function(xhr) { + that.processTokenResponse_(xhr); + onDone(xhr); + }; + remoting.xhr.post(this.OAUTH2_TOKEN_ENDPOINT_, + processTokenResponse, + parameters); +}; + +/** + * Redirect page to get a new OAuth2 Refresh Token. + * + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.doAuthRedirect = function() { + var GET_CODE_URL = 'https://accounts.google.com/o/oauth2/auth?' + + remoting.xhr.urlencodeParamHash({ + 'client_id': this.CLIENT_ID_, + 'redirect_uri': this.REDIRECT_URI_, + 'scope': this.SCOPE_, + 'response_type': 'code', + 'access_type': 'offline', + 'approval_prompt': 'force' + }); + window.location.replace(GET_CODE_URL); +}; + +/** + * Asynchronously exchanges an authorization code for a refresh token. + * + * @param {string} code The new refresh token. + * @param {function(XMLHttpRequest):void} onDone Callback to invoke on + * completion. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.exchangeCodeForToken = function(code, onDone) { + var parameters = { + 'client_id': this.CLIENT_ID_, + 'client_secret': this.CLIENT_SECRET_, + 'redirect_uri': this.REDIRECT_URI_, + 'code': code, + 'grant_type': 'authorization_code' + }; + + /** @type {remoting.OAuth2} */ + var that = this; + /** @param {XMLHttpRequest} xhr The XHR reply. */ + var processTokenResponse = function(xhr) { + that.processTokenResponse_(xhr); + onDone(xhr); + }; + remoting.xhr.post(this.OAUTH2_TOKEN_ENDPOINT_, + processTokenResponse, + parameters); +}; + +/** + * Call myfunc with an access token as the only parameter. + * + * This will refresh the access token if necessary. If the access token + * cannot be refreshed, an error is thrown. + * + * The access token will remain valid for at least 2 minutes. + * + * @param {function(string):void} myfunc + * Function to invoke with access token. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.callWithToken = function(myfunc) { + /** @type {remoting.OAuth2} */ + var that = this; + if (remoting.oauth2.needsNewAccessToken()) { + remoting.oauth2.refreshAccessToken(function() { + if (remoting.oauth2.needsNewAccessToken()) { + // If we still need it, we're going to infinite loop. + throw 'Unable to get access token.'; + } + myfunc(that.getAccessToken()); + }); + return; + } + + myfunc(this.getAccessToken()); +}; + +/** + * Get the user's email address. + * + * @param {function(?string):void} setEmail Callback invoked when the email + * address is available, or on error. + * @return {void} Nothing. + */ +remoting.OAuth2.prototype.getEmail = function(setEmail) { + /** @type {remoting.OAuth2} */ + var that = this; + /** @param {XMLHttpRequest} xhr The XHR response. */ + var onResponse = function(xhr) { + that.email = null; + if (xhr.status == 200) { + // TODO(ajwong): See if we can't find a JSON endpoint. + that.email = xhr.responseText.split('&')[0].split('=')[1]; + } + window.localStorage.setItem(that.KEY_EMAIL_, that.email); + setEmail(that.email); + }; + + /** @param {string} token The access token. */ + var getEmailFromToken = function(token) { + var headers = { 'Authorization': 'OAuth ' + token }; + // TODO(ajwong): Update to new v2 API. + remoting.xhr.get('https://www.googleapis.com/userinfo/email', + onResponse, '', headers); + }; + + this.callWithToken(getEmailFromToken); +}; + +/** + * If the user's email address is cached, return it, otherwise return null. + * + * @return {?string} The email address, if it has been cached by a previous call + * to getEmail, otherwise null. + */ +remoting.OAuth2.prototype.getCachedEmail = function() { + var value = window.localStorage.getItem(this.KEY_EMAIL_); + if (typeof value == 'string') { + return value; + } + return null; +}; diff --git a/remoting/webapp/oauth2_callback.html b/remoting/webapp/oauth2_callback.html new file mode 100644 index 0000000..da5fe1b --- /dev/null +++ b/remoting/webapp/oauth2_callback.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + diff --git a/remoting/webapp/plugin_settings.js b/remoting/webapp/plugin_settings.js new file mode 100644 index 0000000..b195804 --- /dev/null +++ b/remoting/webapp/plugin_settings.js @@ -0,0 +1,16 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Contains all the settings that may need massaging by the build script. +// Keeping all that centralized here allows us to use symlinks for the other +// files making for a faster compile/run cycle when only modifying HTML/JS. + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * The MIME type of the Host plugin. + * @type {string} + */ +remoting.PLUGIN_MIMETYPE = 'HOST_PLUGIN_MIMETYPE'; diff --git a/remoting/webapp/remoting.js b/remoting/webapp/remoting.js new file mode 100644 index 0000000..e0d843d --- /dev/null +++ b/remoting/webapp/remoting.js @@ -0,0 +1,186 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @type {remoting.HostSession} */ remoting.hostSession = null; + +/** + * @enum {string} All error messages from messages.json + */ +remoting.Error = { + NO_RESPONSE: /*i18n-content*/'ERROR_NO_RESPONSE', + INVALID_ACCESS_CODE: /*i18n-content*/'ERROR_INVALID_ACCESS_CODE', + MISSING_PLUGIN: /*i18n-content*/'ERROR_MISSING_PLUGIN', + AUTHENTICATION_FAILED: /*i18n-content*/'ERROR_AUTHENTICATION_FAILED', + HOST_IS_OFFLINE: /*i18n-content*/'ERROR_HOST_IS_OFFLINE', + INCOMPATIBLE_PROTOCOL: /*i18n-content*/'ERROR_INCOMPATIBLE_PROTOCOL', + BAD_PLUGIN_VERSION: /*i18n-content*/'ERROR_BAD_PLUGIN_VERSION', + GENERIC: /*i18n-content*/'ERROR_GENERIC', + UNEXPECTED: /*i18n-content*/'ERROR_UNEXPECTED', + SERVICE_UNAVAILABLE: /*i18n-content*/'ERROR_SERVICE_UNAVAILABLE' +}; + +/** + * Entry point for app initialization. + */ +remoting.init = function() { + l10n.localize(); + var button = document.getElementById('toggle-scaling'); + button.title = chrome.i18n.getMessage(/*i18n-content*/'TOOLTIP_SCALING'); + // Create global objects. + remoting.oauth2 = new remoting.OAuth2(); + remoting.debug = new remoting.DebugLog( + document.getElementById('debug-messages'), + document.getElementById('statistics')); + remoting.hostList = new remoting.HostList( + document.getElementById('host-list'), + document.getElementById('host-list-error')); + remoting.toolbar = new remoting.Toolbar( + document.getElementById('session-toolbar')); + + refreshEmail_(); + var email = remoting.oauth2.getCachedEmail(); + if (email) { + document.getElementById('current-email').innerText = email; + } + + window.addEventListener('blur', pluginLostFocus_, false); + + // Parse URL parameters. + var urlParams = getUrlParameters(); + if ('mode' in urlParams) { + if (urlParams['mode'] == 'me2me') { + var hostId = urlParams['hostId']; + remoting.connectMe2Me(hostId, true); + return; + } + } + + // No valid URL parameters, start up normally. + remoting.setMode(getAppStartupMode_()); + if (isHostModeSupported_()) { + var noShare = document.getElementById('chrome-os-no-share'); + noShare.parentNode.removeChild(noShare); + } else { + var button = document.getElementById('share-button'); + button.disabled = true; + } +}; + +/** + * If there is an incomplete share or connection in progress, cancel it. + */ +remoting.cancelPendingOperation = function() { + document.getElementById('cancel-button').disabled = true; + switch (remoting.getMajorMode()) { + case remoting.AppMode.HOST: + remoting.cancelShare(); + break; + case remoting.AppMode.CLIENT: + remoting.cancelConnect(); + break; + } +}; + +/** + * If the client is connected, or the host is shared, prompt before closing. + * + * @return {?string} The prompt string if a connection is active. + */ +remoting.promptClose = function() { + switch (remoting.currentMode) { + case remoting.AppMode.CLIENT_CONNECTING: + case remoting.AppMode.HOST_WAITING_FOR_CODE: + case remoting.AppMode.HOST_WAITING_FOR_CONNECTION: + case remoting.AppMode.HOST_SHARED: + case remoting.AppMode.IN_SESSION: + var result = chrome.i18n.getMessage(/*i18n-content*/'CLOSE_PROMPT'); + return result; + default: + return null; + } +}; + +/** + * Sign the user out of Chromoting by clearing the OAuth refresh token. + */ +remoting.clearOAuth2 = function() { + remoting.oauth2.clear(); + window.localStorage.removeItem(KEY_EMAIL_); + remoting.setMode(remoting.AppMode.UNAUTHENTICATED); +}; + +/** + * Callback function called when the browser window loses focus. In this case, + * release all keys to prevent them becoming 'stuck down' on the host. + */ +function pluginLostFocus_() { + if (remoting.clientSession && remoting.clientSession.plugin) { + remoting.clientSession.plugin.releaseAllKeys(); + } +} + +/** + * If the user is authenticated, but there is no email address cached, get one. + */ +function refreshEmail_() { + if (!getEmail_() && remoting.oauth2.isAuthenticated()) { + remoting.oauth2.getEmail(setEmail_); + } +} + +/** + * The key under which the email address is stored. + * @private + */ +var KEY_EMAIL_ = 'remoting-email'; + +/** + * Save the user's email address in local storage. + * + * @param {?string} email The email address to place in local storage. + * @return {void} Nothing. + */ +function setEmail_(email) { + if (email) { + document.getElementById('current-email').innerText = email; + } else { + // TODO(ajwong): Have a better way of showing an error. + document.getElementById('current-email').innerText = '???'; + } +} + +/** + * Read the user's email address from local storage. + * + * @return {?string} The email address associated with the auth credentials. + */ +function getEmail_() { + var result = window.localStorage.getItem(KEY_EMAIL_); + return typeof result == 'string' ? result : null; +} + +/** + * Gets the major-mode that this application should start up in. + * + * @return {remoting.AppMode} The mode to start in. + */ +function getAppStartupMode_() { + return remoting.oauth2.isAuthenticated() ? remoting.AppMode.HOME : + remoting.AppMode.UNAUTHENTICATED; +} + +/** + * Returns whether Host mode is supported on this platform. + * + * @return {boolean} True if Host mode is supported. + */ +function isHostModeSupported_() { + // Currently, sharing on Chromebooks is not supported. + return !navigator.userAgent.match(/\bCrOS\b/); +} diff --git a/remoting/webapp/scale-to-fit.png b/remoting/webapp/scale-to-fit.png new file mode 100644 index 0000000..fdb44ab Binary files /dev/null and b/remoting/webapp/scale-to-fit.png differ diff --git a/remoting/webapp/server_log_entry.js b/remoting/webapp/server_log_entry.js new file mode 100644 index 0000000..ba78f66 --- /dev/null +++ b/remoting/webapp/server_log_entry.js @@ -0,0 +1,433 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * A class of server log entries. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @private + * @constructor + */ +remoting.ServerLogEntry = function() { + /** @type Object. */ this.dict = {}; +}; + +/** @private */ +remoting.ServerLogEntry.KEY_EVENT_NAME_ = 'event-name'; +/** @private */ +remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_STATE_ = + 'session-state'; + +/** @private */ +remoting.ServerLogEntry.KEY_SESSION_ID_ = 'session-id'; + +/** @private */ +remoting.ServerLogEntry.KEY_ROLE_ = 'role'; +/** @private */ +remoting.ServerLogEntry.VALUE_ROLE_CLIENT_ = 'client'; + +/** @private */ +remoting.ServerLogEntry.KEY_SESSION_STATE_ = 'session-state'; + +/** + * @private + * @param {remoting.ClientSession.State} state + * @return {string} + */ +remoting.ServerLogEntry.getValueForSessionState = function(state) { + switch(state) { + case remoting.ClientSession.State.UNKNOWN: + return 'unknown'; + case remoting.ClientSession.State.CREATED: + return 'created'; + case remoting.ClientSession.State.BAD_PLUGIN_VERSION: + return 'bad-plugin-version'; + case remoting.ClientSession.State.UNKNOWN_PLUGIN_ERROR: + return 'unknown-plugin-error'; + case remoting.ClientSession.State.CONNECTING: + return 'connecting'; + case remoting.ClientSession.State.INITIALIZING: + return 'initializing'; + case remoting.ClientSession.State.CONNECTED: + return 'connected'; + case remoting.ClientSession.State.CLOSED: + return 'closed'; + case remoting.ClientSession.State.CONNECTION_FAILED: + return 'connection-failed'; + default: + return 'undefined-' + state; + } +}; + +/** @private */ +remoting.ServerLogEntry.KEY_CONNECTION_ERROR_ = 'connection-error'; + +/** + * @private + * @param {remoting.ClientSession.ConnectionError} connectionError + * @return {string} + */ +remoting.ServerLogEntry.getValueForConnectionError = + function(connectionError) { + switch(connectionError) { + case remoting.ClientSession.ConnectionError.NONE: + return 'none'; + case remoting.ClientSession.ConnectionError.HOST_IS_OFFLINE: + return 'host-is-offline'; + case remoting.ClientSession.ConnectionError.SESSION_REJECTED: + return 'session-rejected'; + case remoting.ClientSession.ConnectionError.INCOMPATIBLE_PROTOCOL: + return 'incompatible-protocol'; + case remoting.ClientSession.ConnectionError.NETWORK_FAILURE: + return 'network-failure'; + default: + return 'unknown-' + connectionError; + } +}; + +/** @private */ +remoting.ServerLogEntry.KEY_SESSION_DURATION_ = 'session-duration'; + +/** @private */ +remoting.ServerLogEntry.VALUE_EVENT_NAME_CONNECTION_STATISTICS_ = + "connection-statistics"; +/** @private */ +remoting.ServerLogEntry.KEY_VIDEO_BANDWIDTH_ = "video-bandwidth"; +/** @private */ +remoting.ServerLogEntry.KEY_CAPTURE_LATENCY_ = "capture-latency"; +/** @private */ +remoting.ServerLogEntry.KEY_ENCODE_LATENCY_ = "encode-latency"; +/** @private */ +remoting.ServerLogEntry.KEY_DECODE_LATENCY_ = "decode-latency"; +/** @private */ +remoting.ServerLogEntry.KEY_RENDER_LATENCY_ = "render-latency"; +/** @private */ +remoting.ServerLogEntry.KEY_ROUNDTRIP_LATENCY_ = "roundtrip-latency"; + +/** @private */ +remoting.ServerLogEntry.KEY_OS_NAME_ = 'os-name'; +/** @private */ +remoting.ServerLogEntry.VALUE_OS_NAME_WINDOWS_ = 'Windows'; +/** @private */ +remoting.ServerLogEntry.VALUE_OS_NAME_LINUX_ = 'Linux'; +/** @private */ +remoting.ServerLogEntry.VALUE_OS_NAME_MAC_ = 'Mac'; +/** @private */ +remoting.ServerLogEntry.VALUE_OS_NAME_CHROMEOS_ = 'ChromeOS'; + +/** @private */ +remoting.ServerLogEntry.KEY_OS_VERSION_ = 'os-version'; + +/** @private */ +remoting.ServerLogEntry.KEY_CPU_ = 'cpu'; + +/** @private */ +remoting.ServerLogEntry.KEY_BROWSER_VERSION_ = 'browser-version'; + +/** @private */ +remoting.ServerLogEntry.KEY_WEBAPP_VERSION_ = 'webapp-version'; + +/** @private */ +remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_OLD_ = 'session-id-old'; + +/** @private */ +remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_NEW_ = 'session-id-new'; + +/** + * Sets one field in this log entry. + * + * @private + * @param {string} key + * @param {string} value + */ +remoting.ServerLogEntry.prototype.set = function(key, value) { + this.dict[key] = value; +}; + +/** + * Converts this object into an XML stanza. + * + * @return {string} + */ +remoting.ServerLogEntry.prototype.toStanza = function() { + var stanza = ' */ var fields = []; + for (var key in this.dict) { + fields.push(key + ': ' + this.dict[key]); + } + remoting.debug.logIndent(indentLevel, fields.join(', ')); +}; + +/** + * Makes a log entry for a change of client session state. + * + * @param {remoting.ClientSession.State} state + * @param {remoting.ClientSession.ConnectionError} connectionError + * @return {remoting.ServerLogEntry} + */ +remoting.ServerLogEntry.makeClientSessionStateChange = function(state, + connectionError) { + var entry = new remoting.ServerLogEntry(); + entry.set(remoting.ServerLogEntry.KEY_ROLE_, + remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); + entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, + remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_STATE_); + entry.set(remoting.ServerLogEntry.KEY_SESSION_STATE_, + remoting.ServerLogEntry.getValueForSessionState(state)); + if (connectionError != remoting.ClientSession.ConnectionError.NONE) { + entry.set(remoting.ServerLogEntry.KEY_CONNECTION_ERROR_, + remoting.ServerLogEntry.getValueForConnectionError( + connectionError)); + } + return entry; +}; + +/** + * Adds a session duration to a log entry. + * + * @param {number} sessionDuration + */ +remoting.ServerLogEntry.prototype.addSessionDurationField = function( + sessionDuration) { + this.set(remoting.ServerLogEntry.KEY_SESSION_DURATION_, + sessionDuration.toString()); +}; + +/** + * Makes a log entry for a set of connection statistics. + * Returns null if all the statistics were zero. + * + * @param {remoting.StatsAccumulator} statsAccumulator + * @return {?remoting.ServerLogEntry} + */ +remoting.ServerLogEntry.makeStats = function(statsAccumulator) { + var entry = new remoting.ServerLogEntry(); + entry.set(remoting.ServerLogEntry.KEY_ROLE_, + remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); + entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, + remoting.ServerLogEntry.VALUE_EVENT_NAME_CONNECTION_STATISTICS_); + var nonZero = false; + nonZero |= entry.addStatsField( + remoting.ServerLogEntry.KEY_VIDEO_BANDWIDTH_, + remoting.ClientSession.STATS_KEY_VIDEO_BANDWIDTH, statsAccumulator); + nonZero |= entry.addStatsField( + remoting.ServerLogEntry.KEY_CAPTURE_LATENCY_, + remoting.ClientSession.STATS_KEY_CAPTURE_LATENCY, statsAccumulator); + nonZero |= entry.addStatsField( + remoting.ServerLogEntry.KEY_ENCODE_LATENCY_, + remoting.ClientSession.STATS_KEY_ENCODE_LATENCY, statsAccumulator); + nonZero |= entry.addStatsField( + remoting.ServerLogEntry.KEY_DECODE_LATENCY_, + remoting.ClientSession.STATS_KEY_DECODE_LATENCY, statsAccumulator); + nonZero |= entry.addStatsField( + remoting.ServerLogEntry.KEY_RENDER_LATENCY_, + remoting.ClientSession.STATS_KEY_RENDER_LATENCY, statsAccumulator); + nonZero |= entry.addStatsField( + remoting.ServerLogEntry.KEY_ROUNDTRIP_LATENCY_, + remoting.ClientSession.STATS_KEY_ROUNDTRIP_LATENCY, statsAccumulator); + if (nonZero) { + return entry; + } + return null; +}; + +/** + * Adds one connection statistic to a log entry. + * + * @private + * @param {string} entryKey + * @param {string} statsKey + * @param {remoting.StatsAccumulator} statsAccumulator + * @return {boolean} whether the statistic is non-zero + */ +remoting.ServerLogEntry.prototype.addStatsField = function( + entryKey, statsKey, statsAccumulator) { + var val = statsAccumulator.calcMean(statsKey); + this.set(entryKey, val.toString()); + return (val != 0); +}; + +/** + * Makes a log entry for a "this session ID is old" event. + * + * @param {string} sessionId + * @return {remoting.ServerLogEntry} + */ +remoting.ServerLogEntry.makeSessionIdOld = function(sessionId) { + var entry = new remoting.ServerLogEntry(); + entry.set(remoting.ServerLogEntry.KEY_ROLE_, + remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); + entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, + remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_OLD_); + entry.addSessionIdField(sessionId); + return entry; +}; + +/** + * Makes a log entry for a "this session ID is new" event. + * + * @param {string} sessionId + * @return {remoting.ServerLogEntry} + */ +remoting.ServerLogEntry.makeSessionIdNew = function(sessionId) { + var entry = new remoting.ServerLogEntry(); + entry.set(remoting.ServerLogEntry.KEY_ROLE_, + remoting.ServerLogEntry.VALUE_ROLE_CLIENT_); + entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_, + remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_NEW_); + entry.addSessionIdField(sessionId); + return entry; +}; + +/** + * Adds a session ID field to this log entry. + * + * @param {string} sessionId + */ +remoting.ServerLogEntry.prototype.addSessionIdField = function(sessionId) { + this.set(remoting.ServerLogEntry.KEY_SESSION_ID_, sessionId); +} + +/** + * Adds fields describing the host to this log entry. + */ +remoting.ServerLogEntry.prototype.addHostFields = function() { + var host = remoting.ServerLogEntry.getHostData(); + if (host) { + if (host.os_name.length > 0) { + this.set(remoting.ServerLogEntry.KEY_OS_NAME_, host.os_name); + } + if (host.os_version.length > 0) { + this.set(remoting.ServerLogEntry.KEY_OS_VERSION_, host.os_version); + } + if (host.cpu.length > 0) { + this.set(remoting.ServerLogEntry.KEY_CPU_, host.cpu); + } + } +}; + +/** + * Extracts host data from the userAgent string. + * + * @private + * @return {{os_name:string, os_version:string, cpu:string} | null} + */ +remoting.ServerLogEntry.getHostData = function() { + return remoting.ServerLogEntry.extractHostDataFrom(navigator.userAgent); +}; + +/** + * Extracts host data from the given userAgent string. + * + * @private + * @param {string} s + * @return {{os_name:string, os_version:string, cpu:string} | null} + */ +remoting.ServerLogEntry.extractHostDataFrom = function(s) { + // Sample userAgent strings: + // 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 ' + + // '(KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2' + // 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.8 ' + + // '(KHTML, like Gecko) Chrome/17.0.933.0 Safari/535.8' + // 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 ' + + // '(KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1' + // 'Mozilla/5.0 (X11; CrOS i686 14.811.154) AppleWebKit/535.1 ' + + // '(KHTML, like Gecko) Chrome/14.0.835.204 Safari/535.1' + var match = new RegExp('Windows NT ([0-9\\.]*)').exec(s); + if (match && (match.length >= 2)) { + return { + 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_WINDOWS_, + 'os_version': match[1], + 'cpu': '' + }; + } + match = new RegExp('Linux ([a-zA-Z0-9_]*)').exec(s); + if (match && (match.length >= 2)) { + return { + 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_LINUX_, + 'os_version' : '', + 'cpu': match[1] + }; + } + match = new RegExp('([a-zA-Z]*) Mac OS X ([0-9_]*)').exec(s); + if (match && (match.length >= 3)) { + return { + 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_MAC_, + 'os_version': match[2].replace(/_/g, '.'), + 'cpu': match[1] + }; + } + match = new RegExp('CrOS ([a-zA-Z0-9]*) ([0-9.]*)').exec(s); + if (match && (match.length >= 3)) { + return { + 'os_name': remoting.ServerLogEntry.VALUE_OS_NAME_CHROMEOS_, + 'os_version': match[2], + 'cpu': match[1] + }; + } + return null; +}; + +/** + * Adds a field specifying the browser version to this log entry. + */ +remoting.ServerLogEntry.prototype.addChromeVersionField = function() { + var version = remoting.ServerLogEntry.getChromeVersion(); + if (version != null) { + this.set(remoting.ServerLogEntry.KEY_BROWSER_VERSION_, version); + } +}; + +/** + * Extracts the Chrome version from the userAgent string. + * + * @private + * @return {string | null} + */ +remoting.ServerLogEntry.getChromeVersion = function() { + return remoting.ServerLogEntry.extractChromeVersionFrom(navigator.userAgent); +}; + +/** + * Extracts the Chrome version from the given userAgent string. + * + * @private + * @param {string} s + * @return {string | null} + */ +remoting.ServerLogEntry.extractChromeVersionFrom = function(s) { + var match = new RegExp('Chrome/([0-9.]*)').exec(s); + if (match && (match.length >= 2)) { + return match[1]; + } + return null; +}; + +/** + * Adds a field specifying the webapp version to this log entry. + */ +remoting.ServerLogEntry.prototype.addWebappVersionField = function() { + this.set(remoting.ServerLogEntry.KEY_WEBAPP_VERSION_, + chrome.app.getDetails().version); +}; diff --git a/remoting/webapp/spinner.gif b/remoting/webapp/spinner.gif new file mode 100644 index 0000000..7cec163 Binary files /dev/null and b/remoting/webapp/spinner.gif differ diff --git a/remoting/webapp/stats_accumulator.js b/remoting/webapp/stats_accumulator.js new file mode 100644 index 0000000..adf89c5 --- /dev/null +++ b/remoting/webapp/stats_accumulator.js @@ -0,0 +1,126 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * The webapp reads the plugin's connection statistics frequently (once per + * second). It logs statistics to the server less frequently, to keep + * bandwidth and storage costs down. This class bridges that gap, by + * accumulating high-frequency numeric data, and providing statistics + * summarising that data. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @constructor + */ +remoting.StatsAccumulator = function() { + /** + * A map from names to lists of values. + * @private + * @type Object.> + */ + this.valueLists_ = {}; + + /** + * The first time, after this object was most recently initialized or emptied, + * at which a value was added to this object. + * @private + * @type {?number} + */ + this.timeOfFirstValue_ = null; +}; + +/** + * Adds values to this object. + * + * @param {Object.} newValues + */ +remoting.StatsAccumulator.prototype.add = function(newValues) { + for (var key in newValues) { + this.getValueList(key).push(newValues[key]); + } + if (!this.timeOfFirstValue_) { + this.timeOfFirstValue_ = new Date().getTime(); + } +}; + +/** + * Empties this object. + */ +remoting.StatsAccumulator.prototype.empty = function() { + this.valueLists_ = {}; + this.timeOfFirstValue_ = null; +}; + +/** + * Gets the number of milliseconds since the first value was added to this + * object, after this object was most recently initialized or emptied. + * + * @return {number} milliseconds since the first value + */ +remoting.StatsAccumulator.prototype.getTimeSinceFirstValue = function() { + if (!this.timeOfFirstValue_) { + return 0; + } + return new Date().getTime() - this.timeOfFirstValue_; +}; + +/** + * Calculates the mean of the values for a given key. + * + * @param {string} key + * @return {number} the mean of the values for that key + */ +remoting.StatsAccumulator.prototype.calcMean = function(key) { + /** + * @param {Array.} values + * @return {number} + */ + var calcMean = function(values) { + if (values.length == 0) { + return 0.0; + } + var sum = 0; + for (var i = 0; i < values.length; i++) { + sum += values[i]; + } + return sum / values.length; + }; + return this.map(key, calcMean); +}; + +/** + * Applies a given map to the list of values for a given key. + * + * @param {string} key + * @param {function(Array.): number} map + * @return {number} the result of applying that map to the list of values for + * that key + */ +remoting.StatsAccumulator.prototype.map = function(key, map) { + return map(this.getValueList(key)); +}; + +/** + * Gets the list of values for a given key. + * If this object contains no values for that key, then this routine creates + * an empty list, stores it in this object, and returns it. + * + * @private + * @param {string} key + * @return {Array.} the list of values for that key + */ +remoting.StatsAccumulator.prototype.getValueList = function(key) { + var valueList = this.valueLists_[key]; + if (!valueList) { + valueList = []; + this.valueLists_[key] = valueList; + } + return valueList; +}; diff --git a/remoting/webapp/toolbar.css b/remoting/webapp/toolbar.css new file mode 100644 index 0000000..9a56d1e --- /dev/null +++ b/remoting/webapp/toolbar.css @@ -0,0 +1,75 @@ +/* Copyright (c) 2011 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +.toolbar-container { + position: fixed; + top: -45px; + width: 640px; + -webkit-transition: top 0.2s linear; + -webkit-transition-delay: 0.7s; + font-size: 13px; + pointer-events: none; + z-index: 1; +} + +.toolbar-container button { + padding: 3px 9px; +} + +.toolbar-visible { + top: -8px; + -webkit-transition-delay: 0s; +} + +.toolbar-container div { + margin-left: auto; + margin-right: auto; +} + +.toolbar-stub { + position: absolute; + width: 134px; + height: 7px; + left: 253px; + border-bottom-left-radius: 7px; + border-bottom-right-radius: 7px; + background-color: #4695ff; + -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); + pointer-events: all; + clip: rect(0, 999px, 999px, -999px); +} + +.toolbar-border { + border-radius: 7px; + border: 3px solid #4695ff; + width: 620px; + padding: 10px 7px 5px 7px; + background-color: #e9e9e9; + -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); + pointer-events: all; +} + +/* Ensure that the 'connected to' string doesn't make the tool-bar overflow */ +#connected-to { + display: inline-block; + max-width: 280px; + overflow: hidden; + margin-__MSG_@@bidi_end_edge__: 8px; + white-space: nowrap; +} + +.end-align { + float: __MSG_@@bidi_end_edge__; +} + +.arrow-down { + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid white; + left: auto; + right: auto; +} diff --git a/remoting/webapp/toolbar.js b/remoting/webapp/toolbar.js new file mode 100644 index 0000000..85ad48b --- /dev/null +++ b/remoting/webapp/toolbar.js @@ -0,0 +1,139 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Class representing the client tool-bar. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** + * @param {Element} toolbar The HTML element representing the tool-bar. + * @constructor + */ +remoting.Toolbar = function(toolbar) { + /** + * @type {Element} + * @private + */ + this.toolbar_ = toolbar; + /** + * @type {boolean} False if the tool-bar is currently hidden, or should be + * hidden once the over-shoot timer expires; true otherwise. + */ + this.visible = false; + /** + * @type {number?} The id of the current timer, if any. + */ + this.timerId = null; + + /** @type {remoting.Toolbar} */ + var that = this; + + /** + * @param {Event} event The mouseout event, used to determine whether or + * not the mouse is leaving the tool-bar or (due to event-bubbling) + * one of its children. + */ + var onMouseOut = function(event) { + for (var e = event.toElement; e != null; e = e.parentElement) { + if (e == that.toolbar_) { + return; // Still over a child element => ignore. + } + } + that.hide_(); + }; + this.toolbar_.onmouseout = onMouseOut; + + this.toolbar_.onmouseover = function() { + that.showForAtLeast_(1000); + }; + + window.addEventListener('resize', function() { that.center(); }, false); +}; + +/** + * Preview the tool-bar functionality by showing it for 3s if it is not + * already visible. + * @return {void} Nothing. + */ +remoting.Toolbar.prototype.preview = function() { + this.showForAtLeast_(3000); + this.visible = false; +}; + +/** + * Center the tool-bar horizonally. + */ +remoting.Toolbar.prototype.center = function() { + var toolbarX = (window.innerWidth - this.toolbar_.clientWidth) / 2; + this.toolbar_.style['left'] = toolbarX + 'px'; +}; + +/** + * If the tool-bar is not currently visible, show it and start a timer to + * prevent it from being hidden again for a short time. This is to guard + * against users over-shooting the tool-bar stub when trying to access it. + * + * @param {number} timeout The minimum length of time, in ms, for which to + * show the tool-bar. If the hide_() method is called within this time, + * it will not take effect until the timeout expires. + * @return {void} Nothing. + * @private + */ +remoting.Toolbar.prototype.showForAtLeast_ = function(timeout) { + if (this.visible) { + return; + } + addClass(this.toolbar_, remoting.Toolbar.VISIBLE_CLASS_); + this.visible = true; + if (this.timerId) { + window.clearTimeout(this.timerId); + this.timerId = null; + } + /** @type {remoting.Toolbar} */ + var that = this; + var checkVisibility = function() { that.checkVisibility_(); }; + this.timerId = window.setTimeout(checkVisibility, timeout); +}; + +/** + * Hide the tool-bar if it is visible. If there is a visibility timer running, + * the tool-bar will not be hidden until it expires. + * + * @return {void} Nothing. + * @private + */ +remoting.Toolbar.prototype.hide_ = function() { + if (!this.visible) { + return; + } + this.visible = false; + if (!this.timerId) { + this.checkVisibility_(); + } +}; + +/** + * Hide the tool-bar if it is visible and should not be. + * + * @return {void} Nothing. + * @private + */ +remoting.Toolbar.prototype.checkVisibility_ = function() { + this.timerId = null; + if (!this.visible) { + removeClass(this.toolbar_, remoting.Toolbar.VISIBLE_CLASS_); + } +}; + +/** @type {remoting.Toolbar} */ +remoting.toolbar = null; + +/** @private */ +remoting.Toolbar.VISIBLE_CLASS_ = 'toolbar-visible'; diff --git a/remoting/webapp/ui_mode.js b/remoting/webapp/ui_mode.js new file mode 100644 index 0000000..da0253c --- /dev/null +++ b/remoting/webapp/ui_mode.js @@ -0,0 +1,85 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Functions related to controlling the modal ui state of the app. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @enum {string} */ +remoting.AppMode = { + HOME: 'home', + UNAUTHENTICATED: 'auth', + CLIENT: 'client', + CLIENT_UNCONNECTED: 'client.unconnected', + CLIENT_PIN_PROMPT: 'client.pin-prompt', + CLIENT_CONNECTING: 'client.connecting', + CLIENT_CONNECT_FAILED_IT2ME: 'client.connect-failed.it2me', + CLIENT_CONNECT_FAILED_ME2ME: 'client.connect-failed.me2me', + CLIENT_SESSION_FINISHED_IT2ME: 'client.session-finished.it2me', + CLIENT_SESSION_FINISHED_ME2ME: 'client.session-finished.me2me', + HOST: 'host', + HOST_WAITING_FOR_CODE: 'host.waiting-for-code', + HOST_WAITING_FOR_CONNECTION: 'host.waiting-for-connection', + HOST_SHARED: 'host.shared', + HOST_SHARE_FAILED: 'host.share-failed', + HOST_SHARE_FINISHED: 'host.share-finished', + IN_SESSION: 'in-session' +}; + +/** + * @type {remoting.AppMode} The current app mode + */ +remoting.currentMode = remoting.AppMode.HOME; + +/** + * Change the app's modal state to |mode|, which is considered to be a dotted + * hierachy of modes. For example, setMode('host.shared') will show any modal + * elements with an data-ui-mode attribute of 'host' or 'host.shared' and hide + * all others. + * + * @param {remoting.AppMode} mode The new modal state, expressed as a dotted + * hiearchy. + */ +remoting.setMode = function(mode) { + var modes = mode.split('.'); + for (var i = 1; i < modes.length; ++i) + modes[i] = modes[i - 1] + '.' + modes[i]; + var elements = document.querySelectorAll('[data-ui-mode]'); + for (var i = 0; i < elements.length; ++i) { + var element = /** @type {Element} */ elements[i]; + var hidden = true; + for (var m = 0; m < modes.length; ++m) { + if (hasClass(element.getAttribute('data-ui-mode'), modes[m])) { + hidden = false; + break; + } + } + element.hidden = hidden; + } + remoting.debug.log('App mode: ' + mode); + remoting.currentMode = mode; + if (mode == remoting.AppMode.IN_SESSION) { + document.removeEventListener('keydown', remoting.DebugLog.onKeydown, false); + } else { + document.addEventListener('keydown', remoting.DebugLog.onKeydown, false); + } + if (mode == remoting.AppMode.HOME) { + var display = function() { remoting.hostList.display(); }; + remoting.hostList.refresh(display); + } +}; + +/** + * Get the major mode that the app is running in. + * @return {string} The app's current major mode. + */ +remoting.getMajorMode = function() { + return remoting.currentMode.split('.')[0]; +}; diff --git a/remoting/webapp/util.js b/remoting/webapp/util.js new file mode 100644 index 0000000..f6899c3 --- /dev/null +++ b/remoting/webapp/util.js @@ -0,0 +1,53 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Simple utility functions for Chromoting. + */ + +/** + * @param {string} classes A space-separated list of classes. + * @param {string} cls The class to check for. + * @return {boolean} True if |cls| is found within |classes|. + */ +function hasClass(classes, cls) { + return classes.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) != null; +} + +/** + * @param {Element} element The element to which to add the class. + * @param {string} cls The new class. + * @return {void} Nothing. + */ +function addClass(element, cls) { + if (!hasClass(element.className, cls)) { + var padded = element.className == '' ? '' : element.className + ' '; + element.className = padded + cls; + } +} + +/** + * @param {Element} element The element from which to remove the class. + * @param {string} cls The new class. + * @return {void} Nothing. + */ +function removeClass(element, cls) { + element.className = + element.className.replace(new RegExp('\\b' + cls + '\\b', 'g'), '') + .replace(' ', ' '); +} + +/** + * @return {Object.} The URL parameters. + */ +function getUrlParameters() { + var result = {}; + var parts = window.location.search.substring(1).split('&'); + for (var i = 0; i < parts.length; i++) { + var pair = parts[i].split('='); + result[pair[0]] = decodeURIComponent(pair[1]); + } + return result; +} diff --git a/remoting/webapp/viewer_plugin_proto.js b/remoting/webapp/viewer_plugin_proto.js new file mode 100644 index 0000000..18d6461 --- /dev/null +++ b/remoting/webapp/viewer_plugin_proto.js @@ -0,0 +1,68 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains type definitions for the viewer plugin. It is used only +// with JSCompiler to verify the type-correctness of our code. + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @constructor + * @extends HTMLElement + */ +remoting.ViewerPlugin = function() {}; + +/** @param {string} iq The Iq stanza received from the host. */ +remoting.ViewerPlugin.prototype.onIq = function(iq) {}; + +/** @param {boolean} scale True to enable scaling, false to disable. */ +remoting.ViewerPlugin.prototype.setScaleToFit = function(scale) {}; + +/** Release all keys currently pressed by this client. */ +remoting.ViewerPlugin.prototype.releaseAllKeys = function() {}; + +/** + * @param {string} hostJid The host's JID. + * @param {string} hostPublicKey The host's public key. + * @param {string} clientJid The client's JID. + * @param {string} authenticationCode The access code for IT2Me or the + * PIN for Me2Me. + * @return {void} Nothing. +*/ +remoting.ViewerPlugin.prototype.connect = + function(hostJid, hostPublicKey, clientJid, authenticationCode) {}; + +/** @type {function(number, number): void} State change callback function. */ +remoting.ViewerPlugin.prototype.connectionInfoUpdate; + +/** @type {number} */ remoting.ViewerPlugin.prototype.apiMinVersion; +/** @type {number} */ remoting.ViewerPlugin.prototype.apiVersion; + +/** @type {number} */ remoting.ViewerPlugin.prototype.desktopHeight; +/** @type {number} */ remoting.ViewerPlugin.prototype.desktopWidth; + +/** @type {number} */ remoting.ViewerPlugin.prototype.status; +/** @type {number} */ remoting.ViewerPlugin.prototype.error; + +/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_UNKNOWN; +/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_CONNECTING; +/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_INITIALIZING; +/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_CONNECTED; +/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_CLOSED; +/** @type {number} */ remoting.ViewerPlugin.prototype.STATUS_FAILED; + +/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_NONE; +/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_HOST_IS_OFFLINE; +/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_SESSION_REJECTED; +/** @type {number} */ + remoting.ViewerPlugin.prototype.ERROR_INCOMPATIBLE_PROTOCOL; +/** @type {number} */ remoting.ViewerPlugin.prototype.ERROR_NETWORK_FAILURE; + +/** @type {number} */ remoting.ViewerPlugin.prototype.videoBandwidth; +/** @type {number} */ remoting.ViewerPlugin.prototype.videoCaptureLatency; +/** @type {number} */ remoting.ViewerPlugin.prototype.videoDecodeLatency; +/** @type {number} */ remoting.ViewerPlugin.prototype.videoEncodeLatency; +/** @type {number} */ remoting.ViewerPlugin.prototype.videoFrameRate; +/** @type {number} */ remoting.ViewerPlugin.prototype.videoRenderLatency; +/** @type {number} */ remoting.ViewerPlugin.prototype.roundTripLatency; diff --git a/remoting/webapp/wcs.js b/remoting/webapp/wcs.js new file mode 100644 index 0000000..a6e5049 --- /dev/null +++ b/remoting/webapp/wcs.js @@ -0,0 +1,148 @@ +/* Copyright (c) 2012 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** + * @fileoverview + * A class that provides an interface to a WCS connection. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @type {remoting.Wcs} */ +remoting.wcs = null; + +/** + * @constructor + * @param {remoting.WcsIqClient} wcsIqClient The WCS client. + * @param {string} token An OAuth2 access token. + * @param {function(boolean): void} onReady A function called when the WCS + * client has received a full JID. + */ +remoting.Wcs = function(wcsIqClient, token, onReady) { + /** + * The WCS client. + * @type {remoting.WcsIqClient} + * @private + */ + this.wcsIqClient_ = wcsIqClient; + + /** + * The OAuth2 access token. + * @type {string} + * @private + */ + this.token_ = token; + + /** + * The function called when the WCS client has received a full JID. + * @type {function(boolean): void} + * @private + */ + this.onReady_ = onReady; + + /** + * The full JID of the WCS client. + * @type {string} + * @private + */ + this.clientFullJid_ = ''; + + /** @type {remoting.Wcs} */ + var that = this; + /** + * A timer that polls for an updated access token. + * @type {number} + * @private + */ + this.pollForUpdatedToken_ = setInterval( + function() { + /** @param {string} token */ + var updateAccessToken = function(token) { + that.updateAccessToken_(token); + } + remoting.oauth2.callWithToken(updateAccessToken); + }, + 60 * 1000); + + /** + * A function called when an IQ stanza is received. + * @param {string} stanza The IQ stanza. + * @private + */ + this.onIq_ = function(stanza) {}; + + // Handle messages from the WcsIqClient. + /** @param {Array.} msg An array of message strings. */ + var onMessage = function(msg) { that.onMessage_(msg); }; + this.wcsIqClient_.setOnMessage(onMessage); + + // Start the WcsIqClient. + this.wcsIqClient_.connectChannel(); +}; + +/** + * Passes an access token to the WcsIqClient, if the token has been updated. + * + * @param {string} tokenNew A (possibly updated) access token. + * @return {void} Nothing. + * @private + */ +remoting.Wcs.prototype.updateAccessToken_ = function(tokenNew) { + if (tokenNew != this.token_) { + this.token_ = tokenNew; + this.wcsIqClient_.updateAccessToken(this.token_); + } +}; + +/** + * Handles a message coming from the WcsIqClient. + * + * @param {Array.} msg The message. + * @return {void} Nothing. + * @private + */ +remoting.Wcs.prototype.onMessage_ = function(msg) { + if (msg[0] == 'is') { + this.onIq_(msg[1]); + } else if (msg[0] == 'cfj') { + this.clientFullJid_ = msg[1]; + remoting.debug.log('Received JID: ' + this.clientFullJid_); + this.onReady_(true); + this.onReady_ = function(success) {}; + } +}; + +/** + * Gets the full JID of the WCS client. + * + * @return {string} The full JID. + */ +remoting.Wcs.prototype.getJid = function() { + return this.clientFullJid_; +}; + +/** + * Sends an IQ stanza. + * + * @param {string} stanza An IQ stanza. + * @return {void} Nothing. + */ +remoting.Wcs.prototype.sendIq = function(stanza) { + this.wcsIqClient_.sendIq(stanza); +}; + +/** + * Sets the function called when an IQ stanza is received. + * + * @param {function(string): void} onIq The function called when an IQ stanza + * is received. + * @return {void} Nothing. + */ +remoting.Wcs.prototype.setOnIq = function(onIq) { + this.onIq_ = onIq; +}; diff --git a/remoting/webapp/wcs_iq_client_proto.js b/remoting/webapp/wcs_iq_client_proto.js new file mode 100644 index 0000000..3a484260 --- /dev/null +++ b/remoting/webapp/wcs_iq_client_proto.js @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains type definitions for the WCS IQ client. It is used only +// with JSCompiler to verify the type-correctness of our code. + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @constructor + */ +remoting.WcsIqClient = function() {}; + +/** @param {function(Array.): void} onMsg The function called when a + * message is received. + * @return {void} Nothing. */ +remoting.WcsIqClient.prototype.setOnMessage = function(onMsg) {}; + +/** @return {void} Nothing. */ +remoting.WcsIqClient.prototype.connectChannel = function() {}; + +/** @param {string} stanza An IQ stanza. + * @return {void} Nothing. */ +remoting.WcsIqClient.prototype.sendIq = function(stanza) {}; + +/** @param {string} token An OAuth2 access token. + * @return {void} Nothing. */ +remoting.WcsIqClient.prototype.updateAccessToken = function(token) {}; diff --git a/remoting/webapp/wcs_loader.js b/remoting/webapp/wcs_loader.js new file mode 100644 index 0000000..54fd3cc --- /dev/null +++ b/remoting/webapp/wcs_loader.js @@ -0,0 +1,132 @@ +/* Copyright (c) 2012 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** + * @fileoverview + * A class that loads a WCS IQ client and constructs remoting.wcs as a + * wrapper for it. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** @type {remoting.WcsLoader} */ +remoting.wcsLoader = null; + +/** + * @constructor + * @private + */ +remoting.WcsLoader = function() { + /** + * The WCS client that will be downloaded. This variable is initialized (via + * remoting.wcsLoader) by the downloaded Javascript. + * @type {remoting.WcsIqClient} + */ + this.wcsIqClient = null; +}; + +/** + * Load WCS if necessary, then invoke the callback with an access token. + * + * @param {function(string?): void} onReady The callback function, called with + * an OAuth2 access token when WCS has been loaded, or with null on error. + * @return {void} Nothing. + */ +remoting.WcsLoader.load = function(onReady) { + if (!remoting.wcsLoader) { + remoting.wcsLoader = new remoting.WcsLoader(); + } + /** @param {string} token The OAuth2 access token. */ + var start = function(token) { + remoting.wcsLoader.start_(token, onReady); + }; + remoting.oauth2.callWithToken(start); +}; + +/** + * The URL of the GTalk gadget. + * @type {string} + * @private + */ +remoting.WcsLoader.prototype.TALK_GADGET_URL_ = + 'https://talkgadget.google.com/talkgadget/'; + +/** + * The id of the script node. + * @type {string} + * @private + */ +remoting.WcsLoader.prototype.SCRIPT_NODE_ID_ = 'wcs-script-node'; + +/** + * The attribute name indicating that the WCS has finished loading. + * @type {string} + * @private + */ +remoting.WcsLoader.prototype.SCRIPT_NODE_LOADED_FLAG_ = 'wcs-script-loaded'; + +/** + * Starts loading the WCS IQ client. + * + * When it's loaded, construct remoting.wcs as a wrapper for it. + * When the WCS connection is ready, or on error, call |onReady|. + * + * @param {string} token An OAuth2 access token. + * @param {function(string?): void} onReady The callback function, called with + * an OAuth2 access token when WCS has been loaded, or with null on error. + * @return {void} Nothing. + * @private + */ +remoting.WcsLoader.prototype.start_ = function(token, onReady) { + var node = document.getElementById(this.SCRIPT_NODE_ID_); + if (!node) { + // The first time, there will be no script node, so create one. + node = document.createElement('script'); + node.id = this.SCRIPT_NODE_ID_; + node.src = this.TALK_GADGET_URL_ + 'iq?access_token=' + token; + node.type = 'text/javascript'; + document.body.insertBefore(node, document.body.firstChild); + } else if (node.hasAttribute(this.SCRIPT_NODE_LOADED_FLAG_)) { + // Subsequently, explicitly invoke onReady if onload has already fired. + // TODO(jamiewalch): It's possible that the WCS client has not finished + // initializing. Add support for multiple callbacks to the remoting.Wcs + // class to address this. + onReady(token); + return; + } + /** @type {remoting.WcsLoader} */ + var that = this; + var onLoad = function() { + var typedNode = /** @type {Element} */ (node); + typedNode.setAttribute(that.SCRIPT_NODE_LOADED_FLAG_, true); + that.constructWcs_(token, onReady); + }; + var onError = function() { + var typedNode = /** @type {Element} */ (node); + typedNode.parentNode.removeChild(node); + onReady(null); + }; + node.addEventListener('load', onLoad, false); + node.addEventListener('error', onError, false); +}; + +/** + * Constructs the remoting.wcs object. + * + * @param {string} token An OAuth2 access token. + * @param {function(string?): void} onReady The callback function, called with + * an OAuth2 access token when WCS has been loaded, or with null on error. + * @return {void} Nothing. + * @private + */ +remoting.WcsLoader.prototype.constructWcs_ = function(token, onReady) { + remoting.wcs = new remoting.Wcs( + remoting.wcsLoader.wcsIqClient, + token, + function() { onReady(token); }); +}; diff --git a/remoting/webapp/xhr.js b/remoting/webapp/xhr.js new file mode 100644 index 0000000..2a48077 --- /dev/null +++ b/remoting/webapp/xhr.js @@ -0,0 +1,187 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Simple utilities for making XHRs more pleasant. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** Namespace for XHR functions */ +/** @type {Object} */ +remoting.xhr = remoting.xhr || {}; + +/** + * Takes an associative array of parameters and urlencodes it. + * + * @param {Object.} paramHash The parameter key/value pairs. + * @return {string} URLEncoded version of paramHash. + */ +remoting.xhr.urlencodeParamHash = function(paramHash) { + var paramArray = []; + for (var key in paramHash) { + paramArray.push(encodeURIComponent(key) + + '=' + encodeURIComponent(paramHash[key])); + } + if (paramArray.length > 0) { + return paramArray.join('&'); + } + return ''; +}; + +/** + * Execute an XHR GET asynchronously. + * + * @param {string} url The base URL to GET, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, do + * not include the ? and be sure it is correctly URLEncoded. + * @param {Object.=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.get = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('GET', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an XHR POST asynchronously. + * + * @param {string} url The base URL to POST, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.post = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('POST', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an XHR DELETE asynchronously. + * + * @param {string} url The base URL to DELETE, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.remove = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('DELETE', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an XHR PUT asynchronously. + * + * @param {string} url The base URL to PUT, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.put = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('PUT', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an arbitrary HTTP method asynchronously. + * + * @param {string} methodName The HTTP method name, e.g. "GET", "POST" etc. + * @param {string} url The base URL, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The XMLHttpRequest object. + */ +remoting.xhr.doMethod = function(methodName, url, onDone, + opt_parameters, opt_headers, + opt_withCredentials) { + /** @type {XMLHttpRequest} */ + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState != 4) { + return; + } + onDone(xhr); + }; + + var parameterString = ''; + if (typeof(opt_parameters) === 'string') { + parameterString = opt_parameters; + } else if (typeof(opt_parameters) === 'object') { + parameterString = remoting.xhr.urlencodeParamHash(opt_parameters); + } else if (opt_parameters === undefined) { + // No problem here. Do nothing. + } else { + throw 'opt_parameters must be string or associated array.'; + } + + var useBody = (methodName == 'POST') || (methodName == 'PUT'); + + if (!useBody && parameterString != '') { + url = url + '?' + parameterString; + } + + xhr.open(methodName, url, true); + if (methodName == 'POST') { + xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + } + // Add in request headers. + if (typeof(opt_headers) === 'object') { + for (var key in opt_headers) { + xhr.setRequestHeader(key, opt_headers[key]); + } + } else if (opt_headers === undefined) { + // No problem here. Do nothing. + } else { + throw 'opt_headers must be associative array.'; + } + + if (opt_withCredentials) { + xhr.withCredentials = true; + } + + xhr.send(useBody ? parameterString : null); + return xhr; +}; -- cgit v1.1