Browse Source

Add a language selector in the navigation bar

Gu1 11 years ago
parent
commit
b7232bed2a

+ 6 - 1
AUTHORS

@@ -27,7 +27,12 @@
     Silk icon set
     Mark James
     http://www.famfamfam.com/lab/icons/silk/
-    Licensed under the Creative Commons Attribution 3.0 License
+    Licensed under the Creative Commons Attribution 2.5/3.0 License
+
+    Flag icons
+    Copyright (c) 2013 Go Squared Ltd. http://www.gosquared.com/
+    https://www.gosquared.com/resources/flag-icons/
+    Licensed under the MIT License
 
     Deja Vu font
     Copyright (c) 2003, Bitstream Inc.

+ 2 - 0
ffdnispdb/__init__.py

@@ -15,6 +15,8 @@ cache = Cache()
 mail = Mail()
 
 def get_locale():
+    if request.cookies.get('locale') in current_app.config['LANGUAGES'].keys():
+        return request.cookies.get('locale')
     return request.accept_languages.best_match(current_app.config['LANGUAGES'].keys())
 
 

+ 5 - 0
ffdnispdb/constants.py

@@ -21,3 +21,8 @@ STEPS_LABELS = {
     6: 'warning',
     7: 'success'
 }
+
+LOCALES_FLAGS = {
+    'en': 'GB',
+    'fr': 'FR',
+}

+ 2 - 2
ffdnispdb/default_settings.py

@@ -6,8 +6,8 @@ CRAWLER_MAX_CACHE_TIME = 60*60*24*14 # 2 week
 CRAWLER_DEFAULT_CACHE_TIME = 60*60*12 # 12 hours
 SYSTEM_TIME_ZONE = 'Europe/Paris'
 LANGUAGES = {
-    'en': 'English',
-    'fr': 'Français',
+    'en': u'English',
+    'fr': u'Français',
 }
 ISP_FORM_GEOJSON_MAX_SIZE = 256*1024
 ISP_FORM_GEOJSON_MAX_SIZE_TOTAL = 1024*1024

+ 262 - 0
ffdnispdb/static/css/flags.css

@@ -0,0 +1,262 @@
+.flag { background: url('../img/flags.png') no-repeat top left; width: 16px; height: 16px;  }
+i.flag { display: inline-block; vertical-align: text-top; }
+.flag.flag-_abkhazia { background-position: 0px 0px;  }
+.flag.flag-AD { background-position: -19px 0px;  }
+.flag.flag-AE { background-position: -38px 0px;  }
+.flag.flag-AF { background-position: -57px 0px;  }
+.flag.flag-AG { background-position: -76px 0px;  }
+.flag.flag-AI { background-position: -95px 0px;  }
+.flag.flag-AL { background-position: -114px 0px;  }
+.flag.flag-AM { background-position: -133px 0px;  }
+.flag.flag-AN { background-position: -152px 0px;  }
+.flag.flag-AO { background-position: -171px 0px;  }
+.flag.flag-AQ { background-position: -190px 0px;  }
+.flag.flag-AR { background-position: -209px 0px;  }
+.flag.flag-AS { background-position: -228px 0px;  }
+.flag.flag-AT { background-position: -247px 0px;  }
+.flag.flag-AU { background-position: -266px 0px;  }
+.flag.flag-AW { background-position: -285px 0px;  }
+.flag.flag-AX { background-position: -304px 0px;  }
+.flag.flag-AZ { background-position: -323px 0px;  }
+.flag.flag-BA { background-position: -342px 0px;  }
+.flag.flag-_basque-country { background-position: -361px 0px;  }
+.flag.flag-BB { background-position: -380px 0px;  }
+.flag.flag-BD { background-position: -399px 0px;  }
+.flag.flag-BE { background-position: -418px 0px;  }
+.flag.flag-BF { background-position: -437px 0px;  }
+.flag.flag-BG { background-position: -456px 0px;  }
+.flag.flag-BH { background-position: -475px 0px;  }
+.flag.flag-BI { background-position: -494px 0px;  }
+.flag.flag-BJ { background-position: -513px 0px;  }
+.flag.flag-BL { background-position: -532px 0px;  }
+.flag.flag-BM { background-position: -551px 0px;  }
+.flag.flag-BN { background-position: -570px 0px;  }
+.flag.flag-BO { background-position: -589px 0px;  }
+.flag.flag-BR { background-position: -608px 0px;  }
+.flag.flag-_british-antarctic-territory { background-position: -627px 0px;  }
+.flag.flag-BS { background-position: -646px 0px;  }
+.flag.flag-BT { background-position: -665px 0px;  }
+.flag.flag-BW { background-position: -684px 0px;  }
+.flag.flag-BY { background-position: -703px 0px;  }
+.flag.flag-BZ { background-position: -722px 0px;  }
+.flag.flag-CA { background-position: -741px 0px;  }
+.flag.flag-CC { background-position: -760px 0px;  }
+.flag.flag-CD { background-position: -779px 0px;  }
+.flag.flag-CF { background-position: -798px 0px;  }
+.flag.flag-CG { background-position: -817px 0px;  }
+.flag.flag-CH { background-position: -836px 0px;  }
+.flag.flag-CI { background-position: -855px 0px;  }
+.flag.flag-CK { background-position: -874px 0px;  }
+.flag.flag-CL { background-position: -893px 0px;  }
+.flag.flag-CM { background-position: -912px 0px;  }
+.flag.flag-CN { background-position: -931px 0px;  }
+.flag.flag-CO { background-position: -950px 0px;  }
+.flag.flag-_commonwealth { background-position: -969px 0px;  }
+.flag.flag-CR { background-position: -988px 0px;  }
+.flag.flag-CU { background-position: -1007px 0px;  }
+.flag.flag-CV { background-position: -1026px 0px;  }
+.flag.flag-CW { background-position: -1045px 0px;  }
+.flag.flag-CX { background-position: -1064px 0px;  }
+.flag.flag-CY { background-position: -1083px 0px;  }
+.flag.flag-CZ { background-position: -1102px 0px;  }
+.flag.flag-DE { background-position: -1121px 0px;  }
+.flag.flag-DJ { background-position: -1140px 0px;  }
+.flag.flag-DK { background-position: -1159px 0px;  }
+.flag.flag-DM { background-position: -1178px 0px;  }
+.flag.flag-DO { background-position: -1197px 0px;  }
+.flag.flag-DZ { background-position: -1216px 0px;  }
+.flag.flag-EC { background-position: -1235px 0px;  }
+.flag.flag-EE { background-position: -1254px 0px;  }
+.flag.flag-EG { background-position: -1273px 0px;  }
+.flag.flag-EH { background-position: -1292px 0px;  }
+.flag.flag-_england { background-position: -1311px 0px;  }
+.flag.flag-ER { background-position: -1330px 0px;  }
+.flag.flag-ES { background-position: -1349px 0px;  }
+.flag.flag-ET { background-position: -1368px 0px;  }
+.flag.flag-EU { background-position: -1387px 0px;  }
+.flag.flag-FI { background-position: -1406px 0px;  }
+.flag.flag-FJ { background-position: -1425px 0px;  }
+.flag.flag-FK { background-position: -1444px 0px;  }
+.flag.flag-FM { background-position: -1463px 0px;  }
+.flag.flag-FO { background-position: -1482px 0px;  }
+.flag.flag-FR { background-position: -1501px 0px;  }
+.flag.flag-GA { background-position: -1520px 0px;  }
+.flag.flag-GB { background-position: -1539px 0px;  }
+.flag.flag-GD { background-position: -1558px 0px;  }
+.flag.flag-GE { background-position: -1577px 0px;  }
+.flag.flag-GG { background-position: -1596px 0px;  }
+.flag.flag-GH { background-position: -1615px 0px;  }
+.flag.flag-GI { background-position: -1634px 0px;  }
+.flag.flag-GL { background-position: -1653px 0px;  }
+.flag.flag-GM { background-position: -1672px 0px;  }
+.flag.flag-GN { background-position: -1691px 0px;  }
+.flag.flag-_gosquared { background-position: -1710px 0px;  }
+.flag.flag-GQ { background-position: -1729px 0px;  }
+.flag.flag-GR { background-position: -1748px 0px;  }
+.flag.flag-GS { background-position: -1767px 0px;  }
+.flag.flag-GT { background-position: -1786px 0px;  }
+.flag.flag-GU { background-position: -1805px 0px;  }
+.flag.flag-GW { background-position: -1824px 0px;  }
+.flag.flag-GY { background-position: -1843px 0px;  }
+.flag.flag-HK { background-position: -1862px 0px;  }
+.flag.flag-HN { background-position: -1881px 0px;  }
+.flag.flag-HR { background-position: -1900px 0px;  }
+.flag.flag-HT { background-position: -1919px 0px;  }
+.flag.flag-HU { background-position: -1938px 0px;  }
+.flag.flag-IC { background-position: -1957px 0px;  }
+.flag.flag-ID { background-position: -1976px 0px;  }
+.flag.flag-IE { background-position: -1995px 0px;  }
+.flag.flag-IL { background-position: -2014px 0px;  }
+.flag.flag-IM { background-position: -2033px 0px;  }
+.flag.flag-IN { background-position: -2052px 0px;  }
+.flag.flag-IQ { background-position: -2071px 0px;  }
+.flag.flag-IR { background-position: -2090px 0px;  }
+.flag.flag-IS { background-position: -2109px 0px;  }
+.flag.flag-IT { background-position: -2128px 0px;  }
+.flag.flag-JE { background-position: -2147px 0px;  }
+.flag.flag-JM { background-position: -2166px 0px;  }
+.flag.flag-JO { background-position: -2185px 0px;  }
+.flag.flag-JP { background-position: -2204px 0px;  }
+.flag.flag-KE { background-position: -2223px 0px;  }
+.flag.flag-KG { background-position: -2242px 0px;  }
+.flag.flag-KH { background-position: -2261px 0px;  }
+.flag.flag-KI { background-position: -2280px 0px;  }
+.flag.flag-KM { background-position: -2299px 0px;  }
+.flag.flag-KN { background-position: -2318px 0px;  }
+.flag.flag-_kosovo { background-position: -2337px 0px;  }
+.flag.flag-KP { background-position: -2356px 0px;  }
+.flag.flag-KR { background-position: -2375px 0px;  }
+.flag.flag-KW { background-position: -2394px 0px;  }
+.flag.flag-KY { background-position: -2413px 0px;  }
+.flag.flag-KZ { background-position: -2432px 0px;  }
+.flag.flag-LA { background-position: -2451px 0px;  }
+.flag.flag-LB { background-position: -2470px 0px;  }
+.flag.flag-LC { background-position: -2489px 0px;  }
+.flag.flag-LI { background-position: -2508px 0px;  }
+.flag.flag-LK { background-position: -2527px 0px;  }
+.flag.flag-LR { background-position: -2546px 0px;  }
+.flag.flag-LS { background-position: -2565px 0px;  }
+.flag.flag-LT { background-position: -2584px 0px;  }
+.flag.flag-LU { background-position: -2603px 0px;  }
+.flag.flag-LV { background-position: -2622px 0px;  }
+.flag.flag-LY { background-position: -2641px 0px;  }
+.flag.flag-MA { background-position: -2660px 0px;  }
+.flag.flag-_mars { background-position: -2679px 0px;  }
+.flag.flag-MC { background-position: -2698px 0px;  }
+.flag.flag-MD { background-position: -2717px 0px;  }
+.flag.flag-ME { background-position: -2736px 0px;  }
+.flag.flag-MF { background-position: -2755px 0px;  }
+.flag.flag-MG { background-position: -2774px 0px;  }
+.flag.flag-MH { background-position: -2793px 0px;  }
+.flag.flag-MK { background-position: -2812px 0px;  }
+.flag.flag-ML { background-position: -2831px 0px;  }
+.flag.flag-MM { background-position: -2850px 0px;  }
+.flag.flag-MN { background-position: -2869px 0px;  }
+.flag.flag-MO { background-position: -2888px 0px;  }
+.flag.flag-MP { background-position: -2907px 0px;  }
+.flag.flag-MQ { background-position: -2926px 0px;  }
+.flag.flag-MR { background-position: -2945px 0px;  }
+.flag.flag-MS { background-position: -2964px 0px;  }
+.flag.flag-MT { background-position: -2983px 0px;  }
+.flag.flag-MU { background-position: -3002px 0px;  }
+.flag.flag-MV { background-position: -3021px 0px;  }
+.flag.flag-MW { background-position: -3040px 0px;  }
+.flag.flag-MX { background-position: -3059px 0px;  }
+.flag.flag-MY { background-position: -3078px 0px;  }
+.flag.flag-MZ { background-position: -3097px 0px;  }
+.flag.flag-NA { background-position: -3116px 0px;  }
+.flag.flag-_nagorno-karabakh { background-position: -3135px 0px;  }
+.flag.flag-_nato { background-position: -3154px 0px;  }
+.flag.flag-NC { background-position: -3173px 0px;  }
+.flag.flag-NE { background-position: -3192px 0px;  }
+.flag.flag-NF { background-position: -3211px 0px;  }
+.flag.flag-NG { background-position: -3230px 0px;  }
+.flag.flag-NI { background-position: -3249px 0px;  }
+.flag.flag-NL { background-position: -3268px 0px;  }
+.flag.flag-NO { background-position: -3287px 0px;  }
+.flag.flag-_northern-cyprus { background-position: -3306px 0px;  }
+.flag.flag-NP { background-position: -3325px 0px;  }
+.flag.flag-NR { background-position: -3344px 0px;  }
+.flag.flag-NU { background-position: -3363px 0px;  }
+.flag.flag-NZ { background-position: -3382px 0px;  }
+.flag.flag-_olympics { background-position: -3401px 0px;  }
+.flag.flag-OM { background-position: -3420px 0px;  }
+.flag.flag-PA { background-position: -3439px 0px;  }
+.flag.flag-PE { background-position: -3458px 0px;  }
+.flag.flag-PF { background-position: -3477px 0px;  }
+.flag.flag-PG { background-position: -3496px 0px;  }
+.flag.flag-PH { background-position: -3515px 0px;  }
+.flag.flag-PK { background-position: -3534px 0px;  }
+.flag.flag-PL { background-position: -3553px 0px;  }
+.flag.flag-PN { background-position: -3572px 0px;  }
+.flag.flag-PR { background-position: -3591px 0px;  }
+.flag.flag-PS { background-position: -3610px 0px;  }
+.flag.flag-PT { background-position: -3629px 0px;  }
+.flag.flag-PW { background-position: -3648px 0px;  }
+.flag.flag-PY { background-position: -3667px 0px;  }
+.flag.flag-QA { background-position: -3686px 0px;  }
+.flag.flag-_red-cross { background-position: -3705px 0px;  }
+.flag.flag-RO { background-position: -3724px 0px;  }
+.flag.flag-RS { background-position: -3743px 0px;  }
+.flag.flag-RU { background-position: -3762px 0px;  }
+.flag.flag-RW { background-position: -3781px 0px;  }
+.flag.flag-SA { background-position: -3800px 0px;  }
+.flag.flag-SB { background-position: -3819px 0px;  }
+.flag.flag-SC { background-position: -3838px 0px;  }
+.flag.flag-_scotland { background-position: -3857px 0px;  }
+.flag.flag-SD { background-position: -3876px 0px;  }
+.flag.flag-SE { background-position: -3895px 0px;  }
+.flag.flag-SG { background-position: -3914px 0px;  }
+.flag.flag-SH { background-position: -3933px 0px;  }
+.flag.flag-SI { background-position: -3952px 0px;  }
+.flag.flag-SK { background-position: -3971px 0px;  }
+.flag.flag-SL { background-position: -3990px 0px;  }
+.flag.flag-SM { background-position: -4009px 0px;  }
+.flag.flag-SN { background-position: -4028px 0px;  }
+.flag.flag-SO { background-position: -4047px 0px;  }
+.flag.flag-_somaliland { background-position: -4066px 0px;  }
+.flag.flag-_south-ossetia { background-position: -4085px 0px;  }
+.flag.flag-SR { background-position: -4104px 0px;  }
+.flag.flag-SS { background-position: -4123px 0px;  }
+.flag.flag-ST { background-position: -4142px 0px;  }
+.flag.flag-SV { background-position: -4161px 0px;  }
+.flag.flag-SY { background-position: -4180px 0px;  }
+.flag.flag-SZ { background-position: -4199px 0px;  }
+.flag.flag-TC { background-position: -4218px 0px;  }
+.flag.flag-TD { background-position: -4237px 0px;  }
+.flag.flag-TF { background-position: -4256px 0px;  }
+.flag.flag-TG { background-position: -4275px 0px;  }
+.flag.flag-TH { background-position: -4294px 0px;  }
+.flag.flag-TJ { background-position: -4313px 0px;  }
+.flag.flag-TK { background-position: -4332px 0px;  }
+.flag.flag-TL { background-position: -4351px 0px;  }
+.flag.flag-TM { background-position: -4370px 0px;  }
+.flag.flag-TN { background-position: -4389px 0px;  }
+.flag.flag-TO { background-position: -4408px 0px;  }
+.flag.flag-TR { background-position: -4427px 0px;  }
+.flag.flag-TT { background-position: -4446px 0px;  }
+.flag.flag-TV { background-position: -4465px 0px;  }
+.flag.flag-TW { background-position: -4484px 0px;  }
+.flag.flag-TZ { background-position: -4503px 0px;  }
+.flag.flag-UA { background-position: -4522px 0px;  }
+.flag.flag-UG { background-position: -4541px 0px;  }
+.flag.flag-_united-nations { background-position: -4560px 0px;  }
+.flag.flag-_unknown { background-position: -4579px 0px;  }
+.flag.flag-US { background-position: -4598px 0px;  }
+.flag.flag-UY { background-position: -4617px 0px;  }
+.flag.flag-UZ { background-position: -4636px 0px;  }
+.flag.flag-VA { background-position: -4655px 0px;  }
+.flag.flag-VC { background-position: -4674px 0px;  }
+.flag.flag-VE { background-position: -4693px 0px;  }
+.flag.flag-VG { background-position: -4712px 0px;  }
+.flag.flag-VI { background-position: -4731px 0px;  }
+.flag.flag-VN { background-position: -4750px 0px;  }
+.flag.flag-VU { background-position: -4769px 0px;  }
+.flag.flag-_wales { background-position: -4788px 0px;  }
+.flag.flag-WF { background-position: -4807px 0px;  }
+.flag.flag-WS { background-position: -4826px 0px;  }
+.flag.flag-YE { background-position: -4845px 0px;  }
+.flag.flag-YT { background-position: -4864px 0px;  }
+.flag.flag-ZA { background-position: -4883px 0px;  }
+.flag.flag-ZM { background-position: -4902px 0px;  }
+.flag.flag-ZW { background-position: -4921px 0px;  }

+ 36 - 0
ffdnispdb/static/css/style.css

@@ -191,6 +191,42 @@ input#search-input {
     }
 }
 
+.navbar #locale-selector {
+    float: right;
+    height: 36px;
+    padding-top: 4px;
+    cursor: pointer;
+    opacity: 0.8;
+    transition-duration: 200ms;
+}
+
+.navbar #locale-selector .flag {
+    margin: 0 auto;
+}
+
+.navbar #locale-selector:hover {
+    opacity: 1;
+    transition-duration: 200ms;
+}
+
+.navbar #locale-selector .locale-name {
+    color: #f8f8f8;
+    text-align: center;
+    font-weight: bold;
+    line-height: 16px;
+}
+
+@media (max-width: 979px) {
+    .navbar-search:before {
+        top: 18px;
+        left: 22px;
+    }
+
+    .navbar #locale-selector, .navbar .locale-divider {
+        display: none;
+    }
+}
+
 
 /*
  * Sticky footer

BIN
ffdnispdb/static/img/flags.png


+ 20 - 1
ffdnispdb/templates/layout.html

@@ -17,6 +17,7 @@
     <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/jquery.ui.all.css') }}">
     <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/bootstrap-select.min.css') }}">
     <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/leaflet.css') }}">
+    <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/flags.css') }}">
     <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/style.css') }}">
     {%- endblock %}
   </head>
@@ -32,6 +33,11 @@
         </a>
         <a class="brand" href="/"><span id="ffdn-header"><span>F</span><span>F</span><span>D</span><span>N</span></span> Database</a>
         <div class="nav-collapse collapse">
+          <div id="locale-selector" data-target="#locale-modal" data-toggle="modal">
+            <div class="flag flag-{{ current_locale()|locale_flag }}"></div>
+            <div class="locale-name">{{ current_locale() }}</div>
+          </div>
+          <div class="pull-right divider-vertical locale-divider"></div>
           <form method="get" action="/search" class="navbar-search pull-right">
             <input type="text" id="search-input" class="search-query input-medium" name="q" placeholder="{{ _("Search") }}" />
           </form>
@@ -46,6 +52,19 @@
       </div>
     </div>
   </div>
+  <div id="locale-modal" class="modal hide" data-remote="{{ url_for('ispdb.locale_selector') }}">
+    <form method="post" action="{{ url_for('ispdb.locale_selector') }}">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3>{{ _("Choose your language") }}</h3>
+      </div>
+      <div class="modal-body"></div>
+      <div class="modal-footer">
+        <button class="btn" data-dismiss="modal" aria-hidden="true">{{ _("Close") }}</button>
+        <button class="btn btn-primary">{{ _("Confirm") }}</button>
+      </div>
+    </form>
+  </div>
 
   <div id="main-container" class="container">
     {%- with messages = get_flashed_messages(with_categories="true") -%}
@@ -87,7 +106,7 @@
 <script type="text/javascript" src="{{ url_for('static', filename='js/bootstrap.js') }}"></script>
 <script type="text/javascript" src="{{ url_for('static', filename='js/bootstrap-select.min.js') }}"></script>
 <script type="text/javascript" src="{{ url_for('static', filename='js/leaflet.js') }}"></script>
-<script type="text/javascript" src="{{ url_for('.site_js') }}"></script>
+<script type="text/javascript" src="{{ url_for('ispdb.site_js') }}"></script>
 {%- endblock %}
 </body>
 

+ 6 - 0
ffdnispdb/templates/locale_selector.html

@@ -0,0 +1,6 @@
+    {% for l in locales %}
+      <label class="radio">
+        <input type="radio" name="locale" value="{{ l.0 }}">
+        <i class="flag flag-{{ l.1 }}"></i> {{ l.2 }}
+      </label>
+    {% endfor %}

BIN
ffdnispdb/translations/fr/LC_MESSAGES/messages.mo


+ 20 - 11
ffdnispdb/translations/fr/LC_MESSAGES/messages.po

@@ -6,8 +6,8 @@
 msgid ""
 msgstr ""
 "Report-Msgid-Bugs-To: gu1@cafai.fr\n"
-"POT-Creation-Date: 2013-12-21 15:25+0100\n"
-"PO-Revision-Date: 2013-12-21 15:25+0100\n"
+"POT-Creation-Date: 2013-12-22 10:01+0100\n"
+"PO-Revision-Date: 2013-12-22 10:02+0100\n"
 "Last-Translator: Gu1 <gu1@cafai.fr>\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "MIME-Version: 1.0\n"
@@ -443,27 +443,40 @@ msgstr ""
 msgid "Add my project"
 msgstr "Ajouter mon projet"
 
-#: ffdnispdb/templates/layout.html:36
+#: ffdnispdb/templates/layout.html:42
 #: ffdnispdb/templates/search_results.html:8
 msgid "Search"
 msgstr "Chercher"
 
-#: ffdnispdb/templates/layout.html:39
+#: ffdnispdb/templates/layout.html:45
 msgid "Home"
 msgstr "Accueil"
 
-#: ffdnispdb/templates/layout.html:40 ffdnispdb/templates/project_list.html:3
+#: ffdnispdb/templates/layout.html:46 ffdnispdb/templates/project_list.html:3
 msgid "Project List"
 msgstr "Liste des projet"
 
-#: ffdnispdb/templates/layout.html:41
+#: ffdnispdb/templates/layout.html:47
 msgid "Format"
 msgstr "Format"
 
-#: ffdnispdb/templates/layout.html:42
+#: ffdnispdb/templates/layout.html:48
 msgid "API"
 msgstr "API"
 
+#: ffdnispdb/templates/layout.html:59
+msgid "Choose your language"
+msgstr "Choisissez votre langue"
+
+#: ffdnispdb/templates/layout.html:63
+msgid "Close"
+msgstr "Fermer"
+
+#: ffdnispdb/templates/layout.html:64
+#: ffdnispdb/templates/validator_generic.html:82
+msgid "Confirm"
+msgstr "Confirmer"
+
 #: ffdnispdb/templates/map_popup.html:15
 #: ffdnispdb/templates/project_detail.html:50
 msgid "email"
@@ -566,7 +579,3 @@ msgstr "Trouvez des FAI proche de vous"
 #: ffdnispdb/templates/validator_generic.html:81
 msgid "Retry"
 msgstr "Réessayer"
-
-#: ffdnispdb/templates/validator_generic.html:82
-msgid "Confirm"
-msgstr "Confirmer"

+ 22 - 0
ffdnispdb/views.py

@@ -417,6 +417,20 @@ def site_js():
     return r
 
 
+@ispdb.route('/locale_selector', methods=['GET', 'POST'])
+def locale_selector():
+    l = current_app.config['LANGUAGES']
+
+    if request.method == 'POST' and request.form.get('locale') in l:
+        resp = redirect(url_for('.home'))
+        resp.set_cookie('locale', request.form['locale'])
+        return resp
+
+    return render_template('locale_selector.html', locales=(
+        (code, LOCALES_FLAGS[code], name) for code, name in l.iteritems()
+    ))
+
+
 #------
 # Filters
 
@@ -435,3 +449,11 @@ def stepname(step):
 def json_filter(v):
     return Markup(json.dumps(unicode(v)))
 
+@ispdb.app_template_filter('locale_flag')
+def locale_flag(l):
+    return LOCALES_FLAGS.get(str(l), '_unknown')
+
+@ispdb.app_template_global('current_locale')
+def current_locale():
+    return get_locale()
+