multilingualprogramming 0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- multilingualprogramming/__init__.py +74 -0
- multilingualprogramming/__main__.py +194 -0
- multilingualprogramming/codegen/__init__.py +12 -0
- multilingualprogramming/codegen/executor.py +215 -0
- multilingualprogramming/codegen/python_generator.py +592 -0
- multilingualprogramming/codegen/repl.py +489 -0
- multilingualprogramming/codegen/runtime_builtins.py +308 -0
- multilingualprogramming/core/__init__.py +12 -0
- multilingualprogramming/core/ir.py +29 -0
- multilingualprogramming/core/lowering.py +24 -0
- multilingualprogramming/datetime/__init__.py +11 -0
- multilingualprogramming/datetime/date_parser.py +190 -0
- multilingualprogramming/datetime/mp_date.py +210 -0
- multilingualprogramming/datetime/mp_datetime.py +153 -0
- multilingualprogramming/datetime/mp_time.py +147 -0
- multilingualprogramming/datetime/resource_loader.py +18 -0
- multilingualprogramming/exceptions.py +158 -0
- multilingualprogramming/imports.py +150 -0
- multilingualprogramming/keyword/__init__.py +13 -0
- multilingualprogramming/keyword/keyword_registry.py +249 -0
- multilingualprogramming/keyword/keyword_validator.py +59 -0
- multilingualprogramming/keyword/language_pack_validator.py +110 -0
- multilingualprogramming/lexer/__init__.py +11 -0
- multilingualprogramming/lexer/lexer.py +570 -0
- multilingualprogramming/lexer/source_reader.py +91 -0
- multilingualprogramming/lexer/token.py +54 -0
- multilingualprogramming/lexer/token_types.py +38 -0
- multilingualprogramming/numeral/__init__.py +11 -0
- multilingualprogramming/numeral/abstract_numeral.py +232 -0
- multilingualprogramming/numeral/complex_numeral.py +190 -0
- multilingualprogramming/numeral/fraction_numeral.py +165 -0
- multilingualprogramming/numeral/mp_numeral.py +243 -0
- multilingualprogramming/numeral/numeral_converter.py +151 -0
- multilingualprogramming/numeral/roman_numeral.py +301 -0
- multilingualprogramming/numeral/unicode_numeral.py +292 -0
- multilingualprogramming/parser/__init__.py +28 -0
- multilingualprogramming/parser/ast_nodes.py +459 -0
- multilingualprogramming/parser/ast_printer.py +677 -0
- multilingualprogramming/parser/error_messages.py +75 -0
- multilingualprogramming/parser/parser.py +1796 -0
- multilingualprogramming/parser/semantic_analyzer.py +689 -0
- multilingualprogramming/parser/surface_normalizer.py +282 -0
- multilingualprogramming/resources/datetime/eras.json +23 -0
- multilingualprogramming/resources/datetime/formats.json +32 -0
- multilingualprogramming/resources/datetime/months.json +150 -0
- multilingualprogramming/resources/datetime/weekdays.json +90 -0
- multilingualprogramming/resources/parser/error_messages.json +310 -0
- multilingualprogramming/resources/repl/commands.json +636 -0
- multilingualprogramming/resources/usm/builtins_aliases.json +731 -0
- multilingualprogramming/resources/usm/keywords.json +1063 -0
- multilingualprogramming/resources/usm/operators.json +532 -0
- multilingualprogramming/resources/usm/schema.json +34 -0
- multilingualprogramming/resources/usm/surface_patterns.json +1523 -0
- multilingualprogramming/unicode_string.py +140 -0
- multilingualprogramming/version.py +9 -0
- multilingualprogramming-0.2.0.dist-info/METADATA +350 -0
- multilingualprogramming-0.2.0.dist-info/RECORD +61 -0
- multilingualprogramming-0.2.0.dist-info/WHEEL +5 -0
- multilingualprogramming-0.2.0.dist-info/entry_points.txt +3 -0
- multilingualprogramming-0.2.0.dist-info/licenses/LICENSE +674 -0
- multilingualprogramming-0.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#
|
|
2
|
+
# SPDX-FileCopyrightText: 2024 John Samuel <johnsamuelwrites@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""Multilingual error message registry for the parser and semantic analyzer."""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ErrorMessageRegistry:
|
|
14
|
+
"""
|
|
15
|
+
Loads and formats multilingual error messages from JSON resources.
|
|
16
|
+
|
|
17
|
+
Singleton pattern, consistent with KeywordRegistry.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
_instance = None
|
|
21
|
+
_data = None
|
|
22
|
+
|
|
23
|
+
def __new__(cls):
|
|
24
|
+
if cls._instance is None:
|
|
25
|
+
cls._instance = super().__new__(cls)
|
|
26
|
+
return cls._instance
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
if ErrorMessageRegistry._data is None:
|
|
30
|
+
self._load()
|
|
31
|
+
|
|
32
|
+
def _load(self):
|
|
33
|
+
"""Load error_messages.json from resources."""
|
|
34
|
+
resource_path = os.path.join(
|
|
35
|
+
os.path.dirname(os.path.dirname(__file__)),
|
|
36
|
+
"resources", "parser", "error_messages.json"
|
|
37
|
+
)
|
|
38
|
+
with open(resource_path, "r", encoding="utf-8") as f:
|
|
39
|
+
raw = json.load(f)
|
|
40
|
+
ErrorMessageRegistry._data = raw.get("messages", {})
|
|
41
|
+
|
|
42
|
+
def format(self, message_key, language="en", **kwargs):
|
|
43
|
+
"""
|
|
44
|
+
Format an error message in the given language.
|
|
45
|
+
|
|
46
|
+
Parameters:
|
|
47
|
+
message_key: Key from error_messages.json
|
|
48
|
+
language: Language code (falls back to 'en')
|
|
49
|
+
**kwargs: Template variables
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Formatted error message string
|
|
53
|
+
"""
|
|
54
|
+
templates = self._data.get(message_key)
|
|
55
|
+
if templates is None:
|
|
56
|
+
return f"Unknown error: {message_key}"
|
|
57
|
+
|
|
58
|
+
template = templates.get(language)
|
|
59
|
+
if template is None:
|
|
60
|
+
template = templates.get("en", message_key)
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
return template.format(**kwargs)
|
|
64
|
+
except KeyError:
|
|
65
|
+
return template
|
|
66
|
+
|
|
67
|
+
def get_supported_keys(self):
|
|
68
|
+
"""Return all available message keys."""
|
|
69
|
+
return list(self._data.keys())
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def reset(cls):
|
|
73
|
+
"""Reset singleton for testing."""
|
|
74
|
+
cls._instance = None
|
|
75
|
+
cls._data = None
|