Localization - First Pass (#2174)

* Started designing the backend localization service

* Worked in Transloco for initial PoC

* Worked in Transloco for initial PoC

* Translated the login screen

* translated dashboard screen

* Started work on the backend

* Fixed a logic bug

* translated edit-user screen

* Hooked up the backend for having a locale property.

* Hooked up the ability to view the available locales and switch to them.

* Made the localization service languages be derived from what's in langs/ directory.

* Fixed up localization switching

* Switched when we check for a license on UI bootstrap

* Tweaked some code

* Fixed the bug where dashboard wasn't loading and made it so language switching is working.

* Fixed a bug on dashboard with languagePath

* Converted user-scrobble-history.component.html

* Converted spoiler.component.html

* Converted review-series-modal.component.html

* Converted review-card-modal.component.html

* Updated the readme

* Translated using Weblate (English)

Currently translated at 100.0% (54 of 54 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/en/

* Converted review-card.component.html

* Deleted dead component

* Converted want-to-read.component.html

* Added translation using Weblate (Korean)

* Translated using Weblate (Spanish)

Currently translated at 40.7% (22 of 54 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/es/

* Translated using Weblate (Korean)

Currently translated at 62.9% (34 of 54 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/ko/

* Converted user-preferences.component.html

* Translated using Weblate (Korean)

Currently translated at 92.5% (50 of 54 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/ko/

* Converted user-holds.component.html

* Converted theme-manager.component.html

* Converted restriction-selector.component.html

* Converted manage-devices.component.html

* Converted edit-device.component.html

* Converted change-password.component.html

* Converted change-email.component.html

* Converted change-age-restriction.component.html

* Converted api-key.component.html

* Converted anilist-key.component.html

* Converted typeahead.component.html

* Converted user-stats-info-cards.component.html

* Converted user-stats.component.html

* Converted top-readers.component.html

* Converted some pipes and ensure translation is loaded before the app.

* Finished all but one pipe for localization

* Converted directory-picker.component.html

* Converted library-access-modal.component.html

* Converted a few components

* Converted a few components

* Converted a few components

* Converted a few components

* Converted a few components

* Merged weblate in

* ... -> … update

* Updated the readme

* Updateded all fonts to be woff2

* Cleaned up some strings to increase re-use

* Removed an old flow (that doesn't exist in backend any longer) from when we introduced emails on Kavita.

* Converted Series detail

* Lots more converted

* Lots more converted & hooked up the ability to flatten during prod build the language files.

* Lots more converted

* Lots more converted & fixed a bunch of broken pipes due to inject()

* Lots more converted

* Lots more converted

* Lots more converted & fixed some bad keys

* Lots more converted

* Fixed some bugs with admin dasbhoard nested tabs not rendering on first load due to not using onpush change detection

* Fixed up some localization errors and fixed forgot password error when the user doesn't have change password permission

* Fixed a stupid build issue again

* Started adding errors for interceptor and backend.

* Finished off manga-reader

* More translations

* Few fixes

* Fixed a bug where character tag badges weren't showing the name on chapter info

* All components are translated

* All toasts are translated

* All confirm/alerts are translated

* Trying something new for the backend

* Migrated the localization strings for the backend into a new file.

* Updated the localization service to be able to do backend localization with fallback to english.

* Cleaned up some external reviews code to reduce looping

* Localized AccountController.cs

* 60% done with controllers

* All controllers are done

* All KavitaExceptions are covered

* Some shakeout fixes

* Prep for initial merge

* Everything is done except options and basic shakeout proves response times are good. Unit tests are broken.

* Fixed up the unit tests

* All unit tests are now working

* Removed some quantifier

* I'm not sure I can support localization for some Volume/Chapter/Book strings within the codebase.

---------

Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
Co-authored-by: majora2007 <kavitareader@gmail.com>
Co-authored-by: expertjun <jtrobin@naver.com>
Co-authored-by: ThePromidius <thepromidiusyt@gmail.com>
This commit is contained in:
Joe Milazzo 2023-08-03 10:33:51 -05:00 committed by GitHub
parent 670bf82c38
commit 3b23d63234
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
389 changed files with 13652 additions and 7925 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,25 @@
import os
from fontTools.ttLib import TTFont
# Function to convert a font file to woff2
def convert_to_woff2(font_path):
font = TTFont(font_path)
font.flavor = 'woff2'
new_path = os.path.splitext(font_path)[0] + '.woff2'
font.save(new_path)
return new_path
def main():
# Get the current directory of the script
current_directory = os.path.dirname(os.path.abspath(__file__))
# Search for all OTF files recursively in the current directory
for root, _, files in os.walk(current_directory):
for file in files:
if file.lower().endswith(('.otf', '.ttf')) and not file.lower().endswith(('.woff', '.woff2')):
font_file = os.path.join(root, file)
new_path = convert_to_woff2(font_file)
print(f"Converted {font_file} to {new_path}")
if __name__ == "__main__":
main()

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,34 @@
{
"login": {
"title": "Acceso",
"username": "Usuario",
"password": "Contraseña",
"password-validation": "La contraseña tiene que tener entre {{min}} y{{max}} caracteres",
"forgot-password": "Has olvidado la contraseña?",
"submit": "Enviar"
},
"dashboard": {
"no-libraries": "No existen librerías configuradas. Configura algunas en",
"server-settings-link": "Ajustes del servidor",
"not-granted": "No has sido autorizado para ver ninguna librería.",
"on-deck-title": "On Deck",
"recently-updated-title": "Recently Updated Series",
"recently-added-title": "Newly Added Series"
},
"edit-user": {
"edit": "Editar",
"username": "Nombre de Usuario",
"not-valid-email": "El correo electronico tiene que ser válido",
"saving": "Guardando …",
"update": "Actualizar",
"required": "Este campo es obligatorio"
},
"user-scrobble-history": {
"data-header": "Datos",
"not-applicable": "No aplicable",
"filter-label": "Filtro",
"type-header": "Tipo",
"rating": "Puntuación {{r}}",
"no-data": "No hay datos"
}
}

View file

@ -0,0 +1,70 @@
{
"login": {
"title": "로그인",
"username": "아이디",
"password": "비밀번호",
"submit": "로그인",
"password-validation": "비밀번호는 길이는{{min}}에서 {{max}}자 사이여야 합니다",
"forgot-password": "비밀번호를 잊으셨나요?"
},
"dashboard": {
"no-libraries": "라이브러리가 아직 설정되지 않았습니다. 구성하기",
"server-settings-link": "서버 설정",
"recently-updated-title": "최근에 업데이트된 시리즈",
"recently-added-title": "새롭게 추가된 시리즈",
"not-granted": "라이브러리에 대한 접근 권한이 없습니다."
},
"edit-user": {
"edit": "수정",
"username": "사용자",
"required": "필수 항목입니다",
"not-valid-email": "유효한 메일 주소여야 합니다",
"update": "업데이트",
"email": "이메일",
"saving": "저장중…"
},
"user-scrobble-history": {
"filter-label": "필터",
"type-header": "유형",
"series-header": "시리즈",
"created-header": "생성됨",
"last-modified-header": "마지막으로 수정한 날짜",
"no-data": "데이터 없음",
"volume-and-chapter-num": "볼륨 {{v}} 챕터 {{n}}",
"rating": "평점 {{r}}",
"not-applicable": "해당 사항 없음",
"processed": "처리됨",
"not-processed": "처리되지 않음",
"description": "여기에 계정과 연결된 모든 scrobble 데이터베이스가 있습니다. 이벤트가 존재하려면 활성 상태가 있어야 합니다\n scrobble 공급자가 구성되었습니다. 처리된 모든 이벤트는 한 달 후에 지워집니다. 만약 처리되지 않은 이벤트가 있다면, 그것은 삭제됩니다\n 이들은 업스트림에서 일치하는 항목을 형성할 수 없습니다. 관리자에게 연락하여 수정하십시오.",
"data-header": "데이터",
"is-processed-header": "처리됨"
},
"scrobble-event-type-pipe": {
"chapter-read": "읽기 진행률",
"score-updated": "평점 업데이트",
"want-to-read-add": "읽고 싶어요: 추가",
"want-to-read-remove": "읽고 싶어요: 제거",
"review": "후기 업데이트"
},
"spoiler": {
"click-to-show": "스포일러, 표시하려면 클릭"
},
"review-series-modal": {
"title": "후기 수정",
"tagline-label": "제목",
"review-label": "평가",
"close": "{{common.close}}",
"save": "{{common.save}}"
},
"review-card-modal": {
"close": "{{common.close}}",
"user-review": "{{username}}님의 리뷰",
"external-mod": "(external)",
"go-to-review": "리뷰로 이동"
},
"common": {
"close": "닫기",
"cancel": "취소",
"save": "저장"
}
}