mirror of https://github.com/go-gitea/gitea
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> ![image](https://user-images.githubusercontent.com/2114189/232179420-b1b9974b-9d96-4408-b209-b80182c8b359.png) ![image](https://user-images.githubusercontent.com/2114189/232179416-14f36aa0-3f3e-4ac9-b366-7bd3a4464a11.png) </details>pull/24049/head^2
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 '@github/relative-time-element'; |
||||
import './GiteaLocaleNumber.js'; |
||||
import './GiteaOriginUrl.js'; |
||||
|
Loading…
Reference in new issue