From cff2a9efc5be9e32ccfc145dfe27cfbb30179f40 Mon Sep 17 00:00:00 2001
From: Ilya Kreymer <ikreymer@users.noreply.github.com>
Date: Fri, 18 Jun 2021 14:58:21 -0700
Subject: [PATCH] more locale fixes: (#653)

* more locale fixes:
- fix running wb-manager w/o i18n dependencies
- dependencies: move babel to extra_requires, show warning if locale used or 'wb-manager i18n' called and i18n are not installed
- not found page: don't language switch header banner on nested content frame
---
 CHANGES.rst                  |  6 ++++++
 extra_requirements.txt       |  1 +
 pywb/apps/rewriterapp.py     |  2 +-
 pywb/manager/manager.py      | 15 +++++++++++++--
 pywb/rewrite/templateview.py | 12 +++++++-----
 pywb/templates/header.html   |  2 +-
 requirements.txt             |  1 -
 setup.py                     |  5 ++++-
 8 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/CHANGES.rst b/CHANGES.rst
index bd940775..5dc0ac56 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -3,8 +3,14 @@ pywb 2.6.0b2 changelist
 
 * Update documentation for CDX Server API (by @sebastian-nagel) `#651 <https://github.com/webrecorder/pywb/pull/651>`_
 
+Localization fixes: `#653 <https://github.com/webrecorder/pywb/pull/653>`_
+
 * Ensure banner template is not autoescaped
 
+* Don't show locale switch on not found pages (redundant with banner)
+
+* Ensure wb-manager works when optional i18n dependencies are not installed
+
 
 pywb 2.6.0b1 changelist
 ~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/extra_requirements.txt b/extra_requirements.txt
index 5e5860de..a7329ac6 100644
--- a/extra_requirements.txt
+++ b/extra_requirements.txt
@@ -5,4 +5,5 @@ uwsgi
 ujson
 pysocks
 lxml
+babel
 translate_toolkit
diff --git a/pywb/apps/rewriterapp.py b/pywb/apps/rewriterapp.py
index 1b3004de..e91dc677 100644
--- a/pywb/apps/rewriterapp.py
+++ b/pywb/apps/rewriterapp.py
@@ -685,7 +685,7 @@ class RewriterApp(object):
             return self._error_response(environ, wbe)
 
     def _not_found_response(self, environ, url):
-        resp = self.not_found_view.render_to_string(environ, url=url)
+        resp = self.not_found_view.render_to_string(environ, url=url, err_msg="Not Found")
 
         return WbResponse.text_response(resp, status='404 Not Found', content_type='text/html')
 
diff --git a/pywb/manager/manager.py b/pywb/manager/manager.py
index bb079690..fc767b7d 100644
--- a/pywb/manager/manager.py
+++ b/pywb/manager/manager.py
@@ -442,14 +442,25 @@ Create manage file based web archive collections
     acl.set_defaults(func=do_acl)
 
     # LOC
-    from pywb.manager.locmanager import LocManager
+    loc_avail = False
+    try:
+        from pywb.manager.locmanager import LocManager
+        loc_avail = True
+    except:
+        pass
+
     def do_loc(r):
+        if not loc_avail:
+            print("You must install i18n extensions with 'pip install pywb[i18n]' to use localization features")
+            return
+
         loc = LocManager()
         loc.process(r)
 
     loc_help = 'Generate strings for i18n/localization'
     loc = subparsers.add_parser('i18n', help=loc_help)
-    LocManager.init_parser(loc)
+    if loc_avail:
+        LocManager.init_parser(loc)
     loc.set_defaults(func=do_loc)
 
     # Parse
diff --git a/pywb/rewrite/templateview.py b/pywb/rewrite/templateview.py
index 4a388151..dadd331c 100644
--- a/pywb/rewrite/templateview.py
+++ b/pywb/rewrite/templateview.py
@@ -8,8 +8,6 @@ from six.moves.urllib.parse import urlsplit, quote
 from jinja2 import Environment, TemplateNotFound, contextfunction, select_autoescape
 from jinja2 import FileSystemLoader, PackageLoader, ChoiceLoader
 
-from babel.support import Translations
-
 from webassets.ext.jinja2 import AssetsExtension
 from webassets.loaders import YAMLLoader
 from webassets.env import Resolver
@@ -17,6 +15,7 @@ from webassets.env import Resolver
 from pkg_resources import resource_filename
 
 import os
+import logging
 
 try:
     import ujson as json
@@ -128,9 +127,12 @@ class JinjaEnv(object):
         self.default_locale = default_locale
 
         if locales_root_dir:
-            for loc in locales:
-                loc_map[loc] = Translations.load(locales_root_dir, [loc, default_locale])
-                #jinja_env.jinja_env.install_gettext_translations(translations)
+            try:
+                from babel.support import Translations
+                for loc in locales:
+                    loc_map[loc] = Translations.load(locales_root_dir, [loc, default_locale])
+            except:
+                logging.warn("Ignoring Locales. You must install i18n extensions with 'pip install pywb[i18n]' to use localization features")
 
         def get_translate(context):
             loc = context.get('env', {}).get('pywb_lang', default_locale)
diff --git a/pywb/templates/header.html b/pywb/templates/header.html
index c45a9e0d..24228983 100644
--- a/pywb/templates/header.html
+++ b/pywb/templates/header.html
@@ -1,5 +1,5 @@
 <header>
-   {% if locales|length > 1 %}
+   {% if not err_msg and locales|length > 1 %}
     <div class="language-select">
         {{ _('Language:') }}
         <ul role="listbox" aria-activedescendant="{{ env.pywb_lang | default(default_locale) }}" aria-labelledby="{{ _('Language select') }}">
diff --git a/requirements.txt b/requirements.txt
index 7f3d3401..60e078ec 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -14,5 +14,4 @@ portalocker
 wsgiprox>=1.5.1
 fakeredis<1.0
 tldextract
-babel
 python-dateutil
diff --git a/setup.py b/setup.py
index bf2f7215..c3591550 100755
--- a/setup.py
+++ b/setup.py
@@ -108,7 +108,10 @@ setup(
     ],
     install_requires=load_requirements('requirements.txt'),
     extras_require={
-        "i18n":  ["translate_toolkit"],
+        "i18n":  [
+            "babel",
+            "translate_toolkit"
+        ],
     },
     tests_require=[
         'pytest',