Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion src/server/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ def render_template(template, *args, **kwargs):
kwargs.update(year=year, lang=lang, language=language, supported_languages=template_supported_languages,
supported_years=template_supported_years, all_supported_years=SUPPORTED_YEARS,
supported_chapters=supported_chapters, date_published=date_published, date_modified=date_modified,
ebook_size_in_mb=ebook_size_in_mb, get_file_date_info=get_file_date_info, config=config)
ebook_size_in_mb=ebook_size_in_mb, get_file_date_info=get_file_date_info, config=config,
plural_ru=plural_ru)
return flask_render_template(template, *args, **kwargs)


Expand Down Expand Up @@ -232,6 +233,18 @@ def get_ebook_size_in_mb(lang, year):
return int(get_file_date_info(ebook_file, 'size') or 0)


def plural_ru(value, quantitative):
# Handle Russian plurals
# Based on https://github.com/andrewp-as-is/plural-ru.py
if value % 100 in (11, 12, 13, 14):
return quantitative[2]
if value % 10 == 1:
return quantitative[0]
if value % 10 in (2, 3, 4):
return quantitative[1]
return quantitative[2]


class RegexConverter(BaseConverter):
def __init__(self, url_map, *items):
super(RegexConverter, self).__init__(url_map)
Expand Down
18 changes: 17 additions & 1 deletion src/server/tests/helpers_test.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from server.helpers import get_file_date_info, get_versioned_filename, get_ebook_size_in_mb, \
chapter_lang_exists, featured_chapters_exists, get_chapter_nextprev, get_chapter_config, convert_old_image_path, \
add_footnote_links, year_live, strip_accents, accentless_sort, render_template, render_error_template, \
get_ebook_methodology
get_ebook_methodology, plural_ru
from server.config import get_config, SUPPORTED_LANGUAGES, SUPPORTED_YEARS, get_entries_from_json
from server.language import _Language
from server import app
Expand Down Expand Up @@ -330,3 +330,19 @@ def test_ebook_size_non_existant_year_is_zero():

def test_ebook_size_non_existant_language_and_year_is_zero():
assert get_ebook_size_in_mb('rubbish', 'rubbish') == 0


def test_russian_singlar():
assert plural_ru(1, ["участник", "участника", "участников"]) == "участник"


def test_russian_ends_in_eleven():
assert plural_ru(11, ["участник", "участника", "участников"]) == "участников"


def test_russian_two():
assert plural_ru(2, ["участник", "участника", "участников"]) == "участника"


def test_russian_seven():
assert plural_ru(7, ["участник", "участника", "участников"]) == "участников"
3 changes: 3 additions & 0 deletions src/templates/base/contributors.html
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ <h1 class="title title-lg">
var contributors = document.querySelector('.contributors');
var counter = document.querySelector('#filtered-contributors');
var totalText = document.querySelector('#contributors-total-text');
var totalTextNonFiltered = document.querySelector('#contributors-total-text-non-filtered');
var totalContributors = document.querySelector('#contributors-total');
var shadowNode = document.createElement('div');

Expand Down Expand Up @@ -473,8 +474,10 @@ <h1 class="title title-lg">
counter.innerText = filteredCount;
if ( counter.innerText === totalContributors.innerText ) {
totalText.classList.add('hidden')
if (totalTextNonFiltered) totalTextNonFiltered.classList.remove('hidden')
} else {
totalText.classList.remove('hidden')
if (totalTextNonFiltered) totalTextNonFiltered.classList.add('hidden')
}
}
window.addEventListener('popstate', handleFilterUrl);
Expand Down
4 changes: 2 additions & 2 deletions src/templates/ru/2019/contributors.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

{% block title %}Участники за {{ year }} | Web Almanac от HTTP Archive{% endblock %}

{% block description %}{{ config.contributors.items() | length }} человек, внесших свой вклад в Web Almanac за 2019 год — это аналитики, авторы, участники мозговых штурмов, дизайнеры, разработчики, редакторы, руководители, проверяющие и переводчики.{% endblock %}
{% block description %}{{ config.contributors.items() | length }} {{ plural_ru(config.contributors.items() | length | int, ["человек", "человека", "человек"]) }}, внесших свой вклад в Web Almanac за 2019 год — это аналитики, авторы, участники мозговых штурмов, дизайнеры, разработчики, редакторы, руководители, проверяющие и переводчики.{% endblock %}

{% block filter_by_team %}Фильтр по ролям в команде: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> из <span id="contributors-total">{{ config.contributors.items() | length }}</span></span> участников.{% endblock %}
{% block filter_by_team %}Фильтр по ролям в команде: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> из <span id="contributors-total">{{ config.contributors.items() | length }}</span> {{ plural_ru(config.contributors.items() | length | int, ["участника", "участников", "участников"]) }}</span><span id="contributors-total-text-non-filtered"> {{ plural_ru(config.contributors.items() | length | int, ["участника", "участников", "участников"]) }}</span>.{% endblock %}
{% block filter_by %}Отфильтровать по{% endblock %}

{% block join_the_team_title%}Присоединяйтесь к команде Web Almanac{% endblock %}
Expand Down
4 changes: 2 additions & 2 deletions src/templates/ru/2020/contributors.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

{% block title %}Участники за {{ year }} год | Web Almanac от HTTP Archive{% endblock %}

{% block description %}{{ config.contributors.items() | length }} человек, внесших свой вклад в Web Almanac за {{ year }} год — это аналитики, авторы, дизайнеры, разработчики, редакторы, руководители, проверяющие и переводчики.{% endblock %}
{% block description %}{{ config.contributors.items() | length }} {{ plural_ru(config.contributors.items() | length | int, ["человек", "человека", "человек"]) }}, внесших свой вклад в Web Almanac за {{ year }} год — это аналитики, авторы, дизайнеры, разработчики, редакторы, руководители, проверяющие и переводчики.{% endblock %}

{% block filter_by_team %}Фильтр по ролям в команде: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> из <span id="contributors-total">{{ config.contributors.items() | length }}</span></span> участников.{% endblock %}
{% block filter_by_team %}Фильтр по ролям в команде: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> из <span id="contributors-total">{{ config.contributors.items() | length }}</span> {{ plural_ru(config.contributors.items() | length | int, ["участника", "участников", "участников"]) }}</span><span id="contributors-total-text-non-filtered"> {{ plural_ru(config.contributors.items() | length | int, ["участника", "участников", "участников"]) }}</span>.{% endblock %}
{% block filter_by %}Отфильтровать по{% endblock %}

{% block join_the_team_title%}Присоединяйтесь к команде Web Almanac{% endblock %}
Expand Down
4 changes: 2 additions & 2 deletions src/templates/ru/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

{% block mission %}
<p>
Наша задача — объединить необработанные статистические данные и тенденции HTTP Archive вместе со знаниями веб-сообщества. Web Almanac — это всеобъемлющий отчёт о состоянии веба, подкреплённый реальными данными и подтверждённый авторитетными веб-экспертами. Издание {{ year }} года состоит из {{ supported_chapters | length }} глав, охватывающих такие аспекты, как содержание страниц, пользовательские ощущения, публикация и распространение информации.
Наша задача — объединить необработанные статистические данные и тенденции HTTP Archive вместе со знаниями веб-сообщества. Web Almanac — это всеобъемлющий отчёт о состоянии веба, подкреплённый реальными данными и подтверждённый авторитетными веб-экспертами. Издание {{ year }} года состоит из {{ supported_chapters | length }} {{ plural_ru(supported_chapters | length | int, ["главы", "глав", "глав"]) }}, охватывающих такие аспекты, как содержание страниц, пользовательские ощущения, публикация и распространение информации.
</p>
{% endblock %}

Expand Down Expand Up @@ -117,7 +117,7 @@
{% block methodology_stat_2_title %}Размер обработанных данных{% endblock %}
{% block methodology_link %}Узнать подробнее про методологию{% endblock %}
{% block methodology_description %}
Если не указано иное, метрики во всех {{ supported_chapters | length }} главах Web Almanac {{ year }} получены из набора данных HTTP Archive. HTTP Archive — это управляемый сообществом проект по исследованию веба с 2010 года. При помощи WebPageTest и Lighthouse ежемесячно проверяются метаданные {{ self.total_websites() }} сайтов, которые затем вносятся в общедоступную базу данных BigQuery для последующего анализа. В качестве основы для метрик Web Almanac {{ year }} был использован набор данных за {{ self.dataset() }} года. Дополнительную информацию смотрите на странице по методологии.
Если не указано иное, метрики во всех {{ supported_chapters | length }} {{ plural_ru(supported_chapters | length | int, ["глава", "главах", "главах"]) }} Web Almanac {{ year }} получены из набора данных HTTP Archive. HTTP Archive — это управляемый сообществом проект по исследованию веба с 2010 года. При помощи WebPageTest и Lighthouse ежемесячно проверяются метаданные {{ self.total_websites() }} сайтов, которые затем вносятся в общедоступную базу данных BigQuery для последующего анализа. В качестве основы для метрик Web Almanac {{ year }} был использован набор данных за {{ self.dataset() }} года. Дополнительную информацию смотрите на странице по методологии.
{% endblock %}

{% block introduction %}Введение{% endblock %}
Expand Down
4 changes: 2 additions & 2 deletions src/templates/uk/2019/contributors.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

{% block title %}Контриб'ютори 2019 року | Web Almanac від HTTP Archive{% endblock %}

{% block description %}{{ config.contributors.items() | length }} неймовірних людей, які долучилися до створення Web Almanac 2019 як аналітики, автори, дизайнери, розробники, рецензенти, керівники, редактори та перекладачі.{% endblock %}
{% block description %}{{ config.contributors.items() | length }} {{ plural_ru(config.contributors.items() | length | int, ["неймовірна людина", "неймовірні людини", "неймовірних людей"]) }}, які долучилися до створення Web Almanac 2019 як аналітики, автори, дизайнери, розробники, рецензенти, керівники, редактори та перекладачі.{% endblock %}

{% block filter_by_team %}Фільтрувати за роллю в команді: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> з <span id="contributors-total">{{ config.contributors.items() | length }}</span></span> контриб'юторів.{% endblock %}
{% block filter_by_team %}Фільтрувати за роллю в команді: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> з <span id="contributors-total">{{ config.contributors.items() | length }}</span> {{ plural_ru(config.contributors.items() | length | int, ["контриб'ютора", "контриб'юторів", "контриб'юторів"]) }}</span><span id="contributors-total-text-non-filtered">{{ plural_ru(config.contributors.items() | length | int, ["контриб'ютор", "контриб'ютори", "контриб'юторів"]) }}</span>.{% endblock %}
{% block filter_by %}Фільтрувати за{% endblock %}

{% block join_the_team_title%}Приєднуйся до команди Web Almanac{% endblock %}
Expand Down
4 changes: 2 additions & 2 deletions src/templates/uk/2020/contributors.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

{% block title %}Контриб'ютори {{ year }} року | Web Almanac від HTTP Archive{% endblock %}

{% block description %}{{ config.contributors.items() | length }} неймовірних людей, які долучилися до створення Web Almanac {{ year }} як аналітики, автори, дизайнери, розробники, рецензенти, керівники, редактори та перекладачі.{% endblock %}
{% block description %}{{ config.contributors.items() | length }} {{ plural_ru(config.contributors.items() | length | int, ["неймовірна людина", "неймовірні людини", "неймовірних людей"]) }}, які долучилися до створення Web Almanac {{ year }} як аналітики, автори, дизайнери, розробники, рецензенти, керівники, редактори та перекладачі.{% endblock %}

{% block filter_by_team %}Фільтрувати за роллю в команді: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> з <span id="contributors-total">{{ config.contributors.items() | length }}</span></span> контриб'юторів.{% endblock %}
{% block filter_by_team %}Фільтрувати за роллю в команді: <span id="filtered-contributors">{{ self.contributors() }}</span><span id="contributors-total-text" class="hidden"> з <span id="contributors-total">{{ config.contributors.items() | length }}</span> {{ plural_ru(config.contributors.items() | length | int, ["контриб'ютора", "контриб'юторів", "контриб'юторів"]) }}</span><span id="contributors-total-text-non-filtered"> {{ plural_ru(config.contributors.items() | length | int, ["контриб'ютор", "контриб'ютори", "контриб'юторів"]) }}</span>.{% endblock %}
{% block filter_by %}Фільтрувати за{% endblock %}

{% block join_the_team_title%}Приєднуйся до команди Web Almanac{% endblock %}
Expand Down
4 changes: 2 additions & 2 deletions src/templates/uk/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

{% block mission %}
<p>
Наша місія - поєднати суху статистику і тренди від HTTP Archive з досвідом веб-спільноти. Web Almanac це всеосяжний звіт про стан вебу, підтриманий реальними даними та довіреними веб-експертами. Видання {{ year }} року складається з {{ supported_chapters | length }} розділів, які охоплюють аспекти контенту сторінки, досвіду користування, публікації та розповсюдження.
Наша місія - поєднати суху статистику і тренди від HTTP Archive з досвідом веб-спільноти. Web Almanac - це всеосяжний звіт про стан вебу, підтриманий реальними даними та довіреними веб-експертами. Видання {{ year }} року складається з {{ supported_chapters | length }} {{ plural_ru(supported_chapters | length | int, ["розділу", "розділів", "розділів"]) }}, які охоплюють аспекти контенту сторінки, досвіду користування, публікації та розповсюдження.
</p>
{% endblock %}

Expand Down Expand Up @@ -117,7 +117,7 @@
{% block methodology_stat_2_title %}Оброблено даних{% endblock %}
{% block methodology_link %}Дізнатися про нашу Методологію{% endblock %}
{% block methodology_description %}
Якщо не вказано інше, метрики в усіх {{ supported_chapters | length }} розділах Web Almanac {{ year }} взяті з датасету HTTP Archive. HTTP Archive – це громадський проект, що відслідковує, як будується веб з 2010 року. Метадата про {{ self.total_websites() }} вебсайтів тестується щомісяця, використовуючи WebPageTest та Lighthouse, і додається до публічної бази даних BigQuery для аналізу. Для метрик Web Almanac {{ year }} був використаний як базис набір даних від {{ self.dataset() }} року. Більше інформації на сторінці Методологія.
Якщо не вказано інше, метрики в усіх {{ supported_chapters | length }} {{ plural_ru(supported_chapters | length | int, ["розділі", "розділах", "розділах"]) }} Web Almanac {{ year }} взяті з датасету HTTP Archive. HTTP Archive – це громадський проект, що відслідковує, як будується веб з 2010 року. Метадата про {{ self.total_websites() }} вебсайтів тестується щомісяця, використовуючи WebPageTest та Lighthouse, і додається до публічної бази даних BigQuery для аналізу. Для метрик Web Almanac {{ year }} був використаний як базис набір даних від {{ self.dataset() }} року. Більше інформації на сторінці Методологія.
{% endblock %}

{% block introduction %}Вступ{% endblock %}
Expand Down