Refactor locale number (#24134)
Before, the `GiteaLocaleNumber.js` was just written as a a drop-in replacement for old `js-pretty-number`. Actually, we can use Golang's `text` package to format. This PR partially completes the TODOs in `GiteaLocaleNumber.js`: > if we have complete backend locale support (eg: Golang "x/text" package), we can drop this component. > tooltip: only 2 usages of this, we can replace it with Golang's "x/text/number" package in the future. This PR also helps #24131 Screenshots: <details>   </details>wip
parent
be7cd73439
commit
7681d582cd
@ -0,0 +1,27 @@
|
|||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package translation
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// MockLocale provides a mocked locale without any translations
|
||||||
|
type MockLocale struct{}
|
||||||
|
|
||||||
|
var _ Locale = (*MockLocale)(nil)
|
||||||
|
|
||||||
|
func (l MockLocale) Language() string {
|
||||||
|
return "en"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l MockLocale) Tr(s string, _ ...interface{}) string {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l MockLocale) TrN(_cnt interface{}, key1, _keyN string, _args ...interface{}) string {
|
||||||
|
return key1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l MockLocale) PrettyNumber(v any) string {
|
||||||
|
return fmt.Sprint(v)
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package translation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/translation/i18n"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPrettyNumber(t *testing.T) {
|
||||||
|
// TODO: make this package friendly to testing
|
||||||
|
|
||||||
|
i18n.ResetDefaultLocales()
|
||||||
|
|
||||||
|
allLangMap = make(map[string]*LangType)
|
||||||
|
allLangMap["id-ID"] = &LangType{Lang: "id-ID", Name: "Bahasa Indonesia"}
|
||||||
|
|
||||||
|
l := NewLocale("id-ID")
|
||||||
|
assert.EqualValues(t, "1.000.000", l.PrettyNumber(1000000))
|
||||||
|
|
||||||
|
l = NewLocale("nosuch")
|
||||||
|
assert.EqualValues(t, "1,000,000", l.PrettyNumber(1000000))
|
||||||
|
}
|
@ -1,20 +0,0 @@
|
|||||||
// Convert a number to a locale string by data-number attribute.
|
|
||||||
// Or add a tooltip by data-number-in-tooltip attribute. JSON: {message: "count: %s", number: 123}
|
|
||||||
window.customElements.define('gitea-locale-number', class extends HTMLElement {
|
|
||||||
connectedCallback() {
|
|
||||||
// ideally, the number locale formatting and plural processing should be done by backend with translation strings.
|
|
||||||
// if we have complete backend locale support (eg: Golang "x/text" package), we can drop this component.
|
|
||||||
const number = this.getAttribute('data-number');
|
|
||||||
if (number) {
|
|
||||||
this.attachShadow({mode: 'open'});
|
|
||||||
this.shadowRoot.textContent = new Intl.NumberFormat().format(Number(number));
|
|
||||||
}
|
|
||||||
const numberInTooltip = this.getAttribute('data-number-in-tooltip');
|
|
||||||
if (numberInTooltip) {
|
|
||||||
// TODO: only 2 usages of this, we can replace it with Golang's "x/text/number" package in the future
|
|
||||||
const {message, number} = JSON.parse(numberInTooltip);
|
|
||||||
const tooltipContent = message.replace(/%[ds]/, new Intl.NumberFormat().format(Number(number)));
|
|
||||||
this.setAttribute('data-tooltip-content', tooltipContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,4 +1,3 @@
|
|||||||
import '@webcomponents/custom-elements'; // polyfill for some browsers like Pale Moon
|
import '@webcomponents/custom-elements'; // polyfill for some browsers like Pale Moon
|
||||||
import '@github/relative-time-element';
|
import '@github/relative-time-element';
|
||||||
import './GiteaLocaleNumber.js';
|
|
||||||
import './GiteaOriginUrl.js';
|
import './GiteaOriginUrl.js';
|
||||||
|
Loading…
Reference in New Issue