Merge pull request #68784 from bruvzg/localize_numeral_system

Add `Control::localize_numeral_system` property to toggle automatic numeral system conversion.
This commit is contained in:
Rémi Verschelde 2022-11-17 14:44:21 +01:00
commit dc28e82b74
No known key found for this signature in database
GPG Key ID: C3336907360768E1
7 changed files with 45 additions and 5 deletions

View File

@ -1010,6 +1010,10 @@
<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0"> <member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0">
Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew). Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew).
</member> </member>
<member name="localize_numeral_system" type="bool" setter="set_localize_numeral_system" getter="is_localizing_numeral_system" default="true">
If [code]true[/code], automatically converts code line numbers, list indices, [SpinBox] and [ProgressBar] values from the Western Arabic (0..9) to the numeral systems used in current locale.
[b]Note:[/b] Numbers within the text are not automatically converted, it can be done manually, using [method TextServer.format_number].
</member>
<member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" enum="Control.CursorShape" default="0"> <member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" enum="Control.CursorShape" default="0">
The default cursor shape for this control. Useful for Godot plugins and applications or games that use the system's mouse cursors. The default cursor shape for this control. Useful for Godot plugins and applications or games that use the system's mouse cursors.
[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the system. [b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the system.

View File

@ -1425,7 +1425,10 @@ bool CodeEdit::is_line_numbers_zero_padded() const {
} }
void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) { void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) {
String fc = TS->format_number(String::num(p_line + 1).lpad(line_number_digits, line_number_padding)); String fc = String::num(p_line + 1).lpad(line_number_digits, line_number_padding);
if (is_localizing_numeral_system()) {
fc = TS->format_number(fc);
}
Ref<TextLine> tl; Ref<TextLine> tl;
tl.instantiate(); tl.instantiate();
tl->add_string(fc, font, font_size); tl->add_string(fc, font, font_size);

View File

@ -2773,6 +2773,20 @@ bool Control::is_layout_rtl() const {
return data.is_rtl; return data.is_rtl;
} }
void Control::set_localize_numeral_system(bool p_enable) {
if (p_enable == data.localize_numeral_system) {
return;
}
data.localize_numeral_system = p_enable;
notification(MainLoop::NOTIFICATION_TRANSLATION_CHANGED);
}
bool Control::is_localizing_numeral_system() const {
return data.localize_numeral_system;
}
void Control::set_auto_translate(bool p_enable) { void Control::set_auto_translate(bool p_enable) {
if (p_enable == data.auto_translate) { if (p_enable == data.auto_translate) {
return; return;
@ -3154,6 +3168,9 @@ void Control::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_auto_translate", "enable"), &Control::set_auto_translate); ClassDB::bind_method(D_METHOD("set_auto_translate", "enable"), &Control::set_auto_translate);
ClassDB::bind_method(D_METHOD("is_auto_translating"), &Control::is_auto_translating); ClassDB::bind_method(D_METHOD("is_auto_translating"), &Control::is_auto_translating);
ClassDB::bind_method(D_METHOD("set_localize_numeral_system", "enable"), &Control::set_localize_numeral_system);
ClassDB::bind_method(D_METHOD("is_localizing_numeral_system"), &Control::is_localizing_numeral_system);
ADD_GROUP("Layout", ""); ADD_GROUP("Layout", "");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size");
@ -3198,8 +3215,9 @@ void Control::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_vertical", PROPERTY_HINT_FLAGS, "Fill:1,Expand:2,Shrink Center:4,Shrink End:8"), "set_v_size_flags", "get_v_size_flags"); ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_vertical", PROPERTY_HINT_FLAGS, "Fill:1,Expand:2,Shrink Center:4,Shrink End:8"), "set_v_size_flags", "get_v_size_flags");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,20,0.01,or_greater"), "set_stretch_ratio", "get_stretch_ratio"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,20,0.01,or_greater"), "set_stretch_ratio", "get_stretch_ratio");
ADD_GROUP("Auto Translate", ""); ADD_GROUP("Localization", "");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_translate"), "set_auto_translate", "is_auto_translating"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_translate"), "set_auto_translate", "is_auto_translating");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "localize_numeral_system"), "set_localize_numeral_system", "is_localizing_numeral_system");
ADD_GROUP("Tooltip", "tooltip_"); ADD_GROUP("Tooltip", "tooltip_");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "tooltip_text", PROPERTY_HINT_MULTILINE_TEXT), "set_tooltip_text", "get_tooltip_text"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "tooltip_text", PROPERTY_HINT_MULTILINE_TEXT), "set_tooltip_text", "get_tooltip_text");

View File

@ -249,6 +249,7 @@ private:
bool is_rtl = false; bool is_rtl = false;
bool auto_translate = true; bool auto_translate = true;
bool localize_numeral_system = true;
// Extra properties. // Extra properties.
@ -595,6 +596,9 @@ public:
LayoutDirection get_layout_direction() const; LayoutDirection get_layout_direction() const;
virtual bool is_layout_rtl() const; virtual bool is_layout_rtl() const;
void set_localize_numeral_system(bool p_enable);
bool is_localizing_numeral_system() const;
void set_auto_translate(bool p_enable); void set_auto_translate(bool p_enable);
bool is_auto_translating() const; bool is_auto_translating() const;
_FORCE_INLINE_ String atr(const String p_string) const { _FORCE_INLINE_ String atr(const String p_string) const {

View File

@ -103,7 +103,12 @@ void ProgressBar::_notification(int p_what) {
} }
if (show_percentage) { if (show_percentage) {
String txt = TS->format_number(itos(int(get_as_ratio() * 100))) + TS->percent_sign(); String txt = itos(int(get_as_ratio() * 100));
if (is_localizing_numeral_system()) {
txt = TS->format_number(txt) + TS->percent_sign();
} else {
txt += String("%");
}
TextLine tl = TextLine(txt, theme_cache.font, theme_cache.font_size); TextLine tl = TextLine(txt, theme_cache.font, theme_cache.font_size);
Vector2 text_pos = (Point2(get_size().width - tl.get_size().x, get_size().height - tl.get_size().y) / 2).round(); Vector2 text_pos = (Point2(get_size().width - tl.get_size().x, get_size().height - tl.get_size().y) / 2).round();

View File

@ -752,7 +752,10 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o
prefix = _prefix; prefix = _prefix;
break; break;
} else if (list_items[i]->list_type == LIST_NUMBERS) { } else if (list_items[i]->list_type == LIST_NUMBERS) {
segment = TS->format_number(itos(list_index[i]), _find_language(l.from)); segment = itos(list_index[i]);
if (is_localizing_numeral_system()) {
segment = TS->format_number(segment, _find_language(l.from));
}
} else if (list_items[i]->list_type == LIST_LETTERS) { } else if (list_items[i]->list_type == LIST_LETTERS) {
segment = _letters(list_index[i], list_items[i]->capitalize); segment = _letters(list_index[i], list_items[i]->capitalize);
} else if (list_items[i]->list_type == LIST_ROMAN) { } else if (list_items[i]->list_type == LIST_ROMAN) {

View File

@ -40,7 +40,10 @@ Size2 SpinBox::get_minimum_size() const {
} }
void SpinBox::_value_changed(double p_value) { void SpinBox::_value_changed(double p_value) {
String value = TS->format_number(String::num(get_value(), Math::range_step_decimals(get_step()))); String value = String::num(get_value(), Math::range_step_decimals(get_step()));
if (is_localizing_numeral_system()) {
value = TS->format_number(value);
}
if (!line_edit->has_focus()) { if (!line_edit->has_focus()) {
if (!prefix.is_empty()) { if (!prefix.is_empty()) {