Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b974581
feat: Add match type selection for merchant rules
luacmartins Jan 28, 2026
b6c0b22
fix: Remove padding from match type menu item
luacmartins Jan 28, 2026
6921cb0
Fix styles, remove unused copy
luacmartins Jan 28, 2026
96ffdc3
Update submit button styles
luacmartins Jan 28, 2026
7b15d32
feat: Use 'matches' operator for exact match type
luacmartins Jan 28, 2026
264ce03
Merge branch 'main' into cmartins-merchantRulesExactMatch
luacmartins Jan 28, 2026
6c81e04
Revert CONST changes
luacmartins Jan 28, 2026
546a919
Use constants
luacmartins Jan 28, 2026
7c413cf
Apply translations
luacmartins Jan 28, 2026
e7c3fad
Revert chant to category
luacmartins Jan 28, 2026
2eefd88
Merge branch 'main' into cmartins-merchantRulesExactMatch
luacmartins Jan 28, 2026
17adfc8
Update menu item selection
luacmartins Jan 28, 2026
d0ab8f2
Update selection list order
luacmartins Jan 28, 2026
42529e2
Remove temp file
luacmartins Jan 28, 2026
8b828a0
Apply translations
luacmartins Jan 28, 2026
9950881
Fix prettier
luacmartins Jan 28, 2026
9d90cc3
Update operators
luacmartins Jan 28, 2026
c0d80ce
Apply comments
luacmartins Jan 28, 2026
aef4984
Fix prettier
luacmartins Jan 28, 2026
1a06258
Fix TS
luacmartins Jan 28, 2026
a6484f0
Merge branch 'main' into cmartins-merchantRulesExactMatch
luacmartins Jan 29, 2026
1203665
Add matchType to ignore list
luacmartins Jan 29, 2026
e3eab8f
Fix TS
luacmartins Jan 29, 2026
5772be6
refactor: Omit empty fields instead of sending null values
luacmartins Jan 29, 2026
ab2ce62
Update errors
luacmartins Jan 29, 2026
d48941f
refactor: Use null in Onyx but omit nulls from API
luacmartins Jan 29, 2026
c3812f1
fix: Correct operator check when loading match type for editing
luacmartins Jan 29, 2026
50582c9
fix: Correct operator check in MerchantRulesSection for exact match
luacmartins Jan 29, 2026
0e4c713
chore: Add expensesExactlyMatching translation to en.ts
luacmartins Jan 29, 2026
1ce80cd
Update operators
luacmartins Jan 29, 2026
a503cc7
Apply translations
luacmartins Jan 29, 2026
2662c34
resolve conflicts
luacmartins Jan 29, 2026
4fdbafd
Address comments
luacmartins Jan 29, 2026
f9eedaa
Resolve conflicts
luacmartins Jan 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3782,6 +3782,7 @@ const CONST = {
BILLABLE: 'billable',
CATEGORY: 'category',
DESCRIPTION: 'comment',
MATCH_TYPE: 'matchType',
MERCHANT_TO_MATCH: 'merchantToMatch',
MERCHANT: 'merchant',
REIMBURSABLE: 'reimbursable',
Expand Down Expand Up @@ -7138,6 +7139,7 @@ const CONST = {
AND: 'and',
OR: 'or',
EQUAL_TO: 'eq',
CONTAINS: 'contains',
NOT_EQUAL_TO: 'neq',
GREATER_THAN: 'gt',
GREATER_THAN_OR_EQUAL_TO: 'gte',
Expand Down
4 changes: 4 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2680,6 +2680,10 @@ const ROUTES = {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/merchant-to-match',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/merchant-to-match` as const,
},
RULES_MERCHANT_MATCH_TYPE: {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/merchant-to-match/type',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/merchant-to-match/type` as const,
},
RULES_MERCHANT_MERCHANT: {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/merchant',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/merchant` as const,
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,7 @@ const SCREENS = {
RULES_PROHIBITED_DEFAULT: 'Rules_Prohibited_Default',
RULES_MERCHANT_NEW: 'Rules_Merchant_New',
RULES_MERCHANT_MERCHANT_TO_MATCH: 'Rules_Merchant_Merchant_To_Match',
RULES_MERCHANT_MATCH_TYPE: 'Rules_Merchant_Match_Type',
RULES_MERCHANT_MERCHANT: 'Rules_Merchant_Merchant',
RULES_MERCHANT_CATEGORY: 'Rules_Merchant_Category',
RULES_MERCHANT_TAG: 'Rules_Merchant_Tag',
Expand Down
9 changes: 6 additions & 3 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6382,22 +6382,25 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
title: 'Händler',
subtitle: 'Legen Sie Händlerregeln fest, damit Ausgaben korrekt codiert ankommen und weniger Nachbearbeitung erfordern.',
addRule: 'Händlerregel hinzufügen',
ruleSummaryTitle: (merchantName: string) => `Wenn Händler „${merchantName}“ enthält`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `Wenn Händler ${isExactMatch ? 'stimmt genau überein' : 'enthält'} „${merchantName}“`,
ruleSummarySubtitleMerchant: (merchantName: string) => `Händler in „${merchantName}“ umbenennen`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Aktualisiere ${fieldName} zu „${fieldValue}“`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Als "${reimbursable ? 'erstattungsfähig' : 'nicht erstattungsfähig'}" markieren`,
ruleSummarySubtitleBillable: (billable: boolean) => `Als „${billable ? 'Abrechenbar' : 'nicht abrechenbar'}“ markieren`,
addRuleTitle: 'Regel hinzufügen',
expensesWith: 'Für Ausgaben mit:',
applyUpdates: 'Diese Updates anwenden:',
merchantHint: 'Einem Händlernamen mit groß-/kleinschreibungsunabhängiger „Enthält“-Übereinstimmung zuordnen',
saveRule: 'Regel speichern',
confirmError: 'Geben Sie den Händler ein und nehmen Sie mindestens eine Änderung vor',
confirmErrorMerchant: 'Bitte geben Sie den Händler ein',
confirmErrorUpdate: 'Bitte wenden Sie mindestens eine Aktualisierung an',
editRuleTitle: 'Regel bearbeiten',
deleteRule: 'Regel löschen',
deleteRuleConfirmation: 'Sind Sie sicher, dass Sie diese Regel löschen möchten?',
matchType: 'Abgleichstyp',
matchTypeContains: 'Enthält',
matchTypeExact: 'Exakte Übereinstimmung',
expensesExactlyMatching: 'Für Ausgaben mit genau folgender Übereinstimmung:',
},
},
planTypePage: {
Expand Down Expand Up @@ -7000,7 +7003,7 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
[CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Auszahlungs-ID',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Kategorie',
[CONST.SEARCH.GROUP_BY.MERCHANT]: 'Händler',
[CONST.SEARCH.GROUP_BY.TAG]: 'Stichwort',
[CONST.SEARCH.GROUP_BY.TAG]: 'Tag',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Monat',
},
feed: 'Feed',
Expand Down
7 changes: 5 additions & 2 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6242,19 +6242,22 @@ const translations = {
addRuleTitle: 'Add rule',
editRuleTitle: 'Edit rule',
expensesWith: 'For expenses with:',
expensesExactlyMatching: 'For expenses exactly matching:',
applyUpdates: 'Apply these updates:',
merchantHint: 'Match a merchant name with case-insensitive "contains" matching',
saveRule: 'Save rule',
confirmError: 'Enter merchant and apply at least one update',
confirmErrorMerchant: 'Please enter merchant',
confirmErrorUpdate: 'Please apply at least one update',
deleteRule: 'Delete rule',
deleteRuleConfirmation: 'Are you sure you want to delete this rule?',
ruleSummaryTitle: (merchantName: string) => `If merchant contains "${merchantName}"`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `If merchant ${isExactMatch ? 'exactly matches' : 'contains'} "${merchantName}"`,

@situchan situchan Jan 29, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think it's fine to translate conditionally?
Just wondering if exactly matches and contains are at different positions in some languages.

ruleSummarySubtitleMerchant: (merchantName: string) => `Rename merchant to "${merchantName}"`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Update ${fieldName} to "${fieldValue}"`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Mark as "${reimbursable ? 'reimbursable' : 'non-reimbursable'}"`,
ruleSummarySubtitleBillable: (billable: boolean) => `Mark as "${billable ? 'billable' : 'non-billable'}"`,
matchType: 'Match type',
matchTypeContains: 'Contains',
matchTypeExact: 'Exactly matches',
},
categoryRules: {
title: 'Category rules',
Expand Down
7 changes: 5 additions & 2 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6020,19 +6020,22 @@ ${amount} para ${merchant} - ${date}`,
addRuleTitle: 'Añadir regla',
editRuleTitle: 'Editar regla',
expensesWith: 'Para gastos con:',
expensesExactlyMatching: 'Para gastos que coincidan exactamente con:',
applyUpdates: 'Aplicar estas actualizaciones:',
merchantHint: 'Coincide con un nombre de comerciante con coincidencia "contiene" sin distinción de mayúsculas y minúsculas',
saveRule: 'Guardar regla',
confirmError: 'Ingresa comerciante y aplica al menos una actualización',
confirmErrorMerchant: 'Por favor ingresa comerciante',
confirmErrorUpdate: 'Por favor aplica al menos una actualización',
deleteRule: 'Eliminar regla',
deleteRuleConfirmation: '¿Estás seguro de que quieres eliminar esta regla?',
ruleSummaryTitle: (merchantName: string) => `Si el comerciante contiene "${merchantName}"`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `Si el comerciante ${isExactMatch ? 'coincide exactamente con' : 'contiene'} "${merchantName}"`,
ruleSummarySubtitleMerchant: (merchantName: string) => `Renombrar comerciante a "${merchantName}"`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Actualizar ${fieldName} a "${fieldValue}"`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Marcar como "${reimbursable ? 'reembolsable' : 'no reembolsable'}"`,
ruleSummarySubtitleBillable: (billable: boolean) => `Marcar como "${billable ? 'facturable' : 'no facturable'}"`,
matchType: 'Tipo de coincidencia',
matchTypeContains: 'Contiene',
matchTypeExact: 'Coincide exactamente',
},
categoryRules: {
title: 'Reglas de categoría',
Expand Down
7 changes: 5 additions & 2 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6393,22 +6393,25 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
title: 'Commerçant',
subtitle: 'Définissez les règles de marchand afin que les dépenses arrivent correctement codées et nécessitent moins de nettoyage.',
addRule: 'Ajouter une règle de commerçant',
ruleSummaryTitle: (merchantName: string) => `Si le commerçant contient « ${merchantName} »`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `Si le commerçant ${isExactMatch ? 'correspond exactement' : 'contient'} « ${merchantName} »`,
ruleSummarySubtitleMerchant: (merchantName: string) => `Renommer le marchand en « ${merchantName} »`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Mettre à jour ${fieldName} sur « ${fieldValue} »`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Marquer comme « ${reimbursable ? 'remboursable' : 'non remboursable'} »`,
ruleSummarySubtitleBillable: (billable: boolean) => `Marquer comme « ${billable ? 'facturable' : 'non facturable'} »`,
addRuleTitle: 'Ajouter une règle',
expensesWith: 'Pour les dépenses avec :',
applyUpdates: 'Appliquer ces mises à jour :',
merchantHint: 'Faire correspondre un nom de commerçant avec une correspondance « contient » insensible à la casse',
saveRule: 'Enregistrer la règle',
confirmError: 'Saisissez un marchand et appliquez au moins une mise à jour',
confirmErrorMerchant: 'Veuillez saisir le commerçant',
confirmErrorUpdate: 'Veuillez appliquer au moins une mise à jour',
editRuleTitle: 'Modifier la règle',
deleteRule: 'Supprimer la règle',
deleteRuleConfirmation: 'Voulez-vous vraiment supprimer cette règle ?',
matchType: 'Type de correspondance',
matchTypeContains: 'Contient',
matchTypeExact: 'Correspond exactement',
expensesExactlyMatching: 'Pour les dépenses correspondant exactement :',
},
},
planTypePage: {
Expand Down
7 changes: 5 additions & 2 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6364,22 +6364,25 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
title: 'Esercente',
subtitle: 'Imposta le regole per gli esercenti in modo che le spese arrivino già codificate correttamente e richiedano meno correzioni.',
addRule: 'Aggiungi regola esercente',
ruleSummaryTitle: (merchantName: string) => `Se lesercente contiene "${merchantName}"`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `Se l'esercente ${isExactMatch ? 'corrisponde esattamente' : 'contiene'} "${merchantName}"`,
ruleSummarySubtitleMerchant: (merchantName: string) => `Rinomina esercente in "${merchantName}"`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Aggiorna ${fieldName} a "${fieldValue}"`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Segna come "${reimbursable ? 'rimborsabile' : 'non rimborsabile'}"`,
ruleSummarySubtitleBillable: (billable: boolean) => `Contrassegna come "${billable ? 'fatturabile' : 'non fatturabile'}"`,
addRuleTitle: 'Aggiungi regola',
expensesWith: 'Per spese con:',
applyUpdates: 'Applica questi aggiornamenti:',
merchantHint: 'Abbina un nome commerciante con una corrispondenza "contiene" che non distingue tra maiuscole e minuscole',
saveRule: 'Salva regola',
confirmError: 'Inserisci l’esercente e applica almeno un aggiornamento',
confirmErrorMerchant: 'Per favore inserisci l’esercente',
confirmErrorUpdate: 'Applica almeno un aggiornamento',
editRuleTitle: 'Modifica regola',
deleteRule: 'Elimina regola',
deleteRuleConfirmation: 'Sei sicuro di voler eliminare questa regola?',
matchType: 'Tipo di corrispondenza',
matchTypeContains: 'Contiene',
matchTypeExact: 'Corrisponde esattamente',
expensesExactlyMatching: 'Per le spese che corrispondono esattamente:',
},
},
planTypePage: {
Expand Down
7 changes: 5 additions & 2 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6320,22 +6320,25 @@ ${reportName}
title: '加盟店',
subtitle: '取引先ルールを設定して、経費が正しくコード化された状態で届くようにし、後処理を最小限に抑えましょう。',
addRule: '店舗ルールを追加',
ruleSummaryTitle: (merchantName: string) => `もし取引先に「${merchantName}」が含まれている場合`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `もし加盟店 ${isExactMatch ? '完全一致' : '含む'} 「${merchantName}」`,
ruleSummarySubtitleMerchant: (merchantName: string) => `支払先名を「${merchantName}」に変更`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `${fieldName} を「${fieldValue}」に更新`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `「${reimbursable ? '払い戻し対象' : '精算対象外'}」としてマーク`,
ruleSummarySubtitleBillable: (billable: boolean) => `「${billable ? '請求可能' : '請求対象外'}」としてマーク`,
addRuleTitle: 'ルールを追加',
expensesWith: '次の条件の経費について:',
applyUpdates: 'これらの更新を適用:',
merchantHint: '大文字小文字を区別しない「含む」一致で支払先名を照合する',
saveRule: 'ルールを保存',
confirmError: '支払先を入力し、少なくとも 1 つの更新を適用してください',
confirmErrorMerchant: '商人を入力してください',
confirmErrorUpdate: '少なくとも 1 件の更新を適用してください',
editRuleTitle: 'ルールを編集',
deleteRule: 'ルールを削除',
deleteRuleConfirmation: 'このルールを削除してもよろしいですか?',
matchType: '一致タイプ',
matchTypeContains: '含む',
matchTypeExact: '完全一致',
expensesExactlyMatching: '以下と完全一致する経費について:',
},
},
planTypePage: {
Expand Down
7 changes: 5 additions & 2 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6352,22 +6352,25 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
title: 'Handelaar',
subtitle: 'Stel de merchantregels zo in dat onkosten met de juiste codering binnenkomen en er minder nabewerking nodig is.',
addRule: 'Merchantregel toevoegen',
ruleSummaryTitle: (merchantName: string) => `Als handelaar "${merchantName}" bevat`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `Als handelaar ${isExactMatch ? 'komt exact overeen' : 'bevat'} "${merchantName}"`,
ruleSummarySubtitleMerchant: (merchantName: string) => `Naam handelaar wijzigen in "${merchantName}"`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Werk ${fieldName} bij naar "${fieldValue}"`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Markeren als "${reimbursable ? 'Vergoedbaar' : 'niet-vergoedbaar'}"`,
ruleSummarySubtitleBillable: (billable: boolean) => `Markeren als "${billable ? 'factureerbaar' : 'niet-factureerbaar'}"`,
addRuleTitle: 'Regel toevoegen',
expensesWith: 'Voor uitgaven met:',
applyUpdates: 'Deze updates toepassen:',
merchantHint: 'Een handelsnaam koppelen met hoofdletterongevoelige "bevat"-overeenkomst',
saveRule: 'Regel opslaan',
confirmError: 'Voer een leverancier in en pas ten minste één wijziging toe',
confirmErrorMerchant: 'Voer handelaar in',
confirmErrorUpdate: 'Breng ten minste één wijziging aan alstublieft',
editRuleTitle: 'Regel bewerken',
deleteRule: 'Regel verwijderen',
deleteRuleConfirmation: 'Weet je zeker dat je deze regel wilt verwijderen?',
matchType: 'Type overeenkomen',
matchTypeContains: 'Bevat',
matchTypeExact: 'Komt exact overeen',
expensesExactlyMatching: 'Voor uitgaven die exact overeenkomen met:',
},
},
planTypePage: {
Expand Down
9 changes: 6 additions & 3 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6345,22 +6345,25 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
title: 'Sprzedawca',
subtitle: 'Skonfiguruj reguły dla sprzedawców, aby wydatki trafiały z poprawnym kodowaniem i wymagały mniej poprawek.',
addRule: 'Dodaj regułę sprzedawcy',
ruleSummaryTitle: (merchantName: string) => `Jeśli sprzedawca zawiera „${merchantName}”`,
ruleSummaryTitle: (merchantName: string, isExactMatch: boolean) => `Jeśli sprzedawca ${isExactMatch ? 'dokładnie pasuje' : 'Zawiera'} „${merchantName}”`,
ruleSummarySubtitleMerchant: (merchantName: string) => `Zmień sprzedawcę na „${merchantName}”`,
ruleSummarySubtitleUpdateField: (fieldName: string, fieldValue: string) => `Zaktualizuj ${fieldName} na „${fieldValue}”`,
ruleSummarySubtitleReimbursable: (reimbursable: boolean) => `Oznacz jako "${reimbursable ? 'kwalifikujący się do zwrotu kosztów' : 'niepodlegający zwrotowi'}"`,
ruleSummarySubtitleBillable: (billable: boolean) => `Oznacz jako „${billable ? 'fakturowalne' : 'poza fakturą'}”`,
addRuleTitle: 'Dodaj regułę',
expensesWith: 'Dla wydatków z:',
applyUpdates: 'Zastosuj te aktualizacje:',
merchantHint: 'Dopasuj nazwę sprzedawcy przy użyciu nieczułego na wielkość liter dopasowania typu „zawiera”',
saveRule: 'Zapisz regułę',
confirmError: 'Wprowadź sprzedawcę i zastosuj co najmniej jedną aktualizację',
confirmErrorMerchant: 'Wprowadź sprzedawcę',
confirmErrorUpdate: 'Proszę wprowadzić co najmniej jedną zmianę',
editRuleTitle: 'Edytuj regułę',
deleteRule: 'Usuń regułę',
deleteRuleConfirmation: 'Czy na pewno chcesz usunąć tę regułę?',
matchType: 'Typ dopasowania',
matchTypeContains: 'Zawiera',
matchTypeExact: 'Dokładne dopasowanie',
expensesExactlyMatching: 'Dla wydatków dokładnie pasujących:',
},
},
planTypePage: {
Expand Down Expand Up @@ -6961,7 +6964,7 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
[CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'ID wypłaty',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Kategoria',
[CONST.SEARCH.GROUP_BY.MERCHANT]: 'Sprzedawca',
[CONST.SEARCH.GROUP_BY.TAG]: 'Etykieta',
[CONST.SEARCH.GROUP_BY.TAG]: 'Tag',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Miesiąc',
},
feed: 'Kanał',
Expand Down
Loading
Loading