mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	settings: Remove language_list_dbl_col from page_params.
The language_list_dbl_col parameter in the page_params is used by only the web client frontend. The value is calculated in the backend and then passed as a page_param which is unnecessary considering that the whole process is beneficial for the front_end only. Hence move the entire calculation code to the frontend. Fixes part of #18673.
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							56d85fb833
						
					
				
				
					commit
					8fc3715ea8
				
			@@ -2,6 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const {strict: assert} = require("assert");
 | 
					const {strict: assert} = require("assert");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const _ = require("lodash");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {unmock_module, zrequire} = require("../zjsunit/namespace");
 | 
					const {unmock_module, zrequire} = require("../zjsunit/namespace");
 | 
				
			||||||
const {run_test} = require("../zjsunit/test");
 | 
					const {run_test} = require("../zjsunit/test");
 | 
				
			||||||
const {page_params} = require("../zjsunit/zpage_params");
 | 
					const {page_params} = require("../zjsunit/zpage_params");
 | 
				
			||||||
@@ -23,7 +25,7 @@ page_params.translation_data = {
 | 
				
			|||||||
// `i18n.js` initializes FormatJS and is imported by
 | 
					// `i18n.js` initializes FormatJS and is imported by
 | 
				
			||||||
// `templates.js`.
 | 
					// `templates.js`.
 | 
				
			||||||
unmock_module("../../static/js/i18n");
 | 
					unmock_module("../../static/js/i18n");
 | 
				
			||||||
const {$t, $t_html} = zrequire("i18n");
 | 
					const {$t, $t_html, get_language_list_columns} = zrequire("i18n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test("$t", () => {
 | 
					run_test("$t", () => {
 | 
				
			||||||
    // Normally the id would be provided by babel-plugin-formatjs, but
 | 
					    // Normally the id would be provided by babel-plugin-formatjs, but
 | 
				
			||||||
@@ -104,3 +106,78 @@ run_test("tr_tag", () => {
 | 
				
			|||||||
    const html = require("../../static/templates/settings_tab.hbs")(args);
 | 
					    const html = require("../../static/templates/settings_tab.hbs")(args);
 | 
				
			||||||
    assert.ok(html.indexOf("Déclencheurs de notification") > 0);
 | 
					    assert.ok(html.indexOf("Déclencheurs de notification") > 0);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					run_test("language_list", () => {
 | 
				
			||||||
 | 
					    page_params.language_list = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            code: "en",
 | 
				
			||||||
 | 
					            locale: "en",
 | 
				
			||||||
 | 
					            name: "English",
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            code: "en-gb",
 | 
				
			||||||
 | 
					            locale: "en_GB",
 | 
				
			||||||
 | 
					            name: "British English",
 | 
				
			||||||
 | 
					            percent_translated: 99,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            code: "id",
 | 
				
			||||||
 | 
					            locale: "id",
 | 
				
			||||||
 | 
					            name: "Bahasa Indonesia",
 | 
				
			||||||
 | 
					            percent_translated: 32,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const successful_formatted_list = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            first: {
 | 
				
			||||||
 | 
					                name: "English",
 | 
				
			||||||
 | 
					                code: "en",
 | 
				
			||||||
 | 
					                name_with_percent: "English",
 | 
				
			||||||
 | 
					                selected: true,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            second: {
 | 
				
			||||||
 | 
					                name: "Bahasa Indonesia",
 | 
				
			||||||
 | 
					                code: "id",
 | 
				
			||||||
 | 
					                name_with_percent: "Bahasa Indonesia (32%)",
 | 
				
			||||||
 | 
					                selected: false,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            first: {
 | 
				
			||||||
 | 
					                name: "British English",
 | 
				
			||||||
 | 
					                code: "en-gb",
 | 
				
			||||||
 | 
					                name_with_percent: "British English (99%)",
 | 
				
			||||||
 | 
					                selected: false,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const formatted_list = get_language_list_columns("en");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function check_value_match(element, position) {
 | 
				
			||||||
 | 
					        assert.equal(
 | 
				
			||||||
 | 
					            formatted_list[element][position].name,
 | 
				
			||||||
 | 
					            successful_formatted_list[element][position].name,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        assert.equal(
 | 
				
			||||||
 | 
					            formatted_list[element][position].code,
 | 
				
			||||||
 | 
					            successful_formatted_list[element][position].code,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        assert.equal(
 | 
				
			||||||
 | 
					            formatted_list[element][position].name_with_percent,
 | 
				
			||||||
 | 
					            successful_formatted_list[element][position].name_with_percent,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        assert.equal(
 | 
				
			||||||
 | 
					            formatted_list[element][position].selected,
 | 
				
			||||||
 | 
					            successful_formatted_list[element][position].selected,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const element of _.range(0, formatted_list.length)) {
 | 
				
			||||||
 | 
					        check_value_match(element, "first");
 | 
				
			||||||
 | 
					        if (formatted_list[element].second) {
 | 
				
			||||||
 | 
					            check_value_match(element, "second");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,3 +43,68 @@ export function $t_html(descriptor, values) {
 | 
				
			|||||||
        ),
 | 
					        ),
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This formats language data for the language selection modal in a
 | 
				
			||||||
 | 
					// 2-column format.
 | 
				
			||||||
 | 
					export function get_language_list_columns(default_language) {
 | 
				
			||||||
 | 
					    const language_list = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Only render languages with percentage translation >= 5%
 | 
				
			||||||
 | 
					    for (const language of page_params.language_list) {
 | 
				
			||||||
 | 
					        if (language.percent_translated === undefined || language.percent_translated >= 5) {
 | 
				
			||||||
 | 
					            language_list.push({
 | 
				
			||||||
 | 
					                code: language.code,
 | 
				
			||||||
 | 
					                locale: language.locale,
 | 
				
			||||||
 | 
					                name: language.name,
 | 
				
			||||||
 | 
					                percent_translated: language.percent_translated,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const formatted_list = [];
 | 
				
			||||||
 | 
					    const language_len = language_list.length;
 | 
				
			||||||
 | 
					    const firsts_end = Math.floor(language_len / 2) + (language_len % 2);
 | 
				
			||||||
 | 
					    const firsts = _.range(0, firsts_end);
 | 
				
			||||||
 | 
					    const seconds = _.range(firsts_end, language_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const longest_zip = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Create a zip (itertool.zip_longest in python)
 | 
				
			||||||
 | 
					    for (const value of firsts) {
 | 
				
			||||||
 | 
					        longest_zip.push([value, seconds[value]]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const row of longest_zip) {
 | 
				
			||||||
 | 
					        const item = {};
 | 
				
			||||||
 | 
					        const zip_row = [
 | 
				
			||||||
 | 
					            ["first", row[0]],
 | 
				
			||||||
 | 
					            ["second", row[1]],
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        for (const zip_value of zip_row) {
 | 
				
			||||||
 | 
					            if (zip_value[1] !== undefined) {
 | 
				
			||||||
 | 
					                const lang = language_list[zip_value[1]];
 | 
				
			||||||
 | 
					                const name = lang.name;
 | 
				
			||||||
 | 
					                let name_with_percent = name;
 | 
				
			||||||
 | 
					                if (lang.percent_translated !== undefined) {
 | 
				
			||||||
 | 
					                    name_with_percent = name + " (" + lang.percent_translated + "%)";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let selected = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (default_language === lang.code || default_language === lang.locale) {
 | 
				
			||||||
 | 
					                    selected = true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                item[zip_value[0]] = {
 | 
				
			||||||
 | 
					                    name,
 | 
				
			||||||
 | 
					                    code: lang.code,
 | 
				
			||||||
 | 
					                    name_with_percent,
 | 
				
			||||||
 | 
					                    selected,
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        formatted_list.push(item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return formatted_list;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ import render_settings_tab from "../templates/settings_tab.hbs";
 | 
				
			|||||||
import * as admin from "./admin";
 | 
					import * as admin from "./admin";
 | 
				
			||||||
import * as blueslip from "./blueslip";
 | 
					import * as blueslip from "./blueslip";
 | 
				
			||||||
import * as common from "./common";
 | 
					import * as common from "./common";
 | 
				
			||||||
import {$t, $t_html} from "./i18n";
 | 
					import {$t, $t_html, get_language_list_columns} from "./i18n";
 | 
				
			||||||
import * as overlays from "./overlays";
 | 
					import * as overlays from "./overlays";
 | 
				
			||||||
import {page_params} from "./page_params";
 | 
					import {page_params} from "./page_params";
 | 
				
			||||||
import * as people from "./people";
 | 
					import * as people from "./people";
 | 
				
			||||||
@@ -113,6 +113,7 @@ export function build_page() {
 | 
				
			|||||||
        user_can_change_avatar: settings_data.user_can_change_avatar(),
 | 
					        user_can_change_avatar: settings_data.user_can_change_avatar(),
 | 
				
			||||||
        user_role_text: people.get_user_type(page_params.user_id),
 | 
					        user_role_text: people.get_user_type(page_params.user_id),
 | 
				
			||||||
        default_language_name: settings_display.default_language_name,
 | 
					        default_language_name: settings_display.default_language_name,
 | 
				
			||||||
 | 
					        language_list_dbl_col: get_language_list_columns(page_params.default_language),
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $(".settings-box").html(rendered_settings_tab);
 | 
					    $(".settings-box").html(rendered_settings_tab);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,23 +21,23 @@
 | 
				
			|||||||
        </p>
 | 
					        </p>
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
            <table>
 | 
					            <table>
 | 
				
			||||||
                {{#each page_params.language_list_dbl_col}}
 | 
					                {{#each language_list}}
 | 
				
			||||||
                <tr>
 | 
					                <tr>
 | 
				
			||||||
                    <td>
 | 
					                    <td>
 | 
				
			||||||
                        <a class="language" data-code="{{this.first.code}}" data-name="{{this.first.name}}">
 | 
					                        <a class="language" data-code="{{this.first.code}}" data-name="{{this.first.name}}">
 | 
				
			||||||
                            {{#if this.first.selected}}
 | 
					                            {{#if this.first.selected}}
 | 
				
			||||||
                            <b>{{this.first.percent}}</b>
 | 
					                            <b>{{this.first.name_with_percent}}</b>
 | 
				
			||||||
                            {{else}}
 | 
					                            {{else}}
 | 
				
			||||||
                            {{this.first.percent}}
 | 
					                            {{this.first.name_with_percent}}
 | 
				
			||||||
                            {{/if}}
 | 
					                            {{/if}}
 | 
				
			||||||
                        </a>
 | 
					                        </a>
 | 
				
			||||||
                    </td>
 | 
					                    </td>
 | 
				
			||||||
                    <td>
 | 
					                    <td>
 | 
				
			||||||
                        <a class="language" data-code="{{this.second.code}}" data-name="{{this.second.name}}">
 | 
					                        <a class="language" data-code="{{this.second.code}}" data-name="{{this.second.name}}">
 | 
				
			||||||
                            {{#if this.second.selected}}
 | 
					                            {{#if this.second.selected}}
 | 
				
			||||||
                            <b>{{this.second.percent}}</b>
 | 
					                            <b>{{this.second.name_with_percent}}</b>
 | 
				
			||||||
                            {{else}}
 | 
					                            {{else}}
 | 
				
			||||||
                            {{this.second.percent}}
 | 
					                            {{this.second.name_with_percent}}
 | 
				
			||||||
                            {{/if}}
 | 
					                            {{/if}}
 | 
				
			||||||
                        </a>
 | 
					                        </a>
 | 
				
			||||||
                    </td>
 | 
					                    </td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
                </button>
 | 
					                </button>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            {{> ../default_language_modal guidelines_link="https://zulip.readthedocs.io/en/latest/translating/translating.html"}}
 | 
					            {{> ../default_language_modal language_list=language_list_dbl_col guidelines_link="https://zulip.readthedocs.io/en/latest/translating/translating.html"}}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div id="user-display-settings">
 | 
					        <div id="user-display-settings">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,6 @@ from zerver.lib.events import do_events_register
 | 
				
			|||||||
from zerver.lib.i18n import (
 | 
					from zerver.lib.i18n import (
 | 
				
			||||||
    get_and_set_request_language,
 | 
					    get_and_set_request_language,
 | 
				
			||||||
    get_language_list,
 | 
					    get_language_list,
 | 
				
			||||||
    get_language_list_for_templates,
 | 
					 | 
				
			||||||
    get_language_translation_data,
 | 
					    get_language_translation_data,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from zerver.lib.users import compute_show_invites_and_add_streams
 | 
					from zerver.lib.users import compute_show_invites_and_add_streams
 | 
				
			||||||
@@ -196,7 +195,6 @@ def build_page_params_for_home_page_load(
 | 
				
			|||||||
        # Only show marketing email settings if on Zulip Cloud
 | 
					        # Only show marketing email settings if on Zulip Cloud
 | 
				
			||||||
        corporate_enabled=settings.CORPORATE_ENABLED,
 | 
					        corporate_enabled=settings.CORPORATE_ENABLED,
 | 
				
			||||||
        ## Misc. extra data.
 | 
					        ## Misc. extra data.
 | 
				
			||||||
        language_list_dbl_col=get_language_list_for_templates(register_ret["default_language"]),
 | 
					 | 
				
			||||||
        language_list=get_language_list(),
 | 
					        language_list=get_language_list(),
 | 
				
			||||||
        needs_tutorial=needs_tutorial,
 | 
					        needs_tutorial=needs_tutorial,
 | 
				
			||||||
        first_in_realm=first_in_realm,
 | 
					        first_in_realm=first_in_realm,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,8 @@
 | 
				
			|||||||
# See https://zulip.readthedocs.io/en/latest/translating/internationalization.html
 | 
					# See https://zulip.readthedocs.io/en/latest/translating/internationalization.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import operator
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
from functools import lru_cache
 | 
					from functools import lru_cache
 | 
				
			||||||
from itertools import zip_longest
 | 
					 | 
				
			||||||
from typing import Any, Dict, List, Optional
 | 
					from typing import Any, Dict, List, Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import orjson
 | 
					import orjson
 | 
				
			||||||
@@ -21,46 +19,6 @@ def get_language_list() -> List[Dict[str, Any]]:
 | 
				
			|||||||
        return languages["name_map"]
 | 
					        return languages["name_map"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_language_list_for_templates(default_language: str) -> List[Dict[str, Dict[str, str]]]:
 | 
					 | 
				
			||||||
    language_list = [
 | 
					 | 
				
			||||||
        lang
 | 
					 | 
				
			||||||
        for lang in get_language_list()
 | 
					 | 
				
			||||||
        if "percent_translated" not in lang or lang["percent_translated"] >= 5.0
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    formatted_list = []
 | 
					 | 
				
			||||||
    lang_len = len(language_list)
 | 
					 | 
				
			||||||
    firsts_end = (lang_len // 2) + operator.mod(lang_len, 2)
 | 
					 | 
				
			||||||
    firsts = list(range(0, firsts_end))
 | 
					 | 
				
			||||||
    seconds = list(range(firsts_end, lang_len))
 | 
					 | 
				
			||||||
    assert len(firsts) + len(seconds) == lang_len
 | 
					 | 
				
			||||||
    for row in zip_longest(firsts, seconds):
 | 
					 | 
				
			||||||
        item = {}
 | 
					 | 
				
			||||||
        for position, ind in zip(["first", "second"], row):
 | 
					 | 
				
			||||||
            if ind is None:
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            lang = language_list[ind]
 | 
					 | 
				
			||||||
            percent = name = lang["name"]
 | 
					 | 
				
			||||||
            if "percent_translated" in lang:
 | 
					 | 
				
			||||||
                percent = "{} ({}%)".format(name, lang["percent_translated"])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            selected = False
 | 
					 | 
				
			||||||
            if default_language in (lang["code"], lang["locale"]):
 | 
					 | 
				
			||||||
                selected = True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            item[position] = {
 | 
					 | 
				
			||||||
                "name": name,
 | 
					 | 
				
			||||||
                "code": lang["code"],
 | 
					 | 
				
			||||||
                "percent": percent,
 | 
					 | 
				
			||||||
                "selected": selected,
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        formatted_list.append(item)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return formatted_list
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_language_name(code: str) -> str:
 | 
					def get_language_name(code: str) -> str:
 | 
				
			||||||
    for lang in get_language_list():
 | 
					    for lang in get_language_list():
 | 
				
			||||||
        if code in (lang["code"], lang["locale"]):
 | 
					        if code in (lang["code"], lang["locale"]):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,7 +106,6 @@ class HomeTest(ZulipTestCase):
 | 
				
			|||||||
        "is_spectator",
 | 
					        "is_spectator",
 | 
				
			||||||
        "jitsi_server_url",
 | 
					        "jitsi_server_url",
 | 
				
			||||||
        "language_list",
 | 
					        "language_list",
 | 
				
			||||||
        "language_list_dbl_col",
 | 
					 | 
				
			||||||
        "last_event_id",
 | 
					        "last_event_id",
 | 
				
			||||||
        "left_side_userlist",
 | 
					        "left_side_userlist",
 | 
				
			||||||
        "login_page",
 | 
					        "login_page",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user