Hello community,

here is the log from the commit of package python-Flask-Babel for 
openSUSE:Factory checked in at 2020-02-18 13:29:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-Flask-Babel (Old)
 and      /work/SRC/openSUSE:Factory/.python-Flask-Babel.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-Flask-Babel"

Tue Feb 18 13:29:19 2020 rev:4 rq:774993 version:1.0.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-Flask-Babel/python-Flask-Babel.changes    
2018-11-08 09:48:37.205090649 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-Flask-Babel.new.26092/python-Flask-Babel.changes
 2020-02-18 13:29:21.684697381 +0100
@@ -1,0 +2,13 @@
+Sun Feb 16 05:57:42 UTC 2020 - Arun Persaud <[email protected]>
+
+- specfile:
+  * update copyright year
+
+- update to version 1.0.0:
+  * pytz is an explicit dependency. (#14)
+  * pytz.gae, used for Google App Engine, is no longer necessary and
+    has been removed. (#153)
+  * Fixed a deprecated werkzeug import (#158).
+  * Fix issues switching locales in threaded contexts (#125).
+
+-------------------------------------------------------------------

Old:
----
  Flask-Babel-0.12.2.tar.gz

New:
----
  Flask-Babel-1.0.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-Flask-Babel.spec ++++++
--- /var/tmp/diff_new_pack.u1JLB9/_old  2020-02-18 13:29:22.176698339 +0100
+++ /var/tmp/diff_new_pack.u1JLB9/_new  2020-02-18 13:29:22.176698339 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-Flask-Babel
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 # Copyright (c) 2014 Dr. Axel Braun
 #
 # All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-Flask-Babel
-Version:        0.12.2
+Version:        1.0.0
 Release:        0
 Summary:        i18n and l10n support for Flask
 License:        BSD-3-Clause

++++++ Flask-Babel-0.12.2.tar.gz -> Flask-Babel-1.0.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/Flask_Babel.egg-info/PKG-INFO 
new/Flask-Babel-1.0.0/Flask_Babel.egg-info/PKG-INFO
--- old/Flask-Babel-0.12.2/Flask_Babel.egg-info/PKG-INFO        2018-10-25 
17:45:46.000000000 +0200
+++ new/Flask-Babel-1.0.0/Flask_Babel.egg-info/PKG-INFO 2020-02-06 
17:38:13.000000000 +0100
@@ -1,12 +1,12 @@
 Metadata-Version: 2.1
 Name: Flask-Babel
-Version: 0.12.2
+Version: 1.0.0
 Summary: Adds i18n/l10n support to Flask applications
 Home-page: http://github.com/python-babel/flask-babel
 Author: Armin Ronacher
 Author-email: [email protected]
 License: BSD
-Description: # Flask Babel - 0.12.2
+Description: # Flask Babel - 1.0.0
         
         [![Build 
Status](https://travis-ci.org/python-babel/flask-babel.svg?branch=master)](https://travis-ci.org/python-babel/flask-babel)
         
[![PyPI](https://img.shields.io/pypi/v/flask-babel.svg?maxAge=2592000)](https://pypi.python.org/pypi/Flask-Babel)
@@ -21,9 +21,25 @@
         
         The latest documentation is available [here][docs].
         
+        # Changelog
+        
+        ## v1.0.0 - 06/02/2020
+        
+        Starting with version 1, flask-babel has changed to
+        [Semantic Versioning][semver].
+        
+        ### Changed
+        
+        - pytz is an explicit dependency. (#14)
+        - pytz.gae, used for Google App Engine, is no longer necessary and has 
been
+          removed. (#153)
+        - Fixed a deprecated werkzeug import (#158).
+        - Fix issues switching locales in threaded contexts (#125).
+        
         [babel]: https://github.com/python-babel/babel
         [pytz]: https://pypi.python.org/pypi/pytz/
         [docs]: https://pythonhosted.org/Flask-Babel/
+        [semver]: https://semver.org/
         
 Platform: any
 Classifier: Development Status :: 4 - Beta
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/Flask_Babel.egg-info/SOURCES.txt 
new/Flask-Babel-1.0.0/Flask_Babel.egg-info/SOURCES.txt
--- old/Flask-Babel-0.12.2/Flask_Babel.egg-info/SOURCES.txt     2018-10-25 
17:45:47.000000000 +0200
+++ new/Flask-Babel-1.0.0/Flask_Babel.egg-info/SOURCES.txt      2020-02-06 
17:38:13.000000000 +0100
@@ -15,6 +15,19 @@
 docs/index.rst
 docs/make.bat
 docs/_static/flask-babel.png
+docs/_themes/.git
+docs/_themes/.gitignore
+docs/_themes/LICENSE
+docs/_themes/README
+docs/_themes/flask_theme_support.py
+docs/_themes/flask/layout.html
+docs/_themes/flask/relations.html
+docs/_themes/flask/theme.conf
+docs/_themes/flask/static/flasky.css_t
+docs/_themes/flask/static/small_flask.css
+docs/_themes/flask_small/layout.html
+docs/_themes/flask_small/theme.conf
+docs/_themes/flask_small/static/flasky.css_t
 flask_babel/__init__.py
 flask_babel/_compat.py
 flask_babel/speaklater.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/Flask_Babel.egg-info/requires.txt 
new/Flask-Babel-1.0.0/Flask_Babel.egg-info/requires.txt
--- old/Flask-Babel-0.12.2/Flask_Babel.egg-info/requires.txt    2018-10-25 
17:45:46.000000000 +0200
+++ new/Flask-Babel-1.0.0/Flask_Babel.egg-info/requires.txt     2020-02-06 
17:38:13.000000000 +0100
@@ -1,3 +1,4 @@
+pytz
 Flask
 Babel>=2.3
 Jinja2>=2.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/PKG-INFO 
new/Flask-Babel-1.0.0/PKG-INFO
--- old/Flask-Babel-0.12.2/PKG-INFO     2018-10-25 17:45:47.000000000 +0200
+++ new/Flask-Babel-1.0.0/PKG-INFO      2020-02-06 17:38:13.000000000 +0100
@@ -1,12 +1,12 @@
 Metadata-Version: 2.1
 Name: Flask-Babel
-Version: 0.12.2
+Version: 1.0.0
 Summary: Adds i18n/l10n support to Flask applications
 Home-page: http://github.com/python-babel/flask-babel
 Author: Armin Ronacher
 Author-email: [email protected]
 License: BSD
-Description: # Flask Babel - 0.12.2
+Description: # Flask Babel - 1.0.0
         
         [![Build 
Status](https://travis-ci.org/python-babel/flask-babel.svg?branch=master)](https://travis-ci.org/python-babel/flask-babel)
         
[![PyPI](https://img.shields.io/pypi/v/flask-babel.svg?maxAge=2592000)](https://pypi.python.org/pypi/Flask-Babel)
@@ -21,9 +21,25 @@
         
         The latest documentation is available [here][docs].
         
+        # Changelog
+        
+        ## v1.0.0 - 06/02/2020
+        
+        Starting with version 1, flask-babel has changed to
+        [Semantic Versioning][semver].
+        
+        ### Changed
+        
+        - pytz is an explicit dependency. (#14)
+        - pytz.gae, used for Google App Engine, is no longer necessary and has 
been
+          removed. (#153)
+        - Fixed a deprecated werkzeug import (#158).
+        - Fix issues switching locales in threaded contexts (#125).
+        
         [babel]: https://github.com/python-babel/babel
         [pytz]: https://pypi.python.org/pypi/pytz/
         [docs]: https://pythonhosted.org/Flask-Babel/
+        [semver]: https://semver.org/
         
 Platform: any
 Classifier: Development Status :: 4 - Beta
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/README.md 
new/Flask-Babel-1.0.0/README.md
--- old/Flask-Babel-0.12.2/README.md    2018-10-25 17:31:05.000000000 +0200
+++ new/Flask-Babel-1.0.0/README.md     2020-02-06 17:32:24.000000000 +0100
@@ -1,4 +1,4 @@
-# Flask Babel - 0.12.2
+# Flask Babel - 1.0.0
 
 [![Build 
Status](https://travis-ci.org/python-babel/flask-babel.svg?branch=master)](https://travis-ci.org/python-babel/flask-babel)
 
[![PyPI](https://img.shields.io/pypi/v/flask-babel.svg?maxAge=2592000)](https://pypi.python.org/pypi/Flask-Babel)
@@ -13,6 +13,22 @@
 
 The latest documentation is available [here][docs].
 
+# Changelog
+
+## v1.0.0 - 06/02/2020
+
+Starting with version 1, flask-babel has changed to
+[Semantic Versioning][semver].
+
+### Changed
+
+- pytz is an explicit dependency. (#14)
+- pytz.gae, used for Google App Engine, is no longer necessary and has been
+  removed. (#153)
+- Fixed a deprecated werkzeug import (#158).
+- Fix issues switching locales in threaded contexts (#125).
+
 [babel]: https://github.com/python-babel/babel
 [pytz]: https://pypi.python.org/pypi/pytz/
 [docs]: https://pythonhosted.org/Flask-Babel/
+[semver]: https://semver.org/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/.git 
new/Flask-Babel-1.0.0/docs/_themes/.git
--- old/Flask-Babel-0.12.2/docs/_themes/.git    1970-01-01 01:00:00.000000000 
+0100
+++ new/Flask-Babel-1.0.0/docs/_themes/.git     2018-10-25 01:23:38.000000000 
+0200
@@ -0,0 +1 @@
+gitdir: ../../.git/modules/docs/_themes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/.gitignore 
new/Flask-Babel-1.0.0/docs/_themes/.gitignore
--- old/Flask-Babel-0.12.2/docs/_themes/.gitignore      1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/.gitignore       2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,3 @@
+*.pyc
+*.pyo
+.DS_Store
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/LICENSE 
new/Flask-Babel-1.0.0/docs/_themes/LICENSE
--- old/Flask-Babel-0.12.2/docs/_themes/LICENSE 1970-01-01 01:00:00.000000000 
+0100
+++ new/Flask-Babel-1.0.0/docs/_themes/LICENSE  2018-10-25 01:23:38.000000000 
+0200
@@ -0,0 +1,37 @@
+Copyright (c) 2010 by Armin Ronacher.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms of the theme, with or
+without modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the following
+  disclaimer in the documentation and/or other materials provided
+  with the distribution.
+
+* The names of the contributors may not be used to endorse or
+  promote products derived from this software without specific
+  prior written permission.
+
+We kindly ask you to only use these themes in an unmodified manner just
+for Flask and Flask-related products, not for unrelated projects.  If you
+like the visual style and want to use it for your own projects, please
+consider making some larger changes to the themes (such as changing
+font faces, sizes, colors or margins).
+
+THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/README 
new/Flask-Babel-1.0.0/docs/_themes/README
--- old/Flask-Babel-0.12.2/docs/_themes/README  1970-01-01 01:00:00.000000000 
+0100
+++ new/Flask-Babel-1.0.0/docs/_themes/README   2018-10-25 01:23:38.000000000 
+0200
@@ -0,0 +1,31 @@
+Flask Sphinx Styles
+===================
+
+This repository contains sphinx styles for Flask and Flask related
+projects.  To use this style in your Sphinx documentation, follow
+this guide:
+
+1. put this folder as _themes into your docs folder.  Alternatively
+   you can also use git submodules to check out the contents there.
+2. add this to your conf.py:
+
+   sys.path.append(os.path.abspath('_themes'))
+   html_theme_path = ['_themes']
+   html_theme = 'flask'
+
+The following themes exist:
+
+- 'flask' - the standard flask documentation theme for large
+  projects
+- 'flask_small' - small one-page theme.  Intended to be used by
+  very small addon libraries for flask.
+
+The following options exist for the flask_small theme:
+
+   [options]
+   index_logo = ''              filename of a picture in _static
+                                to be used as replacement for the
+                                h1 in the index.rst file.
+   index_logo_height = 120px    height of the index logo
+   github_fork = ''             repository name on github for the
+                                "fork me" badge
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/layout.html 
new/Flask-Babel-1.0.0/docs/_themes/flask/layout.html
--- old/Flask-Babel-0.12.2/docs/_themes/flask/layout.html       1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask/layout.html        2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,25 @@
+{%- extends "basic/layout.html" %}
+{%- block extrahead %}
+  {{ super() }}
+  {% if theme_touch_icon %}
+  <link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 
1) }}" />
+  {% endif %}
+  <link media="only screen and (max-device-width: 480px)" href="{{
+    pathto('_static/small_flask.css', 1) }}" type= "text/css" rel="stylesheet" 
/>
+{% endblock %}
+{%- block relbar2 %}{% endblock %}
+{% block header %}
+  {{ super() }}
+  {% if pagename == 'index' %}
+  <div class=indexwrapper>
+  {% endif %}
+{% endblock %}
+{%- block footer %}
+  <div class="footer">
+    &copy; Copyright {{ copyright }}.
+    Created using <a href="http://sphinx.pocoo.org/";>Sphinx</a>.
+  </div>
+  {% if pagename == 'index' %}
+  </div>
+  {% endif %}
+{%- endblock %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/relations.html 
new/Flask-Babel-1.0.0/docs/_themes/flask/relations.html
--- old/Flask-Babel-0.12.2/docs/_themes/flask/relations.html    1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask/relations.html     2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,19 @@
+<h3>Related Topics</h3>
+<ul>
+  <li><a href="{{ pathto(master_doc) }}">Documentation overview</a><ul>
+  {%- for parent in parents %}
+  <li><a href="{{ parent.link|e }}">{{ parent.title }}</a><ul>
+  {%- endfor %}
+    {%- if prev %}
+      <li>Previous: <a href="{{ prev.link|e }}" title="{{ _('previous chapter')
+        }}">{{ prev.title }}</a></li>
+    {%- endif %}
+    {%- if next %}
+      <li>Next: <a href="{{ next.link|e }}" title="{{ _('next chapter')
+        }}">{{ next.title }}</a></li>
+    {%- endif %}
+  {%- for parent in parents %}
+  </ul></li>
+  {%- endfor %}
+  </ul></li>
+</ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Flask-Babel-0.12.2/docs/_themes/flask/static/flasky.css_t 
new/Flask-Babel-1.0.0/docs/_themes/flask/static/flasky.css_t
--- old/Flask-Babel-0.12.2/docs/_themes/flask/static/flasky.css_t       
1970-01-01 01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask/static/flasky.css_t        
2018-10-25 01:23:38.000000000 +0200
@@ -0,0 +1,395 @@
+/*
+ * flasky.css_t
+ * ~~~~~~~~~~~~
+ *
+ * :copyright: Copyright 2010 by Armin Ronacher.
+ * :license: Flask Design License, see LICENSE for details.
+ */
+
+{% set page_width = '940px' %}
+{% set sidebar_width = '220px' %}
+ 
+@import url("basic.css");
+ 
+/* -- page layout ----------------------------------------------------------- 
*/
+ 
+body {
+    font-family: 'Georgia', serif;
+    font-size: 17px;
+    background-color: white;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    width: {{ page_width }};
+    margin: 30px auto 0 auto;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 {{ sidebar_width }};
+}
+
+div.sphinxsidebar {
+    width: {{ sidebar_width }};
+}
+
+hr {
+    border: 1px solid #B1B4B6;
+}
+ 
+div.body {
+    background-color: #ffffff;
+    color: #3E4349;
+    padding: 0 30px 0 30px;
+}
+
+img.floatingflask {
+    padding: 0 0 10px 10px;
+    float: right;
+}
+ 
+div.footer {
+    width: {{ page_width }};
+    margin: 20px auto 30px auto;
+    font-size: 14px;
+    color: #888;
+    text-align: right;
+}
+
+div.footer a {
+    color: #888;
+}
+
+div.related {
+    display: none;
+}
+ 
+div.sphinxsidebar a {
+    color: #444;
+    text-decoration: none;
+    border-bottom: 1px dotted #999;
+}
+
+div.sphinxsidebar a:hover {
+    border-bottom: 1px solid #999;
+}
+ 
+div.sphinxsidebar {
+    font-size: 14px;
+    line-height: 1.5;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 18px 10px;
+}
+
+div.sphinxsidebarwrapper p.logo {
+    padding: 0 0 20px 0;
+    margin: 0;
+    text-align: center;
+}
+ 
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+    font-family: 'Garamond', 'Georgia', serif;
+    color: #444;
+    font-size: 24px;
+    font-weight: normal;
+    margin: 0 0 5px 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h4 {
+    font-size: 20px;
+}
+ 
+div.sphinxsidebar h3 a {
+    color: #444;
+}
+
+div.sphinxsidebar p.logo a,
+div.sphinxsidebar h3 a,
+div.sphinxsidebar p.logo a:hover,
+div.sphinxsidebar h3 a:hover {
+    border: none;
+}
+ 
+div.sphinxsidebar p {
+    color: #555;
+    margin: 10px 0;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px 0;
+    padding: 0;
+    color: #000;
+}
+ 
+div.sphinxsidebar input {
+    border: 1px solid #ccc;
+    font-family: 'Georgia', serif;
+    font-size: 1em;
+}
+ 
+/* -- body styles ----------------------------------------------------------- 
*/
+ 
+a {
+    color: #004B6B;
+    text-decoration: underline;
+}
+ 
+a:hover {
+    color: #6D4100;
+    text-decoration: underline;
+}
+ 
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Garamond', 'Georgia', serif;
+    font-weight: normal;
+    margin: 30px 0px 10px 0px;
+    padding: 0;
+}
+
+{% if theme_index_logo %}
+div.indexwrapper h1 {
+    text-indent: -999999px;
+    background: url({{ theme_index_logo }}) no-repeat center center;
+    height: {{ theme_index_logo_height }};
+}
+{% endif %}
+ 
+div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
+div.body h2 { font-size: 180%; }
+div.body h3 { font-size: 150%; }
+div.body h4 { font-size: 130%; }
+div.body h5 { font-size: 100%; }
+div.body h6 { font-size: 100%; }
+ 
+a.headerlink {
+    color: #ddd;
+    padding: 0 4px;
+    text-decoration: none;
+}
+ 
+a.headerlink:hover {
+    color: #444;
+    background: #eaeaea;
+}
+ 
+div.body p, div.body dd, div.body li {
+    line-height: 1.4em;
+}
+
+div.admonition {
+    background: #fafafa;
+    margin: 20px -30px;
+    padding: 10px 30px;
+    border-top: 1px solid #ccc;
+    border-bottom: 1px solid #ccc;
+}
+
+div.admonition tt.xref, div.admonition a tt {
+    border-bottom: 1px solid #fafafa;
+}
+
+dd div.admonition {
+    margin-left: -60px;
+    padding-left: 60px;
+}
+
+div.admonition p.admonition-title {
+    font-family: 'Garamond', 'Georgia', serif;
+    font-weight: normal;
+    font-size: 24px;
+    margin: 0 0 10px 0;
+    padding: 0;
+    line-height: 1;
+}
+
+div.admonition p.last {
+    margin-bottom: 0;
+}
+
+div.highlight {
+    background-color: white;
+}
+
+dt:target, .highlight {
+    background: #FAF3E8;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+ 
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+ 
+div.topic {
+    background-color: #eee;
+}
+ 
+p.admonition-title {
+    display: inline;
+}
+ 
+p.admonition-title:after {
+    content: ":";
+}
+
+pre, tt {
+    font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera 
Sans Mono', monospace;
+    font-size: 0.9em;
+}
+
+img.screenshot {
+}
+
+tt.descname, tt.descclassname {
+    font-size: 0.95em;
+}
+
+tt.descname {
+    padding-right: 0.08em;
+}
+
+img.screenshot {
+    -moz-box-shadow: 2px 2px 4px #eee;
+    -webkit-box-shadow: 2px 2px 4px #eee;
+    box-shadow: 2px 2px 4px #eee;
+}
+
+table.docutils {
+    border: 1px solid #888;
+    -moz-box-shadow: 2px 2px 4px #eee;
+    -webkit-box-shadow: 2px 2px 4px #eee;
+    box-shadow: 2px 2px 4px #eee;
+}
+
+table.docutils td, table.docutils th {
+    border: 1px solid #888;
+    padding: 0.25em 0.7em;
+}
+
+table.field-list, table.footnote {
+    border: none;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+
+table.footnote {
+    margin: 15px 0;
+    width: 100%;
+    border: 1px solid #eee;
+    background: #fdfdfd;
+    font-size: 0.9em;
+}
+
+table.footnote + table.footnote {
+    margin-top: -15px;
+    border-top: none;
+}
+
+table.field-list th {
+    padding: 0 0.8em 0 0;
+}
+
+table.field-list td {
+    padding: 0;
+}
+
+table.footnote td.label {
+    width: 0px;
+    padding: 0.3em 0 0.3em 0.5em;
+}
+
+table.footnote td {
+    padding: 0.3em 0.5em;
+}
+
+dl {
+    margin: 0;
+    padding: 0;
+}
+
+dl dd {
+    margin-left: 30px;
+}
+
+blockquote {
+    margin: 0 0 0 30px;
+    padding: 0;
+}
+
+ul, ol {
+    margin: 10px 0 10px 30px;
+    padding: 0;
+}
+ 
+pre {
+    background: #eee;
+    padding: 7px 30px;
+    margin: 15px -30px;
+    line-height: 1.3em;
+}
+
+dl pre, blockquote pre, li pre {
+    margin-left: -60px;
+    padding-left: 60px;
+}
+
+dl dl pre {
+    margin-left: -90px;
+    padding-left: 90px;
+}
+ 
+tt {
+    background-color: #ecf0f3;
+    color: #222;
+    /* padding: 1px 2px; */
+}
+
+tt.xref, a tt {
+    background-color: #FBFBFB;
+    border-bottom: 1px solid white;
+}
+
+a.reference {
+    text-decoration: none;
+    border-bottom: 1px dotted #004B6B;
+}
+
+a.reference:hover {
+    border-bottom: 1px solid #6D4100;
+}
+
+a.footnote-reference {
+    text-decoration: none;
+    font-size: 0.7em;
+    vertical-align: top;
+    border-bottom: 1px dotted #004B6B;
+}
+
+a.footnote-reference:hover {
+    border-bottom: 1px solid #6D4100;
+}
+
+a:hover tt {
+    background: #EEE;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Flask-Babel-0.12.2/docs/_themes/flask/static/small_flask.css 
new/Flask-Babel-1.0.0/docs/_themes/flask/static/small_flask.css
--- old/Flask-Babel-0.12.2/docs/_themes/flask/static/small_flask.css    
1970-01-01 01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask/static/small_flask.css     
2018-10-25 01:23:38.000000000 +0200
@@ -0,0 +1,70 @@
+/*
+ * small_flask.css_t
+ * ~~~~~~~~~~~~~~~~~
+ *
+ * :copyright: Copyright 2010 by Armin Ronacher.
+ * :license: Flask Design License, see LICENSE for details.
+ */
+
+body {
+    margin: 0;
+    padding: 20px 30px;
+}
+
+div.documentwrapper {
+    float: none;
+    background: white;
+}
+
+div.sphinxsidebar {
+    display: block;
+    float: none;
+    width: 102.5%;
+    margin: 50px -30px -20px -30px;
+    padding: 10px 20px;
+    background: #333;
+    color: white;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar a {
+    color: #aaa;
+}
+
+div.sphinxsidebar p.logo {
+    display: none;
+}
+
+div.document {
+    width: 100%;
+    margin: 0;
+}
+
+div.related {
+    display: block;
+    margin: 0;
+    padding: 10px 0 20px 0;
+}
+
+div.related ul,
+div.related ul li {
+    margin: 0;
+    padding: 0;
+}
+
+div.footer {
+    display: none;
+}
+
+div.bodywrapper {
+    margin: 0;
+}
+
+div.body {
+    min-height: 0;
+    padding: 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/theme.conf 
new/Flask-Babel-1.0.0/docs/_themes/flask/theme.conf
--- old/Flask-Babel-0.12.2/docs/_themes/flask/theme.conf        1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask/theme.conf 2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,9 @@
+[theme]
+inherit = basic
+stylesheet = flasky.css
+pygments_style = flask_theme_support.FlaskyStyle
+
+[options]
+index_logo = ''
+index_logo_height = 120px
+touch_icon = 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Flask-Babel-0.12.2/docs/_themes/flask_small/layout.html 
new/Flask-Babel-1.0.0/docs/_themes/flask_small/layout.html
--- old/Flask-Babel-0.12.2/docs/_themes/flask_small/layout.html 1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask_small/layout.html  2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,22 @@
+{% extends "basic/layout.html" %}
+{% block header %}
+  {{ super() }}
+  {% if pagename == 'index' %}
+  <div class=indexwrapper>
+  {% endif %}
+{% endblock %}
+{% block footer %}
+  {% if pagename == 'index' %}
+  </div>
+  {% endif %}
+{% endblock %}
+{# do not display relbars #}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}
+  {% if theme_github_fork %}
+    <a href="http://github.com/{{ theme_github_fork }}"><img style="position: 
fixed; top: 0; right: 0; border: 0;"
+    
src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"; 
alt="Fork me on GitHub" /></a>
+  {% endif %}
+{% endblock %}
+{% block sidebar1 %}{% endblock %}
+{% block sidebar2 %}{% endblock %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Flask-Babel-0.12.2/docs/_themes/flask_small/static/flasky.css_t 
new/Flask-Babel-1.0.0/docs/_themes/flask_small/static/flasky.css_t
--- old/Flask-Babel-0.12.2/docs/_themes/flask_small/static/flasky.css_t 
1970-01-01 01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask_small/static/flasky.css_t  
2018-10-25 01:23:38.000000000 +0200
@@ -0,0 +1,287 @@
+/*
+ * flasky.css_t
+ * ~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- flasky theme based on nature theme.
+ *
+ * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+ 
+@import url("basic.css");
+ 
+/* -- page layout ----------------------------------------------------------- 
*/
+ 
+body {
+    font-family: 'Georgia', serif;
+    font-size: 17px;
+    color: #000;
+    background: white;
+    margin: 0;
+    padding: 0;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 40px auto 0 auto;
+    width: 700px;
+}
+
+hr {
+    border: 1px solid #B1B4B6;
+}
+ 
+div.body {
+    background-color: #ffffff;
+    color: #3E4349;
+    padding: 0 30px 30px 30px;
+}
+
+img.floatingflask {
+    padding: 0 0 10px 10px;
+    float: right;
+}
+ 
+div.footer {
+    text-align: right;
+    color: #888;
+    padding: 10px;
+    font-size: 14px;
+    width: 650px;
+    margin: 0 auto 40px auto;
+}
+ 
+div.footer a {
+    color: #888;
+    text-decoration: underline;
+}
+ 
+div.related {
+    line-height: 32px;
+    color: #888;
+}
+
+div.related ul {
+    padding: 0 0 0 10px;
+}
+ 
+div.related a {
+    color: #444;
+}
+ 
+/* -- body styles ----------------------------------------------------------- 
*/
+ 
+a {
+    color: #004B6B;
+    text-decoration: underline;
+}
+ 
+a:hover {
+    color: #6D4100;
+    text-decoration: underline;
+}
+
+div.body {
+    padding-bottom: 40px; /* saved for footer */
+}
+ 
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Garamond', 'Georgia', serif;
+    font-weight: normal;
+    margin: 30px 0px 10px 0px;
+    padding: 0;
+}
+
+{% if theme_index_logo %}
+div.indexwrapper h1 {
+    text-indent: -999999px;
+    background: url({{ theme_index_logo }}) no-repeat center center;
+    height: {{ theme_index_logo_height }};
+}
+{% endif %}
+ 
+div.body h2 { font-size: 180%; }
+div.body h3 { font-size: 150%; }
+div.body h4 { font-size: 130%; }
+div.body h5 { font-size: 100%; }
+div.body h6 { font-size: 100%; }
+ 
+a.headerlink {
+    color: white;
+    padding: 0 4px;
+    text-decoration: none;
+}
+ 
+a.headerlink:hover {
+    color: #444;
+    background: #eaeaea;
+}
+ 
+div.body p, div.body dd, div.body li {
+    line-height: 1.4em;
+}
+
+div.admonition {
+    background: #fafafa;
+    margin: 20px -30px;
+    padding: 10px 30px;
+    border-top: 1px solid #ccc;
+    border-bottom: 1px solid #ccc;
+}
+
+div.admonition p.admonition-title {
+    font-family: 'Garamond', 'Georgia', serif;
+    font-weight: normal;
+    font-size: 24px;
+    margin: 0 0 10px 0;
+    padding: 0;
+    line-height: 1;
+}
+
+div.admonition p.last {
+    margin-bottom: 0;
+}
+
+div.highlight{
+    background-color: white;
+}
+
+dt:target, .highlight {
+    background: #FAF3E8;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+ 
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+ 
+div.topic {
+    background-color: #eee;
+}
+ 
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+ 
+p.admonition-title {
+    display: inline;
+}
+ 
+p.admonition-title:after {
+    content: ":";
+}
+
+pre, tt {
+    font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera 
Sans Mono', monospace;
+    font-size: 0.85em;
+}
+
+img.screenshot {
+}
+
+tt.descname, tt.descclassname {
+    font-size: 0.95em;
+}
+
+tt.descname {
+    padding-right: 0.08em;
+}
+
+img.screenshot {
+    -moz-box-shadow: 2px 2px 4px #eee;
+    -webkit-box-shadow: 2px 2px 4px #eee;
+    box-shadow: 2px 2px 4px #eee;
+}
+
+table.docutils {
+    border: 1px solid #888;
+    -moz-box-shadow: 2px 2px 4px #eee;
+    -webkit-box-shadow: 2px 2px 4px #eee;
+    box-shadow: 2px 2px 4px #eee;
+}
+
+table.docutils td, table.docutils th {
+    border: 1px solid #888;
+    padding: 0.25em 0.7em;
+}
+
+table.field-list, table.footnote {
+    border: none;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+
+table.footnote {
+    margin: 15px 0;
+    width: 100%;
+    border: 1px solid #eee;
+}
+
+table.field-list th {
+    padding: 0 0.8em 0 0;
+}
+
+table.field-list td {
+    padding: 0;
+}
+
+table.footnote td {
+    padding: 0.5em;
+}
+
+dl {
+    margin: 0;
+    padding: 0;
+}
+
+dl dd {
+    margin-left: 30px;
+}
+ 
+pre {
+    padding: 0;
+    margin: 15px -30px;
+    padding: 8px;
+    line-height: 1.3em;
+    padding: 7px 30px;
+    background: #eee;
+    border-radius: 2px;
+    -moz-border-radius: 2px;
+    -webkit-border-radius: 2px;
+}
+
+dl pre {
+    margin-left: -60px;
+    padding-left: 60px;
+}
+
+tt {
+    background-color: #ecf0f3;
+    color: #222;
+    /* padding: 1px 2px; */
+}
+
+tt.xref, a tt {
+    background-color: #FBFBFB;
+}
+
+a:hover tt {
+    background: #EEE;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Flask-Babel-0.12.2/docs/_themes/flask_small/theme.conf 
new/Flask-Babel-1.0.0/docs/_themes/flask_small/theme.conf
--- old/Flask-Babel-0.12.2/docs/_themes/flask_small/theme.conf  1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask_small/theme.conf   2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,10 @@
+[theme]
+inherit = basic
+stylesheet = flasky.css
+nosidebar = true
+pygments_style = flask_theme_support.FlaskyStyle
+
+[options]
+index_logo = ''
+index_logo_height = 120px
+github_fork = ''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Flask-Babel-0.12.2/docs/_themes/flask_theme_support.py 
new/Flask-Babel-1.0.0/docs/_themes/flask_theme_support.py
--- old/Flask-Babel-0.12.2/docs/_themes/flask_theme_support.py  1970-01-01 
01:00:00.000000000 +0100
+++ new/Flask-Babel-1.0.0/docs/_themes/flask_theme_support.py   2018-10-25 
01:23:38.000000000 +0200
@@ -0,0 +1,86 @@
+# flasky extensions.  flasky pygments style based on tango style
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+class FlaskyStyle(Style):
+    background_color = "#f8f8f8"
+    default_style = ""
+
+    styles = {
+        # No corresponding class for the following:
+        #Text:                     "", # class:  ''
+        Whitespace:                "underline #f8f8f8",      # class: 'w'
+        Error:                     "#a40000 border:#ef2929", # class: 'err'
+        Other:                     "#000000",                # class 'x'
+
+        Comment:                   "italic #8f5902", # class: 'c'
+        Comment.Preproc:           "noitalic",       # class: 'cp'
+
+        Keyword:                   "bold #004461",   # class: 'k'
+        Keyword.Constant:          "bold #004461",   # class: 'kc'
+        Keyword.Declaration:       "bold #004461",   # class: 'kd'
+        Keyword.Namespace:         "bold #004461",   # class: 'kn'
+        Keyword.Pseudo:            "bold #004461",   # class: 'kp'
+        Keyword.Reserved:          "bold #004461",   # class: 'kr'
+        Keyword.Type:              "bold #004461",   # class: 'kt'
+
+        Operator:                  "#582800",   # class: 'o'
+        Operator.Word:             "bold #004461",   # class: 'ow' - like 
keywords
+
+        Punctuation:               "bold #000000",   # class: 'p'
+
+        # because special names such as Name.Class, Name.Function, etc.
+        # are not recognized as such later in the parsing, we choose them
+        # to look the same as ordinary variables.
+        Name:                      "#000000",        # class: 'n'
+        Name.Attribute:            "#c4a000",        # class: 'na' - to be 
revised
+        Name.Builtin:              "#004461",        # class: 'nb'
+        Name.Builtin.Pseudo:       "#3465a4",        # class: 'bp'
+        Name.Class:                "#000000",        # class: 'nc' - to be 
revised
+        Name.Constant:             "#000000",        # class: 'no' - to be 
revised
+        Name.Decorator:            "#888",           # class: 'nd' - to be 
revised
+        Name.Entity:               "#ce5c00",        # class: 'ni'
+        Name.Exception:            "bold #cc0000",   # class: 'ne'
+        Name.Function:             "#000000",        # class: 'nf'
+        Name.Property:             "#000000",        # class: 'py'
+        Name.Label:                "#f57900",        # class: 'nl'
+        Name.Namespace:            "#000000",        # class: 'nn' - to be 
revised
+        Name.Other:                "#000000",        # class: 'nx'
+        Name.Tag:                  "bold #004461",   # class: 'nt' - like a 
keyword
+        Name.Variable:             "#000000",        # class: 'nv' - to be 
revised
+        Name.Variable.Class:       "#000000",        # class: 'vc' - to be 
revised
+        Name.Variable.Global:      "#000000",        # class: 'vg' - to be 
revised
+        Name.Variable.Instance:    "#000000",        # class: 'vi' - to be 
revised
+
+        Number:                    "#990000",        # class: 'm'
+
+        Literal:                   "#000000",        # class: 'l'
+        Literal.Date:              "#000000",        # class: 'ld'
+
+        String:                    "#4e9a06",        # class: 's'
+        String.Backtick:           "#4e9a06",        # class: 'sb'
+        String.Char:               "#4e9a06",        # class: 'sc'
+        String.Doc:                "italic #8f5902", # class: 'sd' - like a 
comment
+        String.Double:             "#4e9a06",        # class: 's2'
+        String.Escape:             "#4e9a06",        # class: 'se'
+        String.Heredoc:            "#4e9a06",        # class: 'sh'
+        String.Interpol:           "#4e9a06",        # class: 'si'
+        String.Other:              "#4e9a06",        # class: 'sx'
+        String.Regex:              "#4e9a06",        # class: 'sr'
+        String.Single:             "#4e9a06",        # class: 's1'
+        String.Symbol:             "#4e9a06",        # class: 'ss'
+
+        Generic:                   "#000000",        # class: 'g'
+        Generic.Deleted:           "#a40000",        # class: 'gd'
+        Generic.Emph:              "italic #000000", # class: 'ge'
+        Generic.Error:             "#ef2929",        # class: 'gr'
+        Generic.Heading:           "bold #000080",   # class: 'gh'
+        Generic.Inserted:          "#00A000",        # class: 'gi'
+        Generic.Output:            "#888",           # class: 'go'
+        Generic.Prompt:            "#745334",        # class: 'gp'
+        Generic.Strong:            "bold #000000",   # class: 'gs'
+        Generic.Subheading:        "bold #800080",   # class: 'gu'
+        Generic.Traceback:         "bold #a40000",   # class: 'gt'
+    }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/conf.py 
new/Flask-Babel-1.0.0/docs/conf.py
--- old/Flask-Babel-0.12.2/docs/conf.py 2018-10-25 17:31:05.000000000 +0200
+++ new/Flask-Babel-1.0.0/docs/conf.py  2020-02-06 17:32:24.000000000 +0100
@@ -49,9 +49,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = '0.12.2'
+version = '1.0.0'
 # The full version, including alpha/beta/rc tags.
-release = '0.12.2'
+release = '1.0.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/index.rst 
new/Flask-Babel-1.0.0/docs/index.rst
--- old/Flask-Babel-0.12.2/docs/index.rst       2018-10-25 17:31:05.000000000 
+0200
+++ new/Flask-Babel-1.0.0/docs/index.rst        2020-02-06 17:20:12.000000000 
+0100
@@ -28,7 +28,7 @@
 Configuration
 -------------
 
-To get started all you need to do is to instanciate a :class:`Babel`
+To get started all you need to do is to instantiate a :class:`Babel`
 object after configuring the application::
 
     from flask import Flask
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/flask_babel/__init__.py 
new/Flask-Babel-1.0.0/flask_babel/__init__.py
--- old/Flask-Babel-0.12.2/flask_babel/__init__.py      2018-10-25 
17:31:05.000000000 +0200
+++ new/Flask-Babel-1.0.0/flask_babel/__init__.py       2020-02-06 
17:20:31.000000000 +0100
@@ -16,14 +16,8 @@
 from flask import current_app, request
 from flask.ctx import has_request_context
 from babel import dates, numbers, support, Locale
-from werkzeug import ImmutableDict
-try:
-    from pytz.gae import pytz
-except ImportError:
-    from pytz import timezone, UTC
-else:
-    timezone = pytz.timezone
-    UTC = pytz.UTC
+from pytz import timezone, UTC
+from werkzeug.datastructures import ImmutableDict
 
 from flask_babel._compat import string_types
 from flask_babel.speaklater import LazyString
@@ -305,6 +299,9 @@
         if hasattr(ctx, key):
             delattr(ctx, key)
 
+    if hasattr(ctx, 'forced_babel_locale'):
+        ctx.babel_locale = ctx.forced_babel_locale
+
 
 @contextmanager
 def force_locale(locale):
@@ -325,20 +322,19 @@
         yield
         return
 
-    babel = current_app.extensions['babel']
-
-    orig_locale_selector_func = babel.locale_selector_func
     orig_attrs = {}
     for key in ('babel_translations', 'babel_locale'):
         orig_attrs[key] = getattr(ctx, key, None)
 
     try:
-        babel.locale_selector_func = lambda: locale
-        for key in orig_attrs:
-            setattr(ctx, key, None)
+        ctx.babel_locale = Locale.parse(locale)
+        ctx.forced_babel_locale = ctx.babel_locale
+        ctx.babel_translations = None
         yield
     finally:
-        babel.locale_selector_func = orig_locale_selector_func
+        if hasattr(ctx, 'forced_babel_locale'):
+            del ctx.forced_babel_locale
+
         for key, value in orig_attrs.items():
             setattr(ctx, key, value)
 
@@ -620,6 +616,21 @@
     return LazyString(gettext, string, **variables)
 
 
+def lazy_ngettext(singular, plural, num, **variables):
+    """Like :func:`ngettext` but the string returned is lazy which means
+    it will be translated when it is used as an actual string.
+
+    Example::
+
+        apples = lazy_ngettext(u'%(num)d Apple', u'%(num)d Apples', 
num=len(apples))
+
+        @app.route('/')
+        def index():
+            return unicode(apples)
+    """
+    return LazyString(ngettext, singular, plural, num, **variables)
+
+
 def lazy_pgettext(context, string, **variables):
     """Like :func:`pgettext` but the string returned is lazy which means
     it will be translated when it is used as an actual string.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/setup.py 
new/Flask-Babel-1.0.0/setup.py
--- old/Flask-Babel-0.12.2/setup.py     2018-10-25 17:36:17.000000000 +0200
+++ new/Flask-Babel-1.0.0/setup.py      2020-02-06 17:32:24.000000000 +0100
@@ -8,7 +8,7 @@
 
 setup(
     name='Flask-Babel',
-    version='0.12.2',
+    version='1.0.0',
     url='http://github.com/python-babel/flask-babel',
     license='BSD',
     author='Armin Ronacher',
@@ -20,6 +20,7 @@
     zip_safe=False,
     platforms='any',
     install_requires=[
+        'pytz',
         'Flask',
         'Babel>=2.3',
         'Jinja2>=2.5'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Flask-Babel-0.12.2/tests/tests.py 
new/Flask-Babel-1.0.0/tests/tests.py
--- old/Flask-Babel-0.12.2/tests/tests.py       2018-10-25 17:31:05.000000000 
+0200
+++ new/Flask-Babel-1.0.0/tests/tests.py        2020-02-06 17:20:31.000000000 
+0100
@@ -6,13 +6,14 @@
 sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
 
 import pickle
+from threading import Thread, Semaphore
 
 import unittest
 from decimal import Decimal
 import flask
 from datetime import datetime, timedelta
 import flask_babel as babel
-from flask_babel import gettext, ngettext, lazy_gettext, get_translations
+from flask_babel import gettext, ngettext, lazy_gettext, lazy_ngettext, 
get_translations
 from babel.support import NullTranslations
 from flask_babel._compat import text_type
 
@@ -204,6 +205,46 @@
                 assert str(babel.get_locale()) == 'en_US'
             assert str(babel.get_locale()) == 'de_DE'
 
+    def test_force_locale_with_threading(self):
+        app = flask.Flask(__name__)
+        b = babel.Babel(app)
+
+        @b.localeselector
+        def select_locale():
+            return 'de_DE'
+
+        semaphore = Semaphore(value=0)
+
+        def first_request():
+            with app.test_request_context():
+                with babel.force_locale('en_US'):
+                    assert str(babel.get_locale()) == 'en_US'
+                    semaphore.acquire()
+
+        thread = Thread(target=first_request)
+        thread.start()
+
+        try:
+            with app.test_request_context():
+                assert str(babel.get_locale()) == 'de_DE'
+        finally:
+            semaphore.release()
+            thread.join()
+
+    def test_refresh_during_force_locale(self):
+        app = flask.Flask(__name__)
+        b = babel.Babel(app)
+
+        @b.localeselector
+        def select_locale():
+            return 'de_DE'
+
+        with app.test_request_context():
+            with babel.force_locale('en_US'):
+                assert str(babel.get_locale()) == 'en_US'
+                babel.refresh()
+                assert str(babel.get_locale()) == 'en_US'
+
 
 class NumberFormattingTestCase(unittest.TestCase):
 
@@ -266,6 +307,18 @@
             assert text_type(yes) == 'Yes'
             assert yes.__html__() == 'Yes'
 
+    def test_lazy_ngettext(self):
+        app = flask.Flask(__name__)
+        babel.Babel(app, default_locale='de_DE')
+        one_apple = lazy_ngettext(u'%(num)s Apple', u'%(num)s Apples', 1)
+        with app.test_request_context():
+            assert text_type(one_apple) == '1 Apfel'
+            assert one_apple.__html__() == '1 Apfel'
+        two_apples = lazy_ngettext(u'%(num)s Apple', u'%(num)s Apples', 2)
+        with app.test_request_context():
+            assert text_type(two_apples) == u'2 Äpfel'
+            assert two_apples.__html__() == u'2 Äpfel'
+
     def test_list_translations(self):
         app = flask.Flask(__name__)
         b = babel.Babel(app, default_locale='de_DE')


Reply via email to