diff --git a/kumascript/macros/AddonSidebar.ejs b/kumascript/macros/AddonSidebar.ejs
index ed7a5f319fc3..934f40161cde 100644
--- a/kumascript/macros/AddonSidebar.ejs
+++ b/kumascript/macros/AddonSidebar.ejs
@@ -28,12 +28,12 @@ var text = mdn.localStringMap({
'WebExtensions/Match_patterns': 'Match patterns',
'WebExtensions/Working_with_files': 'Working with files',
'WebExtensions/Internationalization': 'Internationalization',
- 'WebExtensions/Security_best_practices': 'Security best practices',
'WebExtensions/Content_Security_Policy': 'Content Security Policy',
+ 'WebExtensions/Differences_between_API_implementations': 'Differences between API implementations',
+ 'WebExtensions/Chrome_incompatibilities': 'Chrome incompatibilities',
'WebExtensions/Native_messaging': 'Native messaging',
'WebExtensions#User_Interface': 'User interface',
'WebExtensions/user_interface': 'User Interface',
- 'WebExtensions/user_interface/Accessibility_guidelines': 'Accessibility guidelines',
'WebExtensions/user_interface/Browser_action': 'Toolbar button',
'WebExtensions/user_interface/Page_actions': 'Address bar button',
'WebExtensions/user_interface/Sidebars': 'Sidebars',
@@ -47,6 +47,7 @@ var text = mdn.localStringMap({
'WebExtensions/Intercept_HTTP_requests': 'Intercept HTTP requests',
'WebExtensions/Modify_a_web_page': 'Modify a web page',
'WebExtensions/Safely_inserting_external_content_into_a_page': 'Insert external content',
+ 'WebExtensions/Sharing_objects_with_page_scripts': 'Share objects with page scripts',
'WebExtensions/Add_a_button_to_the_toolbar': 'Add a button to the toolbar',
'WebExtensions/Implement_a_settings_page': 'Implement a settings page',
'WebExtensions/Working_with_the_Tabs_API': 'Work with the Tabs API',
@@ -54,16 +55,7 @@ var text = mdn.localStringMap({
'WebExtensions/Work_with_the_Cookies_API': 'Work with the Cookies API',
'WebExtensions/Work_with_contextual_identities': 'Work with contextual identities',
'WebExtensions/Build_a_cross_browser_extension': 'Build a cross-browser extension',
- 'WebExtensions/onboarding_upboarding_offboarding_best_practices': 'Onboard, upboard, and offboard users',
- 'WebExtensions#Porting': 'Porting',
'WebExtensions/Firefox_differentiators': 'Firefox differentiators',
- 'WebExtensions/Porting_a_Google_Chrome_extension': 'Porting a Google Chrome extension',
- 'WebExtensions/Porting_a_legacy_Firefox_add-on': 'Porting a legacy Firefox extension',
- 'WebExtensions/Comparison_with_the_Add-on_SDK': 'Comparison with the Add-on SDK',
- 'WebExtensions/Comparison_with_XUL_XPCOM_extensions': 'Comparison with XUL/XPCOM extensions',
- 'WebExtensions/Differences_between_API_implementations': 'Differences between API implementations',
- 'WebExtensions/Chrome_incompatibilities': 'Chrome incompatibilities',
- 'WebExtensions/Differences_between_desktop_and_Android': 'Differences between desktop and Android',
'WebExtensions#Firefox_workflow': 'Firefox workflow',
'WebExtensions/Development_Tools': 'Developer tools',
'WebExtensions/Choose_a_Firefox_version_for_web_extension_develop': 'Choose a Firefox version',
@@ -81,35 +73,16 @@ var text = mdn.localStringMap({
'WebExtensions/Best_practices_for_updating_your_extension': 'Best practices for updating your extension',
'WebExtensions/API': 'JavaScript APIs',
'WebExtensions/manifest.json': 'Manifest keys',
- 'WebExtensions/Distribution_options': 'Distribution Options',
- 'Themes': 'Themes',
- 'Themes/Theme_concepts': 'Browser themes',
- 'Themes/Theme_concepts_': 'Browser theme concepts',
- 'Themes/Using_the_AMO_theme_generator': 'Using the AMO theme generator',
- 'Distribution': 'Publishing and Distribution',
- 'Distribution/Publishing': 'Publishing add-ons',
- 'WebExtensions/Developer_accounts': 'Developer accounts',
- 'Distribution/Signing': 'Signing and distribution overview',
- 'WebExtensions/Package_your_extension_': 'Package your extension',
- 'Distribution/Submitting_an_add-on': 'Submit an add-on',
- 'Source_Code_Submission': 'Source code submission',
- 'Distribution/Resources_for_publishers': 'Resources for publishers',
- 'Listing': 'Creating an appealing listing',
- 'Distribution/Make_money_from_browser_extensions': 'Make money from browser extensions',
- 'Distribution/Promoting_your_extension_or_theme': 'Promoting your extension or theme',
- 'AMO/Policy/Reviews': 'Add-on policies',
- 'AMO/Policy/Agreement': 'Developer agreement',
- 'AMO/Policy/Featured': 'Featured add-ons',
- 'Distribution/Retiring_your_extension': 'Retiring your extension',
- 'WebExtensions/Alternative_distribution_options': 'Distributing add-ons',
- 'WebExtensions/Alternative_distribution_options/Sideloading_add-ons': 'For sideloading',
- 'WebExtensions/Alternative_distribution_options/Add-ons_for_desktop_apps': 'For desktop apps',
- 'WebExtensions/Alternative_distribution_options/Add-ons_in_the_enterprise': 'For an enterprise',
- 'Community_and_Support': 'Community and Support',
+ 'extension_workshop': 'Extension Workshop',
+ 'extension_workshop_develop': 'Develop',
+ 'extension_workshop_publish': 'Publish',
+ 'extension_workshop_manage': 'Manage',
+ 'extension_workshop_enterprise': 'Enterprise',
'Channels': 'Channels',
'Blog': 'Add-ons blog',
- 'Forums': 'Add-on forums',
- '#Contact_us': 'Contact us'
+ 'Forums': 'Add-ons forum',
+ 'Chat': 'Add-ons chat',
+ 'Contact_us': 'Contact us'
},
'fr': {
'WebExtensions': 'WebExtensions',
@@ -126,12 +99,12 @@ var text = mdn.localStringMap({
'WebExtensions/Match_patterns': 'Motifs de correspondance (Match patterns)',
'WebExtensions/Working_with_files': 'Travailler avec les fichiers',
'WebExtensions/Internationalization': 'Internationalisation',
- 'WebExtensions/Security_best_practices': 'Sécurité : bonnes pratiques',
'WebExtensions/Content_Security_Policy': 'Politique de sécurité du contenu',
'WebExtensions/Native_messaging': 'Message natifs',
+ 'WebExtensions/Chrome_incompatibilities': 'Incompatibilités avec Chrome',
+ 'WebExtensions/Differences_between_desktop_and_Android': 'Différence entre le bureau et Android',
'WebExtensions#User_Interface': 'Interface Utilisateur',
'WebExtensions/user_interface': 'Introduction',
- 'WebExtensions/user_interface/Accessibility_guidelines': 'Accessibility guidelines',
'WebExtensions/user_interface/Browser_action': 'Bouton de la barre d\'outils',
'WebExtensions/user_interface/Page_actions': 'Bouton de la barre d\'adresse',
'WebExtensions/user_interface/Sidebars': 'Barres latérales',
@@ -145,21 +118,15 @@ var text = mdn.localStringMap({
'WebExtensions/Intercept_HTTP_requests': 'Intercepter les requêtes HTTP',
'WebExtensions/Modify_a_web_page': 'Modifier une page web',
'WebExtensions/Safely_inserting_external_content_into_a_page': 'Insérer un contenu externe',
+ 'WebExtensions/Sharing_objects_with_page_scripts': 'Share objects with page scripts',
'WebExtensions/Add_a_button_to_the_toolbar': 'Ajouter un bouton à la barre d\'outils',
'WebExtensions/Implement_a_settings_page': 'Mettre en place une page de paramètres',
'WebExtensions/Working_with_the_Tabs_API': 'Travailler avec l\'API Tabs',
'WebExtensions/Work_with_the_Bookmarks_API': 'Travailler avec l\'API Bookmarks',
'WebExtensions/Work_with_the_Cookies_API': 'Travailler avec l\'API Cookies',
'WebExtensions/Work_with_contextual_identities': 'Travailler avec des identités contextuelles',
- 'WebExtensions/onboarding_upboarding_offboarding_best_practices': 'Onboard, upboard, and offboard users',
'WebExtensions/Build_a_cross_browser_extension': 'Build a cross-browser extension',
- 'WebExtensions#Porting': 'Portage',
- 'WebExtensions/Porting_a_Google_Chrome_extension': 'Porter une extension Google Chrome',
- 'WebExtensions/Porting_a_legacy_Firefox_add-on': 'Porter une ancienne extension Firefox',
- 'WebExtensions/Comparison_with_the_Add-on_SDK': 'Comparaison avec le SDK Add-on',
- 'WebExtensions/Comparison_with_XUL_XPCOM_extensions': 'Comparaison avec les extensions XUL/XPCOM',
- 'WebExtensions/Chrome_incompatibilities': 'Incompatibilités avec Chrome',
- 'WebExtensions/Differences_between_desktop_and_Android': 'Différence entre le bureau et Android',
+ 'WebExtensions/Firefox_differentiators': 'Firefox differentiators',
'WebExtensions#Firefox_workflow': 'Déroulement avec Firefox',
'WebExtensions/Choose_a_Firefox_version_for_web_extension_develop': 'Choose a Firefox version',
'WebExtensions/User_experience_best_practices': 'Expérience utilisateur : bonnes pratiques',
@@ -176,33 +143,16 @@ var text = mdn.localStringMap({
'WebExtensions/Best_practices_for_updating_your_extension': 'Bonnes pratiques pour la mise à jour de votre extension',
'WebExtensions/API': 'Les API JavaScript',
'WebExtensions/manifest.json': 'Clés de manifeste',
- 'WebExtensions/Distribution_options': 'Distribution Options',
- 'Themes': 'Thèmes',
- 'Themes/Theme_concepts': 'Thème de navigateur',
- 'Themes/Theme_concepts_': 'Concepts des thèmes',
- 'Themes/Using_the_AMO_theme_generator': 'Using the AMO theme generator',
- 'Distribution': 'Publication et distribution',
- 'Distribution/Publishing': 'Publication de votre extension',
- 'WebExtensions/Developer_accounts': 'Developer accounts',
- 'Distribution/Signing': 'Signature et distribution de votre extension',
- 'WebExtensions/Package_your_extension_': 'Zipper votre extension',
- 'Distribution/Submitting_an_add-on': 'Soumettre une extension',
- 'Source_Code_Submission': 'Soumission du code source',
- 'Distribution/Resources_for_publishers': 'Ressources pour les développeurs',
- 'Listing': 'Créer une page attrayante pour votre extension',
- 'AMO/Policy/Reviews': 'Processus de revue',
- 'AMO/Policy/Agreement': 'Accord développeur',
- 'AMO/Policy/Featured': 'Extensions mises en avant',
- 'Distribution/Retiring_your_extension': 'Retrait de votre extension',
- 'WebExtensions/Alternative_distribution_options': 'Distribuer votre module',
- 'WebExtensions/Alternative_distribution_options/Sideloading_add-ons': 'Pour une installation manuelle',
- 'WebExtensions/Alternative_distribution_options/Add-ons_for_desktop_apps': 'En tant qu\'application de bureau',
- 'WebExtensions/Alternative_distribution_options/Add-ons_in_the_enterprise': 'Dans un contexte d\'entreprise',
- 'Community_and_Support': 'Communauté et Support',
+ 'extension_workshop': 'Extension Workshop',
+ 'extension_workshop_develop': 'Develop',
+ 'extension_workshop_publish': 'Publish',
+ 'extension_workshop_manage': 'Manage',
+ 'extension_workshop_enterprise': 'Enterprise',
'Channels': 'Canaux de discussions',
'Blog': 'Blog extensions',
'Forums': 'Forum extensions',
- '#Contact_us': 'Nous contacter'
+ 'Chat': 'Add-ons chat',
+ 'Contact_us': 'Nous contacter'
},
'ja': {
'WebExtensions': 'ブラウザー拡張機能',
@@ -219,12 +169,12 @@ var text = mdn.localStringMap({
'WebExtensions/Match_patterns': 'マッチパターン',
'WebExtensions/Working_with_files': 'ファイルの操作',
'WebExtensions/Internationalization': '多言語対応',
- 'WebExtensions/Security_best_practices': 'セキュリティのベストプラクティス',
'WebExtensions/Content_Security_Policy': 'Content Security Policy',
'WebExtensions/Native_messaging': 'Native messaging',
+ 'WebExtensions/Chrome_incompatibilities': 'Chrome との非互換性',
+ 'WebExtensions/Differences_between_desktop_and_Android': 'デスクトップと Android の差',
'WebExtensions#User_Interface': 'ユーザーインターフェイス',
'WebExtensions/user_interface': 'ユーザーインターフェイス',
- 'WebExtensions/user_interface/Accessibility_guidelines': 'Accessibility guidelines',
'WebExtensions/user_interface/Browser_action': 'ブラウザーツールバーボタン',
'WebExtensions/user_interface/Page_actions': 'アドレスバーボタン',
'WebExtensions/user_interface/Sidebars': 'サイドバー',
@@ -238,6 +188,7 @@ var text = mdn.localStringMap({
'WebExtensions/Intercept_HTTP_requests': 'HTTP リクエストへの介入',
'WebExtensions/Modify_a_web_page': 'web ページの変更',
'WebExtensions/Safely_inserting_external_content_into_a_page': '外部コンテンツの挿入',
+ 'WebExtensions/Sharing_objects_with_page_scripts': 'Share objects with page scripts',
'WebExtensions/Add_a_button_to_the_toolbar': 'ツールバーボタンの追加',
'WebExtensions/Implement_a_settings_page': '設定画面の実装',
'WebExtensions/Working_with_the_Tabs_API': 'Tabs API 群の使い方',
@@ -245,14 +196,7 @@ var text = mdn.localStringMap({
'WebExtensions/Work_with_the_Cookies_API': 'Cookie API 群の使い方',
'WebExtensions/Work_with_contextual_identities': 'contextual identities の使い方',
'WebExtensions/Build_a_cross_browser_extension': 'Build a cross-browser extension',
- 'WebExtensions/onboarding_upboarding_offboarding_best_practices': 'Onboard, upboard, and offboard users',
- 'WebExtensions#Porting': '移行',
- 'WebExtensions/Porting_a_Google_Chrome_extension': 'Google Chrome extension からの移行',
- 'WebExtensions/Porting_a_legacy_Firefox_add-on': '古い Firefox アドオンの移行',
- 'WebExtensions/Comparison_with_the_Add-on_SDK': 'Add-on SDK との比較',
- 'WebExtensions/Comparison_with_XUL_XPCOM_extensions': 'XUL/XPCOM 拡張との比較',
- 'WebExtensions/Chrome_incompatibilities': 'Chrome との非互換性',
- 'WebExtensions/Differences_between_desktop_and_Android': 'デスクトップと Android の差',
+ 'WebExtensions/Firefox_differentiators': 'Firefox differentiators',
'WebExtensions#Firefox_workflow': 'Firefox でのワークフロー',
'WebExtensions/Choose_a_Firefox_version_for_web_extension_develop': 'Choose a Firefox version',
'WebExtensions/User_experience_best_practices': 'ユーザー体験の成功事例',
@@ -269,33 +213,16 @@ var text = mdn.localStringMap({
'WebExtensions/Best_practices_for_updating_your_extension': 'Best practices for updating your extension',
'WebExtensions/API': 'JavaScript API 群',
'WebExtensions/manifest.json': 'Manifest keys',
- 'WebExtensions/Distribution_options': 'Distribution Options',
- 'Themes': 'テーマ',
- 'Themes/Theme_concepts': 'ブラウザのテーマ',
- 'Themes/Theme_concepts_': 'ブラウザのテーマのコンセプト',
- 'Themes/Using_the_AMO_theme_generator': 'Using the AMO theme generator',
- 'Distribution': '公開して配布する',
- 'Distribution/Publishing': 'アドオンを公開する',
- 'WebExtensions/Developer_accounts': 'Developer accounts',
- 'Distribution/Signing': '署名して配布する',
- 'WebExtensions/Package_your_extension_': '拡張機能をパッケージ化する',
- 'Distribution/Submitting_an_add-on': 'アドオンを投稿する',
- 'Source_Code_Submission': 'ソースコードの提出',
- 'Distribution/Resources_for_publishers': '公開した人のためのドキュメント',
- 'Listing': '魅力的に作るためのリスト',
- 'AMO/Policy/Reviews': 'レビューポリシー',
- 'AMO/Policy/Agreement': '開発者同意事項',
- 'AMO/Policy/Featured': 'AMO でおすすめされるアドオン',
- 'Distribution/Retiring_your_extension': '拡張機能のクロージング',
- 'WebExtensions/Alternative_distribution_options': 'アドオンの配布',
- 'WebExtensions/Alternative_distribution_options/Sideloading_add-ons': 'サイドローディング',
- 'WebExtensions/Alternative_distribution_options/Add-ons_for_desktop_apps': 'デスクトップアプリ',
- 'WebExtensions/Alternative_distribution_options/Add-ons_in_the_enterprise': 'エンタープライズ',
- 'Community_and_Support': 'コミュニティとサポート',
+ 'extension_workshop': 'Extension Workshop',
+ 'extension_workshop_develop': 'Develop',
+ 'extension_workshop_publish': 'Publish',
+ 'extension_workshop_manage': 'Manage',
+ 'extension_workshop_enterprise': 'Enterprise',
'Channels': 'チャンネル',
'Blog': 'ブログ',
'Forums': 'フォーラム',
- '#Contact_us': 'コンタクト'
+ 'Chat': 'Add-ons chat',
+ 'Contact_us': 'コンタクト'
},
'ko': {
'WebExtensions': '브라우저 확장 기능',
@@ -312,12 +239,12 @@ var text = mdn.localStringMap({
'WebExtensions/Match_patterns': '일치 패턴',
'WebExtensions/Working_with_files': '파일 작업',
'WebExtensions/Internationalization': '국제화',
- 'WebExtensions/Security_best_practices': '보안 모범 사례',
'WebExtensions/Content_Security_Policy': '컨텐츠 보안 정책',
'WebExtensions/Native_messaging': '네이티브 메시징',
+ 'WebExtensions/Differences_between_API_implementations': 'API 구현간의 차이점',
+ 'WebExtensions/Chrome_incompatibilities': 'Chrome 비호환성',
'WebExtensions#User_Interface': '사용자 인터페이스',
'WebExtensions/user_interface': '사용자 인터페이스',
- 'WebExtensions/user_interface/Accessibility_guidelines': 'Accessibility guidelines',
'WebExtensions/user_interface/Browser_action': '도구 모음 버튼',
'WebExtensions/user_interface/Page_actions': '주소 표시줄 버튼',
'WebExtensions/user_interface/Sidebars': '사이드바',
@@ -331,6 +258,7 @@ var text = mdn.localStringMap({
'WebExtensions/Intercept_HTTP_requests': 'HTTP 요청 가로채기',
'WebExtensions/Modify_a_web_page': '웹 페이지 수정하기',
'WebExtensions/Safely_inserting_external_content_into_a_page': '외부 컨텐츠 삽입하기',
+ 'WebExtensions/Sharing_objects_with_page_scripts': 'Share objects with page scripts',
'WebExtensions/Add_a_button_to_the_toolbar': '도구 모음에 버튼 추가하기',
'WebExtensions/Implement_a_settings_page': '설정 페이지 구현하기',
'WebExtensions/Working_with_the_Tabs_API': 'Tabs API 사용하기',
@@ -338,61 +266,19 @@ var text = mdn.localStringMap({
'WebExtensions/Work_with_the_Cookies_API': 'Cookies API 사용하기',
'WebExtensions/Work_with_contextual_identities': 'contextual identities 사용하기',
'WebExtensions/Build_a_cross_browser_extension': 'Build a cross-browser extension',
- 'WebExtensions/onboarding_upboarding_offboarding_best_practices': '사용자의 온보드, 업보드 및 오프보드',
- 'WebExtensions#Porting': '포팅',
'WebExtensions/Firefox_differentiators': 'Firefox의 차별화',
- 'WebExtensions/Porting_a_Google_Chrome_extension': 'Google Chrome 확장 기능 포팅',
- 'WebExtensions/Porting_a_legacy_Firefox_add-on': '레거시 Firefox 확장 기능 포팅',
- 'WebExtensions/Comparison_with_the_Add-on_SDK': 'Add-on SDK와 비교',
- 'WebExtensions/Comparison_with_XUL_XPCOM_extensions': 'XUL/XPCOM 확장 기능과 비교',
- 'WebExtensions/Differences_between_API_implementations': 'API 구현간의 차이점',
- 'WebExtensions/Chrome_incompatibilities': 'Chrome 비호환성',
- 'WebExtensions/Differences_between_desktop_and_Android': '데스크톱과 Android간의 차이점',
- 'WebExtensions#Firefox_workflow': 'Firefox 작업 흐름',
- 'WebExtensions/Choose_a_Firefox_version_for_web_extension_develop': 'Choose a Firefox version',
- 'WebExtensions/Development_Tools': '개발자 도구',
- 'WebExtensions/User_experience_best_practices': '사용자 경험',
- 'WebExtensions/Prompt_users_for_data_and_privacy_consents': 'Prompt users for data and privacy consents',
- 'WebExtensions/Temporary_Installation_in_Firefox': 'Firefox에서의 일시적인 설치',
- 'WebExtensions/Debugging': '디버깅',
- 'WebExtensions/Testing_persistent_and_restart_features': '지속성과 기능 재시작 테스팅하기',
- 'WebExtensions/Test_permission_requests': 'Test permission requests',
- 'WebExtensions/Developing_WebExtensions_for_Firefox_for_Android': 'Android용 Firefox 개발하기',
- 'WebExtensions/Getting_started_with_web-ext': 'web-ext 시작하기',
- 'WebExtensions/web-ext_command_reference': 'web-ext 명령어 레퍼런스',
- 'WebExtensions/WebExtensions_and_the_Add-on_ID': '확장 기능과 부가 기능 ID',
- 'WebExtensions/Request_the_right_permissions': '올바른 권한 요청하기',
- 'WebExtensions/Best_practices_for_updating_your_extension': 'Best practices for updating your extension',
'WebExtensions/API': 'JavaScript APIs',
'WebExtensions/manifest.json': 'Manifest 키',
- 'Themes': '테마',
- 'Themes/Theme_concepts': '브라우저 테마',
- 'Themes/Theme_concepts_': '브라우저 테마 개념',
- 'Themes/Using_the_AMO_theme_generator': 'AMD 테마 생성기 사용하기',
- 'Distribution': '출판 및 배포하기',
- 'Distribution/Publishing': '부가 기능 출판하기',
- 'WebExtensions/Developer_accounts': 'Developer accounts',
- 'Distribution/Signing': '서명 및 출판 개요',
- 'WebExtensions/Package_your_extension_': '확장 기능 패키징',
- 'Distribution/Submitting_an_add-on': '부가 기능 제출',
- 'Source_Code_Submission': '소스 코드 제출',
- 'Distribution/Resources_for_publishers': '출판자를 위한 리소스',
- 'Listing': '매력적인 목록 생성하기',
- 'Distribution/Make_money_from_browser_extensions': '브라우저 확장 기능으로 수익 내기',
- 'Distribution/Promoting_your_extension_or_theme': '확장 기능 또는 테마 홍보하기',
- 'AMO/Policy/Reviews': '정책 리뷰',
- 'AMO/Policy/Agreement': '개발자 협약',
- 'AMO/Policy/Featured': '주요 부가 기능',
- 'Distribution/Retiring_your_extension': '확장 기능 종료하기',
- 'WebExtensions/Alternative_distribution_options': '부가 기능 배포하기',
- 'WebExtensions/Alternative_distribution_options/Sideloading_add-ons': '개별 전송용',
- 'WebExtensions/Alternative_distribution_options/Add-ons_for_desktop_apps': '데스크탑 앱',
- 'WebExtensions/Alternative_distribution_options/Add-ons_in_the_enterprise': '기업용',
- 'Community_and_Support': '커뮤니티와 지원',
+ 'extension_workshop': 'Extension Workshop',
+ 'extension_workshop_develop': 'Develop',
+ 'extension_workshop_publish': 'Publish',
+ 'extension_workshop_manage': 'Manage',
+ 'extension_workshop_enterprise': 'Enterprise',
'Channels': '채널',
'Blog': '부가 기능 블로그',
'Forums': '부가 기능 포럼',
- '#Contact_us': '연락하기'
+ 'Chat': 'Add-ons chat',
+ 'Contact_us': '연락하기'
},
'zh-CN': {
'WebExtensions': '浏览器扩展程序',
@@ -409,12 +295,12 @@ var text = mdn.localStringMap({
'WebExtensions/Match_patterns': '匹配样式',
'WebExtensions/Working_with_files': '处理文件',
'WebExtensions/Internationalization': '国际化',
- 'WebExtensions/Security_best_practices': '安全最佳实践',
'WebExtensions/Content_Security_Policy': '内容安全举措',
'WebExtensions/Native_messaging': '本地消息',
+ 'WebExtensions/Differences_between_API_implementations': 'API实现之间的差异',
+ 'WebExtensions/Chrome_incompatibilities': 'Chrome不兼容',
'WebExtensions#User_Interface': '用户界面',
'WebExtensions/user_interface': '用户界面',
- 'WebExtensions/user_interface/Accessibility_guidelines': '无障碍指南',
'WebExtensions/user_interface/Browser_action': '工具栏按钮',
'WebExtensions/user_interface/Page_actions': '地址栏按钮',
'WebExtensions/user_interface/Sidebars': '侧边栏',
@@ -428,6 +314,7 @@ var text = mdn.localStringMap({
'WebExtensions/Intercept_HTTP_requests': '拦截HTTP 请求',
'WebExtensions/Modify_a_web_page': '修改网页',
'WebExtensions/Safely_inserting_external_content_into_a_page': '插入外部内容',
+ 'WebExtensions/Sharing_objects_with_page_scripts': 'Share objects with page scripts',
'WebExtensions/Add_a_button_to_the_toolbar': '向工具栏添加按钮',
'WebExtensions/Implement_a_settings_page': '应用设置页面',
'WebExtensions/Working_with_the_Tabs_API': '使用Tabs API',
@@ -435,62 +322,20 @@ var text = mdn.localStringMap({
'WebExtensions/Work_with_the_Cookies_API': '使用Cookies API',
'WebExtensions/Work_with_contextual_identities': '使用上下文身份',
'WebExtensions/Build_a_cross_browser_extension': '构建跨浏览器扩展',
- 'WebExtensions/onboarding_upboarding_offboarding_best_practices': 'Onboard, upboard, and offboard users',
'WebExtensions#Porting': '移植',
'WebExtensions/Firefox_differentiators': 'Firefox的优势',
- 'WebExtensions/Porting_a_Google_Chrome_extension': '移植Google Chrome扩展程序',
- 'WebExtensions/Porting_a_legacy_Firefox_add-on': '移植旧版Firefox扩展',
- 'WebExtensions/Comparison_with_the_Add-on_SDK': '与附加SDK的比较',
- 'WebExtensions/Comparison_with_XUL_XPCOM_extensions': '与XUL / XPCOM扩展的比较',
- 'WebExtensions/Differences_between_API_implementations': 'API实现之间的差异',
- 'WebExtensions/Chrome_incompatibilities': 'Chrome不兼容',
- 'WebExtensions/Differences_between_desktop_and_Android': '桌面版和Android之间的区别',
- 'WebExtensions#Firefox_workflow': 'Firefox工作流程',
- 'WebExtensions/Development_Tools': '开发者工具',
- 'WebExtensions/Choose_a_Firefox_version_for_web_extension_develop': '选择Firefox版本',
- 'WebExtensions/User_experience_best_practices': '用户体验',
- 'WebExtensions/Prompt_users_for_data_and_privacy_consents': '提示用户输入数据和隐私权',
- 'WebExtensions/Temporary_Installation_in_Firefox': 'Firefox中临时安装',
- 'WebExtensions/Debugging': '调试',
- 'WebExtensions/Testing_persistent_and_restart_features': '测试持久性和重新启动功能',
- 'WebExtensions/Test_permission_requests': '测试许可请求',
- 'WebExtensions/Developing_WebExtensions_for_Firefox_for_Android': '为Android的Firefox开发',
- 'WebExtensions/Getting_started_with_web-ext': 'Web-ext入门',
- 'WebExtensions/web-ext_command_reference': 'web-ext命令参考',
- 'WebExtensions/WebExtensions_and_the_Add-on_ID': '扩展和附加ID',
- 'WebExtensions/Request_the_right_permissions': '请求正确的权限',
- 'WebExtensions/Best_practices_for_updating_your_extension': '更新扩展程序的最佳做法',
'WebExtensions/API': 'JavaScript APIs',
'WebExtensions/manifest.json': 'Manifest keys',
- 'WebExtensions/Distribution_options': '发行选项',
- 'Themes': '主题',
- 'Themes/Theme_concepts': '浏览器主题',
- 'Themes/Theme_concepts_': '浏览器主题的概念',
- 'Themes/Using_the_AMO_theme_generator': '使用AMO主题生成器',
- 'Distribution': '发布和分发',
- 'Distribution/Publishing': '发布附加组件',
- 'WebExtensions/Developer_accounts': '开发者帐户',
- 'Distribution/Signing': '签名和分发概述',
- 'WebExtensions/Package_your_extension_': '打包您的扩展',
- 'Distribution/Submitting_an_add-on': '提交附加组件',
- 'Source_Code_Submission': '提交源代码',
- 'Distribution/Resources_for_publishers': '为发布者准备的资源',
- 'Listing': '创建一个有吸引力的清单',
- 'Distribution/Make_money_from_browser_extensions': '通过浏览器扩展盈利',
- 'Distribution/Promoting_your_extension_or_theme': '宣传您的扩展程序或主题',
- 'AMO/Policy/Reviews': '附加政策',
- 'AMO/Policy/Agreement': '开发者协议',
- 'AMO/Policy/Featured': '精选插件',
- 'Distribution/Retiring_your_extension': '下架您的扩展程序',
- 'WebExtensions/Alternative_distribution_options': '分发附加组件',
- 'WebExtensions/Alternative_distribution_options/Sideloading_add-ons': '用于旁加载',
- 'WebExtensions/Alternative_distribution_options/Add-ons_for_desktop_apps': '用于桌面应用',
- 'WebExtensions/Alternative_distribution_options/Add-ons_in_the_enterprise': '用于企业',
- 'Community_and_Support': '社区与支持',
+ 'extension_workshop': 'Extension Workshop',
+ 'extension_workshop_develop': 'Develop',
+ 'extension_workshop_publish': 'Publish',
+ 'extension_workshop_manage': 'Manage',
+ 'extension_workshop_enterprise': 'Enterprise',
'Channels': '渠道',
'Blog': 'Add-ons博客',
- 'Forums': 'Add-on论坛',
- '#Contact_us': '联系我们'
+ 'Forums': 'Add-ons论坛',
+ 'Chat': 'Add-ons chat',
+ 'Contact_us': '联系我们'
}
});
@@ -521,9 +366,10 @@ var text = mdn.localStringMap({
<%=text['WebExtensions/Match_patterns']%>
<%=text['WebExtensions/Working_with_files']%>
<%=text['WebExtensions/Internationalization']%>
- <%=text['WebExtensions/Security_best_practices']%>
<%=text['WebExtensions/Content_Security_Policy']%>
<%=text['WebExtensions/Native_messaging']%>
+ <%=text['WebExtensions/Differences_between_API_implementations']%>
+ <%=text['WebExtensions/Chrome_incompatibilities']%>
@@ -532,7 +378,6 @@ var text = mdn.localStringMap({
<%=text['WebExtensions#User_Interface']%>
- <%=text['WebExtensions/user_interface']%>
- - <%=text['WebExtensions/user_interface/Accessibility_guidelines']%>
- <%=text['WebExtensions/user_interface/Browser_action']%>
- <%=text['WebExtensions/user_interface/Page_actions']%>
- <%=text['WebExtensions/user_interface/Sidebars']%>
@@ -552,6 +397,7 @@ var text = mdn.localStringMap({
- <%=text['WebExtensions/Intercept_HTTP_requests']%>
- <%=text['WebExtensions/Modify_a_web_page']%>
- <%=text['WebExtensions/Safely_inserting_external_content_into_a_page']%>
+ - <%=text['WebExtensions/Sharing_objects_with_page_scripts']%>
- <%=text['WebExtensions/Add_a_button_to_the_toolbar']%>
- <%=text['WebExtensions/Implement_a_settings_page']%>
- <%=text['WebExtensions/Working_with_the_Tabs_API']%>
@@ -559,44 +405,12 @@ var text = mdn.localStringMap({
- <%=text['WebExtensions/Work_with_the_Cookies_API']%>
- <%=text['WebExtensions/Work_with_contextual_identities']%>
- <%=text['WebExtensions/Build_a_cross_browser_extension']%>
- - <%=text['WebExtensions/onboarding_upboarding_offboarding_best_practices']%>
- <%=text['WebExtensions#Porting']%>
-
- - <%=text['WebExtensions/Firefox_differentiators']%>
- - <%=text['WebExtensions/Porting_a_Google_Chrome_extension']%>
- - <%=text['WebExtensions/Porting_a_legacy_Firefox_add-on']%>
- - <%=text['WebExtensions/Comparison_with_the_Add-on_SDK']%>
- - <%=text['WebExtensions/Comparison_with_XUL_XPCOM_extensions']%>
- - <%=text['WebExtensions/Differences_between_API_implementations']%>
- - <%=text['WebExtensions/Chrome_incompatibilities']%>
- - <%=text['WebExtensions/Differences_between_desktop_and_Android']%>
-
-
-
-
-
- <%=text['WebExtensions#Firefox_workflow']%>
-
- - <%=text['WebExtensions/Development_Tools']%>
- - <%=text['WebExtensions/Choose_a_Firefox_version_for_web_extension_develop']%>
- - <%=text['WebExtensions/User_experience_best_practices']%>
- - <%=text['WebExtensions/Prompt_users_for_data_and_privacy_consents']%>
- - <%=text['WebExtensions/Temporary_Installation_in_Firefox']%>
- - <%=text['WebExtensions/Debugging']%>
- - <%=text['WebExtensions/Testing_persistent_and_restart_features']%>
- - <%=text['WebExtensions/Test_permission_requests']%>
- - <%=text['WebExtensions/Developing_WebExtensions_for_Firefox_for_Android']%>
- - <%=text['WebExtensions/Getting_started_with_web-ext']%>
- - <%=text['WebExtensions/web-ext_command_reference']%>
- - <%=text['WebExtensions/WebExtensions_and_the_Add-on_ID']%>
- - <%=text['WebExtensions/Request_the_right_permissions']%>
- - <%=text['WebExtensions/Best_practices_for_updating_your_extension']%>
-
+ <%=text['WebExtensions/Firefox_differentiators']%>
@@ -605,7 +419,6 @@ var text = mdn.localStringMap({
<%-await template("WebExtAPISidebar", [])%>
-
<%=text['WebExtensions/manifest.json']%>
@@ -614,57 +427,25 @@ var text = mdn.localStringMap({
%>
- <%=text['WebExtensions/Distribution_options']%>
- <%=text['Themes']%>
-
-
- <%=text['Themes/Theme_concepts']%>
-
- - <%=text['Themes/Theme_concepts_']%>
- - <%=text['Themes/Using_the_AMO_theme_generator']%>
-
-
-
- <%=text['Distribution']%>
-
-
- <%=text['Distribution/Publishing']%>
-
- - <%=text['WebExtensions/Developer_accounts']%>
- - <%=text['Distribution/Signing']%>
- - <%=text['WebExtensions/Package_your_extension_']%>
- - <%=text['Distribution/Submitting_an_add-on']%>
- - <%=text['Source_Code_Submission']%>
- - <%=text['Distribution/Resources_for_publishers']%>
- - <%=text['Listing']%>
- - <%=text['Distribution/Make_money_from_browser_extensions']%>
- - <%=text['Distribution/Promoting_your_extension_or_theme']%>
- - <%=text['AMO/Policy/Reviews']%>
- - <%=text['AMO/Policy/Agreement']%>
- - <%=text['AMO/Policy/Featured']%>
- - <%=text['Distribution/Retiring_your_extension']%>
-
-
-
-
+
- <%=text['WebExtensions/Alternative_distribution_options']%>
+ <%=text['extension_workshop']%>
- - <%=text['WebExtensions/Alternative_distribution_options/Sideloading_add-ons']%>
- - <%=text['WebExtensions/Alternative_distribution_options/Add-ons_for_desktop_apps']%>
- - <%=text['WebExtensions/Alternative_distribution_options/Add-ons_in_the_enterprise']%>
+ - <%=text['extension_workshop_develop']%>
+ - <%=text['extension_workshop_publish']%>
+ - <%=text['extension_workshop_manage']%>
+ - <%=text['extension_workshop_enterprise']%>
- <%=text['Community_and_Support']%>
+ <%=text['Contact_us']%>
<%=text['Channels']%>
- <%=text['Blog']%>
- <%=text['Forums']%>
- - Stack Overflow
- - <%=text['#Contact_us']%>
+ - <%=text['Chat']%>
diff --git a/kumascript/macros/AddonSidebarMain.ejs b/kumascript/macros/AddonSidebarMain.ejs
new file mode 100644
index 000000000000..59db2783c77b
--- /dev/null
+++ b/kumascript/macros/AddonSidebarMain.ejs
@@ -0,0 +1,82 @@
+<%
+var currentSection = $0;
+var locale = env.locale;
+var slug = env.slug;
+var baseURL = '/' + locale + '/docs/Mozilla/Add-ons/';
+
+function currentPageIsUnder(root) {
+ rootSlug = 'Mozilla/Add-ons/' + root;
+ if (slug && slug.indexOf(rootSlug) != -1) {
+ return 'open';
+ }
+ return '';
+}
+
+var text = mdn.localStringMap({
+ 'en-US': {
+ 'WebExtensions': 'Browser extensions',
+ 'Themes': 'Themes',
+ 'Community_and_Support': 'Community and Support',
+ 'Channels': 'Channels',
+ 'Blog': 'Add-ons blog',
+ 'Forums': 'Add-on forums',
+ '#Contact_us': 'Contact us'
+ },
+ 'fr': {
+ 'WebExtensions': 'WebExtensions',
+ 'Themes': 'Thèmes',
+ 'Community_and_Support': 'Communauté et Support',
+ 'Channels': 'Canaux de discussions',
+ 'Blog': 'Blog extensions',
+ 'Forums': 'Forum extensions',
+ '#Contact_us': 'Nous contacter'
+ },
+ 'ja': {
+ 'WebExtensions': 'ブラウザー拡張機能',
+ 'Themes': 'テーマ',
+ 'Community_and_Support': 'コミュニティとサポート',
+ 'Channels': 'チャンネル',
+ 'Blog': 'ブログ',
+ 'Forums': 'フォーラム',
+ '#Contact_us': 'コンタクト'
+ },
+ 'ko': {
+ 'WebExtensions': '브라우저 확장 기능',
+ 'Themes': '테마',
+ 'Community_and_Support': '커뮤니티와 지원',
+ 'Channels': '채널',
+ 'Blog': '부가 기능 블로그',
+ 'Forums': '부가 기능 포럼',
+ '#Contact_us': '연락하기'
+ },
+ 'zh-CN': {
+ 'WebExtensions': '浏览器扩展程序',
+ 'Themes': '主题',
+ 'Channels': '渠道',
+ 'Blog': 'Add-ons博客',
+ 'Forums': 'Add-ons论坛',
+ 'Chat': 'Add-ons chat',
+ 'Contact_us': '联系我们'
+ }
+});
+
+%>
+
+
diff --git a/kumascript/macros/CSSAnimatedProperties.ejs b/kumascript/macros/CSSAnimatedProperties.ejs
index 2e827d376ca8..7b37e7cdfd25 100644
--- a/kumascript/macros/CSSAnimatedProperties.ejs
+++ b/kumascript/macros/CSSAnimatedProperties.ejs
@@ -13,7 +13,7 @@ var animatedProps = [];
// the animatedProps array.
for (var property in data.properties) {
if (data.properties.hasOwnProperty(property)) {
- if (data.properties[property].animationType !== "discrete") {
+ if (!["discrete", "notAnimatable"].includes(data.properties[property].animationType)) {
animatedProps.push(property);
}
}
diff --git a/kumascript/macros/CSSInfo.ejs b/kumascript/macros/CSSInfo.ejs
index aed8e21c9ca7..22037b1e00b8 100644
--- a/kumascript/macros/CSSInfo.ejs
+++ b/kumascript/macros/CSSInfo.ejs
@@ -286,10 +286,6 @@ if (name === "preview-wiki-content") {
}
properties = properties.concat({
- name: "media",
- label: localize(localStrings, "media")
- },
- {
name: "computed",
label: await template("Xref_csscomputed")
});
@@ -301,11 +297,6 @@ if (name === "preview-wiki-content") {
});
}
- properties = properties.concat({
- name: "order",
- label: localize(localStrings, "canonicalOrder")
- });
-
if (cssInfo.stacking) {
properties = properties.concat({
name: "stacking",
diff --git a/kumascript/macros/GroupData.json b/kumascript/macros/GroupData.json
index 76efa935f60b..bf628398c809 100644
--- a/kumascript/macros/GroupData.json
+++ b/kumascript/macros/GroupData.json
@@ -27,6 +27,17 @@
"properties": ["Navigator.battery"],
"events": []
},
+ "Barcode Detector API": {
+ "overview": ["Barcode Detector API"],
+ "guides": [],
+ "interfaces": ["BarcodeDetector"],
+ "methods": [
+ "BarcodeDetector.detect()",
+ "BarcodeDetector.getSupportedFormats()"
+ ],
+ "properties": [],
+ "events": []
+ },
"Beacon": {
"overview": ["Beacon API"],
"guides": ["/docs/Web/API/Beacon_API/Using_the_Beacon_API"],
@@ -92,7 +103,8 @@
"events": []
},
"Clipboard API": {
- "interfaces": ["Clipboard", "ClipboardEvent"],
+ "overview": ["Clipboard API"],
+ "interfaces": ["Clipboard", "ClipboardEvent", "ClipboardItem"],
"dictionaries": ["ClipboardPermissionDescriptor"],
"methods": [],
"properties": ["Navigator.clipboard"],
@@ -103,6 +115,16 @@
"Element: paste"
]
},
+ "Content Index API": {
+ "overview": ["Content Index API"],
+ "interfaces": ["ContentIndex", "ContentIndexEvent"],
+ "methods": [],
+ "properties": [
+ "ServiceWorkerRegistration.index",
+ "ServiceWorkerGlobalScope.oncontentdelete"
+ ],
+ "events": ["ServiceWorkerGlobalScope: contentdelete"]
+ },
"Console API": {
"overview": ["Console API"],
"interfaces": ["Console"],
@@ -830,8 +852,16 @@
"overview": ["Media Session API"],
"interfaces": ["MediaMetadata", "MediaSession"],
"methods": [],
- "properties": [],
- "events": []
+ "properties": ["navigator.mediaSession"],
+ "events": [],
+ "dictionaries": [
+ "MediaImage",
+ "MediaMetadataInit",
+ "MediaPositionState",
+ "MediaSessionActionDetails"
+ ],
+ "types": ["MediaSessionAction", "MediaSessionPlaybackState"],
+ "callbacks": ["MediaSessionActionHandler"]
},
"Media Source Extensions": {
"overview": ["Media Source Extensions API"],
@@ -966,6 +996,16 @@
"properties": ["Window.performance"],
"events": []
},
+ "Periodic Background Sync": {
+ "overview": ["Web Periodic Background Synchronization API"],
+ "interfaces": ["PeriodicSyncEvent", "PeriodicSyncManager"],
+ "methods": [],
+ "properties": [
+ "ServiceWorkerRegistration.periodicSync",
+ "ServiceWorkerGlobalScope.onperiodicsync"
+ ],
+ "events": ["ServiceWorkerGlobalScope: periodicsync"]
+ },
"Permissions API": {
"overview": ["Permissions API"],
"guides": ["/docs/Web/API/Permissions_API/Using_the_Permissions_API"],
@@ -974,6 +1014,29 @@
"properties": ["Navigator.permissions", "WorkerNavigator.permissions"],
"events": []
},
+ "Picture-in-Picture API": {
+ "overview": ["Picture-in-Picture API"],
+ "guides": ["/docs/Web/API/Picture-in-Picture_API/Guide"],
+ "interfaces": ["PictureInPictureWindow"],
+ "methods": [
+ "HTMLVideoElement.requestPictureInPicture()",
+ "Document.exitPictureInPicture()"
+ ],
+ "properties": [
+ "HTMLVideoElement.autoPictureInPicture",
+ "HTMLVideoElement.disablePictureInPicture",
+ "HTMLVideoElement.onenterpictureinpicture",
+ "HTMLVideoElement.onleavepictureinpicture",
+ "Document.pictureInPictureEnabled",
+ "DocumentOrShadowRoot.pictureInPictureElement",
+ "PictureInPictureWindow.onresize"
+ ],
+ "events": [
+ "HTMLVideoElement: enterpictureinpicture",
+ "HTMLVideoElement: leavepictureinpicture",
+ "PictureInPictureWindow: resize"
+ ]
+ },
"Pointer Events": {
"overview": ["Pointer events"],
"guides": [
@@ -1088,6 +1151,7 @@
"events": []
},
"Screen Capture API": {
+ "overview": ["Screen Capture API"],
"guides": ["/docs/Web/API/Screen_Capture_API/Using_Screen_Capture"],
"interfaces": [],
"dictionaries": [],
@@ -1113,6 +1177,13 @@
"properties": ["Screen.orientation"],
"events": []
},
+ "Screen Wake Lock API": {
+ "overview": ["Screen Wake Lock API"],
+ "interfaces": ["WakeLock", "WakeLockSentinel"],
+ "methods": [],
+ "properties": ["Navigator.wakelock"],
+ "events": []
+ },
"Selection API": {
"interfaces": ["Selection"],
"properties": [
@@ -1407,6 +1478,13 @@
"properties": [],
"events": []
},
+ "Visual Viewport": {
+ "overview": ["Visual Viewport API"],
+ "interfaces": ["VisualViewport"],
+ "methods": [],
+ "properties": ["Window.visualViewport"],
+ "events": ["VisualViewport: resize", "VisualViewport: scroll"]
+ },
"Web Animations": {
"overview": ["Web Animations API"],
"guides": [
@@ -1692,7 +1770,6 @@
"RTCDTMFSender",
"RTCDTMFToneChangeEvent",
"RTCStatsReport",
- "RTCStatsEvent",
"RTCErrorEvent"
],
"dictionaries": [
@@ -1792,7 +1869,31 @@
],
"methods": ["MediaDevices.getUserMedia()"],
"properties": ["Navigator.mediaDevices"],
- "events": [],
+ "events": [
+ "RTCDataChannel: bufferedamountlow",
+ "RTCDataChannel: close",
+ "RTCDataChannel: closing",
+ "RTCPeerConnection: connectionstatechange",
+ "RTCPeerConnection: datachannel",
+ "RTCDataChannel: error",
+ "RTCIceTransport: error",
+ "RTCDtlsTransport: error",
+ "RTCSctpTransport: error",
+ "RTCIceTransport: gatheringstatechange",
+ "RTCPeerConnection: icecandidate",
+ "RTCPeerConnection: icecandidateerror",
+ "RTCPeerConnection: iceconnectionstatechange",
+ "RTCPeerConnection: icegatheringstatechange",
+ "RTCDataChannel: message",
+ "RTCPeerConnection: negotiationneeded",
+ "RTCDataChannel: open",
+ "RTCIceTransport: selectedcandidatepairchange",
+ "RTCPeerConnection: signalingstatechange",
+ "RTCIceTransport: statechange",
+ "RTCDtlsTransport: statechange",
+ "RTCDTMFSender: tonechange",
+ "RTCPeerConnection: track"
+ ],
"callbacks": [
"RTCPeerConnectionErrorCallback",
"RTCSessionDescriptionCallback"
@@ -1833,10 +1934,7 @@
},
"Web Storage API": {
"overview": ["Web Storage API"],
- "guides": [
- "/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API",
- "/docs/Web/API/Web_Storage_API/Local_storage"
- ],
+ "guides": ["/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API"],
"interfaces": ["Storage", "StorageEvent"],
"methods": [],
"properties": ["Window.sessionStorage", "Window.localStorage"],
diff --git a/kumascript/macros/JSRef.ejs b/kumascript/macros/JSRef.ejs
index d99110f1655c..1ecc126eeb03 100644
--- a/kumascript/macros/JSRef.ejs
+++ b/kumascript/macros/JSRef.ejs
@@ -43,7 +43,7 @@ var inheritance = ["Object", "Function"];
var inheritanceData = {
"Math": ["Object"],
"Function": ["Object"],
- "Object": ["Function"],
+ "Object": [],
"JSON": ["Object"],
"Intl": ["Object"],
"arguments": [],
diff --git a/kumascript/macros/JsSidebar.ejs b/kumascript/macros/JsSidebar.ejs
index e84b99e422fd..d3a8e7c6be93 100644
--- a/kumascript/macros/JsSidebar.ejs
+++ b/kumascript/macros/JsSidebar.ejs
@@ -38,6 +38,7 @@ var text = mdn.localStringMap({
'Intermediate': 'Intermediate',
'Introducing_objects': 'Introducing JavaScript objects',
'Client-side_APIs': 'Client-side web APIs',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': 'A re-introduction to JavaScript',
'Data_structures': 'JavaScript data structures',
'Equality': 'Equality comparisons and sameness',
@@ -92,6 +93,7 @@ var text = mdn.localStringMap({
'Intermediate': 'Средние',
'Introducing_objects': 'Introducing JavaScript objects',
'Client-side_APIs': 'Client-side web APIs',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': 'Повторное введение в JavaScript',
'Data_structures': 'Структуры данных JavaScript',
'Equality': 'Проверки на равенство и когда их использовать',
@@ -146,6 +148,7 @@ var text = mdn.localStringMap({
'Intermediate': 'Intermédiaire',
'Introducing_objects': 'Introducing JavaScript objects',
'Client-side_APIs': 'Client-side web APIs',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': 'Réintroduction à JavaScript',
'Data_structures': 'Structures de données en JavaScript',
'Equality': 'Différents tests d\'égalité',
@@ -200,6 +203,7 @@ var text = mdn.localStringMap({
'Intermediate': '中级教程',
'Introducing_objects': 'Introducing JavaScript objects',
'Client-side_APIs': 'Client-side web APIs',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': '深入 JavaScript',
'Data_structures': 'JavaScript 数据结构',
'Equality': '如何正确判断相等性',
@@ -254,6 +258,7 @@ var text = mdn.localStringMap({
'Intermediate': 'Fortgeschritten',
'Introducing_objects': 'Introducing JavaScript objects',
'Client-side_APIs': 'Client-side web APIs',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': 'Eine Wiedereinführung in JavaScript',
'Data_structures': 'JavaScript Datenstrukturen',
'Equality': 'Vergleiche auf Gleichheit',
@@ -308,6 +313,7 @@ var text = mdn.localStringMap({
'Intermediate': '中級編',
'Introducing_objects': 'Introducing JavaScript objects',
'Client-side_APIs': 'Client-side web APIs',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': 'JavaScript 「再」入門',
'Data_structures': 'JavaScript のデータ構造',
'Equality': '等値比較と同一性',
@@ -362,6 +368,7 @@ var text = mdn.localStringMap({
'Intermediate': 'Intermediário',
'Introducing_objects': 'Introdução a objetos JavaScript',
'Client-side_APIs': 'APIs Web para aplicações Cliente',
+ 'Frameworks': 'Client-side JavaScript frameworks',
'Re-introduction': 'Uma reintrodução a JavaScript',
'Data_structures': 'Estruturas de dados de JavaScript',
'Equality': 'Comparadores de igualdade e semelhança',
@@ -433,7 +440,7 @@ var text = mdn.localStringMap({
>
<%=text['Intermediate']%>
- - <%=text['Introducing_objects']%>
+ - <%=text['Frameworks']%>
- <%=text['Client-side_APIs']%>
- <%=text['Re-introduction']%>
- <%=text['Data_structures']%>
diff --git a/kumascript/macros/LearnSidebar.ejs b/kumascript/macros/LearnSidebar.ejs
index 78526bb8e65c..68609591e35c 100644
--- a/kumascript/macros/LearnSidebar.ejs
+++ b/kumascript/macros/LearnSidebar.ejs
@@ -180,13 +180,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : 'Setting up your own test automation environment',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : 'Server-side website programming',
'First_steps' : 'First steps',
'First_steps_overview' : 'First steps overview',
@@ -398,13 +435,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : 'Setze deine eigene Testumgebung auf',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : 'Serverseitige Webseitenprogrammierung',
'First_steps' : 'Erste Schritte',
'First_steps_overview' : 'Erste Schritte — Übersicht',
@@ -616,13 +690,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : 'Configurando seu próprio ambiente de testes automatizados',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : 'Programação de servidores de Aplicação',
'First_steps' : 'Primeiros passos',
'First_steps_overview' : 'Visão geral para os primeiros passos',
@@ -818,13 +929,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : 'Установка вашей автоматической среды тестирования',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : 'Программирование серверной части сайта',
'First_steps' : 'Первые шаги',
'First_steps_overview' : 'Первые шаги',
@@ -1024,13 +1172,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : '设置您的自动测试环境',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : '服务端网页编程',
'First_steps' : '第一步',
'First_steps_overview' : '第一步概述',
@@ -1225,13 +1410,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : '設定自己的自動化測試環境',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : '伺服端網站程式設計',
'First_steps' : '第一步',
'First_steps_overview' : '第一步概述',
@@ -1457,13 +1679,50 @@ var text = mdn.localStringMap({
'Setting_up_your_own_test_automation_environment' : 'Setting up your own test automation environment',
'Git_and_GitHub' : 'Git and GitHub',
'Git_and_GitHub_overview' : 'Git and GitHub overview',
- 'Understanding_client-side_web_development_tools' : 'Understanding client-side web development tools',
+ 'Client-side_web_development_tools' : 'Client-side web development tools',
'Client-side_web_development_tools_index' : 'Client-side web development tools index',
'Client-side_tooling_overview' : 'Client-side tooling overview',
'Command_line_crash_course' : 'Command line crash course',
'Package_management_basics' : 'Package management basics',
'Introducing_a_complete_toolchain' : 'Introducing a complete toolchain',
'Deploying_our_app' : 'Deploying our app',
+ 'Introduction_to_client-side_frameworks': 'Introduction to client-side frameworks',
+ 'Client-side_frameworks_overview': 'Client-side frameworks overview',
+ 'Framework_main_features': 'Framework main features',
+ 'React': 'React',
+ 'Getting_started_with_React': 'Getting started with React',
+ 'Beginning_our_React_todo_list': 'Beginning our React todo list',
+ 'Componentizing_our_React_app': 'Componentizing our React app',
+ 'React_interactivity:_Events_and_state': 'React interactivity: Events and state',
+ 'React_interactivity:_Editing_filtering_conditional_rendering': 'React interactivity: Editing, filtering, conditional rendering',
+ 'Accessibility_in_React': 'Accessibility in React',
+ 'React_resources': 'React resources',
+ 'Ember': 'Ember',
+ 'Getting_started_with_Ember': 'Getting started with Ember',
+ 'Ember_app_structure_and_componentization': 'Ember app structure and componentization',
+ 'Ember_interactivity:_Events_classes_and_state': 'Ember interactivity: Events, classes and state',
+ 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember Interactivity: Footer functionality, conditional rendering',
+ 'Routing_in_Ember': 'Routing in Ember',
+ 'Ember_resources_and_troubleshooting': 'Ember resources and troubleshooting',
+ 'Vue': 'Vue',
+ 'Getting_started_with_Vue': 'Getting started with Vue',
+ 'Creating_our_first_Vue_component': 'Creating our first Vue component',
+ 'Rendering_a_list_of_Vue_components': 'Rendering a list of Vue components',
+ 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Adding a new todo form: Vue events, methods, and models',
+ 'Styling_Vue_components_with_CSS': 'Styling Vue components with CSS',
+ 'Using_Vue_computed_properties': 'Using Vue computed properties',
+ 'Vue_conditional_rendering:_editing_existing_todos': 'Vue conditional rendering: editing existing todos',
+ 'Focus_management_with_Vue_refs': 'Focus management with Vue refs',
+ 'Vue_resources': 'Vue resources',
+ 'Svelte': 'Svelte',
+ 'Getting_started_with_Svelte': 'Getting started with Svelte',
+ 'Starting_our_Svelte_Todo_list_app': 'Starting our Svelte Todo list app',
+ 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Dynamic behavior in Svelte: working with variables and props',
+ 'Componentizing_our_Svelte_app': 'Componentizing our Svelte app',
+ 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Advanced Svelte: Reactivity, lifecycle, accessibility',
+ 'Working_with_Svelte_stores': 'Working with Svelte stores',
+ 'TypeScript_support_in_Svelte': 'TypeScript support in Svelte',
+ 'Deployment_and_next_steps': 'Deployment and next steps',
'Server-side_website_programming' : 'Server-side website programming',
'First_steps' : 'First steps',
'First_steps_overview' : 'First steps overview',
@@ -1772,18 +2031,82 @@ var text = mdn.localStringMap({
- <%=text['Tools_and_testing']%>
-
-
>
- <%=text['Cross_browser_testing']%>
+ >
+ <%=text['Client-side_web_development_tools']%>
- - <%=text['Cross_browser_testing_overview']%>
- - <%=text['Introduction_to_cross_browser_testing']%>
- - <%=text['Strategies_for_carrying_out_testing']%>
- - <%=text['Handling_common_HTML_and_CSS_problems']%>
- - <%=text['Handling_common_JavaScript_problems']%>
- - <%=text['Handling_common_accessibility_problems']%>
- - <%=text['Implementing_feature_detection']%>
- - <%=text['Introduction_to_automated_testing']%>
- - <%=text['Setting_up_your_own_test_automation_environment']%>
+ - <%=text['Client-side_web_development_tools_index']%>
+ - <%=text['Client-side_tooling_overview']%>
+ - <%=text['Command_line_crash_course']%>
+ - <%=text['Package_management_basics']%>
+ - <%=text['Introducing_a_complete_toolchain']%>
+ - <%=text['Deploying_our_app']%>
+
+
+
+ -
+
>
+ <%=text['Introduction_to_client-side_frameworks']%>
+
+ - <%=text['Client-side_frameworks_overview']%>
+ - <%=text['Framework_main_features']%>
+
+
+
+ -
+
>
+ <%=text['React']%>
+
+ - <%=text['Getting_started_with_React']%>
+ - <%=text['Beginning_our_React_todo_list']%>
+ - <%=text['Componentizing_our_React_app']%>
+ - <%=text['React_interactivity:_Events_and_state']%>
+ - <%=text['React_interactivity:_Editing_filtering_conditional_rendering']%>
+ - <%=text['Accessibility_in_React']%>
+ - <%=text['React_resources']%>
+
+
+
+ -
+
>
+ <%=text['Ember']%>
+
+ - <%=text['Getting_started_with_Ember']%>
+ - <%=text['Ember_app_structure_and_componentization']%>
+ - <%=text['Ember_interactivity:_Events_classes_and_state']%>
+ - <%=text['Ember_Interactivity:_Footer_functionality_conditional_rendering']%>
+ - <%=text['Routing_in_Ember']%>
+ - <%=text['Ember_resources_and_troubleshooting']%>
+
+
+
+ -
+
>
+ <%=text['Vue']%>
+
+ - <%=text['Getting_started_with_Vue']%>
+ - <%=text['Creating_our_first_Vue_component']%>
+ - <%=text['Rendering_a_list_of_Vue_components']%>
+ - <%=text['Adding_a_new_todo_form:_Vue_events_methods_and_models']%>
+ - <%=text['Styling_Vue_components_with_CSS']%>
+ - <%=text['Using_Vue_computed_properties']%>
+ - <%=text['Vue_conditional_rendering:_editing_existing_todos']%>
+ - <%=text['Focus_management_with_Vue_refs']%>
+ - <%=text['Vue_resources']%>
+
+
+
+ -
+
>
+ <%=text['Svelte']%>
+
+ - <%=text['Getting_started_with_Svelte']%>
+ - <%=text['Starting_our_Svelte_Todo_list_app']%>
+ - <%=text['Dynamic_behavior_in_Svelte:_working_with_variables_and_props']%>
+ - <%=text['Componentizing_our_Svelte_app']%>
+ - <%=text['Advanced_Svelte:_Reactivity_lifecycle_accessibility']%>
+ - <%=text['Working_with_Svelte_stores']%>
+ - <%=text['TypeScript_support_in_Svelte']%>
+ - <%=text['Deployment_and_next_steps']%>
@@ -1801,15 +2124,18 @@ var text = mdn.localStringMap({
- >
- <%=text['Understanding_client-side_web_development_tools']%>
+ >
+ <%=text['Cross_browser_testing']%>
- - <%=text['Client-side_web_development_tools_index']%>
- - <%=text['Client-side_tooling_overview']%>
- - <%=text['Command_line_crash_course']%>
- - <%=text['Package_management_basics']%>
- - <%=text['Introducing_a_complete_toolchain']%>
- - <%=text['Deploying_our_app']%>
+ - <%=text['Cross_browser_testing_overview']%>
+ - <%=text['Introduction_to_cross_browser_testing']%>
+ - <%=text['Strategies_for_carrying_out_testing']%>
+ - <%=text['Handling_common_HTML_and_CSS_problems']%>
+ - <%=text['Handling_common_JavaScript_problems']%>
+ - <%=text['Handling_common_accessibility_problems']%>
+ - <%=text['Implementing_feature_detection']%>
+ - <%=text['Introduction_to_automated_testing']%>
+ - <%=text['Setting_up_your_own_test_automation_environment']%>
diff --git a/kumascript/macros/ToolsSidebar.ejs b/kumascript/macros/ToolsSidebar.ejs
index 272e9983609d..af922915769a 100644
--- a/kumascript/macros/ToolsSidebar.ejs
+++ b/kumascript/macros/ToolsSidebar.ejs
@@ -12,6 +12,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "JavaScript Debugger",
"Network_Monitor": "Network Monitor",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "Responsive Design Mode",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -43,6 +44,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "ডিবাগার",
"Network_Monitor": "নেটওয়ার্ক মনিটর",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "রেসপন্সিভ ডিজাইন ভিউ",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -76,6 +78,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Depurador",
"Network_Monitor": "Monitor de Xarxa",
"Performance": "Rendiment",
+ "Application": "Application",
"Responsive_Design_Mode": "Visualització Sensible al Disseny",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -107,6 +110,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Debugger",
"Network_Monitor": "Netzwerkanalyse",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "Reaktives Design",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -138,6 +142,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Débogueur JavaScript",
"Network_Monitor": "Moniteur réseau",
"Performance": "Performances",
+ "Application": "Application",
"Responsive_Design_Mode": "Vue adaptative",
"Accessibility_Inspector": "Panneau accessibilité",
"More_Tools": "Plus d'outils",
@@ -169,6 +174,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Pen-debug JavaScript",
"Network_Monitor": "Monitor Jaringan",
"Performance": "Performa",
+ "Application": "Application",
"Responsive_Design_Mode": "Mode Desain Responsif",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "Alat Lainnya",
@@ -200,6 +206,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "JavaScript デバッガー",
"Network_Monitor": "ネットワークモニター",
"Performance": "パフォーマンス",
+ "Application": "Application",
"Responsive_Design_Mode": "レスポンシブデザインモード",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "その他のツール",
@@ -231,6 +238,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "디버거",
"Network_Monitor": "네트워크 모니터",
"Performance": "성능",
+ "Application": "Application",
"Responsive_Design_Mode": "반응형 디자인 화면",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -262,6 +270,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "JavaScript Debugger",
"Network_Monitor": "Network Monitor",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "Responsive Design Mode",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -293,6 +302,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "JavaScript Debugger",
"Network_Monitor": "Network Monitor",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "Responsive Design Mode",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -325,6 +335,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Depanator JavaScript",
"Network_Monitor": "Monitorizare rețea",
"Performance": "Performanță",
+ "Application": "Application",
"Responsive_Design_Mode": "Vedere design receptiv",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -356,6 +367,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Отладчик JavaScript",
"Network_Monitor": "Монитор сетевой активности",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "Режим адаптивного дизайна",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "Больше инструментов",
@@ -387,6 +399,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "Avlusare",
"Network_Monitor": "Nätverksövervakare",
"Performance": "Performance",
+ "Application": "Application",
"Responsive_Design_Mode": "Responsive Design Mode",
"Accessibility_Inspector": "Accessibility Inspector",
"More_Tools": "More Tools",
@@ -418,6 +431,7 @@ const text = mdn.localStringMap({
"JavaScript_Debugger": "JavaScript 调试器",
"Network_Monitor": "网络监视器",
"Performance": "性能",
+ "Application": "Application",
"Responsive_Design_Mode": "响应式设计模式",
"Accessibility_Inspector": "无障碍环境",
"More_Tools": "更多工具",
@@ -454,6 +468,7 @@ const text = mdn.localStringMap({
<%=text['JavaScript_Debugger']%>
<%=text['Network_Monitor']%>
<%=text['Performance']%>
+ <%=text['Application']%>
<%=text['Responsive_Design_Mode']%>
<%=text['Accessibility_Inspector']%>
@@ -497,4 +512,4 @@ const text = mdn.localStringMap({
<%=text['Tips']%>
<%=text['Release_notes']%>
-
\ No newline at end of file
+
diff --git a/kumascript/tests/macros/addonsidebar.test.js b/kumascript/tests/macros/addonsidebar.test.js
index afb50ad9417f..a2c08208c392 100644
--- a/kumascript/tests/macros/addonsidebar.test.js
+++ b/kumascript/tests/macros/addonsidebar.test.js
@@ -18,13 +18,10 @@ const SUMMARIES = {
"Concepts",
"User interface",
"How to",
- "Porting",
- "Firefox workflow",
+ "Firefox differentiators",
"JavaScript APIs",
"Manifest keys",
- "Browser themes",
- "Publishing add-ons",
- "Distributing add-ons",
+ "Extension Workshop",
"Channels",
],
fr: [
@@ -32,13 +29,10 @@ const SUMMARIES = {
"Concepts",
"Interface Utilisateur",
"Mode d'emploi",
- "Portage",
- "Déroulement avec Firefox",
+ "Firefox differentiators",
"Les API JavaScript",
"Clés de manifeste",
- "Thème de navigateur",
- "Publication de votre extension",
- "Distribuer votre module",
+ "Extension Workshop",
"Canaux de discussions",
],
ja: [
@@ -46,13 +40,10 @@ const SUMMARIES = {
"概念",
"ユーザーインターフェイス",
"逆引きリファレンス",
- "移行",
- "Firefox でのワークフロー",
+ "Firefox differentiators",
"JavaScript API 群",
"Manifest keys",
- "ブラウザのテーマ",
- "アドオンを公開する",
- "アドオンの配布",
+ "Extension Workshop",
"チャンネル",
],
"zh-CN": [
@@ -60,13 +51,10 @@ const SUMMARIES = {
"概念",
"用户界面",
"怎么做",
- "移植",
- "Firefox工作流程",
+ "Firefox differentiators",
"JavaScript APIs",
"Manifest keys",
- "浏览器主题",
- "发布附加程序",
- "分发附加程序",
+ "Extension Workshop",
"渠道",
],
};