From d5d5867d4e68ef4b326db1d4d49544b6f6f0ab82 Mon Sep 17 00:00:00 2001 From: zwim <36999612+zwim@users.noreply.github.com> Date: Tue, 24 May 2022 00:25:50 +0200 Subject: [PATCH] DoubleSpinWidget, SpinWidget: add units, make usage more consistent (#9046) --- .../reader/modules/readerdevicestatus.lua | 16 ++-- frontend/apps/reader/modules/readerfooter.lua | 32 ++++---- .../apps/reader/modules/readerhighlight.lua | 15 ++-- .../apps/reader/modules/readerscrolling.lua | 2 + .../apps/reader/modules/readertypography.lua | 7 +- .../ui/data/keyboardlayouts/ja_keyboard.lua | 2 + frontend/ui/data/onetime_migration.lua | 16 +++- frontend/ui/elements/screensaver_menu.lua | 4 +- frontend/ui/screensaver.lua | 3 +- frontend/ui/widget/doublespinwidget.lua | 75 ++++++++++++++----- frontend/ui/widget/frontlightwidget.lua | 9 ++- frontend/ui/widget/numberpickerwidget.lua | 11 ++- frontend/ui/widget/spinwidget.lua | 17 ++++- frontend/util.lua | 13 ++-- plugins/autowarmth.koplugin/main.lua | 12 ++- plugins/gestures.koplugin/main.lua | 8 ++ plugins/statistics.koplugin/main.lua | 15 ++-- plugins/terminal.koplugin/main.lua | 2 + 18 files changed, 184 insertions(+), 75 deletions(-) diff --git a/frontend/apps/reader/modules/readerdevicestatus.lua b/frontend/apps/reader/modules/readerdevicestatus.lua index 6bee3e1b1..e9deadbd8 100644 --- a/frontend/apps/reader/modules/readerdevicestatus.lua +++ b/frontend/apps/reader/modules/readerdevicestatus.lua @@ -7,6 +7,7 @@ local SpinWidget = require("ui/widget/spinwidget") local UIManager = require("ui/uimanager") local powerd = Device:getPowerDevice() local _ = require("gettext") +local C_ = _.pgettext local T = require("ffi/util").template local ReaderDeviceStatus = InputContainer:new{ @@ -36,8 +37,8 @@ function ReaderDeviceStatus:init() UIManager:close(self.battery_confirm_box) end self.battery_confirm_box = ConfirmBox:new { - text = is_charging and T(_("High battery level: %1%\n\nDismiss battery level alert?"), battery_capacity) - or T(_("Low battery level: %1%\n\nDismiss battery level alert?"), battery_capacity), + text = is_charging and T(_("High battery level: %1 %\n\nDismiss battery level alert?"), battery_capacity) + or T(_("Low battery level: %1 %\n\nDismiss battery level alert?"), battery_capacity), ok_text = _("Dismiss"), dismissable = false, ok_callback = function() @@ -154,6 +155,7 @@ function ReaderDeviceStatus:addToMainMenu(menu_items) value_min = 1, value_max = 60, default_value = 10, + unit = C_("Time", "min"), value_hold_step = 5, title_text = _("Battery check interval"), callback = function(spin) @@ -172,7 +174,7 @@ function ReaderDeviceStatus:addToMainMenu(menu_items) table.insert(menu_items.device_status_alarm.sub_item_table, { text_func = function() - return T(_("Thresholds: %1% – %2%"), self.battery_threshold, self.battery_threshold_high) + return T(_("Thresholds: %1 % / %2 %"), self.battery_threshold, self.battery_threshold_high) end, enabled_func = function() return G_reader_settings:isTrue("device_status_battery_alarm") @@ -199,16 +201,12 @@ High level threshold is checked when the device is charging.]]), right_default = 100, right_hold_step = 5, default_values = true, + unit = "%", callback = function(left_value, right_value) - if not left_value then -- "Default" button pressed - left_value = 20 - right_value = 100 - end self.battery_threshold = left_value self.battery_threshold_high = right_value G_reader_settings:saveSetting("device_status_battery_threshold", self.battery_threshold) G_reader_settings:saveSetting("device_status_battery_threshold_high", self.battery_threshold_high) - UIManager:close(thresholds_widget) touchmenu_instance:updateItems() powerd:setDismissBatteryStatus(false) end, @@ -249,6 +247,7 @@ High level threshold is checked when the device is charging.]]), value_min = 1, value_max = 60, default_value = 5, + unit = C_("Time", "min"), value_hold_step = 5, title_text = _("Memory check interval"), callback = function(spin) @@ -278,6 +277,7 @@ High level threshold is checked when the device is charging.]]), value_min = 20, value_max = 500, default_value = 100, + unit = C_("Data storage size", "MB"), value_step = 5, value_hold_step = 10, title_text = _("Memory alert threshold"), diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index 8724aee38..561694957 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -630,14 +630,14 @@ function ReaderFooter:set_custom_text(touchmenu_instance) title = "Enter a custom text", fields = { { - text = self.custom_text or "", + text = self.custom_text or "", description = _("Custom string:"), input_type = "string", }, { text = self.custom_text_repetitions, description =_("Number of repetitions:"), - input_type = "number", + input_type = "number", }, }, buttons = { @@ -1198,7 +1198,7 @@ function ReaderFooter:addToMainMenu(menu_items) value_max = 36, default_value = 14, ok_text = _("Set size"), - title_text = _("Footer font size"), + title_text = _("Footer font size"), keep_shown_on_apply = true, callback = function(spin) self.settings.text_font_size = spin.value @@ -1251,7 +1251,7 @@ function ReaderFooter:addToMainMenu(menu_items) value_max = 98, default_value = DMINIBAR_CONTAINER_HEIGHT, ok_text = _("Set height"), - title_text = _("Container height"), + title_text = _("Container height"), keep_shown_on_apply = true, callback = function(spin) self.settings.container_height = spin.value @@ -1277,7 +1277,7 @@ function ReaderFooter:addToMainMenu(menu_items) value_max = 49, default_value = 1, ok_text = _("Set margin"), - title_text = _("Container bottom margin"), + title_text = _("Container bottom margin"), keep_shown_on_apply = true, callback = function(spin) self.settings.container_bottom_padding = spin.value @@ -1295,7 +1295,7 @@ function ReaderFooter:addToMainMenu(menu_items) sub_item_table = { { text_func = function() - return T(_("Book title: %1%"), self.settings.book_title_max_width_pct) + return T(_("Book title: %1 %"), self.settings.book_title_max_width_pct) end, callback = function(touchmenu_instance) local SpinWidget = require("ui/widget/spinwidget") @@ -1305,7 +1305,8 @@ function ReaderFooter:addToMainMenu(menu_items) value_step = 5, value_hold_step = 20, value_max = 100, - title_text = _("Maximum width"), + unit = "%", + title_text = _("Maximum width"), info_text = _("Maximum book title width in percentage of screen width"), keep_shown_on_apply = true, callback = function(spin) @@ -1320,7 +1321,7 @@ function ReaderFooter:addToMainMenu(menu_items) }, { text_func = function() - return T(_("Current chapter: %1%"), self.settings.book_chapter_max_width_pct) + return T(_("Current chapter: %1 %"), self.settings.book_chapter_max_width_pct) end, callback = function(touchmenu_instance) local SpinWidget = require("ui/widget/spinwidget") @@ -1330,7 +1331,8 @@ function ReaderFooter:addToMainMenu(menu_items) value_step = 5, value_hold_step = 20, value_max = 100, - title_text = _("Maximum width"), + unit = "%", + title_text = _("Maximum width"), info_text = _("Maximum chapter width in percentage of screen width"), keep_shown_on_apply = true, callback = function(spin) @@ -1572,7 +1574,7 @@ With this enabled, the current page is included, so the count goes from n to 1 i table.insert(sub_items[settings_submenu_num].sub_item_table, 4, { text_func = function() if self.settings.battery_hide_threshold <= (Device:hasAuxBattery() and 200 or 100) then - return T(_("Hide battery status if level higher than: %1%"), self.settings.battery_hide_threshold) + return T(_("Hide battery status if level higher than: %1 %"), self.settings.battery_hide_threshold) else return _("Hide battery status") end @@ -1591,8 +1593,9 @@ With this enabled, the current page is included, so the count goes from n to 1 i value_min = 0, value_max = Device:hasAuxBattery() and 200 or 100, default_value = Device:hasAuxBattery() and 200 or 100, + unit = "%", value_hold_step = 10, - title_text = _("Hide battery threshold"), + title_text = _("Hide battery threshold"), callback = function(spin) self.settings.battery_hide_threshold = spin.value self:refreshFooter(true, true) @@ -1747,7 +1750,7 @@ With this enabled, the current page is included, so the count goes from n to 1 i value_hold_step = 2, value_max = value_max, default_value = default_value, - title_text = _("Progress bar size"), + title_text = _("Progress bar size"), keep_shown_on_apply = true, callback = function(spin) if self.settings.progress_style_thin then @@ -1907,7 +1910,7 @@ With this enabled, the current page is included, so the count goes from n to 1 i }, { text_func = function() - return T(_("Minimal width: %1%"), self.settings.progress_bar_min_width_pct) + return T(_("Minimal width: %1 %"), self.settings.progress_bar_min_width_pct) end, enabled_func = function() return self.settings.progress_bar_position == "alongside" and not self.settings.disable_progress_bar @@ -1921,7 +1924,8 @@ With this enabled, the current page is included, so the count goes from n to 1 i value_step = 5, value_hold_step = 20, value_max = 50, - title_text = _("Minimal width"), + unit = "%", + title_text = _("Minimal width"), text = _("Minimal progress bar width in percentage of screen width"), keep_shown_on_apply = true, callback = function(spin) diff --git a/frontend/apps/reader/modules/readerhighlight.lua b/frontend/apps/reader/modules/readerhighlight.lua index 28424af62..2abb21eec 100644 --- a/frontend/apps/reader/modules/readerhighlight.lua +++ b/frontend/apps/reader/modules/readerhighlight.lua @@ -397,9 +397,12 @@ function ReaderHighlight:addToMainMenu(menu_items) text = _("Long-press on text"), sub_item_table = { { - text = _("Highlight long-press interval"), + text_func = function() + return T(_("Highlight long-press interval: %1 s"), + G_reader_settings:readSetting("highlight_long_hold_threshold_s", 3)) + end, keep_menu_open = true, - callback = function() + callback = function(touchmenu_instance) local SpinWidget = require("ui/widget/spinwidget") local items = SpinWidget:new{ title_text = _("Highlight long-press interval"), @@ -408,15 +411,17 @@ If a touch is not released in this interval, it is considered a long-press. On d The interval value is in seconds and can range from 3 to 20 seconds.]]), width = math.floor(Screen:getWidth() * 0.75), - value = G_reader_settings:readSetting("highlight_long_hold_threshold", 3), + value = G_reader_settings:readSetting("highlight_long_hold_threshold_s", 3), value_min = 3, value_max = 20, value_step = 1, value_hold_step = 5, + unit = C_("Time", "s"), ok_text = _("Set interval"), default_value = 3, callback = function(spin) - G_reader_settings:saveSetting("highlight_long_hold_threshold", spin.value) + G_reader_settings:saveSetting("highlight_long_hold_threshold_s", spin.value) + if touchmenu_instance then touchmenu_instance:updateItems() end end } UIManager:show(items) @@ -1425,7 +1430,7 @@ function ReaderHighlight:onHoldRelease() local long_final_hold = false if self.hold_last_time then local hold_duration = time.now() - self.hold_last_time - local long_hold_threshold_s = G_reader_settings:readSetting("highlight_long_hold_threshold", 3) -- seconds + local long_hold_threshold_s = G_reader_settings:readSetting("highlight_long_hold_threshold_s", 3) -- seconds if hold_duration > time.s(long_hold_threshold_s) then -- We stayed 3 seconds before release without updating selection long_final_hold = true diff --git a/frontend/apps/reader/modules/readerscrolling.lua b/frontend/apps/reader/modules/readerscrolling.lua index cb53b0ffd..743790037 100644 --- a/frontend/apps/reader/modules/readerscrolling.lua +++ b/frontend/apps/reader/modules/readerscrolling.lua @@ -5,6 +5,7 @@ local UIManager = require("ui/uimanager") local logger = require("logger") local time = require("ui/time") local _ = require("gettext") +local C_ = _.pgettext local T = require("ffi/util").template local Screen = Device.screen @@ -162,6 +163,7 @@ Default value: %1 ms]]), scroll_activation_delay_default_ms), value_max = 2000, value_step = 100, value_hold_step = 500, + unit = C_("Time", "ms"), ok_text = _("Set delay"), default_value = scroll_activation_delay_default_ms, callback = function(spin) diff --git a/frontend/apps/reader/modules/readertypography.lua b/frontend/apps/reader/modules/readertypography.lua index 851be16a4..4c5fbcf26 100644 --- a/frontend/apps/reader/modules/readertypography.lua +++ b/frontend/apps/reader/modules/readertypography.lua @@ -349,7 +349,7 @@ When the book's language tag is not among our presets, no specific features will if G_reader_settings:has("hyph_left_hyphen_min") or G_reader_settings:has("hyph_right_hyphen_min") then -- @translators to RTL language translators: %1/left is the min length of the start of a hyphenated word, %2/right is the min length of the end of a hyphenated word (note that there is yet no support for hyphenation with RTL languages, so this will mostly apply to LTR documents) - return T(_("Left/right minimal sizes: %1 - %2"), + return T(_("Left/right minimal sizes: %1 / %2"), G_reader_settings:readSetting("hyph_left_hyphen_min"), G_reader_settings:readSetting("hyph_right_hyphen_min")) end @@ -376,7 +376,7 @@ When the book's language tag is not among our presets, no specific features will -- the hyphenation changes happening width_factor = 0.6, default_values = true, - default_text = _("Use language defaults"), + default_text = T(_("Language defaults: %1 / %2"), alg_left_hyphen_min, alg_right_hyphen_min), title_text = _("Hyphenation limits"), info_text = _([[ Set minimum length before hyphenation occurs. @@ -384,6 +384,9 @@ These settings will apply to all books with any hyphenation dictionary. 'Use language defaults' resets them.]]), keep_shown_on_apply = true, callback = function(left_hyphen_min, right_hyphen_min) + if left_hyphen_min == alg_left_hyphen_min and right_hyphen_min == alg_right_hyphen_min then + left_hyphen_min, right_hyphen_min = nil, nil -- don't store default values + end G_reader_settings:saveSetting("hyph_left_hyphen_min", left_hyphen_min) G_reader_settings:saveSetting("hyph_right_hyphen_min", right_hyphen_min) self.ui.document:setHyphLeftHyphenMin(G_reader_settings:readSetting("hyph_left_hyphen_min") or 0) diff --git a/frontend/ui/data/keyboardlayouts/ja_keyboard.lua b/frontend/ui/data/keyboardlayouts/ja_keyboard.lua index f67b93fea..881655477 100644 --- a/frontend/ui/data/keyboardlayouts/ja_keyboard.lua +++ b/frontend/ui/data/keyboardlayouts/ja_keyboard.lua @@ -14,6 +14,7 @@ local logger = require("logger") local util = require("util") local time = require("ui/time") local _ = require("gettext") +local C_ = _.pgettext local N_ = _.ngettext local T = require("ffi/util").template @@ -150,6 +151,7 @@ If set to 0, keitai input is disabled entirely and only flick input can be used. value_min = 0, value_max = 10, value_step = 1, + unit = C_("Time", "s"), ok_text = _("Set interval"), default_value = DEFAULT_KEITAI_TAP_INTERVAL_S, callback = function(spin) diff --git a/frontend/ui/data/onetime_migration.lua b/frontend/ui/data/onetime_migration.lua index fd38369b8..2d9d82f2d 100644 --- a/frontend/ui/data/onetime_migration.lua +++ b/frontend/ui/data/onetime_migration.lua @@ -7,7 +7,7 @@ local lfs = require("libs/libkoreader-lfs") local logger = require("logger") -- Date at which the last migration snippet was added -local CURRENT_MIGRATION_DATE = 20220426 +local CURRENT_MIGRATION_DATE = 20220523 -- Retrieve the date of the previous migration, if any local last_migration_date = G_reader_settings:readSetting("last_migration_date", 0) @@ -366,7 +366,7 @@ if last_migration_date < 20220205 then end end --- Rename several time storing settings and shift their value to the new meaning +-- Rename several time storing settings and shift their value to the new meaning see (#8999) if last_migration_date < 20220426 then local function migrateSettingsName(old, new, factor) factor = factor or 1 @@ -387,6 +387,18 @@ if last_migration_date < 20220426 then migrateSettingsName("device_status_memory_interval", "device_status_memory_interval_minutes") end +-- Rename several time storing settings and shift their value to the new meaning follow up to (#8999) +if last_migration_date < 20220523 then + local function migrateSettingsName(old, new, factor) + factor = factor or 1 + if G_reader_settings:readSetting(old) then + local value = math.floor(G_reader_settings:readSetting(old) * factor) + G_reader_settings:saveSetting(new, value) + G_reader_settings:delSetting(old) + end + end + migrateSettingsName("highlight_long_hold_threshold", "highlight_long_hold_threshold_s") +end -- We're done, store the current migration date G_reader_settings:saveSetting("last_migration_date", CURRENT_MIGRATION_DATE) diff --git a/frontend/ui/elements/screensaver_menu.lua b/frontend/ui/elements/screensaver_menu.lua index 2ff2a50ec..fb36e3ca1 100644 --- a/frontend/ui/elements/screensaver_menu.lua +++ b/frontend/ui/elements/screensaver_menu.lua @@ -1,5 +1,6 @@ local Screensaver = require("ui/screensaver") local _ = require("gettext") +local T = require("ffi/util").template local function hasLastFile() if G_reader_settings:hasNot("lastfile") then @@ -157,7 +158,8 @@ return { if G_reader_settings:nilOrFalse("screensaver_stretch_images") then return _("Stretch to fit screen") elseif G_reader_settings:readSetting("screensaver_stretch_limit_percentage") then - return _("Stretch to fit screen (with limit)") + return T(_("Stretch to fit screen (with limit: %1 %)"), + G_reader_settings:readSetting("screensaver_stretch_limit_percentage")) else return _("Stretch to fit screen") end diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index 396df7960..269bf9281 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -391,7 +391,8 @@ function Screensaver:setStretchLimit(touchmenu_instance) value = G_reader_settings:readSetting("screensaver_stretch_limit_percentage", 8), value_min = 0, value_max = 25, - default_value = 8, -- percent + default_value = 8, + unit = "%", title_text = _("Set maximum stretch limit"), ok_text = _("Set"), ok_always_enabled = true, diff --git a/frontend/ui/widget/doublespinwidget.lua b/frontend/ui/widget/doublespinwidget.lua index 91c2f3532..fac918dee 100644 --- a/frontend/ui/widget/doublespinwidget.lua +++ b/frontend/ui/widget/doublespinwidget.lua @@ -43,16 +43,19 @@ local DoubleSpinWidget = FocusManager:new{ right_wrap = false, cancel_text = _("Close"), ok_text = _("Apply"), + ok_always_enabled = false, -- set to true to enable OK button for unchanged values cancel_callback = nil, callback = nil, close_callback = nil, keep_shown_on_apply = false, - -- Set this to add upper default button that applies default values with callback(nil, nil) + -- Set this to add upper default button that applies default values with callback(left_default, right_default) default_values = false, default_text = nil, -- Optional extra button above ok/cancel buttons row extra_text = nil, extra_callback = nil, + is_range = false, -- show a range separator in default button and between the spinners + unit = nil, } function DoubleSpinWidget:init() @@ -81,6 +84,11 @@ function DoubleSpinWidget:init() } end + if self.unit and self.unit ~= "" then + self.left_precision = self.left_precision and self.left_precision or "%1d" + self.right_precision = self.right_precision and self.right_precision or "%1d" + end + -- Actually the widget layout self:update() end @@ -98,6 +106,7 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val value_hold_step = self.left_hold_step, precision = self.left_precision, wrap = self.left_wrap, + unit = self.unit, } self:mergeLayoutInHorizontal(left_widget) local right_widget = NumberPickerWidget:new{ @@ -109,6 +118,7 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val value_hold_step = self.right_hold_step, precision = self.right_precision, wrap = self.right_wrap, + unit = self.unit, } self:mergeLayoutInHorizontal(right_widget) left_widget.picker_updated_callback = function(value) @@ -117,26 +127,43 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val right_widget.picker_updated_callback = function(value) self:update(left_widget:getValue(), value) end + local separator_widget = TextWidget:new{ + text = self.is_range and "–" or "", + face = self.title_face, + bold = true, + } local text_max_width = math.floor(0.95 * self.width / 2) local left_vertical_group = VerticalGroup:new{ align = "center", - TextWidget:new{ - text = self.left_text, - face = self.title_face, - max_width = text_max_width, - }, left_widget, } + local separator_vertical_group = VerticalGroup:new{ + align = "center", + separator_widget, + } local right_vertical_group = VerticalGroup:new{ align = "center", - TextWidget:new{ + right_widget, + } + + if self.left_text ~= "" or self.right_text ~= "" then + table.insert(left_vertical_group, 1, TextWidget:new{ + text = self.left_text, + face = self.title_face, + max_width = text_max_width, + }) + table.insert(separator_vertical_group, 1, TextWidget:new{ + text = "", + face = self.title_face, + }) + table.insert(right_vertical_group, 1, TextWidget:new{ text = self.right_text, face = self.title_face, max_width = text_max_width, - }, - right_widget, - } + }) + end + local widget_group = HorizontalGroup:new{ align = "center", CenterContainer:new{ @@ -144,15 +171,19 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val w = self.width / 2, h = left_vertical_group:getSize().h, }, - left_vertical_group + left_vertical_group, + }, + CenterContainer:new{ + dimen = Geom:new{}, + separator_vertical_group, }, CenterContainer:new{ dimen = Geom:new{ w = self.width / 2, h = right_vertical_group:getSize().h, }, - right_vertical_group - } + right_vertical_group, + }, } local title_bar = TitleBar:new{ @@ -167,17 +198,26 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val local buttons = {} if self.default_values then + local separator = self.is_range and "–" or "/" + local unit = "" + if self.unit then + if self.unit == "°" then + unit = self.unit + elseif self.unit ~= "" then + unit = "\xE2\x80\xAF" .. self.unit -- use Narrow No-Break Space (NNBSP) here + end + end table.insert(buttons, { { - text = self.default_text or T(_("Apply default values: %1 / %2"), + text = self.default_text or T(_("Default values: %1%3 %4 %2%3"), self.left_precision and string.format(self.left_precision, self.left_default) or self.left_default, - self.right_precision and string.format(self.right_precision, self.right_default) or self.right_default), + self.right_precision and string.format(self.right_precision, self.right_default) or self.right_default, + unit, separator), callback = function() left_widget.value = self.left_default right_widget.value = self.right_default left_widget:update() right_widget:update() - self.callback(nil, nil) end, } }) @@ -209,7 +249,8 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val }, { text = self.ok_text, - enabled = self.left_value ~= left_widget:getValue() or self.right_value ~= right_widget:getValue(), + enabled = self.ok_always_enabled or self.left_value ~= left_widget:getValue() + or self.right_value ~= right_widget:getValue(), callback = function() self.left_value = left_widget:getValue() self.right_value = right_widget:getValue() diff --git a/frontend/ui/widget/frontlightwidget.lua b/frontend/ui/widget/frontlightwidget.lua index 4fbed820f..45e6112cd 100644 --- a/frontend/ui/widget/frontlightwidget.lua +++ b/frontend/ui/widget/frontlightwidget.lua @@ -22,6 +22,7 @@ local VerticalSpan = require("ui/widget/verticalspan") local WidgetContainer = require("ui/widget/container/widgetcontainer") local time = require("ui/time") local _ = require("gettext") +local C_ = _.pgettext local Screen = Device.screen local FrontLightWidget = FocusManager:new{ @@ -181,7 +182,7 @@ function FrontLightWidget:layout() self.fl_level, } local fl_min = Button:new{ - text = _("Min"), + text = C_("Extrema", "Min"), margin = Size.margin.small, radius = 0, enabled = true, @@ -192,7 +193,7 @@ function FrontLightWidget:layout() end, -- min is 1 (We use 0 to mean "toggle") } local fl_max = Button:new{ - text = _("Max"), + text = C_("Extrema", "Max"), margin = Size.margin.small, radius = 0, enabled = true, @@ -310,7 +311,7 @@ function FrontLightWidget:layout() self.nl_level, } local nl_min = Button:new{ - text = _("Min"), + text = C_("Extrema", "Min"), margin = Size.margin.small, radius = 0, enabled = true, @@ -321,7 +322,7 @@ function FrontLightWidget:layout() end, } local nl_max = Button:new{ - text = _("Max"), + text = C_("Extrema", "Max"), margin = Size.margin.small, radius = 0, enabled = true, diff --git a/frontend/ui/widget/numberpickerwidget.lua b/frontend/ui/widget/numberpickerwidget.lua index 1fed812eb..60ef57550 100644 --- a/frontend/ui/widget/numberpickerwidget.lua +++ b/frontend/ui/widget/numberpickerwidget.lua @@ -50,6 +50,7 @@ local NumberPickerWidget = FocusManager:new{ date_year = nil, -- on update signal to the caller and pass updated value picker_updated_callback = nil, + unit = "", } function NumberPickerWidget:init() @@ -176,8 +177,16 @@ function NumberPickerWidget:init() end end + local unit = "" + if self.unit then + if self.unit == "°" then + unit = self.unit + elseif self.unit ~= "" then + unit = "\xE2\x80\xAF" .. self.unit -- use Narrow No-Break Space (NNBSP) here + end + end self.text_value = Button:new{ - text = tostring(self.formatted_value), + text = tostring(self.formatted_value) .. unit, bordersize = 0, padding = 0, text_font_face = self.spinner_face.font, diff --git a/frontend/ui/widget/spinwidget.lua b/frontend/ui/widget/spinwidget.lua index 4e3ef5066..03f530bc6 100644 --- a/frontend/ui/widget/spinwidget.lua +++ b/frontend/ui/widget/spinwidget.lua @@ -49,6 +49,7 @@ local SpinWidget = FocusManager:new{ -- Optional extra button above ok/cancel buttons row option_text = nil, option_callback = nil, + unit = nil, } function SpinWidget:init() @@ -80,6 +81,9 @@ function SpinWidget:init() } end + if self.unit and self.unit ~= "" then + self.precision = self.precision and self.precision or "%1d" + end -- Actually the widget layout self:update() end @@ -102,6 +106,7 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index) picker_updated_callback = function(value, value_index) self:update(value, value_index) end, + unit = self.unit, } self:mergeLayoutInVertical(value_widget) local value_group = HorizontalGroup:new{ @@ -121,10 +126,18 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index) local buttons = {} if self.default_value then + local unit = "" + if self.unit then + if self.unit == "°" then + unit = self.unit + elseif self.unit ~= "" then + unit = "\xE2\x80\xAF" .. self.unit -- use Narrow No-Break Space (NNBSP) here + end + end table.insert(buttons, { { - text = self.default_text or T(_("Default value: %1"), - self.precision and string.format(self.precision, self.default_value) or self.default_value), + text = self.default_text or T(_("Default value: %1%2"), + self.precision and string.format(self.precision, self.default_value) or self.default_value, unit), callback = function() value_widget.value = self.default_value value_widget:update() diff --git a/frontend/util.lua b/frontend/util.lua index 7f81916f0..ccafc829e 100644 --- a/frontend/util.lua +++ b/frontend/util.lua @@ -4,6 +4,7 @@ This module contains miscellaneous helper functions for the KOReader frontend. local BaseUtil = require("ffi/util") local _ = require("gettext") +local C_ = _.pgettext local T = BaseUtil.template local lshift = bit.lshift @@ -203,18 +204,18 @@ function util.secondsToHClock(seconds, withoutSeconds, hmsFormat, withDays) end if hmsFormat then -- @translators This is the 'h' for hour, like in 1h30m30s. This is a duration. - time_string = time_string:gsub(":", _("h"), 1) + time_string = time_string:gsub(":", C_("Time", "h"), 1) -- @translators This is the 'm' for minute, like in 1h30m30s. This is a duration. - time_string = time_string:gsub(":", _("m"), 1) - time_string = time_string:gsub("^00" .. _("h"), "") -- delete leading "00h" + time_string = time_string:gsub(":", C_("Time", "m"), 1) + time_string = time_string:gsub("^00" .. C_("Time", "h"), "") -- delete leading "00h" time_string = time_string:gsub("^0", "") -- delete leading "0" -- @translators This is the 's' for second, like in 1h30m30s. This is a duration. - return withoutSeconds and time_string or (time_string .. _("s")) + return withoutSeconds and time_string or (time_string .. C_("Time", "s")) else -- @translators This is the 'h' for hour, like in 1h30m30s. This is a duration. - time_string = time_string:gsub(":", _("h"), 1) + time_string = time_string:gsub(":", C_("Time", "h"), 1) time_string = time_string:gsub(":", "'", 1) - time_string = time_string:gsub("^00" .. _("h"), "") -- delete leading "00h" + time_string = time_string:gsub("^00" .. C_("Time", "h"), "") -- delete leading "00h" time_string = time_string:gsub("^0", "") -- delete leading "0" return withoutSeconds and time_string or (time_string .. SECONDS_SYMBOL) end diff --git a/plugins/autowarmth.koplugin/main.lua b/plugins/autowarmth.koplugin/main.lua index fb2782a84..b66f4ede6 100644 --- a/plugins/autowarmth.koplugin/main.lua +++ b/plugins/autowarmth.koplugin/main.lua @@ -22,6 +22,7 @@ local UIManager = require("ui/uimanager") local WidgetContainer = require("ui/widget/container/widgetcontainer") local logger = require("logger") local _ = require("gettext") +local C_ = _.pgettext local T = FFIUtil.template local Screen = require("device").screen local util = require("util") @@ -483,7 +484,7 @@ function AutoWarmth:getLocationMenu() }, { text_func = function() - return T(_("Coordinates: (%1, %2)"), self.latitude, self.longitude) + return T(_("Coordinates: (%1°, %2°)"), self.latitude, self.longitude) end, callback = function(touchmenu_instance) local location_widget = DoubleSpinWidget:new{ @@ -503,6 +504,7 @@ function AutoWarmth:getLocationMenu() right_step = 0.1, right_hold_step = 5, right_precision = "%0.2f", + unit = "°", callback = function(lat, long) self.latitude = lat self.longitude = long @@ -520,7 +522,7 @@ function AutoWarmth:getLocationMenu() }, { text_func = function() - return T(_("Altitude: %1m"), self.altitude) + return T(_("Altitude: %1 m"), self.altitude) end, callback = function(touchmenu_instance) UIManager:show(SpinWidget:new{ @@ -532,6 +534,7 @@ function AutoWarmth:getLocationMenu() wrap = false, value_step = 10, value_hold_step = 100, + unit = C_("Length", "m"), ok_text = _("Set"), callback = function(spin) self.altitude = spin.value @@ -676,9 +679,9 @@ function AutoWarmth:getWarmthMenu() text_func = function() if Device:hasNaturalLight() then if self.warmth[num] <= 100 then - return T(_("%1: %2%"), text, self.warmth[num]) + return T(_("%1: %2 %"), text, self.warmth[num]) else - return T(_("%1: 100% + ☾"), text) + return T(_("%1: 100 % + ☾"), text) end else if self.warmth[num] <= 100 then @@ -699,6 +702,7 @@ function AutoWarmth:getWarmthMenu() wrap = false, value_step = math.floor(100 / device_max_warmth), value_hold_step = 10, + unit = "%", ok_text = _("Set"), callback = function(spin) self.warmth[num] = spin.value diff --git a/plugins/gestures.koplugin/main.lua b/plugins/gestures.koplugin/main.lua index f186d2562..1bfa65910 100644 --- a/plugins/gestures.koplugin/main.lua +++ b/plugins/gestures.koplugin/main.lua @@ -19,6 +19,7 @@ local util = require("util") local T = FFIUtil.template local time = require("ui/time") local _ = require("gettext") +local C_ = _.pgettext local logger = require("logger") if not Device:isTouchDevice() then @@ -457,6 +458,7 @@ Higher values mean faster screen updates, but also use more CPU.]]), value_max = 60.0, value_step = 1, value_hold_step = 15, + unit = C_("Frequency", "Hz"), ok_text = _("Set rate"), default_value = default_value, callback = function(spin) @@ -484,6 +486,7 @@ The interval value is in milliseconds and can range from 0 (0 seconds) to 2000 ( value_max = 2000, value_step = 50, value_hold_step = 200, + unit = C_("Time", "ms"), ok_text = _("Set interval"), default_value = GestureDetector.TAP_INTERVAL_MS, callback = function(spin) @@ -510,6 +513,7 @@ The interval value is in milliseconds and can range from 0 (0 seconds) to 2000 ( value_max = 2000, value_step = 50, value_hold_step = 200, + unit = C_("Time", "ms"), ok_text = _("Set interval"), default_value = 0, callback = function(spin) @@ -535,6 +539,7 @@ The interval value is in milliseconds and can range from 100 (0.1 seconds) to 20 value_max = 2000, value_step = 100, value_hold_step = 500, + unit = C_("Time", "ms"), ok_text = _("Set interval"), default_value = GestureDetector.DOUBLE_TAP_INTERVAL_MS, callback = function(spin) @@ -561,6 +566,7 @@ The duration value is in milliseconds and can range from 100 (0.1 seconds) to 20 value_max = 2000, value_step = 100, value_hold_step = 500, + unit = C_("Time", "ms"), ok_text = _("Set duration"), default_value = GestureDetector.TWO_FINGER_TAP_DURATION_MS, callback = function(spin) @@ -587,6 +593,7 @@ The interval value is in milliseconds and can range from 100 (0.1 seconds) to 20 value_max = 2000, value_step = 100, value_hold_step = 500, + unit = C_("Time", "ms"), ok_text = _("Set interval"), default_value = GestureDetector.HOLD_INTERVAL_MS, callback = function(spin) @@ -612,6 +619,7 @@ The interval value is in milliseconds and can range from 100 (0.1 seconds) to 20 value_min = 100, value_max = 2000, value_step = 100, + unit = C_("Time", "ms"), value_hold_step = 500, ok_text = _("Set interval"), default_value = GestureDetector.SWIPE_INTERVAL_MS, diff --git a/plugins/statistics.koplugin/main.lua b/plugins/statistics.koplugin/main.lua index 08aa4b2a7..39531866e 100644 --- a/plugins/statistics.koplugin/main.lua +++ b/plugins/statistics.koplugin/main.lua @@ -20,6 +20,7 @@ local lfs = require("libs/libkoreader-lfs") local logger = require("logger") local util = require("util") local _ = require("gettext") +local C_ = _.pgettext local N_ = _.ngettext local T = FFIUtil.template @@ -935,21 +936,21 @@ function ReaderStatistics:addToMainMenu(menu_items) sub_item_table = { { text_func = function() - return T(_("Read page duration limits: %1 s / %2 s"), + return T(_("Read page duration limits: %1 s – %2 s"), self.settings.min_sec, self.settings.max_sec) end, callback = function(touchmenu_instance) local DoubleSpinWidget = require("/ui/widget/doublespinwidget") local durations_widget durations_widget = DoubleSpinWidget:new{ - left_text = _("Min"), + left_text = C_("Extrema", "Min"), left_value = self.settings.min_sec, left_default = DEFAULT_MIN_READ_SEC, left_min = 0, left_max = 120, left_step = 1, left_hold_step = 10, - right_text = _("Max"), + right_text = C_("Extrema", "Max"), right_value = self.settings.max_sec, right_default = DEFAULT_MAX_READ_SEC, right_min = 10, @@ -957,19 +958,17 @@ function ReaderStatistics:addToMainMenu(menu_items) right_step = 10, right_hold_step = 60, default_values = true, + is_range = true, + -- @translators This is the time unit for seconds. + unit = C_("Time", "s"), title_text = _("Read page duration limits"), info_text = _([[ Set min and max time spent (in seconds) on a page for it to be counted as read in statistics. The min value ensures pages you quickly browse and skip are not included. The max value ensures a page you stay on for a long time (because you fell asleep or went away) will be included, but with a duration capped to this specified max value.]]), callback = function(min, max) - if not min then -- "Default" button pressed - min = DEFAULT_MIN_READ_SEC - max = DEFAULT_MAX_READ_SEC - end self.settings.min_sec = min self.settings.max_sec = max - UIManager:close(durations_widget) touchmenu_instance:updateItems() end, } diff --git a/plugins/terminal.koplugin/main.lua b/plugins/terminal.koplugin/main.lua index 93e2ee18c..9e8e4b0f3 100644 --- a/plugins/terminal.koplugin/main.lua +++ b/plugins/terminal.koplugin/main.lua @@ -77,6 +77,7 @@ local TextWidget = require("ui/widget/textwidget") local bit = require("bit") local lfs = require("libs/libkoreader-lfs") local _ = require("gettext") +local C_ = _.pgettext local T = require("ffi/util").template local CHUNK_SIZE = 80 * 40 -- max. nb of read bytes (reduce this, if taps are not detected) @@ -550,6 +551,7 @@ Aliases (shortcuts) to frequently used commands can be placed in: value_max = 30, value_hold_step = 2, default_value = 16, + unit = C_("Data storage size", "kB"), title_text = _("Terminal emulator buffer size (kB)"), callback = function(spin) G_reader_settings:saveSetting("terminal_buffer_size", spin.value)