This commit is contained in:
Christopher Lam 2025-02-10 08:47:08 +08:00 committed by GitHub
commit c79a9f355c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 104 additions and 54 deletions

View File

@ -43,6 +43,9 @@
#include <gnc-engine.h>
#include "gnc-report.h"
#include "unicode/dtitvfmt.h"
#include "unicode/smpdtfmt.h"
extern "C" SCM scm_init_sw_report_module(void);
static QofLogModule log_module = GNC_MOD_GUI;
@ -428,3 +431,71 @@ gnc_get_optiondb_from_dispatcher(SCM dispatcher)
return u_ptr->get();
}
static icu::DateIntervalFormat*
get_date_interval_format ()
{
static std::unique_ptr<icu::DateIntervalFormat> difmt;
if (!difmt)
{
icu::Locale locale;
if (auto lc_time_locale = setlocale (LC_TIME, nullptr))
{
std::string localeStr(lc_time_locale);
if (size_t dotPos = localeStr.find('.'); dotPos != std::string::npos)
localeStr = localeStr.substr(0, dotPos);
locale = icu::Locale::createCanonical (localeStr.c_str());
}
UErrorCode status = U_ZERO_ERROR;
difmt.reset(icu::DateIntervalFormat::createInstance(UDAT_YEAR_NUM_MONTH_DAY, locale, status));
if (U_FAILURE(status))
return nullptr;
}
return difmt.get();
}
static gchar*
date_interval_format (time64 from_date, time64 to_date)
{
auto difmt = get_date_interval_format();
if (!difmt)
{
PWARN("couldn't create DateIntervalFormat");
return nullptr;
}
auto interval = new icu::DateInterval (from_date * 1000, to_date * 1000);
icu::UnicodeString result;
UErrorCode status = U_ZERO_ERROR;
difmt->format(interval, result, status);
if (U_FAILURE(status))
{
PWARN("Error formatting interval");
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 = 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 (_("%s to %s"), from_buff, to_buff);
}
return rv;
}

View File

@ -27,6 +27,7 @@
#include <glib.h>
#include <libguile.h>
#include <gnc-engine-guile.h>
#ifdef __cplusplus
extern "C"
{
@ -74,6 +75,8 @@ gboolean gnc_saved_reports_backup(void);
gboolean gnc_saved_reports_write_to_file(const gchar* report_def, gboolean overwrite);
gchar* gnc_date_interval_format (time64 from_date, time64 to_date);
#ifdef __cplusplus
} //extern "C"
/**

View File

@ -42,3 +42,6 @@ gchar* gnc_get_default_report_font_family();
void gnc_saved_reports_backup (void);
gboolean gnc_saved_reports_write_to_file (const gchar* report_def, gboolean overwrite);
%newobject gnc_date_interval_format;
gchar* gnc_date_interval_format (time64 from_date, time64 to_date);

View File

@ -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

View File

@ -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)))

View File

@ -270,9 +270,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)

View File

@ -859,8 +859,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))
(gnc-date-interval-format startdate enddate)
(display (qof-print-date enddate))))))
(if (eq? (get-option gnc:pagename-general optname-options-summary) 'always)

View File

@ -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)))))

View File

@ -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))

View File

@ -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!

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -1128,8 +1128,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)

View File

@ -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

View File

@ -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"

View File

@ -291,6 +291,12 @@ in the Options panel."))
(define (split->time64 s)
(xaccTransGetDate (xaccSplitGetParent s)))
(define (date-get-week-year-string date)
(let ((beginweekt64 (* (gnc:time64-get-week (gnc-mktime date)) 7 86400)))
(gnc-date-interval-format (+ beginweekt64 (* 3 86400))
(+ beginweekt64 (* 9 86400)))))
(define date-subtotal-list
;; List for date option.
;; Defines the different date sorting keys, as an association-list. Each entry:
@ -316,7 +322,7 @@ in the Options panel."))
(cons 'split-sortvalue (lambda (s) (time64-week (split->time64 s))))
(cons 'date-sortvalue time64-week)
(cons 'text (G_ "Weekly"))
(cons 'renderer-fn (compose gnc:date-get-week-year-string
(cons 'renderer-fn (compose date-get-week-year-string
gnc-localtime
split->time64)))
@ -2542,11 +2548,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!