Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 3 additions & 1 deletion python_twine/twine/formatters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
from twine.twine_file import TwineFile, TwineDefinition, TwineSection
from twine.output_processor import OutputProcessor

def flatten(input: List[List[str]]) -> List[str]:
def flatten(input: Optional[List[List[str]]]) -> List[str]:
if input is None:
return []
flat = []
for group in input:
flat += group
Expand Down
8 changes: 7 additions & 1 deletion python_twine/twine/formatters/apple.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,13 @@ def match_default_lang_translation(self, key:str, lang:str, value:str):
return False
if default_lang == lang:
return False
return self.twine_file.definitions_by_key[key].translations[default_lang] == value
definition = self.twine_file.definitions_by_key[key]
if default_lang in definition.translations:
return definition.translations[default_lang] == value
elif definition.reference is not None:
return definition.reference.translations[default_lang] == value
else:
raise Exception(f"Default language '{default_lang}' is not available for key [{key}]")

def format_file(self, lang: str) -> Optional[str]:
"""Format file with trailing newline."""
Expand Down
12 changes: 11 additions & 1 deletion python_twine/twine/twine_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,13 @@ def get_developer_language_code(self) -> Optional[str]:
return None

def optimize_duplicates(self):
# Check if translation matches value from 'ref' definition.
for key, definition in self.definitions_by_key.items():
if definition.reference is not None:
ref = definition.reference
definition.translations = {lang:value for lang, value in definition.translations.items()
if lang not in ref.translations or ref.translations[lang] != value}

""" Some regional languages have common items. Such as 'en-GB' and 'en'.
Deduplication: for each item and each language search the same translations
within fallback languages. Not all languages have fallbacks.
Expand All @@ -217,7 +224,7 @@ def match_fallback_lang(self, translations: dict, lang:str, key:str, value: Any)
return True
return False

def fallback_languages(self, language: str) -> List[str]:
def fallback_languages(self, language: str, include_default:bool = False) -> List[str]:
fallbacks = []

# Check specific mapping
Expand All @@ -231,6 +238,9 @@ def fallback_languages(self, language: str) -> List[str]:
generic_language = match.group(1)
fallbacks.append(generic_language)

if include_default and language != self.get_developer_language_code():
fallbacks.append(self.get_developer_language_code())

# Remove duplicates while preserving order
seen = set()
result = []
Expand Down