Skip to content

Commit 8cda595

Browse files
chore: add translations korean and indonesian (#1330)
* added translations * implemented suggestions --------- Co-authored-by: Mario Behling <[email protected]>
1 parent 4c92d7e commit 8cda595

File tree

11 files changed

+125
-10
lines changed

11 files changed

+125
-10
lines changed

app/eventyay/base/configurations/default_setting.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,24 @@ def primary_font_kwargs():
849849
choices=settings.LANGUAGES,
850850
widget=MultipleLanguagesWidget,
851851
required=True,
852-
label=_('Available languages'),
852+
label=_('Active languages'),
853+
),
854+
},
855+
'content_locales': {
856+
'default': json.dumps([settings.LANGUAGE_CODE]),
857+
'type': list,
858+
'serializer_class': ListMultipleChoiceField,
859+
'serializer_kwargs': dict(
860+
choices=settings.LANGUAGES,
861+
required=True,
862+
),
863+
'form_class': forms.MultipleChoiceField,
864+
'form_kwargs': dict(
865+
choices=settings.LANGUAGES,
866+
widget=MultipleLanguagesWidget,
867+
required=True,
868+
label=_('Content languages'),
869+
help_text=_('Languages that speakers can select for their submissions. Content languages should be a subset of active languages.'),
853870
),
854871
},
855872
'locale': {

app/eventyay/base/models/event.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2080,12 +2080,53 @@ def clean_presale(presale_start, presale_end):
20802080
@cached_property
20812081
def locales(self) -> list[str]:
20822082
"""Is a list of active event locales."""
2083-
return self.locale_array.split(',')
2083+
if hasattr(self, 'settings') and 'locales' in self.settings._cache():
2084+
if locales := self.settings.get('locales', as_type=list):
2085+
return locales
2086+
return [code for code in self.locale_array.split(',') if code]
20842087

20852088
@cached_property
20862089
def content_locales(self) -> list[str]:
20872090
"""Is a list of active content locales."""
2088-
return self.content_locale_array.split(',')
2091+
if hasattr(self, 'settings') and 'content_locales' in self.settings._cache():
2092+
if locales := self.settings.get('content_locales', as_type=list):
2093+
return locales
2094+
fallback = [code for code in self.content_locale_array.split(',') if code]
2095+
return fallback or self.locales
2096+
2097+
def _clear_language_caches(self):
2098+
for attr in [
2099+
'locales',
2100+
'content_locales',
2101+
'is_multilingual',
2102+
'named_locales',
2103+
'available_content_locales',
2104+
'named_content_locales',
2105+
'named_plugin_locales',
2106+
'plugin_locales',
2107+
]:
2108+
self.__dict__.pop(attr, None)
2109+
2110+
def update_language_configuration(
2111+
self,
2112+
*,
2113+
locales: list[str] | None = None,
2114+
content_locales: list[str] | None = None,
2115+
default_locale: str | None = None,
2116+
) -> None:
2117+
locales_list = list(locales or [])
2118+
if content_locales is None:
2119+
content_locales_list = locales_list
2120+
else:
2121+
content_locales_list = list(content_locales)
2122+
if locales_list:
2123+
self.locale_array = ','.join(locales_list)
2124+
if content_locales_list:
2125+
self.content_locale_array = ','.join(content_locales_list)
2126+
if default_locale:
2127+
self.locale = default_locale
2128+
if locales_list or content_locales_list or default_locale:
2129+
self._clear_language_caches()
20892130

20902131
@cached_property
20912132
def is_multilingual(self) -> bool:

app/eventyay/base/settings.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,20 @@ def validate_event_settings(event, settings_dict):
113113

114114
default_locale = settings_dict.get('locale')
115115
locales = settings_dict.get('locales', [])
116+
if not isinstance(locales, list):
117+
locales = list(locales)
116118
if default_locale and default_locale not in locales:
117119
raise ValidationError({'locale': _('Your default locale must also be enabled for your event (see box above).')})
120+
content_locales = settings_dict.get('content_locales')
121+
if content_locales is None:
122+
content_locales = locales
123+
elif not isinstance(content_locales, list):
124+
content_locales = list(content_locales)
125+
if content_locales:
126+
if invalid_content_locales := set(content_locales) - set(locales):
127+
raise ValidationError(
128+
{'content_locales': _('Content languages must be a subset of the active languages.')}
129+
)
118130
if settings_dict.get('attendee_names_required') and not settings_dict.get('attendee_names_asked'):
119131
raise ValidationError(
120132
{'attendee_names_required': _('You cannot require specifying attendee names if you do not ask for them.')}

app/eventyay/config/settings.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ def instance_name(request):
455455
('fi', _('Finnish')),
456456
('el', _('Greek')),
457457
('it', _('Italian')),
458+
('id', _('Indonesian')),
459+
('ko', _('Korean')),
458460
('lv', _('Latvian')),
459461
('pl', _('Polish')),
460462
('pt-pt', _('Portuguese (Portugal)')),
@@ -624,13 +626,25 @@ def instance_name(request):
624626
'official': False,
625627
'percentage': 95,
626628
},
629+
'id': {
630+
'name': _('Indonesian'),
631+
'natural_name': 'Bahasa Indonesia',
632+
'official': False,
633+
'percentage': 90,
634+
},
627635
'ja-jp': {
628636
'name': _('Japanese'),
629637
'natural_name': '日本語',
630638
'official': False,
631639
'percentage': 69,
632640
'public_code': 'jp',
633641
},
642+
'ko': {
643+
'name': _('Korean'),
644+
'natural_name': '한국어',
645+
'official': False,
646+
'percentage': 88,
647+
},
634648
'nl': {
635649
'name': _('Dutch'),
636650
'natural_name': 'Nederlands',

app/eventyay/control/views/event.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ def get_context_data(self, *args, **kwargs) -> dict:
191191
def form_valid(self, form):
192192
self._save_decoupled(self.sform)
193193
self.sform.save()
194+
form.instance.update_language_configuration(
195+
locales=self.sform.cleaned_data.get('locales'),
196+
content_locales=self.sform.cleaned_data.get('content_locales'),
197+
default_locale=self.sform.cleaned_data.get('locale'),
198+
)
194199
self.save_meta()
195200
self.save_product_meta_property_formset(self.object)
196201
self.save_confirm_texts_formset(self.object)

app/eventyay/control/views/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ def done(self, form_list, form_dict, **kwargs):
282282
event.settings.set('timezone', basics_data['timezone'])
283283
event.settings.set('locale', basics_data['locale'])
284284
event.settings.set('locales', foundation_data['locales'])
285+
event.settings.set('content_locales', foundation_data['locales'])
285286

286287
if (copy_data and copy_data['copy_from_event']) or self.clone_from or event.has_subevents:
287288
return redirect(

app/eventyay/eventyay_common/forms/event.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ class EventCommonSettingsForm(SettingsForm):
2424
)
2525

2626
auto_fields = [
27-
"locales",
28-
"locale",
29-
"region",
27+
'locales',
28+
'content_locales',
29+
'locale',
30+
'region',
3031
"contact_mail",
3132
"imprint_url",
3233
'logo_image',
@@ -57,6 +58,8 @@ def clean(self):
5758
def __init__(self, *args, **kwargs):
5859
self.event = kwargs['obj']
5960
super().__init__(*args, **kwargs)
61+
if self.event and 'content_locales' in self.fields:
62+
self.fields['content_locales'].initial = self.event.content_locales
6063

6164

6265
class EventUpdateForm(I18nModelForm):

app/eventyay/eventyay_common/templates/eventyay_common/event/settings.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ <h1>{{ request.event.name }} {% trans "- Settings" %}</h1>
129129
<fieldset>
130130
<legend>{% trans "Localization" %}</legend>
131131
{% bootstrap_field sform.locales layout="control" %}
132+
{% if sform.content_locales %}{% bootstrap_field sform.content_locales layout="control" %}{% endif %}
132133
{% bootstrap_field sform.locale layout="control" %}
133134
{% bootstrap_field sform.timezone layout="control" %}
134135
{% bootstrap_field sform.region layout="control" %}

app/eventyay/eventyay_common/views/event.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ def done(self, form_list, form_dict, **kwargs):
263263
event.settings.set('timezone', basics_data['timezone'])
264264
event.settings.set('locale', basics_data['locale'])
265265
event.settings.set('locales', foundation_data['locales'])
266+
event.settings.set('content_locales', foundation_data['locales'])
266267

267268
# Use the selected create_for option, but ensure smart defaults work for all
268269
create_for = self.storage.extra_data.get('create_for', EventCreatedFor.BOTH)
@@ -280,6 +281,7 @@ def done(self, form_list, form_dict, **kwargs):
280281
'timezone': str(basics_data.get('timezone')),
281282
'locale': event.settings.locale,
282283
'locales': event.settings.locales,
284+
'content_locales': event.settings.get('content_locales', as_type=list),
283285
'is_video_creation': final_is_video_creation,
284286
}
285287

@@ -354,6 +356,11 @@ def get_context_data(self, *args, **kwargs) -> dict:
354356
def form_valid(self, form):
355357
self._save_decoupled(self.sform)
356358
self.sform.save()
359+
form.instance.update_language_configuration(
360+
locales=self.sform.cleaned_data.get('locales'),
361+
content_locales=self.sform.cleaned_data.get('content_locales'),
362+
default_locale=self.sform.cleaned_data.get('locale'),
363+
)
357364

358365
tickets.invalidate_cache.apply_async(kwargs={'event': self.request.event.pk})
359366

talk/src/pretalx/eventyay_common/tasks.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,14 @@ def process_event_webhook(event_data):
127127
try:
128128
action = event_data.get("action")
129129
organiser = get_object_or_404(Organiser, slug=event_data.get("organiser_slug"))
130+
locales = event_data.get("locales") or []
131+
content_locales = event_data.get("content_locales") or locales
130132
if action == Action.CREATE:
131133
with scopes_disabled():
132134
event = Event.objects.create(
133135
organiser=organiser,
134-
locale_array=",".join(event_data.get("locales")),
135-
content_locale_array=",".join(event_data.get("locales")),
136+
locale_array=",".join(locales),
137+
content_locale_array=",".join(content_locales),
136138
name=event_data.get("name"),
137139
slug=event_data.get("slug"),
138140
timezone=event_data.get("timezone"),
@@ -157,8 +159,8 @@ def process_event_webhook(event_data):
157159
event.name = event_data.get("name")
158160
event.date_from = datetime.fromisoformat(event_data["date_from"])
159161
event.date_to = datetime.fromisoformat(event_data["date_to"])
160-
event.locale_array = ",".join(event_data.get("locales"))
161-
event.content_locale_array = ",".join(event_data.get("locales"))
162+
event.locale_array = ",".join(locales)
163+
event.content_locale_array = ",".join(content_locales)
162164
event.timezone = event_data.get("timezone")
163165
event.locale = event_data.get("locale")
164166
event.plugins = (

0 commit comments

Comments
 (0)