Skip to content

l10n: Fix and complete translations across 26+ locales - #1110

Closed
amanydw wants to merge 1406 commits into
FossifyOrg:mainfrom
amanydw:main
Closed

l10n: Fix and complete translations across 26+ locales#1110
amanydw wants to merge 1406 commits into
FossifyOrg:mainfrom
amanydw:main

Conversation

@amanydw

@amanydw amanydw commented Aug 2, 2026

Copy link
Copy Markdown

Summary

This PR brings major internationalization and localization (l10n/i18n) improvements to Fossify Gallery. It completes translation coverage for 5 under-translated languages (bringing them to 100% coverage / 259 of 259 strings), repairs AAPT2 build defects and mangled escape sequences, restores collapsed multi-line paragraph breaks across 11 locales, fixes CLDR plural category mismatches, and refines wording in several existing translations.


Key Changes

1. Completed Locales (100% Coverage / 259 Strings Each)

Added missing translation strings for 5 languages that previously had minimal coverage:

Locale Language Strings Added Coverage (Before → After)
values-bs Bosnian +254 5 / 259 → 259 / 259 (100%)
values-is Icelandic +254 5 / 259 → 259 / 259 (100%)
values-ms Malay +254 5 / 259 → 259 / 259 (100%)
values-fil Filipino +254 5 / 259 → 259 / 259 (100%)
values-lv Latvian +236 23 / 259 → 259 / 259 (100%)

All additions preserve established terminology (e.g., Latvian datne for file, sīktēls for thumbnail) and adhere strictly to target language CLDR rules.


2. Critical XML & AAPT2 Build Defect Fixes

  • values-gu (Gujarati): Removed duplicate resource declarations for unknown_location, volume, and brightness. Duplicate declarations trigger AAPT2 compilation warnings/errors and cause non-deterministic runtime evaluation.
  • values-lt (Lithuanian): Repaired mangled escape sequences in included_activity_placeholder (which rendered literal N n artifacts) and restored missing opening quotes in faq_2_text and faq_8_text.

3. Multi-line Paragraph Formatting & Escape Sequence Repairs

17 multi-line strings across 11 locales (az, bn, cy, el, en-rGB, es-rUS, ja, lt, mk, sr, ta) used raw XML line breaks inside excluded_activity_placeholder and included_activity_placeholder.

AAPT automatically collapses raw XML line breaks into single spaces, removing intended paragraph separations in the UI. All affected strings have been updated to use explicit \n escape sequences, matching the source string in values/strings.xml.


4. CLDR Plural Rule Adjustments

  • Asian & Non-Plural Languages (in, ja, ko-rKR, th, vi, zh-rCN, zh-rHK, zh-rTW): Removed redundant <item quantity="one"> elements where CLDR guidelines specify only the other category. Where string drift existed (ja, ko-rKR), the higher-quality wording was preserved under other.
  • Language-Specific Plural Categorization: Applied correct CLDR categories for new translations:
    • one / few / other for Bosnian (values-bs)
    • one / other for Icelandic (values-is) and Filipino (values-fil)
    • other for Malay (values-ms)

5. Translation & Wording Refinements

  • hr (Croatian): Resolved 11 issues, including typos (PromjeniPromijeni, zadnojzadnjoj), improper register in cant_unhide_folder, fix for faq_13_text missing closing quote, Serbian loanword replacement (tačkatočka), noun/imperative agreement (Zaključaj ekranZaključavanje zaslona), and formatting spaces around ellipses () and degree symbols (°).
  • ja (Japanese): Restored missing second sentence in included_activity_placeholder.
  • fr (French): Removed spurious trailing ellipsis (...) from group_by.
  • ms (Malay): Translated leftover English term "Edit" to "Sunting".
  • el (Greek): Corrected double spaces and verbatim quotes in exclude_folder_description.

Quality Assurance & Verification

  • Format Specifiers: All %s, %d, %1$s, etc., verified against values/strings.xml source strings to guarantee 100% positional accuracy and prevent runtime formatting crashes.
  • XML Validity: XML well-formedness validated across all modified files.
  • Character Escaping: Single quotes ', double quotes ", ampersands &, and angle brackets < properly escaped according to Android string resource rules.
  • Source Integrity: Base string file (app/src/main/res/values/strings.xml) left untouched.
  • Granular Commit History: Every commit changes a targeted resource with clear commit messages referencing source and target strings.

Checklist

  • Code complies with repository guidelines and Android resource standards.
  • All localized XML files pass build and lint checks.
  • Changes do not break existing functionality or UI layouts.

amanydw and others added 30 commits August 1, 2026 17:53
English: Seems like you don\'t have any folders hidden with a \".nomedia\" file.
Latvian: Šķiet, ka nav nevienas mapes, kas būtu paslēpta ar datni “.nomedia”.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: You have to grant the app All Files access to see hidden files, else it cannot work.
Latvian: Lai redzētu paslēptās datnes, lietotnei ir jāpiešķir piekļuve visām datnēm, citādi tas nedarbosies.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: If a folder or one of its parent folders has a dot before its name, it is hidden and cannot be unhidden lik...
Latvian: Ja mapes vai kādas tās virsmapes nosaukuma priekšā ir punkts, tā ir paslēpta un šādi to nevar parādīt. Punk...

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Included folders
Latvian: Iekļautās mapes

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Manage included folders
Latvian: Pārvaldīt iekļautās mapes

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Add folder
Latvian: Pievienot mapi

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: If you have some folders which contain media, but were not recognized by the app, you can add them manually...
Latvian: Ja jums ir mapes, kurās ir multivide, bet lietotne tās nav atpazinusi, šeit tās var pievienot manuāli. Vien...

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: No media files have been found. You can solve it by adding the folders containing media files manually.
Latvian: Netika atrasta neviena multivides datne. To var atrisināt, manuāli pievienojot mapes, kurās ir multivides d...

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Resize selection and save
Latvian: Mainīt izvēlēto attēlu izmēru un saglabāt

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Width
Latvian: Platums

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Height
Latvian: Augstums

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Keep aspect ratio
Latvian: Saglabāt malu attiecību

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Please enter a valid resolution
Latvian: Lūdzu, ievadiet derīgu izšķirtspēju

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Resize multiple images
Latvian: Mainīt vairāku attēlu izmēru

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Resize factor
Latvian: Izmēra maiņas koeficients

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Resize images to the given percentage, value must be within 10 and 90.
Latvian: Mainīt attēlu izmēru līdz norādītajiem procentiem; vērtībai jābūt no 10 līdz 90.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Enter a number between 10 and 90
Latvian: Ievadiet skaitli no 10 līdz 90

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Images resized successfully
Latvian: Attēlu izmērs veiksmīgi mainīts

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Editor
Latvian: Redaktors

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Basic Editor
Latvian: Vienkāršais redaktors

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Advanced Editor
Latvian: Paplašinātais redaktors

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Rotate
Latvian: Pagriezt

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Invalid image path
Latvian: Nederīgs attēla ceļš

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Invalid video path
Latvian: Nederīgs video ceļš

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Image editing failed
Latvian: Attēla rediģēšana neizdevās

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Video editing failed
Latvian: Video rediģēšana neizdevās

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Image editing cancelled
Latvian: Attēla rediģēšana atcelta

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Video editing cancelled
Latvian: Video rediģēšana atcelta

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: File edited successfully
Latvian: Datne veiksmīgi rediģēta

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
English: Image edited successfully
Latvian: Attēls veiksmīgi rediģēts

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
amanydw and others added 26 commits August 1, 2026 17:59
…hide_folder"

The string used the Serbian "tačka" instead of the Croatian "točka" and switched to the
formal "Morate" even though every other Croatian string addresses the user informally.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The file is created in the given folder ("u zadanoj mapi"), not in the last one
("u zadnjoj mapi"), and "zadnoj" was a typo for "zadanoj" anyway.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The name of the settings section „Slike visoke rezolucije” was left without its
closing quotation mark.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
"Poseban pristup aplikacijie- Aplikacije" contained a typo and a missing space; the
path now matches the one used in media_management_manual.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Croatian quotes are „…”; the string closed one of the quotes with the English “ and
used the correct ” for the two others.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Same as in faq_1_text: „Očisti standardne postavke“ ended with the English closing
quote instead of the Croatian ”.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Indonesian translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Indonesian translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Thai translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Thai translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Vietnamese translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Vietnamese translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Simplified Chinese translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Simplified Chinese translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Chinese (Hong Kong) translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Chinese (Hong Kong) translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Traditional Chinese translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Traditional Chinese translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Korean translation repeated the same sentence for "one" and "other".
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The "one" and "other" items had drifted apart ("%d 개 사진 크기 변경 실패" versus
"%d개 이미지 크기 조정에 실패했습니다"). The full sentence is kept, it matches the source
string and the spacing rules of Korean.
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The two items had drifted apart and "本当に %d ファイルを復元しますか?" was missing the
counter 件 and used an ASCII question mark.
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
枚 is the counter used for images, and the sentence form matches the rest of the
Japanese translation.
CLDR defines only the "other" plural category for this language, so the "one"
item is never selected at runtime and Android lint reports it as an unused
quantity. Keeping a single item avoids the two variants drifting apart.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Gujarati file defined "unknown_location" twice ("સ્થાન અજ્ઞાત છે" and "અજ્ઞાત સ્થાન"). A resource must not be
declared twice for the same configuration: aapt2 rejects the duplicate value and,
when it is tolerated, the winner depends on the declaration order.
The kept translation is "અજ્ઞાત સ્થાન" — the second definition is the literal "Unknown location", while the removed one
read "the location is unknown".

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Gujarati file defined "volume" twice ("અવાજ" and "વોલ્યુમ"). A resource must not be
declared twice for the same configuration: aapt2 rejects the duplicate value and,
when it is tolerated, the winner depends on the declaration order.
The kept translation is "વોલ્યુમ" — the removed value "અવાજ" means "sound"; "વોલ્યુમ" is the term Android uses for the
playback volume.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The Gujarati file defined "brightness" twice ("પ્રકાશ" and "તેજસ્વીતા"). A resource must not be
declared twice for the same configuration: aapt2 rejects the duplicate value and,
when it is tolerated, the winner depends on the declaration order.
The kept translation is "તેજસ્વીતા" — the removed value "પ્રકાશ" means "light"; "તેજસ્વીતા" is "brightness".

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Completes Bosnian, Icelandic, Malay, Filipino and Latvian (259/259 strings each) and repairs concrete defects in 21 other locales, including duplicate Gujarati resources, lost paragraph breaks, mangled Lithuanian escapes and unused CLDR plural categories.
@amanydw
amanydw requested a review from naveensingh as a code owner August 2, 2026 03:02
@fossifybot

fossifybot Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Fossify accepts code contributions only for open issues labeled help wanted. This pull request does not meet that requirement or one of the documented exceptions, so it is being closed without review. Please read the contribution guidelines before starting work.

@fossifybot fossifybot Bot closed this Aug 2, 2026
@naveensingh

Copy link
Copy Markdown
Member

Translation contributions are allowed, but the bot closed it due to a bug (now fixed). However, given that this is a large change, please use Weblate for these translations as recommended in the contribution guidelines.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants