python/moz/l10n/message/serialize.py (45 lines of code) (raw):

# Copyright Mozilla Foundation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import annotations from typing import Callable from ..formats import Format, UnsupportedFormat from ..formats.mf2.serialize import mf2_serialize_message from ..formats.properties.serialize import properties_serialize_message from ..formats.webext.serialize import webext_serialize_message from ..model import Message, PatternMessage android_serialize_message: Callable[[Message], str] | None = None xliff_serialize_message: Callable[[Message], str] | None = None try: from ..formats.android.serialize import android_serialize_message from ..formats.xliff.serialize import xliff_serialize_message except ImportError: pass def serialize_message(format: Format | None, msg: Message) -> str: """ Serialize a `Message` to its string representation. Custom serialisers are used for `android`, `mf2`, `properties`, `webext`, and `xliff` formats. Many formats rely on non-string message parts including an appropriate `source` attribute. SelectMessage serialization is only supported for `mf2`. Serializing `fluent` messages is not supported. """ # TODO post-py38: should be a match if format == Format.properties: return properties_serialize_message(msg) elif format == Format.webext: # Placeholders are discarded return webext_serialize_message(msg)[0] elif format == Format.android: if android_serialize_message is None: raise UnsupportedFormat("Serializing Android messages requires [xml] extra") return android_serialize_message(msg) elif format == Format.xliff: if xliff_serialize_message is None: raise UnsupportedFormat("Serializing XLIFF messages requires [xml] extra") return xliff_serialize_message(msg) elif format == Format.mf2: return mf2_serialize_message(msg) elif format == Format.fluent: raise UnsupportedFormat("Serializing Fluent message patterns is not supported") elif not isinstance(msg, PatternMessage) or msg.declarations: raise ValueError(f"Unsupported message: {msg}") else: res = "" for part in msg.pattern: if isinstance(part, str): res += part else: part_source = part.attributes.get("source", None) if isinstance(part_source, str): res += part_source else: raise ValueError(f"Unsupported placeholder: {part}") return res