diff --git a/backend/app.py b/backend/app.py index caaff381..ff3def93 100755 --- a/backend/app.py +++ b/backend/app.py @@ -3,7 +3,7 @@ from pypnusershub.login_manager import login_manager from routes import main as main_blueprint from flask import Flask -from flask_babel import Babel, get_locale +from flask_babel import Babel from flask_cors import CORS from api import api import config @@ -56,6 +56,10 @@ def __call__(self, environ, start_response): # app.wsgi_app = ReverseProxied(app.wsgi_app) CORS(app, supports_credentials=True) +@babel.localeselector +def determine_locale(): + return utils.getLocale() + app.register_blueprint(main_blueprint) app.register_blueprint(api) app.register_blueprint(custom_app.custom) @@ -71,9 +75,9 @@ def __call__(self, environ, start_response): def inject_to_tpl(): custom = custom_app.custom_inject_to_tpl() data = dict( - dbconf=utils.getDbConf(), - debug=app.debug, - locale=get_locale(), + dbconf=utils.getDbConf(), + debug=app.debug, + locale=utils.getLocale(), isMultiObservatories=utils.isMultiObservatories, getThumborUrl=utils.getThumborUrl, getCustomTpl=utils.getCustomTpl, diff --git a/backend/migrations/versions/d7fd422e1054_translations.py b/backend/migrations/versions/d7fd422e1054_translations.py index 8540773a..6a17604d 100644 --- a/backend/migrations/versions/d7fd422e1054_translations.py +++ b/backend/migrations/versions/d7fd422e1054_translations.py @@ -339,4 +339,4 @@ def downgrade(): op.drop_table("dico_stheme_translation", schema="geopaysages") op.drop_table("communes_translation", schema="geopaysages") op.drop_table("lang", schema="geopaysages") - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file diff --git a/backend/models.py b/backend/models.py index 252f4f37..e38ffcfa 100644 --- a/backend/models.py +++ b/backend/models.py @@ -2,7 +2,7 @@ from geoalchemy2.types import Geometry import geoalchemy2.functions as geo_funcs from geoalchemy2.shape import to_shape -from marshmallow import fields +from marshmallow import fields, post_dump from marshmallow_enum import EnumField from shapely.geometry import mapping @@ -85,7 +85,6 @@ class ObservatoryTranslation(db.Model): "Lang", primaryjoin="ObservatoryTranslation.lang_id == Lang.id" ) - class TSite(db.Model): __tablename__ = "t_site" __table_args__ = {"schema": "geopaysages"} @@ -381,6 +380,16 @@ def _deserialize(self, value, attr, data): # schemas# +def get_translated_data(self, data): + if not self.lang_id: + return data + for field in self.translatable_fields: + for translation in data["translations"]: + if translation["lang_id"] == self.lang_id: + data[field] = translation[field] + return data + + class LangSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Lang @@ -430,6 +439,16 @@ class Meta: class DicoThemeSchema(ma.SQLAlchemyAutoSchema): translations = ma.Nested(DicoThemeTranslationSchema, many=True) + translatable_fields = DicoThemeTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + return get_translated_data(self, data) + class Meta: model = DicoTheme fields = ("id_theme", "icon", "translations") @@ -438,6 +457,16 @@ class Meta: class DicoSthemeSchema(ma.SQLAlchemyAutoSchema): translations = ma.Nested(DicoSthemeTranslationSchema, many=True) + translatable_fields = DicoSthemeTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + return get_translated_data(self, data) + class Meta: model = DicoStheme include_relationships = True @@ -468,8 +497,8 @@ class Meta: class CorSthemeThemeSchema(ma.SQLAlchemyAutoSchema): - dico_theme = ma.Nested(DicoThemeSchema, only=["id_theme", "name_theme"]) - dico_stheme = ma.Nested(DicoSthemeSchema, only=["id_stheme", "name_stheme"]) + dico_theme = ma.Nested(DicoThemeSchema, only=["id_theme"]) + dico_stheme = ma.Nested(DicoSthemeSchema, only=["id_stheme"]) class Meta: fields = ("dico_theme", "dico_stheme") @@ -481,6 +510,16 @@ class ObservatorySchema(ma.SQLAlchemyAutoSchema): comparator = EnumField(ComparatorEnum, by_value=True) geom = fields.Method("geomSerialize") + translatable_fields = ObservatoryTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + return get_translated_data(self, data) + @staticmethod def geomSerialize(obj): if obj.geom is None: @@ -494,7 +533,21 @@ class Meta: include_relationships = True -class ObservatorySchemaFull(ObservatorySchema): +class ObservatorySchemaFull(ma.SQLAlchemyAutoSchema): + translations = ma.Nested(ObservatoryTranslationSchema, many=True) + comparator = EnumField(ComparatorEnum, by_value=True) + geom = fields.Method("geomSerialize") + + translatable_fields = ObservatoryTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + return get_translated_data(self, data) + @staticmethod def geomSerialize(obj): if obj.geom is None: @@ -503,8 +556,21 @@ def geomSerialize(obj): return p.wkt -class ObservatorySchemaLite(ObservatorySchema): +class ObservatorySchemaLite(ma.SQLAlchemyAutoSchema): + translations = ma.Nested(ObservatoryTranslationSchema, many=True) comparator = EnumField(ComparatorEnum, by_value=False) + geom = fields.Method("geomSerialize") + + translatable_fields = ObservatoryTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + print("translate_fields", self.lang_id) + return get_translated_data(self, data) @staticmethod def geomSerialize(obj): @@ -513,17 +579,28 @@ def geomSerialize(obj): p = to_shape(obj.geom) s = p.simplify(0.001, preserve_topology=True) return s.wkt + + class Meta: + model = Observatory + include_relationships = True class TSiteSchema(ma.SQLAlchemyAutoSchema): translations = ma.Nested(TSiteTranslationSchema, many=True) geom = GeographySerializationField(attribute="geom") - observatory = ma.Nested( - ObservatorySchema, - only=["id", "translations", "ref", "color", "logo"], - ) + observatory = ma.Nested(ObservatorySchema, only=["id", "ref", "color", "logo"]) main_theme = ma.Nested(DicoThemeSchema, only=["id_theme", "translations", "icon"]) + translatable_fields = TSiteTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + return get_translated_data(self, data) + class Meta: model = TSite include_fk = True @@ -533,6 +610,16 @@ class Meta: class CommunesSchema(ma.SQLAlchemyAutoSchema): translations = ma.Nested(CommunesTranslationSchema, many=True) + translatable_fields = CommunesTranslationSchema.Meta.fields + + def __init__(self, *args, **kwargs): + self.lang_id = kwargs.pop("locale", None) + super().__init__(*args, **kwargs) + + @post_dump + def translate_fields(self, data, **kwargs): + return get_translated_data(self, data) + class Meta: model = Communes include_relationships = True diff --git a/backend/routes.py b/backend/routes.py index 19b7b6db..6b56374e 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -1,11 +1,11 @@ -from flask import render_template, Blueprint, abort +from flask import render_template, Blueprint, abort, request, redirect, url_for +from functools import wraps from sqlalchemy import text from sqlalchemy.sql.expression import desc import models import utils from config import COMPARATOR_VERSION from datetime import datetime -from flask_babel import format_datetime import math import os @@ -13,19 +13,47 @@ from env import db -dicotheme_schema = models.DicoThemeSchema(many=True) -dicostheme_schema = models.DicoSthemeSchema(many=True) photo_schema = models.TPhotoSchema(many=True) -observatory_schema_lite = models.ObservatorySchemaLite(many=True) -site_schema = models.TSiteSchema(many=True) themes_sthemes_schema = models.CorSthemeThemeSchema(many=True) -communes_schema = models.CommunesSchema(many=True) + + +def localeGuard(f): + @wraps(f) + def decorated_function(*args, **kwargs): + locale = request.view_args.get("locale") + if not utils.isMultiLangs() and locale is not None: + return redirect(url_for(request.endpoint)) + if utils.isMultiLangs() and locale is None: + matched_locale = request.accept_languages.best_match(["fr", "en"]) + if matched_locale is None: + return redirect("/") + return redirect(url_for(request.endpoint, locale=matched_locale)) + return f(*args, **kwargs) + + return decorated_function + + +def homeLocaleSelector(): + return "Select a language" @main.route("/") -def home(): +@main.route("//") +def home(locale=None): + if utils.isMultiLangs() and locale is None: + return homeLocaleSelector() + if not utils.isMultiLangs() and locale is not None: + return redirect("/") + locale = utils.getLocale() + site_schema = models.TSiteSchema(many=True, locale=locale) + communes_schema = models.CommunesSchema(many=True, locale=locale) sql = text( - "SELECT * FROM geopaysages.t_site p join geopaysages.t_observatory o on o.id=p.id_observatory where p.publish_site=true and o.is_published is true ORDER BY RANDOM() LIMIT 6" + f"""SELECT * FROM geopaysages.t_site p + join geopaysages.t_site_translation pt on p.id_site=pt.row_id and pt.lang_id = '{locale}' + join geopaysages.t_observatory o on o.id=p.id_observatory + join geopaysages.t_observatory_translation ot on o.id=ot.row_id and ot.lang_id = '{locale}' + where pt.publish_site=true and ot.is_published is true ORDER BY RANDOM() LIMIT 6 + """ ) sites_proxy = db.engine.execute(sql).fetchall() sites = [dict(row.items()) for row in sites_proxy] @@ -51,9 +79,14 @@ def home(): # WAHO tordu l'histoire! if len(sites_without_photo): sql_missing_photos_str = ( - "select distinct on (id_site) p.* from geopaysages.t_photo p join geopaysages.t_observatory o on o.id=p.id_observatory where p.id_site IN (" + "select distinct on (id_site) p.* from geopaysages.t_photo p " + + "join geopaysages.t_observatory o on o.id=p.id_observatory " + + "join geopaysages.t_observatory_translation ot on o.id=ot.row_id and ot.lang_id = '" + + locale + + "' " + + "where p.id_site IN (" + ",".join(sites_without_photo) - + ") and o.is_published is true order by id_site, filter_date desc" + + ") and ot.is_published is true order by id_site, filter_date desc" ) sql_missing_photos = text(sql_missing_photos_str) missing_photos_result = db.engine.execute(sql_missing_photos).fetchall() @@ -86,8 +119,20 @@ def home(): ) all_sites = site_schema.dump( - models.TSite.query.join(models.Observatory).filter( - models.TSite.publish_site == True, models.Observatory.is_published == True + models.TSite.query.join( + models.TSiteTranslation, + (models.TSite.id_site == models.TSiteTranslation.row_id) + & (models.TSiteTranslation.lang_id == locale), + ) + .join(models.Observatory) + .join( + models.ObservatoryTranslation, + (models.Observatory.id == models.ObservatoryTranslation.row_id) + & (models.ObservatoryTranslation.lang_id == locale), + ) + .filter( + models.TSiteTranslation.publish_site == True, + models.ObservatoryTranslation.is_published == True, ) ) @@ -97,9 +142,16 @@ def home(): carousel_photos = list(filter(lambda x: x != ".gitkeep", carousel_photos)) if utils.isMultiObservatories() == True: - observatories = models.Observatory.query.filter( - models.Observatory.is_published == True - ).order_by(models.Observatory.title) + observatories = ( + models.Observatory.query.join( + models.ObservatoryTranslation, + (models.Observatory.id == models.ObservatoryTranslation.row_id) + & (models.ObservatoryTranslation.lang_id == locale), + ) + .filter(models.ObservatoryTranslation.is_published == True) + .order_by(models.ObservatoryTranslation.title) + ) + observatory_schema_lite = models.ObservatorySchemaLite(many=True, locale=locale) dump_observatories = observatory_schema_lite.dump(observatories) col_max = 5 @@ -137,7 +189,11 @@ def gallery(): @main.route("/sites/") -def site(id_site): +@main.route("//sites/") +@localeGuard +def site(id_site, locale): + site_schema = models.TSiteSchema(many=True, locale=locale) + communes_schema = models.CommunesSchema(many=True, locale=locale) get_site_by_id = models.TSite.query.filter_by(id_site=id_site, publish_site=True) site = site_schema.dump(get_site_by_id) if len(site) == 0: @@ -195,6 +251,7 @@ def getPhoto(photo): @main.route("/sites//photos/latest") def site_photos_last(id_site): + site_schema = models.TSiteSchema(many=True) get_site_by_id = models.TSite.query.filter_by(id_site=id_site, publish_site=True) site = site_schema.dump(get_site_by_id) if len(site) == 0: @@ -221,7 +278,9 @@ def site_photos_last(id_site): @main.route("/sites") -def sites(): +@main.route("//sites/") +@localeGuard +def sites(locale=None): data = utils.getFiltersData() return render_template( @@ -232,7 +291,9 @@ def sites(): ) -@main.route("/legal-notices") +@main.route("/legal-notices/") +@main.route("//legal-notices/") +@localeGuard def legal_notices(): tpl = utils.getCustomTpl("legal_notices") diff --git a/backend/static/js/comparator-v2.js b/backend/static/js/comparator-v2.js index 1e9edd0e..8b013e82 100644 --- a/backend/static/js/comparator-v2.js +++ b/backend/static/js/comparator-v2.js @@ -31,17 +31,17 @@ geopsg.comparator = (options) => { const getFormatedDate = (value) => { if (options.dbconf.comparator_date_format == 'year') { - return value.toLocaleString('fr-FR', { + return value.toLocaleString(options.locale, { year: 'numeric', }); } if (options.dbconf.comparator_date_format == 'month') { - return value.toLocaleString('fr-FR', { + return value.toLocaleString(options.locale, { month: '2-digit', year: 'numeric', }); } else { - return value.toLocaleString('fr-FR', { + return value.toLocaleString(options.locale, { month: '2-digit', day: '2-digit', year: 'numeric', @@ -76,7 +76,7 @@ geopsg.comparator = (options) => { comparedPhotos: [defaultItems[0], defaultItems[1]], thumbProps: thumbProps, thumbsListH: thumbProps.height + 30, - hiddenSelectors: [hideSelectorsOnInit, hideSelectorsOnInit] + hiddenSelectors: [hideSelectorsOnInit, hideSelectorsOnInit], }; }, mounted() { @@ -145,7 +145,7 @@ geopsg.comparator = (options) => { } classNames.push('selected'); - return classNames.join(' ') + return classNames.join(' '); }, updateLayers() { this.$bvModal.show('comparatorLoading'); @@ -230,41 +230,41 @@ geopsg.comparator = (options) => { if (options.dbconf.comparator_date_format == 'year') { sharedData.steps = [ { - label: '1 an', + label: options.translations.date_steps_1y, value: 3600 * 24 * 365, }, ]; } else if (options.dbconf.comparator_date_format == 'month') { sharedData.steps = [ { - label: '1 mois', + label: options.translations.date_steps_1m, value: 3600 * 24 * 30, }, { - label: '1 an', + label: options.translations.date_steps_1y, value: 3600 * 24 * 365, }, ]; } else { sharedData.steps = [ { - label: '0', + label: options.translations.date_steps_none, value: 0, }, { - label: '1 jour', + label: options.translations.date_steps_1d, value: 3600 * 24, }, { - label: '1 semaine', + label: options.translations.date_steps_1w, value: 3600 * 24 * 7, }, { - label: '1 mois', + label: options.translations.date_steps_1m, value: 3600 * 24 * 30, }, { - label: '1 an', + label: options.translations.date_steps_1y, value: 3600 * 24 * 365, }, ]; diff --git a/backend/static/js/sites.js b/backend/static/js/sites.js index bbeb9d87..59a34293 100644 --- a/backend/static/js/sites.js +++ b/backend/static/js/sites.js @@ -434,8 +434,8 @@ geopsg.initSites = (options) => { try { await navigator.clipboard.writeText(this.shareUrl); - this.$bvToast.toast('Le lien est prêt à être coller.', { - title: 'Copié !', + this.$bvToast.toast(options.translations.share_copy_success_message, { + title: options.translations.share_copy_success_title, variant: 'success', solid: true, }); diff --git a/backend/tpl/components/comparator_v2.jinja b/backend/tpl/components/comparator_v2.jinja index 06416b4a..384c46cb 100644 --- a/backend/tpl/components/comparator_v2.jinja +++ b/backend/tpl/components/comparator_v2.jinja @@ -160,7 +160,7 @@ > {% if dbconf.comparator_date_step_button == 'False': %} {% else %} - + @@ -177,6 +177,7 @@ dbconf: {{dbconf | tojson}}, site: {{site | tojson}}, photos: {{photos | tojson}}, + locale: "{{locale}}", translations: { 'mode_sidebyside': "{{ _('comparatorv2.mode.sidebyside') }}", 'mode_split': "{{ _('comparatorv2.mode.split') }}", diff --git a/backend/tpl/components/sites-filter.jinja b/backend/tpl/components/sites-filter.jinja index 81781080..5a16050c 100644 --- a/backend/tpl/components/sites-filter.jinja +++ b/backend/tpl/components/sites-filter.jinja @@ -50,7 +50,7 @@ @click="onCancelClick()" class="btn btn-outline-secondary"> - Réinitialiser + {{_('sites.filters.reset')}} \ No newline at end of file diff --git a/backend/tpl/home_multi_obs.jinja b/backend/tpl/home_multi_obs.jinja index 0ee4dcdc..7244aae0 100644 --- a/backend/tpl/home_multi_obs.jinja +++ b/backend/tpl/home_multi_obs.jinja @@ -45,7 +45,7 @@ {% endfor %} diff --git a/backend/tpl/site.jinja b/backend/tpl/site.jinja index b9ba2de0..2a44198f 100644 --- a/backend/tpl/site.jinja +++ b/backend/tpl/site.jinja @@ -82,7 +82,7 @@
-
Mots clés
+
{{ _('obs_point.keywords') }}
{% for un_sous_theme in site.stheme %} diff --git a/backend/tpl/sites.jinja b/backend/tpl/sites.jinja index 2939d2bd..b93fe14d 100644 --- a/backend/tpl/sites.jinja +++ b/backend/tpl/sites.jinja @@ -74,7 +74,9 @@
- + + {{_('sites.observation_points.item')}} +
@@ -107,10 +109,10 @@
- Partager + {{_('map.share.button')}}
- Partager + {{_('map.share.button')}}
@@ -134,7 +136,7 @@ class="btn d-flex justify-content-between p-3 btn-toggle" v-b-toggle="'app_map_legend_collapse'" > - Légende + {{_('map.legend.title')}} @@ -144,8 +146,8 @@
- -

Copier et partager le lien ci-dessus

+ +

{{_('map.share.dialog.message')}}

1: + locale = getLocale() + sql = text( + f"""SELECT count(*) + FROM geopaysages.t_observatory o + join geopaysages.t_observatory_translation ot on o.id = ot.row_id and ot.lang_id = '{locale}' + where ot.is_published is true""" + ) + result = db.engine.execute(sql) + count = result.scalar() + if count > 1: return True return False +def getLocalizedSitesQuery(): + locale = getLocale() + return ( + models.TSite.query.join( + models.TSiteTranslation, + (models.TSite.id_site == models.TSiteTranslation.row_id) + & (models.TSiteTranslation.lang_id == locale), + ) + .join(models.Observatory) + .join( + models.ObservatoryTranslation, + (models.Observatory.id == models.ObservatoryTranslation.row_id) + & (models.ObservatoryTranslation.lang_id == locale), + ) + .filter( + models.TSiteTranslation.publish_site == True, + models.ObservatoryTranslation.is_published == True, + ) + ) + + def getFiltersData(): dbconf = getDbConf() + locale = getLocale() + observatory_schema = models.ObservatorySchema(many=True, locale=locale) + site_schema = models.TSiteSchema(many=True, locale=locale) + dicotheme_schema = models.DicoThemeSchema(many=True, locale=locale) + dicostheme_schema = models.DicoSthemeSchema(many=True, locale=locale) + sites = site_schema.dump( - models.TSite.query.join(models.Observatory) - .filter( - models.TSite.publish_site == True, models.Observatory.is_published == True - ) - .order_by(dbconf["default_sort_sites"]) + getLocalizedSitesQuery().order_by(text(dbconf["default_sort_sites"])) ) for site in sites: cor_sthemes_themes = site.get("cor_site_stheme_themes") @@ -191,11 +225,11 @@ def getFiltersData(): filter for filter in filters if filter.get("name") == "township" ][0] str_map_in = ["'" + township + "'" for township in filter_township.get("items")] - sql_map_str = ( - "SELECT code_commune AS id, nom_commune AS label FROM geopaysages.communes WHERE code_commune IN (" - + ",".join(str_map_in) - + ")" - ) + sql_map_str = f"""SELECT c.code_commune AS id, ct.nom_commune AS label + FROM geopaysages.communes c + JOIN geopaysages.communes_translation ct on ct.row_id = c.code_commune + WHERE code_commune IN ({",".join(str_map_in)}) + AND ct.lang_id = '{locale}'""" sql_map = text(sql_map_str) townships_result = db.engine.execute(sql_map).fetchall() townships = [dict(row) for row in townships_result] @@ -278,7 +312,7 @@ def getItem(name, id): observatories.append( { "id": site["id_observatory"], - "label": site["observatory"]["title"], + "label": observatory["title"], "data": { "geom": observatory["geom"], "color": observatory["color"], diff --git a/docker/custom.sample/i18n/en/LC_MESSAGES/messages.mo b/docker/custom.sample/i18n/en/LC_MESSAGES/messages.mo new file mode 100644 index 00000000..cfa35117 Binary files /dev/null and b/docker/custom.sample/i18n/en/LC_MESSAGES/messages.mo differ diff --git a/docker/custom.sample/i18n/en/LC_MESSAGES/messages.po b/docker/custom.sample/i18n/en/LC_MESSAGES/messages.po new file mode 100755 index 00000000..d709570f --- /dev/null +++ b/docker/custom.sample/i18n/en/LC_MESSAGES/messages.po @@ -0,0 +1,267 @@ +# English translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2024-10-23 12:32+0000\n" +"PO-Revision-Date: 2018-12-21 11:34+0100\n" +"Last-Translator: FULL NAME \n" +"Language: fr\n" +"Language-Team: fr \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.16.0\n" + +#: utils.py:127 +msgid "sites.filter.themes" +msgstr "Topic" + +#: utils.py:131 +msgid "sites.filter.subthemes" +msgstr "Sub-topic" + +#: utils.py:136 +msgid "sites.filter.township" +msgstr "City" + +#: utils.py:141 +msgid "sites.filter.years" +msgstr "Year" + +#: utils.py:260 +msgid "sites.filter.obervatories" +msgstr "City" + +#: tpl/gallery.jinja:3 +msgid "gallery.meta_title" +msgstr "Photo Gallery" + +#: tpl/gallery.jinja:18 +msgid "gallery.title" +msgstr "Photo Gallery" + +#: tpl/components/sites-filter.jinja:8 tpl/components/sites-filter.jinja:15 +#: tpl/gallery.jinja:76 tpl/sites.jinja:52 +msgid "sites.filters.nb_result" +msgstr "Filter: %(nb)s result(s)" + +#: tpl/home_mono_obs.jinja:3 tpl/home_multi_obs.jinja:3 +msgid "home.meta_title" +msgstr "GeoPaysages: Photographic Observatory of Landscapes" + +#: tpl/home_mono_obs.jinja:17 tpl/home_multi_obs.jinja:19 +msgid "home.title_mobile" +msgstr "Home" + +#: tpl/components/home-carousel.jinja:3 tpl/components/home-carousel.jinja:24 +#: tpl/home_mono_obs.jinja:22 tpl/home_multi_obs.jinja:24 +msgid "home.title" +msgstr "Nature-Based Solutions Education Network" + +#: tpl/home_mono_obs.jinja:36 tpl/home_multi_obs.jinja:61 +msgid "home.block.explore_sites" +msgstr "Explore Observation Sites" + +#: tpl/home_mono_obs.jinja:43 +msgid "home.block.discover" +msgstr "Discover this Observation Site" + +#: tpl/home_mono_obs.jinja:46 +msgid "home.block.photography" +msgstr "Photography" + +#: tpl/home_multi_obs.jinja:48 +msgid "home.block.discover_observatories" +msgstr "Discover this Observation Site" + +#: tpl/layout.jinja:72 +msgid "footer.internal_title" +msgstr "The Site" + +#: tpl/layout.jinja:76 +msgid "footer.internal_links.home" +msgstr "Home" + +#: tpl/layout.jinja:81 +msgid "footer.internal_links.sites" +msgstr "Observation Sites" + +#: tpl/layout.jinja:86 +msgid "footer.internal_links.gallery" +msgstr "Photo Gallery" + +#: tpl/layout.jinja:92 +msgid "footer.internal_links.contact" +msgstr "Contact Us" + +#: tpl/layout.jinja:101 +msgid "footer.external_title" +msgstr "Our Territory" + +#: tpl/site.jinja:31 +msgid "site.title_mobile" +msgstr "Observation Site" + +#: tpl/site.jinja:58 +msgid "obs_point.buttons.notice" +msgstr "Technical Notice for the Photographer" + +#: tpl/site.jinja:63 +msgid "obs_point.buttons.obs" +msgstr "Make an Observation" + +#: tpl/site.jinja:68 +msgid "obs_point.description" +msgstr "Site Presentation" + +#: tpl/site.jinja:75 tpl/site.jinja:94 tpl/site.jinja:111 +msgid "obs_point.buttons.read_more" +msgstr "Read More" + +#: tpl/site.jinja:76 tpl/site.jinja:95 tpl/site.jinja:112 +msgid "obs_point.buttons.read_less" +msgstr "Read Less" + +#: tpl/site.jinja:85 +msgid "obs_point.keywords" +msgstr "Keywords" + +#: tpl/site.jinja:104 +msgid "obs_point.testimonials" +msgstr "Testimonials" + +#: tpl/sites.jinja:4 +msgid "sites.meta_title" +msgstr "Observation Sites" + +#: tpl/sites.jinja:29 +msgid "sites.title" +msgstr "Observation Sites" + +#: tpl/sites.jinja:51 +msgid "sites.observation_points.title" +msgstr "Observation Sites" + +#: tpl/sites.jinja:77 +msgid "sites.observation_points.item" +msgstr "observation site(s)" + +#: tpl/sites.jinja:110 tpl/sites.jinja:113 +msgid "map.share.button" +msgstr "Share" + +#: tpl/sites.jinja:119 +msgid "map.legend.obervatories" +msgstr "city(ies)" + +#: tpl/sites.jinja:125 +msgid "map.legend.themes" +msgstr "Theme(s)" + +#: tpl/sites.jinja:137 +msgid "map.legend.title" +msgstr "Legend" + +#: tpl/sites.jinja:147 +msgid "map.share.dialog.title" +msgstr "Share" + +#: tpl/sites.jinja:148 +msgid "map.share.dialog.message" +msgstr "Copy and share the link above" + +#: tpl/sites.jinja:165 +msgid "map.share.copy_success.title" +msgstr "Copied!" + +#: tpl/sites.jinja:166 +msgid "map.share.copy.copy_success.message" +msgstr "The link is ready to paste." + +#: tpl/components/comparator_v1.jinja:8 +msgid "obs_point.buttons.download" +msgstr "Download" + +#: tpl/components/comparator_v2.jinja:78 +msgid "comparatorv2.loading" +msgstr "Loading" + +#: tpl/components/comparator_v2.jinja:120 +msgid "comparatorv2.date.filter.title" +msgstr "Filter by Date" + +#: tpl/components/comparator_v2.jinja:122 +msgid "comparatorv2.date.filter.start" +msgstr "Start" + +#: tpl/components/comparator_v2.jinja:131 +msgid "comparatorv2.date.filter.end" +msgstr "End" + +#: tpl/components/comparator_v2.jinja:163 +msgid "comparatorv2.date.step" +msgstr "Step" + +#: tpl/components/comparator_v2.jinja:182 +msgid "comparatorv2.mode.sidebyside" +msgstr "Overlay" + +#: tpl/components/comparator_v2.jinja:183 +msgid "comparatorv2.mode.split" +msgstr "Side by Side" + +#: tpl/components/comparator_v2.jinja:184 +msgid "comparatorv2.date.steps.none" +msgstr "0" + +#: tpl/components/comparator_v2.jinja:185 +msgid "comparatorv2.date.steps.1d" +msgstr "1 day" + +#: tpl/components/comparator_v2.jinja:186 +msgid "comparatorv2.date.steps.1w" +msgstr "1 week" + +#: tpl/components/comparator_v2.jinja:187 +msgid "comparatorv2.date.steps.1m" +msgstr "1 month" + +#: tpl/components/comparator_v2.jinja:188 +msgid "comparatorv2.date.steps.1y" +msgstr "1 year" + +#: tpl/components/legal-footer.jinja:1 tpl/custom/footer.jinja:3 +msgid "footer.copyright" +msgstr "© 2023 - GeoLandscapes, free and open-source software" + +#: tpl/components/sites-filter.jinja:22 +msgid "map.filters.title" +msgstr "Filter by" + +#: tpl/components/sites-filter.jinja:53 +msgid "sites.filters.reset" +msgstr "Reset" + +#: tpl/custom/main_menu.jinja:3 +msgid "header.nav.home" +msgstr "Home" + +#: tpl/custom/main_menu.jinja:8 +msgid "header.nav.sites" +msgstr "Observation Sites" + +#~ msgid "home.map_block_title" +#~ msgstr "Map of cities" + +#~ msgid "header.nav.about" +#~ msgstr "About" + +#~ msgid "header.nav.gallery" +#~ msgstr "Photo Gallery" + diff --git a/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.mo b/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.mo index 2e74c308..1f952905 100644 Binary files a/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.mo and b/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.mo differ diff --git a/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.po b/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.po old mode 100644 new mode 100755 index 22e4e651..1ad0b7e5 --- a/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.po +++ b/docker/custom.sample/i18n/fr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-09-14 10:23+0000\n" +"POT-Creation-Date: 2024-10-23 12:32+0000\n" "PO-Revision-Date: 2018-12-21 11:34+0100\n" "Last-Translator: FULL NAME \n" "Language: fr\n" @@ -16,25 +16,25 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.10.3\n" +"Generated-By: Babel 2.16.0\n" -#: utils.py:215 +#: utils.py:127 msgid "sites.filter.themes" msgstr "Thème" -#: utils.py:219 +#: utils.py:131 msgid "sites.filter.subthemes" msgstr "Sous-thème" -#: utils.py:224 +#: utils.py:136 msgid "sites.filter.township" msgstr "Commune" -#: utils.py:229 +#: utils.py:141 msgid "sites.filter.years" msgstr "Année" -#: utils.py:348 +#: utils.py:260 msgid "sites.filter.obervatories" msgstr "Observatoire" @@ -42,12 +42,12 @@ msgstr "Observatoire" msgid "gallery.meta_title" msgstr "Galerie photo" -#: tpl/gallery.jinja:19 +#: tpl/gallery.jinja:18 msgid "gallery.title" msgstr "Galerie photo" #: tpl/components/sites-filter.jinja:8 tpl/components/sites-filter.jinja:15 -#: tpl/gallery.jinja:75 tpl/sites.jinja:52 +#: tpl/gallery.jinja:76 tpl/sites.jinja:52 msgid "sites.filters.nb_result" msgstr "Filtre(s) : %(nb)s résultat(s)" @@ -55,56 +55,56 @@ msgstr "Filtre(s) : %(nb)s résultat(s)" msgid "home.meta_title" msgstr "GeoPaysages : Observatoire photographique des paysages" -#: tpl/components/home-carousel.jinja:2 tpl/components/home-carousel.jinja:20 -#: tpl/home_mono_obs.jinja:19 tpl/home_multi_obs.jinja:21 -msgid "home.title" -msgstr "Observatoire photographique des paysages" - -#: tpl/home_mono_obs.jinja:23 tpl/home_multi_obs.jinja:25 +#: tpl/home_mono_obs.jinja:17 tpl/home_multi_obs.jinja:19 msgid "home.title_mobile" msgstr "Accueil" -#: tpl/home_mono_obs.jinja:39 tpl/home_multi_obs.jinja:94 +#: tpl/components/home-carousel.jinja:3 tpl/components/home-carousel.jinja:24 +#: tpl/home_mono_obs.jinja:22 tpl/home_multi_obs.jinja:24 +msgid "home.title" +msgstr "Observatoire photographique des paysages" + +#: tpl/home_mono_obs.jinja:36 tpl/home_multi_obs.jinja:61 msgid "home.block.explore_sites" msgstr "Explorer les sites d'observation" -#: tpl/home_mono_obs.jinja:46 +#: tpl/home_mono_obs.jinja:43 msgid "home.block.discover" msgstr "Découvrir ce site d'observation" -#: tpl/home_mono_obs.jinja:49 +#: tpl/home_mono_obs.jinja:46 msgid "home.block.photography" msgstr "Photographie" -#: tpl/home_multi_obs.jinja:90 -msgid "home.map_block_title" -msgstr "Carte des observatoires" +#: tpl/home_multi_obs.jinja:48 +msgid "home.block.discover_observatories" +msgstr "Découvrez nos observatoires" -#: tpl/layout.jinja:75 +#: tpl/layout.jinja:72 msgid "footer.internal_title" msgstr "Le site" -#: tpl/layout.jinja:79 +#: tpl/layout.jinja:76 msgid "footer.internal_links.home" msgstr "Accueil" -#: tpl/layout.jinja:84 +#: tpl/layout.jinja:81 msgid "footer.internal_links.sites" msgstr "Sites d'observation" -#: tpl/layout.jinja:89 +#: tpl/layout.jinja:86 msgid "footer.internal_links.gallery" msgstr "Galerie photo" -#: tpl/layout.jinja:95 +#: tpl/layout.jinja:92 msgid "footer.internal_links.contact" msgstr "Contactez-nous" -#: tpl/layout.jinja:104 +#: tpl/layout.jinja:101 msgid "footer.external_title" msgstr "Notre territoire" -#: tpl/site.jinja:41 +#: tpl/site.jinja:31 msgid "site.title_mobile" msgstr "site d'observation" @@ -120,15 +120,19 @@ msgstr "Faire une observation" msgid "obs_point.description" msgstr "Présentation du site" -#: tpl/site.jinja:75 tpl/site.jinja:93 tpl/site.jinja:106 +#: tpl/site.jinja:75 tpl/site.jinja:94 tpl/site.jinja:111 msgid "obs_point.buttons.read_more" msgstr "Lire plus" -#: tpl/site.jinja:76 tpl/site.jinja:94 tpl/site.jinja:107 +#: tpl/site.jinja:76 tpl/site.jinja:95 tpl/site.jinja:112 msgid "obs_point.buttons.read_less" msgstr "Lire moins" -#: tpl/site.jinja:99 +#: tpl/site.jinja:85 +msgid "obs_point.keywords" +msgstr "Mots clés" + +#: tpl/site.jinja:104 msgid "obs_point.testimonials" msgstr "Témoignages" @@ -144,86 +148,114 @@ msgstr "Sites d'observation" msgid "sites.observation_points.title" msgstr "Sites d'observation" -#: tpl/sites.jinja:117 +#: tpl/sites.jinja:77 +msgid "sites.observation_points.item" +msgstr "site(s) d'observation" + +#: tpl/sites.jinja:110 tpl/sites.jinja:113 +msgid "map.share.button" +msgstr "Partager" + +#: tpl/sites.jinja:119 msgid "map.legend.obervatories" msgstr "Observatoire(s)" -#: tpl/sites.jinja:123 +#: tpl/sites.jinja:125 msgid "map.legend.themes" msgstr "Thème(s)" +#: tpl/sites.jinja:137 +msgid "map.legend.title" +msgstr "Légende" + +#: tpl/sites.jinja:147 +msgid "map.share.dialog.title" +msgstr "Partager" + +#: tpl/sites.jinja:148 +msgid "map.share.dialog.message" +msgstr "Copier et partager le lien ci-dessus" + +#: tpl/sites.jinja:165 +msgid "map.share.copy_success.title" +msgstr "Copié !" + +#: tpl/sites.jinja:166 +msgid "map.share.copy.copy_success.message" +msgstr "Le lien est prêt à être coller." + #: tpl/components/comparator_v1.jinja:8 msgid "obs_point.buttons.download" msgstr "Télécharger" -#: tpl/components/comparator_v2.jinja:57 +#: tpl/components/comparator_v2.jinja:78 msgid "comparatorv2.loading" msgstr "Chargement" -#: tpl/components/comparator_v2.jinja:95 +#: tpl/components/comparator_v2.jinja:120 msgid "comparatorv2.date.filter.title" msgstr "Filtrer par date" -#: tpl/components/comparator_v2.jinja:97 +#: tpl/components/comparator_v2.jinja:122 msgid "comparatorv2.date.filter.start" msgstr "Début" -#: tpl/components/comparator_v2.jinja:106 +#: tpl/components/comparator_v2.jinja:131 msgid "comparatorv2.date.filter.end" msgstr "Fin" -#: tpl/components/comparator_v2.jinja:156 +#: tpl/components/comparator_v2.jinja:163 +msgid "comparatorv2.date.step" +msgstr "Pas" + +#: tpl/components/comparator_v2.jinja:182 msgid "comparatorv2.mode.sidebyside" msgstr "Superposition" -#: tpl/components/comparator_v2.jinja:157 +#: tpl/components/comparator_v2.jinja:183 msgid "comparatorv2.mode.split" msgstr "Côte à côte" -#: tpl/components/comparator_v2.jinja:158 +#: tpl/components/comparator_v2.jinja:184 msgid "comparatorv2.date.steps.none" msgstr "0" -#: tpl/components/comparator_v2.jinja:159 +#: tpl/components/comparator_v2.jinja:185 msgid "comparatorv2.date.steps.1d" msgstr "1 jour" -#: tpl/components/comparator_v2.jinja:160 +#: tpl/components/comparator_v2.jinja:186 msgid "comparatorv2.date.steps.1w" msgstr "1 semaine" -#: tpl/components/comparator_v2.jinja:161 +#: tpl/components/comparator_v2.jinja:187 msgid "comparatorv2.date.steps.1m" msgstr "1 mois" -#: tpl/components/comparator_v2.jinja:162 +#: tpl/components/comparator_v2.jinja:188 msgid "comparatorv2.date.steps.1y" msgstr "1 an" -#: tpl/components/legal-footer.jinja:1 +#: tpl/components/legal-footer.jinja:1 tpl/custom/footer.jinja:3 msgid "footer.copyright" msgstr "© 2023 - GeoPaysages, logiciel libre et open-source" -#: tpl/components/main-nav.jinja:3 +#: tpl/components/sites-filter.jinja:22 +msgid "map.filters.title" +msgstr "Filtrer par" + +#: tpl/components/sites-filter.jinja:53 +msgid "sites.filters.reset" +msgstr "Réinitialiser" + +#: tpl/custom/main_menu.jinja:3 msgid "header.nav.home" msgstr "Accueil" -#: tpl/components/main-nav.jinja:7 -msgid "header.nav.about" -msgstr "À propos" - -#: tpl/components/main-nav.jinja:11 +#: tpl/custom/main_menu.jinja:8 msgid "header.nav.sites" msgstr "Sites d'observation" -#: tpl/components/main-nav.jinja:14 -msgid "header.nav.gallery" -msgstr "Galerie photo" - -#: tpl/components/sites-filter.jinja:22 -msgid "map.filters.title" -msgstr "Filtrer par" - #~ msgid "map.filter.themes" #~ msgstr "Thème" @@ -269,3 +301,12 @@ msgstr "Filtrer par" #~ msgid "comparatorv2.mode.title" #~ msgstr "Disposition des photos" +#~ msgid "home.map_block_title" +#~ msgstr "Carte des observatoires" + +#~ msgid "header.nav.about" +#~ msgstr "À propos" + +#~ msgid "header.nav.gallery" +#~ msgstr "Galerie photo" + diff --git a/docker/custom.sample/i18n/messages.pot b/docker/custom.sample/i18n/messages.pot index 866f2112..52d31162 100644 --- a/docker/custom.sample/i18n/messages.pot +++ b/docker/custom.sample/i18n/messages.pot @@ -1,39 +1,39 @@ # Translations template for PROJECT. -# Copyright (C) 2022 ORGANIZATION +# Copyright (C) 2024 ORGANIZATION # This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2022. +# FIRST AUTHOR , 2024. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-09-14 10:23+0000\n" +"POT-Creation-Date: 2024-10-23 12:32+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.10.3\n" +"Generated-By: Babel 2.16.0\n" -#: utils.py:215 +#: utils.py:127 msgid "sites.filter.themes" msgstr "" -#: utils.py:219 +#: utils.py:131 msgid "sites.filter.subthemes" msgstr "" -#: utils.py:224 +#: utils.py:136 msgid "sites.filter.township" msgstr "" -#: utils.py:229 +#: utils.py:141 msgid "sites.filter.years" msgstr "" -#: utils.py:348 +#: utils.py:260 msgid "sites.filter.obervatories" msgstr "" @@ -41,12 +41,12 @@ msgstr "" msgid "gallery.meta_title" msgstr "" -#: tpl/gallery.jinja:19 +#: tpl/gallery.jinja:18 msgid "gallery.title" msgstr "" #: tpl/components/sites-filter.jinja:8 tpl/components/sites-filter.jinja:15 -#: tpl/gallery.jinja:75 tpl/sites.jinja:52 +#: tpl/gallery.jinja:76 tpl/sites.jinja:52 msgid "sites.filters.nb_result" msgstr "" @@ -54,56 +54,56 @@ msgstr "" msgid "home.meta_title" msgstr "" -#: tpl/components/home-carousel.jinja:2 tpl/components/home-carousel.jinja:20 -#: tpl/home_mono_obs.jinja:19 tpl/home_multi_obs.jinja:21 -msgid "home.title" +#: tpl/home_mono_obs.jinja:17 tpl/home_multi_obs.jinja:19 +msgid "home.title_mobile" msgstr "" -#: tpl/home_mono_obs.jinja:23 tpl/home_multi_obs.jinja:25 -msgid "home.title_mobile" +#: tpl/components/home-carousel.jinja:3 tpl/components/home-carousel.jinja:24 +#: tpl/home_mono_obs.jinja:22 tpl/home_multi_obs.jinja:24 +msgid "home.title" msgstr "" -#: tpl/home_mono_obs.jinja:39 tpl/home_multi_obs.jinja:94 +#: tpl/home_mono_obs.jinja:36 tpl/home_multi_obs.jinja:61 msgid "home.block.explore_sites" msgstr "" -#: tpl/home_mono_obs.jinja:46 +#: tpl/home_mono_obs.jinja:43 msgid "home.block.discover" msgstr "" -#: tpl/home_mono_obs.jinja:49 +#: tpl/home_mono_obs.jinja:46 msgid "home.block.photography" msgstr "" -#: tpl/home_multi_obs.jinja:90 -msgid "home.map_block_title" +#: tpl/home_multi_obs.jinja:48 +msgid "home.block.discover_observatories" msgstr "" -#: tpl/layout.jinja:75 +#: tpl/layout.jinja:72 msgid "footer.internal_title" msgstr "" -#: tpl/layout.jinja:79 +#: tpl/layout.jinja:76 msgid "footer.internal_links.home" msgstr "" -#: tpl/layout.jinja:84 +#: tpl/layout.jinja:81 msgid "footer.internal_links.sites" msgstr "" -#: tpl/layout.jinja:89 +#: tpl/layout.jinja:86 msgid "footer.internal_links.gallery" msgstr "" -#: tpl/layout.jinja:95 +#: tpl/layout.jinja:92 msgid "footer.internal_links.contact" msgstr "" -#: tpl/layout.jinja:104 +#: tpl/layout.jinja:101 msgid "footer.external_title" msgstr "" -#: tpl/site.jinja:41 +#: tpl/site.jinja:31 msgid "site.title_mobile" msgstr "" @@ -119,15 +119,19 @@ msgstr "" msgid "obs_point.description" msgstr "" -#: tpl/site.jinja:75 tpl/site.jinja:93 tpl/site.jinja:106 +#: tpl/site.jinja:75 tpl/site.jinja:94 tpl/site.jinja:111 msgid "obs_point.buttons.read_more" msgstr "" -#: tpl/site.jinja:76 tpl/site.jinja:94 tpl/site.jinja:107 +#: tpl/site.jinja:76 tpl/site.jinja:95 tpl/site.jinja:112 msgid "obs_point.buttons.read_less" msgstr "" -#: tpl/site.jinja:99 +#: tpl/site.jinja:85 +msgid "obs_point.keywords" +msgstr "" + +#: tpl/site.jinja:104 msgid "obs_point.testimonials" msgstr "" @@ -143,83 +147,111 @@ msgstr "" msgid "sites.observation_points.title" msgstr "" -#: tpl/sites.jinja:117 +#: tpl/sites.jinja:77 +msgid "sites.observation_points.item" +msgstr "" + +#: tpl/sites.jinja:110 tpl/sites.jinja:113 +msgid "map.share.button" +msgstr "" + +#: tpl/sites.jinja:119 msgid "map.legend.obervatories" msgstr "" -#: tpl/sites.jinja:123 +#: tpl/sites.jinja:125 msgid "map.legend.themes" msgstr "" +#: tpl/sites.jinja:137 +msgid "map.legend.title" +msgstr "" + +#: tpl/sites.jinja:147 +msgid "map.share.dialog.title" +msgstr "" + +#: tpl/sites.jinja:148 +msgid "map.share.dialog.message" +msgstr "" + +#: tpl/sites.jinja:165 +msgid "map.share.copy_success.title" +msgstr "" + +#: tpl/sites.jinja:166 +msgid "map.share.copy.copy_success.message" +msgstr "" + #: tpl/components/comparator_v1.jinja:8 msgid "obs_point.buttons.download" msgstr "" -#: tpl/components/comparator_v2.jinja:57 +#: tpl/components/comparator_v2.jinja:78 msgid "comparatorv2.loading" msgstr "" -#: tpl/components/comparator_v2.jinja:95 +#: tpl/components/comparator_v2.jinja:120 msgid "comparatorv2.date.filter.title" msgstr "" -#: tpl/components/comparator_v2.jinja:97 +#: tpl/components/comparator_v2.jinja:122 msgid "comparatorv2.date.filter.start" msgstr "" -#: tpl/components/comparator_v2.jinja:106 +#: tpl/components/comparator_v2.jinja:131 msgid "comparatorv2.date.filter.end" msgstr "" -#: tpl/components/comparator_v2.jinja:156 +#: tpl/components/comparator_v2.jinja:163 +msgid "comparatorv2.date.step" +msgstr "" + +#: tpl/components/comparator_v2.jinja:182 msgid "comparatorv2.mode.sidebyside" msgstr "" -#: tpl/components/comparator_v2.jinja:157 +#: tpl/components/comparator_v2.jinja:183 msgid "comparatorv2.mode.split" msgstr "" -#: tpl/components/comparator_v2.jinja:158 +#: tpl/components/comparator_v2.jinja:184 msgid "comparatorv2.date.steps.none" msgstr "" -#: tpl/components/comparator_v2.jinja:159 +#: tpl/components/comparator_v2.jinja:185 msgid "comparatorv2.date.steps.1d" msgstr "" -#: tpl/components/comparator_v2.jinja:160 +#: tpl/components/comparator_v2.jinja:186 msgid "comparatorv2.date.steps.1w" msgstr "" -#: tpl/components/comparator_v2.jinja:161 +#: tpl/components/comparator_v2.jinja:187 msgid "comparatorv2.date.steps.1m" msgstr "" -#: tpl/components/comparator_v2.jinja:162 +#: tpl/components/comparator_v2.jinja:188 msgid "comparatorv2.date.steps.1y" msgstr "" -#: tpl/components/legal-footer.jinja:1 +#: tpl/components/legal-footer.jinja:1 tpl/custom/footer.jinja:3 msgid "footer.copyright" msgstr "" -#: tpl/components/main-nav.jinja:3 -msgid "header.nav.home" -msgstr "" - -#: tpl/components/main-nav.jinja:7 -msgid "header.nav.about" +#: tpl/components/sites-filter.jinja:22 +msgid "map.filters.title" msgstr "" -#: tpl/components/main-nav.jinja:11 -msgid "header.nav.sites" +#: tpl/components/sites-filter.jinja:53 +msgid "sites.filters.reset" msgstr "" -#: tpl/components/main-nav.jinja:14 -msgid "header.nav.gallery" +#: tpl/custom/main_menu.jinja:3 +msgid "header.nav.home" msgstr "" -#: tpl/components/sites-filter.jinja:22 -msgid "map.filters.title" +#: tpl/custom/main_menu.jinja:8 +msgid "header.nav.sites" msgstr ""