gnucash stable: Multiple changes pushed
Christopher Lam
clam at code.gnucash.org
Fri Feb 13 18:09:01 EST 2026
Updated via https://github.com/Gnucash/gnucash/commit/2b7043b4 (commit)
via https://github.com/Gnucash/gnucash/commit/47938d1a (commit)
from https://github.com/Gnucash/gnucash/commit/3cee6a3b (commit)
commit 2b7043b4ba9f63faf5d3dcb74100934e1212709e
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sat Sep 14 21:57:52 2024 +0800
[reports] use gnc_date_interval_format
diff --git a/bindings/guile/date-utilities.scm b/bindings/guile/date-utilities.scm
index 3b0f009883..fa80c6ccdb 100644
--- a/bindings/guile/date-utilities.scm
+++ b/bindings/guile/date-utilities.scm
@@ -167,10 +167,10 @@
(gnc-print-time64 (gnc-mktime datevec) "%B %Y"))
(define (gnc:date-get-week-year-string datevec)
- (let* ((beginweekt64 (* (gnc:time64-get-week (gnc-mktime datevec)) 7 86400))
- (begin-string (qof-print-date (+ beginweekt64 (* 3 86400))))
- (end-string (qof-print-date (+ beginweekt64 (* 9 86400)))))
- (format #f (G_ "~a to ~a") begin-string end-string)))
+ (define SECS-PER-DAY 86400)
+ (let ((beginweekt64 (* (gnc:time64-get-week (gnc-mktime datevec)) 7 SECS-PER-DAY)))
+ (gnc-date-interval-format (+ beginweekt64 (* 3 SECS-PER-DAY))
+ (+ beginweekt64 (* 9 SECS-PER-DAY)))))
;; is leap year?
(define (gnc:leap-year? year)
diff --git a/gnucash/report/reports/example/daily-reports.scm b/gnucash/report/reports/example/daily-reports.scm
index 5219a421f7..815e994dbb 100644
--- a/gnucash/report/reports/example/daily-reports.scm
+++ b/gnucash/report/reports/example/daily-reports.scm
@@ -256,10 +256,7 @@
chart (list
report-title
(string-append
- (format #f
- (G_ "~a to ~a")
- (qof-print-date from-date)
- (qof-print-date to-date))
+ (gnc-date-interval-format from-date to-date)
(if show-total?
(let ((total (apply + daily-totals)))
(format
diff --git a/gnucash/report/reports/standard/account-piecharts.scm b/gnucash/report/reports/standard/account-piecharts.scm
index 439c6333e3..912fb6d300 100644
--- a/gnucash/report/reports/standard/account-piecharts.scm
+++ b/gnucash/report/reports/standard/account-piecharts.scm
@@ -510,10 +510,7 @@ balance at a given time"))
chart (list report-title
(string-append
(if do-intervals?
- (format #f
- (G_ "~a to ~a")
- (qof-print-date from-date)
- (qof-print-date to-date))
+ (gnc-date-interval-format from-date to-date)
(format #f
(G_ "Balance at ~a")
(qof-print-date to-date)))
diff --git a/gnucash/report/reports/standard/balance-forecast.scm b/gnucash/report/reports/standard/balance-forecast.scm
index 78e906fb30..ddfaedd31a 100644
--- a/gnucash/report/reports/standard/balance-forecast.scm
+++ b/gnucash/report/reports/standard/balance-forecast.scm
@@ -273,9 +273,7 @@ date point, a projected minimum balance including scheduled transactions."))
(gnc:html-chart-set-type! chart 'line)
;; Set the chart titles
(gnc:html-chart-set-title!
- chart (list report-title
- (format #f (G_ "~a to ~a")
- (qof-print-date from-date) (qof-print-date to-date))))
+ chart (list report-title (gnc-date-interval-format from-date to-date)))
;; Set the chart size
(gnc:html-chart-set-width! chart plot-width)
(gnc:html-chart-set-height! chart plot-height)
diff --git a/gnucash/report/reports/standard/balsheet-pnl.scm b/gnucash/report/reports/standard/balsheet-pnl.scm
index de8ed13865..cc81ce6eab 100644
--- a/gnucash/report/reports/standard/balsheet-pnl.scm
+++ b/gnucash/report/reports/standard/balsheet-pnl.scm
@@ -864,8 +864,7 @@ also show overall period profit & loss."))
(display report-title)
(display " ")
(if (or (not (eq? incr 'disabled)) (eq? report-type 'pnl))
- (format #t (G_ "~a to ~a")
- (qof-print-date startdate) (qof-print-date enddate))
+ (display (gnc-date-interval-format startdate enddate))
(display (qof-print-date enddate))))))
(if (eq? (get-option gnc:pagename-general optname-options-summary) 'always)
diff --git a/gnucash/report/reports/standard/budget.scm b/gnucash/report/reports/standard/budget.scm
index ff03c435e9..1aa44e2619 100644
--- a/gnucash/report/reports/standard/budget.scm
+++ b/gnucash/report/reports/standard/budget.scm
@@ -465,9 +465,9 @@
((eq? (car column-list) 'total)
(G_ "Total"))
((list? (car column-list))
- (format #f (G_ "~a to ~a")
- (period-to-date-string (car (car column-list)))
- (period-to-date-string (last (car column-list)))))
+ (gnc-date-interval-format
+ (gnc-budget-get-period-start-date budget (car (car column-list)))
+ (gnc-budget-get-period-start-date budget (last (car column-list)))))
(else
(period-to-date-string (car column-list)))))
diff --git a/gnucash/report/reports/standard/cash-flow.scm b/gnucash/report/reports/standard/cash-flow.scm
index 3ec0d0f3af..69904a0f58 100644
--- a/gnucash/report/reports/standard/cash-flow.scm
+++ b/gnucash/report/reports/standard/cash-flow.scm
@@ -180,8 +180,7 @@
doc (string-append
(get-option gnc:pagename-general gnc:optname-reportname)
" - "
- (format #f (G_ "~a to ~a")
- (qof-print-date from-date-t64) (qof-print-date to-date-t64))))
+ (gnc-date-interval-format from-date-t64 to-date-t64)))
(if (not (null? accounts))
diff --git a/gnucash/report/reports/standard/cashflow-barchart.scm b/gnucash/report/reports/standard/cashflow-barchart.scm
index 2189bcfd77..a72df612d5 100644
--- a/gnucash/report/reports/standard/cashflow-barchart.scm
+++ b/gnucash/report/reports/standard/cashflow-barchart.scm
@@ -254,11 +254,7 @@
(gnc:report-percent-done 90)
(gnc:html-chart-set-title!
- chart (list report-title
- (format #f
- (G_ "~a to ~a")
- (qof-print-date from-date-t64)
- (qof-print-date to-date-t64))))
+ chart (list report-title (gnc-date-interval-format from-date-t64 to-date-t64)))
(gnc:html-chart-set-width! chart width)
(gnc:html-chart-set-height! chart height)
(gnc:html-chart-set-y-axis-label!
diff --git a/gnucash/report/reports/standard/category-barchart.scm b/gnucash/report/reports/standard/category-barchart.scm
index 4adbccf4a1..ee63e271a3 100644
--- a/gnucash/report/reports/standard/category-barchart.scm
+++ b/gnucash/report/reports/standard/category-barchart.scm
@@ -518,12 +518,8 @@ Please deselect the accounts with negative balances."))
(gnc:html-chart-set-title!
chart (list report-title
- (format #f
- (if do-intervals?
- (G_ "~a to ~a")
- (G_ "Balances ~a to ~a"))
- (qof-print-date from-date-t64)
- (qof-print-date to-date-t64))))
+ (format #f (if do-intervals? "~a" (G_ "Balances ~a"))
+ (gnc-date-interval-format from-date-t64 to-date-t64))))
(gnc:html-chart-set-width! chart width)
(gnc:html-chart-set-height! chart height)
diff --git a/gnucash/report/reports/standard/investment-lots.scm b/gnucash/report/reports/standard/investment-lots.scm
index ae23c33cd7..40a897fcd3 100644
--- a/gnucash/report/reports/standard/investment-lots.scm
+++ b/gnucash/report/reports/standard/investment-lots.scm
@@ -1960,10 +1960,9 @@
(gnc:html-document-set-title!
document
(format #f
- (G_ "~a, ~a to ~a")
+ (G_ "~a, ~a")
(get-option gnc:pagename-general gnc:optname-reportname)
- (qof-print-date from-date)
- (qof-print-date to-date)))
+ (gnc-date-interval-format from-date to-date)))
(cond
((not (null? accounts))
@@ -1986,11 +1985,7 @@
(list colname-unrealized-gain))
'()))))
(gnc:html-chart-set-title! chart
- (list (N_ "Account Lot Gains")
- (format #f
- (G_ "~a to ~a")
- (qof-print-date from-date)
- (qof-print-date to-date))))
+ (list (N_ "Account Lot Gains") (gnc-date-interval-format from-date to-date)))
(gnc:html-chart-set-type! chart 'bar)
(gnc:html-chart-set-width! chart chart-width)
(gnc:html-chart-set-height! chart chart-height)
diff --git a/gnucash/report/reports/standard/net-charts.scm b/gnucash/report/reports/standard/net-charts.scm
index b5e1e5df99..d3695c750a 100644
--- a/gnucash/report/reports/standard/net-charts.scm
+++ b/gnucash/report/reports/standard/net-charts.scm
@@ -312,10 +312,7 @@
(gnc:html-chart-set-width! chart width)
(gnc:html-chart-set-height! chart height)
(gnc:html-chart-set-title!
- chart (list report-title
- (format #f (G_ "~a to ~a")
- (qof-print-date from-date-t64)
- (qof-print-date to-date-t64))))
+ chart (list report-title (gnc-date-interval-format from-date-t64 to-date-t64)))
(gnc:html-chart-set-y-axis-label!
chart (gnc-commodity-get-mnemonic report-currency))
(gnc:html-chart-set-grid?! chart y-grid)
diff --git a/gnucash/report/reports/standard/new-owner-report.scm b/gnucash/report/reports/standard/new-owner-report.scm
index 4fdf13b1d6..420ea2bee7 100644
--- a/gnucash/report/reports/standard/new-owner-report.scm
+++ b/gnucash/report/reports/standard/new-owner-report.scm
@@ -1147,8 +1147,8 @@ and do not match the transaction."))))))))
(gnc:html-document-add-object!
document (gnc:make-html-text
- (string-append (G_ "Date Range") ": " (qof-print-date start-date)
- " - " (qof-print-date end-date))))
+ (string-append (G_ "Date Range") ": "
+ (gnc-date-interval-format start-date end-date))))
(make-break! document)
diff --git a/gnucash/report/reports/standard/price-scatter.scm b/gnucash/report/reports/standard/price-scatter.scm
index 6d83e16686..370004bb91 100644
--- a/gnucash/report/reports/standard/price-scatter.scm
+++ b/gnucash/report/reports/standard/price-scatter.scm
@@ -182,10 +182,7 @@
(string-append
(gnc-commodity-get-mnemonic base-commodity)
" - "
- (format #f
- (G_ "~a to ~a")
- (qof-print-date from-date)
- (qof-print-date to-date)))))
+ (gnc-date-interval-format from-date to-date))))
(gnc:html-chart-set-width! chart width)
(gnc:html-chart-set-height! chart height)
(gnc:html-chart-set! chart
diff --git a/gnucash/report/reports/standard/txn-columns.scm b/gnucash/report/reports/standard/txn-columns.scm
index 16f9cafd9d..a44fa75d68 100644
--- a/gnucash/report/reports/standard/txn-columns.scm
+++ b/gnucash/report/reports/standard/txn-columns.scm
@@ -183,7 +183,7 @@ Select a different subset of transactions, or increase the limit in the options.
1 3 "total-label-cell"
(gnc:make-html-text
(G_ "Total For ")
- (format #f "~a to ~a" (qof-print-date from-date) (qof-print-date to-date))))
+ (gnc-date-interval-format from-date to-date)))
(map (lambda (acc total)
(gnc:make-html-table-cell/markup
"total-number-cell"
diff --git a/gnucash/report/trep-engine.scm b/gnucash/report/trep-engine.scm
index d85c592c51..483bca9c2b 100644
--- a/gnucash/report/trep-engine.scm
+++ b/gnucash/report/trep-engine.scm
@@ -2646,11 +2646,7 @@ be excluded from periodic reporting.")
document
(gnc:make-html-text
(gnc:html-markup-h3
- (format #f
- ;; Translators: Both ~a's are dates
- (G_ "From ~a to ~a")
- (qof-print-date begindate)
- (qof-print-date enddate)))))
+ (gnc-date-interval-format begindate enddate))))
(when (eq? infobox-display 'always)
(gnc:html-document-add-object!
commit 47938d1a2cc7f3abb74b08c3c14c08c2786f58a3
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Wed Feb 11 18:43:21 2026 +0800
[gnc-date.cpp] gnc_date_interval_format localisable with ICU
diff --git a/bindings/engine.i b/bindings/engine.i
index 5b1d5b587c..8e9bce0d6e 100644
--- a/bindings/engine.i
+++ b/bindings/engine.i
@@ -116,6 +116,9 @@ engine-common.i */
%newobject xaccTransGetPaymentAcctSplitList;
%newobject xaccAccountGetSplitList;
+%newobject gnc_date_interval_format;
+gchar* gnc_date_interval_format (time64 from_date, time64 to_date);
+
%include "engine-common.i"
#if defined(SWIGGUILE)
diff --git a/libgnucash/engine/gnc-date.cpp b/libgnucash/engine/gnc-date.cpp
index 0f46cfcf87..cd5e64ba3f 100644
--- a/libgnucash/engine/gnc-date.cpp
+++ b/libgnucash/engine/gnc-date.cpp
@@ -45,6 +45,8 @@
#include <cinttypes>
#include <unicode/calendar.h>
+#include "unicode/dtitvfmt.h"
+#include "unicode/smpdtfmt.h"
#include "gnc-date.h"
#include "gnc-date-p.h"
@@ -613,6 +615,71 @@ qof_print_date (time64 t)
return g_strdup (buff);
}
+static icu::DateIntervalFormat*
+get_icu_date_interval_formatter ()
+{
+ static std::unique_ptr<icu::DateIntervalFormat> difmt;
+ if (!difmt)
+ {
+ auto locale = icu::Locale::getDefault();
+ UErrorCode status = U_ZERO_ERROR;
+ difmt.reset(icu::DateIntervalFormat::createInstance(UDAT_YEAR_NUM_MONTH_DAY, locale, status));
+ if (U_FAILURE(status))
+ {
+ PWARN ("icu::DateIntervalFormat::createInstance error %d", status);
+ return nullptr;
+ }
+ }
+ return difmt.get();
+}
+
+static gchar*
+icu_date_interval_format (time64 from_date, time64 to_date)
+{
+ auto difmt = get_icu_date_interval_formatter();
+ if (!difmt)
+ return nullptr;
+
+ if (from_date > to_date)
+ std::swap(from_date, to_date);
+
+ icu::DateInterval interval (from_date * 1000.0, to_date * 1000.0);
+ icu::UnicodeString result;
+ icu::FieldPosition fp;
+ UErrorCode status = U_ZERO_ERROR;
+ difmt->format (&interval, result, fp, status);
+ if (U_FAILURE(status))
+ {
+ PWARN("Error formatting interval: %d", status);
+ return nullptr;
+ }
+
+ std::string interval_string;
+ result.toUTF8String(interval_string);
+
+ return g_strdup (interval_string.c_str());
+}
+
+gchar*
+gnc_date_interval_format (time64 from_date, time64 to_date)
+{
+ gchar* rv = nullptr;
+
+ if (qof_date_format_get() == QOF_DATE_FORMAT_LOCALE)
+ rv = icu_date_interval_format (from_date, to_date);
+
+ // not using locale, or icu failure
+ if (!rv)
+ {
+ gchar from_buff[MAX_DATE_LENGTH+1], to_buff[MAX_DATE_LENGTH+1];
+ qof_print_date_buff (from_buff, MAX_DATE_LENGTH, from_date);
+ qof_print_date_buff (to_buff, MAX_DATE_LENGTH, to_date);
+ rv = g_strdup_printf (gettext("%s to %s"), from_buff, to_buff);
+ }
+
+ return rv;
+}
+
/* ============================================================== */
/* return the greatest integer <= a/b; works for b > 0 and positive or
diff --git a/libgnucash/engine/gnc-date.h b/libgnucash/engine/gnc-date.h
index d44bc2b289..3b4a50825e 100644
--- a/libgnucash/engine/gnc-date.h
+++ b/libgnucash/engine/gnc-date.h
@@ -482,6 +482,8 @@ size_t qof_print_gdate(char *buf, size_t bufflen, const GDate *gd);
char * qof_print_date (time64 secs);
+gchar* gnc_date_interval_format (time64 from_date, time64 to_date);
+
/* ------------------------------------------------------------------ */
/* time printing utilities */
Summary of changes:
bindings/engine.i | 3 +
bindings/guile/date-utilities.scm | 8 +--
gnucash/report/reports/example/daily-reports.scm | 5 +-
.../report/reports/standard/account-piecharts.scm | 5 +-
.../report/reports/standard/balance-forecast.scm | 4 +-
gnucash/report/reports/standard/balsheet-pnl.scm | 3 +-
gnucash/report/reports/standard/budget.scm | 6 +-
gnucash/report/reports/standard/cash-flow.scm | 3 +-
.../report/reports/standard/cashflow-barchart.scm | 6 +-
.../report/reports/standard/category-barchart.scm | 8 +--
.../report/reports/standard/investment-lots.scm | 11 +---
gnucash/report/reports/standard/net-charts.scm | 5 +-
.../report/reports/standard/new-owner-report.scm | 4 +-
gnucash/report/reports/standard/price-scatter.scm | 5 +-
gnucash/report/reports/standard/txn-columns.scm | 2 +-
gnucash/report/trep-engine.scm | 6 +-
libgnucash/engine/gnc-date.cpp | 67 ++++++++++++++++++++++
libgnucash/engine/gnc-date.h | 2 +
18 files changed, 96 insertions(+), 57 deletions(-)
More information about the gnucash-changes
mailing list