├── .coveragerc
├── .flake8
├── .github
├── FUNDING.yml
└── workflows
│ ├── lint-pr.yml
│ ├── main.yml
│ ├── release.yml
│ ├── stale.yml
│ └── validate-commit.yaml
├── .gitignore
├── .releaserc
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── commitlint.config.js
├── metar_taf_parser
├── __init__.py
├── command
│ ├── __init__.py
│ ├── common.py
│ ├── metar.py
│ ├── remark.py
│ └── taf.py
├── commons
│ ├── __init__.py
│ ├── converter.py
│ ├── exception.py
│ └── i18n.py
├── locale
│ ├── de
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── en
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── es
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── fr
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── it
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── messages.pot
│ ├── pl
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── ru-RU
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ ├── tr
│ │ └── LC_MESSAGES
│ │ │ ├── messages.mo
│ │ │ └── messages.po
│ └── zh-CN
│ │ └── LC_MESSAGES
│ │ ├── messages.mo
│ │ └── messages.po
├── model
│ ├── __init__.py
│ ├── enum.py
│ └── model.py
├── parser
│ ├── __init__.py
│ └── parser.py
└── tests
│ ├── __init__.py
│ ├── command
│ ├── __init__.py
│ ├── test_common.py
│ ├── test_metar.py
│ ├── test_remark.py
│ └── test_taf.py
│ ├── common
│ ├── __init__.py
│ └── test_converter.py
│ └── parser
│ ├── __init__.py
│ └── test_parser.py
├── model.png
├── package-lock.json
├── package.json
├── pyproject.toml
└── renovate.json
/.coveragerc:
--------------------------------------------------------------------------------
1 | [run]
2 | branch = True
3 | source = metar_taf_parser
4 | command_line = -m unittest
--------------------------------------------------------------------------------
/.flake8:
--------------------------------------------------------------------------------
1 | [flake8]
2 |
3 | ignore = E501, W605, W503
4 | exclude = .git,__pycache__,build,dist
5 | max-complexity = 10
6 | statistics = True
7 | count = True
8 | show-source= True
9 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | ko_fi: mivek
4 |
--------------------------------------------------------------------------------
/.github/workflows/lint-pr.yml:
--------------------------------------------------------------------------------
1 | name: "Lint PR"
2 |
3 | on:
4 | pull_request:
5 | types:
6 | - opened
7 | - edited
8 | - synchronize
9 | - reopened
10 |
11 | permissions:
12 | pull-requests: read
13 |
14 | jobs:
15 | main:
16 | name: Validate PR title
17 | runs-on: ubuntu-latest
18 | steps:
19 | - uses: amannn/action-semantic-pull-request@v5.5.3
20 | env:
21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
22 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: Python test
2 |
3 | on:
4 | push:
5 | branches: [ main ]
6 | pull_request:
7 |
8 | jobs:
9 | build:
10 |
11 | runs-on: ubuntu-latest
12 | strategy:
13 | matrix:
14 | python-version: ['3.8', '3.9', '3.10', '3.11']
15 |
16 | steps:
17 | - uses: actions/checkout@v4
18 | with:
19 | fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
20 |
21 | - name: Set up Python ${{ matrix.python-version }}
22 | uses: actions/setup-python@v5
23 | with:
24 | python-version: ${{ matrix.python-version }}
25 |
26 | - name: Install dependencies
27 | run: |
28 | python -m pip install --upgrade pip
29 | make install
30 |
31 | - name: Lint with flake8
32 | run: |
33 | flake8 .
34 |
35 | - name: Test with unittest and generates reports
36 | run: |
37 | make report
38 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 |
8 | permissions:
9 | contents: read
10 |
11 | jobs:
12 | release:
13 | name: Release
14 | runs-on: ubuntu-latest
15 | permissions:
16 | contents: write
17 | issues: write
18 | pull-requests: write
19 | id-token: write
20 | steps:
21 | - uses: actions/checkout@v4
22 | with:
23 | fetch-depth: 0
24 | - name: Setup Node.js
25 | uses: actions/setup-node@v4
26 | with:
27 | node-version: 'lts/*'
28 | cache: 'npm'
29 | - name: Setup Python
30 | uses: actions/setup-python@v5
31 | with:
32 | python-version: '3.11'
33 | - name: Install dependencies
34 | run: npm install
35 | - name: Run semantic-release
36 | run: npx semantic-release
37 | env:
38 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39 | PYPI_TOKEN: ${{ secrets.PYPI_PASSWORD }}
40 |
--------------------------------------------------------------------------------
/.github/workflows/stale.yml:
--------------------------------------------------------------------------------
1 | name: 'Close stale issues and PRs'
2 | on:
3 | schedule:
4 | - cron: '30 1 * * *'
5 |
6 | jobs:
7 | stale:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - uses: actions/stale@v9
11 | with:
12 | stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
13 | stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
14 | days-before-stale: 60
15 | days-before-close: 10
--------------------------------------------------------------------------------
/.github/workflows/validate-commit.yaml:
--------------------------------------------------------------------------------
1 | name: Lint commit
2 |
3 | on: pull_request
4 |
5 | jobs:
6 | commitlint:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v4
10 | with:
11 | fetch-depth: 0
12 | - uses: actions/setup-node@v4
13 | with:
14 | node-version: 'lts/*'
15 | cache: npm
16 |
17 | - name: Install commitlint
18 | run: |
19 | npm install conventional-changelog-conventionalcommits
20 | npm install commitlint@latest
21 |
22 | - name: Validate PR commits with commitlint
23 | run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,pycharm+all,python
3 | # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,pycharm+all,python
4 |
5 | ### PyCharm+all ###
6 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
7 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
8 |
9 | # User-specific stuff
10 | .idea/**/workspace.xml
11 | .idea/**/tasks.xml
12 | .idea/**/usage.statistics.xml
13 | .idea/**/dictionaries
14 | .idea/**/shelf
15 |
16 | # AWS User-specific
17 | .idea/**/aws.xml
18 |
19 | # Generated files
20 | .idea/**/contentModel.xml
21 |
22 | # Sensitive or high-churn files
23 | .idea/**/dataSources/
24 | .idea/**/dataSources.ids
25 | .idea/**/dataSources.local.xml
26 | .idea/**/sqlDataSources.xml
27 | .idea/**/dynamic.xml
28 | .idea/**/uiDesigner.xml
29 | .idea/**/dbnavigator.xml
30 |
31 | # Gradle
32 | .idea/**/gradle.xml
33 | .idea/**/libraries
34 |
35 | # Gradle and Maven with auto-import
36 | # When using Gradle or Maven with auto-import, you should exclude module files,
37 | # since they will be recreated, and may cause churn. Uncomment if using
38 | # auto-import.
39 | # .idea/artifacts
40 | # .idea/compiler.xml
41 | # .idea/jarRepositories.xml
42 | # .idea/modules.xml
43 | # .idea/*.iml
44 | # .idea/modules
45 | # *.iml
46 | # *.ipr
47 |
48 | # CMake
49 | cmake-build-*/
50 |
51 | # Mongo Explorer plugin
52 | .idea/**/mongoSettings.xml
53 |
54 | # File-based project format
55 | *.iws
56 |
57 | # IntelliJ
58 | out/
59 |
60 | # mpeltonen/sbt-idea plugin
61 | .idea_modules/
62 |
63 | # JIRA plugin
64 | atlassian-ide-plugin.xml
65 |
66 | # Cursive Clojure plugin
67 | .idea/replstate.xml
68 |
69 | # SonarLint plugin
70 | .idea/sonarlint/
71 |
72 | # Crashlytics plugin (for Android Studio and IntelliJ)
73 | com_crashlytics_export_strings.xml
74 | crashlytics.properties
75 | crashlytics-build.properties
76 | fabric.properties
77 |
78 | # Editor-based Rest Client
79 | .idea/httpRequests
80 |
81 | # Android studio 3.1+ serialized cache file
82 | .idea/caches/build_file_checksums.ser
83 |
84 | ### PyCharm+all Patch ###
85 | # Ignore everything but code style settings and run configurations
86 | # that are supposed to be shared within teams.
87 |
88 | .idea/*
89 |
90 | !.idea/codeStyles
91 | !.idea/runConfigurations
92 |
93 | ### Python ###
94 | # Byte-compiled / optimized / DLL files
95 | __pycache__/
96 | *.py[cod]
97 | *$py.class
98 |
99 | # C extensions
100 | *.so
101 |
102 | # Distribution / packaging
103 | .Python
104 | build/
105 | develop-eggs/
106 | dist/
107 | downloads/
108 | eggs/
109 | .eggs/
110 | lib/
111 | lib64/
112 | parts/
113 | sdist/
114 | var/
115 | wheels/
116 | share/python-wheels/
117 | *.egg-info/
118 | .installed.cfg
119 | *.egg
120 | MANIFEST
121 |
122 | # PyInstaller
123 | # Usually these files are written by a python script from a template
124 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
125 | *.manifest
126 | *.spec
127 |
128 | # Installer logs
129 | pip-log.txt
130 | pip-delete-this-directory.txt
131 |
132 | # Unit test / coverage reports
133 | htmlcov/
134 | .tox/
135 | .nox/
136 | .coverage
137 | .coverage.*
138 | .cache
139 | nosetests.xml
140 | coverage.xml
141 | *.cover
142 | *.py,cover
143 | .hypothesis/
144 | .pytest_cache/
145 | cover/
146 |
147 |
148 | # Django stuff:
149 | *.log
150 | local_settings.py
151 | db.sqlite3
152 | db.sqlite3-journal
153 |
154 | # Flask stuff:
155 | instance/
156 | .webassets-cache
157 |
158 | # Scrapy stuff:
159 | .scrapy
160 |
161 | # Sphinx documentation
162 | docs/_build/
163 |
164 | # PyBuilder
165 | .pybuilder/
166 | target/
167 |
168 | # Jupyter Notebook
169 | .ipynb_checkpoints
170 |
171 | # IPython
172 | profile_default/
173 | ipython_config.py
174 |
175 | # pyenv
176 | # For a library or package, you might want to ignore these files since the code is
177 | # intended to run in multiple environments; otherwise, check them in:
178 | # .python-version
179 |
180 | # pipenv
181 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
182 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
183 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
184 | # install all needed dependencies.
185 | #Pipfile.lock
186 |
187 | # poetry
188 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
189 | # This is especially recommended for binary packages to ensure reproducibility, and is more
190 | # commonly ignored for libraries.
191 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
192 | #poetry.lock
193 |
194 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
195 | __pypackages__/
196 |
197 | # Celery stuff
198 | celerybeat-schedule
199 | celerybeat.pid
200 |
201 | # SageMath parsed files
202 | *.sage.py
203 |
204 | # Environments
205 | .env
206 | .venv
207 | env/
208 | venv/
209 | ENV/
210 | env.bak/
211 | venv.bak/
212 |
213 | # Spyder project settings
214 | .spyderproject
215 | .spyproject
216 |
217 | # Rope project settings
218 | .ropeproject
219 |
220 | # mkdocs documentation
221 | /site
222 |
223 | # mypy
224 | .mypy_cache/
225 | .dmypy.json
226 | dmypy.json
227 |
228 | # Pyre type checker
229 | .pyre/
230 |
231 | # pytype static type analyzer
232 | .pytype/
233 |
234 | # Cython debug symbols
235 | cython_debug/
236 |
237 | # PyCharm
238 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
239 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
240 | # and can be added to the global gitignore or merged into this file. For a more nuclear
241 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
242 | #.idea/
243 |
244 | ### VisualStudioCode ###
245 | .vscode/*
246 |
247 | # Local History for Visual Studio Code
248 | .history/
249 |
250 | # Built Visual Studio Code Extensions
251 | *.vsix
252 |
253 | ### VisualStudioCode Patch ###
254 | # Ignore all local history of files
255 | .history
256 | .ionide
257 |
258 | # Support for Project snippet scope
259 |
260 | # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,pycharm+all,python
261 |
--------------------------------------------------------------------------------
/.releaserc:
--------------------------------------------------------------------------------
1 | {
2 | "branches": ["main"],
3 | "plugins": [
4 | "@semantic-release/commit-analyzer",
5 | "@semantic-release/release-notes-generator",
6 | "@semantic-release/git",
7 | [
8 | "@semantic-release/changelog",
9 | {
10 | "changelogFile": "CHANGELOG.md"
11 | }
12 | ],
13 | "semantic-release-pypi",
14 | "@semantic-release/github",
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | ## [1.9.0] - 2024-05-19
4 |
5 | ### Added
6 |
7 | - When information about a runway is incomplete in a METAR, a `ParseError` is raised instead of `ValueError`.
8 |
9 | ## [1.8.2] - 2024-01-14
10 |
11 | ### Fixed
12 |
13 | - Fix the calm wind regex to prevent parsing error with visibility.
14 | - Fix single quotes in French translations.
15 |
16 | ## [1.8.0] - 2024-01-04
17 |
18 | ### Added
19 |
20 | - Support of Russian locale thanks to [@a184ot](https://github.com/a184ot)
21 |
22 | ### Fixed
23 |
24 | - Reformat object representation. Removed breaking lines in formatting.
25 |
26 | ## [1.7.1] - 2023-12-09
27 |
28 | ### Fixed
29 |
30 | - Parsing of `WeatherCondition` tokens with recent (`RE`) intensity.
31 |
32 | ## [1.7.0] - 2023-08-20
33 |
34 | ### Added
35 |
36 | - `Wind` and `WindShear` elements now supports 3 digits in gusts part
37 |
38 | ## [1.6.5] - 2023-08-06
39 |
40 | ### Added
41 |
42 | - Implementation of method `__repr__` on class of module `model`.
43 |
44 | ### Fixed
45 |
46 | - Use `getlocale()` instead of `getdefaultlocale()`
47 |
48 | ## [1.6.4] - 2023-06-23
49 |
50 | ### Fixed
51 |
52 | - Parsing of `TAF` with stations starting by `FM`.
53 |
54 | ## [1.6.3] - 2023-03-12
55 |
56 | ### Fixed
57 |
58 | - Parsing of token `0000KT` no longer causes an error.
59 |
60 | ## [1.6.2] - 2023-01-29
61 |
62 | ### Fixed
63 |
64 | - Parsing of Runway does not fail if thickness and braking capacity are not in the enum.
65 |
66 | ### Changed
67 |
68 | - RunwayInfo properties `thickness` and `braking_capacity` type is changed to string. Enums `DepositThickness` and `DepositBreakingCapacity` are removed.
69 |
70 | ## [1.6.1] - 2022-12-20
71 |
72 | ### Added
73 |
74 | - Implement parsing of deposit on a Runway. Properties `indicator`, `deposit_type`, `coverage`, `thickness`, `braking_capacity`.
75 |
76 | ## [1.6.0] - 2022-12-04
77 |
78 | ### Added
79 |
80 | - Support for unknown height and unknown types in cloud elements. Clouds elements with `///` are no longer ignored.
81 | - `Turbulence` and `Icing` elements are available in `TAF` and `TAFTrend` objects. The new properties are `turbulence` and `icings`.
82 |
83 | ### Fixed
84 |
85 | - WeatherConditions are now added to the list only if the entire token was parsed. This prevents false positive matches.
86 | - Phenomenons in WeatherConditions are now listed in the same order they appear in the token.
87 | - Cloud regex matches the cloud type part only of the height is present. Tokens made of 6 letters do not match the regex anymore.
88 |
89 | ## [1.5.0] - 2022-07-17
90 |
91 | ### Added
92 |
93 | - Added `flags` property to `AbstractWeatherCode`. This property is a set holding flags: AUTO, AMD, CNL, NIL and COR. Properties `auto`, `amendment`, `nil`, `canceled` and `corrected` are also available.
94 | - Added new translations.
95 |
96 | ## [1.4.1] - 2022-05-29
97 |
98 | ### Fixed
99 |
100 | - Parsing of visibility in miles having indication: `P` for greater than and `M` for less than.
101 |
102 | ## [1.4.0] - 2022-04-20
103 |
104 | ### Added
105 |
106 | - Added `WeatherChangeType.INTER` for TAFTrend.
107 | - Added methods to retrieve Taf trends by `WeatherChangeType`: taf.becmgs, taf.fms, taf.inters, taf.probs and taf.tempos
108 | - Turkish translation
109 | - Added `PrecipitationBegCommand` and `PrecipitationEndCommand` in remark parsing.
110 |
111 | ### Fixed
112 |
113 | - Parsing of remarks added Phenomenon.FC to the list of WeatherConditions when the remarks contained `FCST`
114 |
115 | ## [1.3.0] - 2021-10-05
116 |
117 | ### Added
118 |
119 | - i18n support for simplified Chinese locale
120 | - Completed remarks parsing
121 |
122 | ## [1.2.0] - 2021-05-04
123 |
124 | ### Added
125 |
126 | - i18n support for Italian locale
127 |
128 | ## [1.1.1] - 2021-04-20
129 |
130 | ### Fixed
131 |
132 | - Added packages source directory in `setup.cfg` to fix deployment.
133 |
134 | ## [1.1.0] - 2021-03-20
135 |
136 | ### Added
137 |
138 | - i18n module to support English, French, German and Polish locales.
139 | - Remarks are now parsed and converted in a readable sentence.
140 | The value is stored in properties `remark` and `remarks`. The `remarks` property contains an element for each remark or
141 | token. The `remark` property contains the whole decoded remarks in a sentence.
142 |
143 | - Makefile and `pyproject.toml`.
144 |
145 | - Coverage measurement.
146 |
147 | ### Changed
148 |
149 | - The packaging now uses setuptools and build modules instead of `setup.py`.
150 |
151 |
152 | ## [1.0.1] - 2021-02-28
153 |
154 | ### Changed
155 |
156 | - Removed the regex search from the weatherCondition parsing.
157 | Replaced by a single string search.
158 |
159 | ### Fixed
160 |
161 | - Added `^` (start of string) at the beginning of the wind regex.
162 |
163 | ## [1.0.0] - 2020-10-18
164 |
165 | ### Added
166 |
167 | - First version of the MetarParser and the TAFParser.
168 | - Github actions to handle commits, release and
169 |
170 | ### Changed
171 |
172 | ### Fixed
173 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ## Pull Request Naming Guidelines
2 |
3 | To keep the repository organized and to make it easier to understand the purpose of each pull request, the project follows these pull request naming conventions:
4 |
5 | ### Format
6 |
7 | Each pull request name should include a type and a short description:
8 |
9 | `: `
10 |
11 | ### Types
12 |
13 | Use one of the following types:
14 |
15 | - **feat**: A new feature
16 | - **fix**: A bug fix
17 | - **docs**: Documentation only changes
18 | - **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
19 | - **refactor**: A code change that neither fixes a bug nor adds a feature
20 | - **perf**: A code change that improves performance
21 | - **test**: Adding missing or correcting existing tests
22 | - **build**: Changes that affect the build system or external dependencies
23 | - **ci**: Changes to the CI configuration files and scripts
24 | - **chore**: Other changes that don't modify src or test files
25 | - **revert**: Reverts a previous commit
26 |
27 | ### Examples
28 |
29 | - `feat: add login feature`
30 | - `fix: bug in authentication`
31 | - `docs: update readme`
32 | - `chore: cleanup dependencies`
33 | - `refactor: improve parser`
34 |
35 | By following these guidelines, you help ensure that the branches are easy to understand and manage.
36 |
37 | ## Commit Message Guidelines
38 |
39 | This project follows the commit message conventions set by [Conventional Commits](https://www.conventionalcommits.org/).
40 |
41 | ### Commit Message Format
42 |
43 | Each commit message should include a type, a scope (optional), and a subject:
44 |
45 | `(): `
46 |
47 | #### Type
48 |
49 | Must be one of the following:
50 |
51 | - **feat**: A new feature
52 | - **fix**: A bug fix
53 | - **docs**: Documentation only changes
54 | - **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
55 | - **refactor**: A code change that neither fixes a bug nor adds a feature
56 | - **perf**: A code change that improves performance
57 | - **test**: Adding missing or correcting existing tests
58 | - **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
59 | - **ci**: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
60 | - **chore**: Other changes that don't modify src or test files
61 | - **revert**: Reverts a previous commit
62 |
63 | #### Subject
64 |
65 | The subject contains a succinct description of the change:
66 |
67 | - Use the imperative, present tense: "change" not "changed" nor "changes"
68 | - Do not capitalize the first letter
69 | - Do not end the subject with a period
70 |
71 | ### Examples
72 |
73 | ```plaintext
74 | feat(parser): add support for new weather condition
75 |
76 | fix(translation): correct French translation for 'clear sky'
77 |
78 | docs(contributing): add commit message guidelines
79 | ```
80 |
81 | By following these guidelines, you help ensure that the project remains consistent and easy to understand.
82 |
83 |
84 | ## Internationalization
85 |
86 | If you are willing to add a new language or complete an existing language, please use https://crwd.in/metarParser to register and contribute.
87 | Once a language is complete at 100%, open an issue so the translation can be added to the project.
88 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2021 Jean-Kevin KPADEY
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | # Include the local folder
2 | recursive-include metar_taf_parser/locale *
3 |
4 | # Include the license
5 | include LICENSE
6 | include CHANGELOG.md
7 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | PYTHON = python
2 |
3 |
4 | clean:
5 | @echo "Cleaning up..."
6 | rm -rf ./metar_taf_parser_mivek.egg-info/
7 | rm -rf ./build/
8 | rm -rf ./dist/
9 | rm -rf ./htmlcov/
10 | rm -rf ./.coverage
11 | rm -rf ./coverage.json
12 | rm -rf ./coverage.xml
13 |
14 | test:
15 | @echo "Launching test"
16 | ${PYTHON} -m pipenv run coverage run -m unittest
17 |
18 | report: test
19 | ${PYTHON} -m pipenv run coverage html
20 | ${PYTHON} -m pipenv run coverage xml
21 | ${PYTHON} -m pipenv run coverage json
22 |
23 | lock:
24 | ${PYTHON} -m pipenv lock
25 |
26 | install:
27 | @echo "Install dependencies"
28 | ${PYTHON} -m pip install flake8 pipenv
29 | ${PYTHON} -m pipenv install -d
30 |
31 | install_deploy:
32 | @echo "Install build/deployment dependencies"
33 | ${PYTHON} -m pip install --upgrade build --user
34 |
--------------------------------------------------------------------------------
/Pipfile:
--------------------------------------------------------------------------------
1 | [[source]]
2 | name = "pypi"
3 | url = "https://pypi.org/simple"
4 | verify_ssl = true
5 |
6 | [dev-packages]
7 | parameterized = "*"
8 | coverage = "*"
9 |
10 | [packages]
11 |
12 |
13 | [requires]
14 |
15 |
--------------------------------------------------------------------------------
/Pipfile.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_meta": {
3 | "hash": {
4 | "sha256": "206a6b663facafa7844f7db51398b0fe7832640d9c3d273261508c7834ea15e5"
5 | },
6 | "pipfile-spec": 6,
7 | "requires": {},
8 | "sources": [
9 | {
10 | "name": "pypi",
11 | "url": "https://pypi.org/simple",
12 | "verify_ssl": true
13 | }
14 | ]
15 | },
16 | "default": {},
17 | "develop": {
18 | "coverage": {
19 | "hashes": [
20 | "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c",
21 | "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6",
22 | "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45",
23 | "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a",
24 | "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03",
25 | "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529",
26 | "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a",
27 | "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a",
28 | "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2",
29 | "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6",
30 | "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759",
31 | "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53",
32 | "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a",
33 | "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4",
34 | "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff",
35 | "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502",
36 | "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793",
37 | "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb",
38 | "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905",
39 | "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821",
40 | "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b",
41 | "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81",
42 | "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0",
43 | "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b",
44 | "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3",
45 | "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184",
46 | "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701",
47 | "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a",
48 | "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82",
49 | "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638",
50 | "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5",
51 | "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083",
52 | "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6",
53 | "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90",
54 | "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465",
55 | "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a",
56 | "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3",
57 | "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e",
58 | "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066",
59 | "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf",
60 | "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b",
61 | "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae",
62 | "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669",
63 | "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873",
64 | "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b",
65 | "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6",
66 | "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb",
67 | "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160",
68 | "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c",
69 | "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079",
70 | "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d",
71 | "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"
72 | ],
73 | "index": "pypi",
74 | "version": "==5.5"
75 | },
76 | "parameterized": {
77 | "hashes": [
78 | "sha256:41bbff37d6186430f77f900d777e5bb6a24928a1c46fb1de692f8b52b8833b5c",
79 | "sha256:9cbb0b69a03e8695d68b3399a8a5825200976536fe1cb79db60ed6a4c8c9efe9"
80 | ],
81 | "index": "pypi",
82 | "version": "==0.8.1"
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # METAR TAF Parser
2 |
3 | 
4 |
5 | This project provides METAR and TAF parsers.
6 |
7 | ## Install
8 |
9 | ```shell
10 | pip install metar-taf-parser-mivek
11 | ```
12 |
13 | ## Structure
14 |
15 | ### Commons package
16 |
17 | This package contains the converter module. The module contains helper functions.
18 |
19 | ### Model package
20 |
21 | This package contains multiple modules
22 |
23 | - enum: Contains the enumerations for the project
24 | - model: Contains the model classes for the project
25 |
26 | ### Parser package
27 |
28 | This package contains the parser module with the `MetarParser` and `TAFParser` classes.
29 |
30 | ## Model
31 |
32 | ### Enumerations
33 |
34 | - CloudQuantity: Represents the quantity in a cloud layer
35 | - CloudType: Represents the type of cloud in a cloud layer
36 | - DepositCoverage: Represents the percentage of a runway covered by the deposit
37 | - DepositType: Represents the type of deposit on a runway
38 | - Descriptive: Represents the descriptive part of a weather phenomenon
39 | - Intensity: Represents the intensity of a weather phenomenon
40 | - Phenomenon: Represents the phenomenon of a weather phenomenon
41 | - TimeIndicator: Indicates the time trend
42 | - WeatherChangeType: Indicate the type of trend
43 | - IcingIntensity: Represents the intensity of an icing element
44 | - TurbulenceIntensity: Represents the intensity of a turbulence element
45 |
46 |
47 | ### Objects
48 |
49 | 
50 |
51 | #### Wind
52 |
53 | Represents the wind part of a metar, taf or trend
54 |
55 | - speed: `int`. The speed of the wind
56 | - direction: `str`. The cardinal direction of the wind
57 | - degrees: `int`. The direction in degrees
58 | - gust: `int`. The speed of gust if any, None otherwise
59 | - min_variation: `int`. The minimal degree variation of the wind
60 | - max_variation: `int`. The maximal degree variation of the wind
61 | - unit: `str`. The unit of the speed of the wind.
62 |
63 | #### WindShear
64 |
65 | Represents a wind shear in TAF message. This class extends Wind.
66 |
67 | - height: `int`. The height of the wind shear.
68 |
69 | #### Visibility
70 |
71 | Represents the visibility part of a METAR, TAF or trend.
72 |
73 | - distance: `str`. The distance in meters or nautical miles.
74 | - min_distance: `int`. The minimal distance in meters if any.
75 | - min_direction: `str`. The direction of the minimal distance if any.
76 |
77 | #### WeatherCondition
78 |
79 | Represents the weather part of a METAR, TAF or trend.
80 |
81 | - intensity: `Intensity`. The intensity of the weather condition if any, `None` otherwise.
82 | - descriptive: `Descriptive`. The descriptive of the weather condition if any, `None` otherwise.
83 | - phenomenons: `[Phenomenon]`. Array of phenomenons of the weather condition.
84 |
85 | #### TemperatureDated
86 |
87 | Represents the temperature part of a TAF.
88 |
89 | - temperature: `int`. The temperature in celsius degrees.
90 | - day: `int`. Day of the occurrence.
91 | - hour: `int`. Hour of the occurrence.
92 |
93 | #### RunwayInfo
94 |
95 | Represents the visibility or the deposit on a runway.
96 |
97 | - name: `str`. The name of the runway.
98 | - min_range: `int`. The minimal visibility distance on the runway.
99 | - max_range: `int`. The maximal visibility distance on the runway.
100 | - trend: `str`. The trend of the visibility.
101 | - indicator: `str`. The indicator on the visual range. `M` for less than and or `P` for greater than.
102 | - deposit_type: `DepositType`. The type of deposit.
103 | - coverage: `DepositCoverage`. The percentage of coverage.
104 | - thickness: `str`. The thickness of the deposit.
105 | - braking_capacity: `str`. The braking capacity on the runway.
106 |
107 | #### Cloud
108 |
109 | Represents a cloud layer in METAR, TAF or trend object.
110 |
111 | - height: `int`. The height of the layer in feet.
112 | - quantity: `CloudQuantity`. The quantity of clouds.
113 | - type: `CloudType`. The type of cloud in the layer.
114 |
115 | #### Icing
116 |
117 | Represents the icing in a TAF or TAFTrend object.
118 |
119 | - intensity: `IcingIntensity`. The intensity of an icing.
120 | - base_height: `int`. The base height of an icing element in feet.
121 | - depth: `int`. The icing layer depth in feet. Adding this to the base height determines the top limit of the icing.
122 |
123 | #### Turbulence
124 |
125 | Represents the turbulence in a TAF or TAFTrend object.
126 |
127 | - intensity: `TurbulenceIntensity`. The intensity of a turbulence.
128 | - base_height: `int`. The base height of a turbulence element in feet.
129 | - depth: `int`. The turbulence layer depth in feet. Adding this to the base height determines the top limit of the turbulence.
130 |
131 | #### ITafGroups
132 |
133 | Class holding turbulence and icing elements.
134 |
135 | - icings: `[Icing]`. List of icing elements.
136 | - turbulence: `[Turbulence]`. List of turbulence elements.
137 |
138 | This class is a parent class of `TAF` and `ITafGroups`.
139 |
140 | #### AbstractWeatherContainer
141 |
142 | Abstract class containing the basic fields of METAR, TAF or trend objects.
143 |
144 | - wind: `Wind`. The wind. Can be `None` for trends.
145 | - visibility: `Visibility`. The visibility.
146 | - vertical_visibility: `int`. The vertical visibility, can be `None`
147 | - wind_shear: `WindShear`. The wind shear object.
148 | - cavok: `bool`. Indicates whether the message is CAVOK (Ceiling and visibility OK)
149 | - remark: `str`. The remark part of the message.
150 | - remarks: `list[str]`. List of remarks. Each element is a different remark or token
151 | - clouds: `[Cloud]`. Array of clouds elements.
152 | - weather_conditions: `[WeatherCondition]`. Array of weather conditions.
153 |
154 | #### AbstractValidity
155 |
156 | Abstract class representing the base of a Validity object.
157 |
158 | - start_day: `int`. The starting day of the validity.
159 | - start_hour: `int`. The starting hour of the validity.
160 |
161 | #### AbstractWeatherCode
162 |
163 | Class extending the AbstractWeatherContainer. Abstract parent class of METAR and TAF.
164 |
165 | - day: `int`. The delivery day of the METAR or TAF.
166 | - time: `datetime.time`. The delivery time of the METAR/TAF.
167 | - message: `str`. The message of the METAR/TAF.
168 | - station: `str`. The station for which the message was issued.
169 | - trends: `[TAFTrend/MetarTrend]`. Array of trends
170 | - flags: `[Flag]`. Set of flags.
171 | - auto: `bool`. Whether the METAR is automated.
172 | - amendment: `bool`. Whether the TAF is an amendment.
173 | - nil: `bool`. Whether the METAR/TAF is null.
174 | - canceled: `bool`. Whether the METAR/TAF is canceled.
175 | - corrected: `bool`. Whether the METAR/TAF is a correction.
176 |
177 | #### Metar
178 |
179 | Class representing a metar object.
180 |
181 | - temperature: `int`. The temperature in celsius.
182 | - dew_point: `int`. The dew_point in celsius.
183 | - altimeter: `float`. The altimeter value in HPa.
184 | - nosig: `bool`. Whether the message is nosig: No significant changes to come.
185 | - runway_info: `[RunwayInfo]`. Array of runway information.
186 |
187 | #### TAF
188 |
189 | Class representing a TAF object.
190 |
191 | - validity: `Validity`. The validity of the TAF.
192 | - max_temperature: `TemperatureDated`. The maximum temperature during the validity of the TAF.
193 | - min_temperature: `TemperatureDated`. The minimum temperature during the validity of the TAF.
194 | - amendment: `bool`. Whether the TAF is an amendment.
195 |
196 | #### AbstractTrend
197 |
198 | Abstract base class for trend.
199 |
200 | - type: `WeatherChangeType`. The type of change.
201 |
202 | #### MetarTrendTime
203 |
204 | Class containing the time of the trend.
205 |
206 | - time: `datetime.time`. Time of the trend's occurrence.
207 | - type: `TimeIndicator`. Type of time change of the trend.
208 |
209 | #### MetarTrend
210 |
211 | Represents a trend in a METAR object, this class extends `AbstractTrend`.
212 |
213 | - times: `[MetarTrendTime]`. The list of time change of the trend.
214 |
215 | #### TAFTrend
216 |
217 | Represent a trend in a TAF object, this class extends `AbstractTrend`
218 |
219 | - validity: `AbstractValidity`. The validity of the trend either `Validity` or `FMValidity`
220 | - probability: `int`. The probability of a trend, can be `None`.
221 |
222 | #### Validity
223 |
224 | Represents the validity timespan of a TAF or TAFTrend, this class extends `AbstractValidity`.
225 |
226 | - end_day: `int`. The ending day of the validity.
227 | - end_hour: `int` The ending hour of the validity.
228 |
229 | #### FMValidity
230 |
231 | Represents the validity of a From trend, extends AbstractValidity
232 |
233 | - start_minutes: `int`. The starting minute of the trend.
234 |
235 |
236 | ## Example
237 |
238 | ### Parse a METAR
239 |
240 | Use the method `parse(string)` of the `MetarParser` to parse a metar.
241 |
242 | ```python
243 | from metar_taf_parser.parser.parser import MetarParser
244 |
245 | metar = MetarParser().parse('KTTN 051853Z 04011KT 9999 VCTS SN FZFG BKN003 OVC010 M02/M02 A3006')
246 |
247 | ```
248 |
249 |
250 | ### Parse a TAF
251 |
252 | Use the method `parse(string)` of the TAFParser to parse a TAF message.
253 | The message must start with `TAF` in order to be parsed.
254 |
255 | ```python
256 | from metar_taf_parser.parser.parser import TAFParser
257 |
258 | taf = TAFParser().parse(
259 | 'TAF LFPG 150500Z 1506/1612 17005KT 6000 SCT012 TEMPO 1506/1509 3000 BR BKN006 PROB40 TEMPO 1506/1508 0400 BCFG BKN002 PROB40 TEMPO 1512/1516 4000 -SHRA FEW030TCU BKN040 BECMG 1520/1522 CAVOK TEMPO 1603/1608 3000 BR BKN006 PROB40 TEMPO 1604/1607 0400 BCFG BKN002 TX17/1512Z TN07/1605Z')
260 | ```
261 |
262 |
263 | ## Internationalization
264 |
265 | The following locales are supported:
266 | - en (default)
267 | - fr
268 | - de
269 | - pl
270 | - it
271 | - ru
272 |
273 | To add or complete locales please see [CONTRIBUTING](CONTRIBUTING.md)
--------------------------------------------------------------------------------
/commitlint.config.js:
--------------------------------------------------------------------------------
1 | export default { extends: ['@commitlint/config-conventional'] };
2 |
--------------------------------------------------------------------------------
/metar_taf_parser/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/command/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/command/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/command/common.py:
--------------------------------------------------------------------------------
1 |
2 | import re
3 |
4 | from metar_taf_parser.commons import converter
5 | from metar_taf_parser.commons.converter import convert_visibility
6 | from metar_taf_parser.model.enum import CloudQuantity, CloudType
7 | from metar_taf_parser.model.model import Visibility, Wind, WindShear, Cloud, AbstractWeatherContainer
8 |
9 |
10 | def set_wind_elements(wind: Wind, direction: str, speed: str, gust: str, unit: str):
11 | """
12 | This function updates a wind element.
13 | :param wind: Wind. The wind object
14 | :param direction: str. The direction in degrees
15 | :param speed: str. The speed
16 | :param gust: int. The speed of the gust.
17 | :param unit: str. The speed unit
18 | :return: None.
19 | """
20 | wind.speed = int(speed)
21 | wind.direction = converter.degrees_to_cardinal(direction)
22 |
23 | if 'VRB' != direction:
24 | wind.degrees = int(direction)
25 | if gust:
26 | wind.gust = int(gust)
27 | if unit:
28 | wind.unit = unit
29 | else:
30 | wind.unit = 'KT'
31 |
32 |
33 | class CloudCommand:
34 | cloud_regex = r'^([A-Z]{3})((\d{3}|/{3})([A-Z]{2,3}|/{3})?)?$'
35 | undefined = '///'
36 |
37 | def __init__(self):
38 | self._pattern = re.compile(CloudCommand.cloud_regex)
39 |
40 | def parse(self, cloud_string: str):
41 | m = self._pattern.search(cloud_string).groups()
42 | cloud = Cloud()
43 | try:
44 | if CloudQuantity[m[0]]:
45 | cloud.quantity = CloudQuantity[m[0]]
46 | if m[2] and m[2] != CloudCommand.undefined:
47 | cloud.height = 100 * int(m[2])
48 | if m[3] and m[3] != CloudCommand.undefined:
49 | cloud.type = CloudType[m[3]]
50 | return cloud
51 | except KeyError:
52 | return
53 |
54 | def execute(self, container: AbstractWeatherContainer, cloud_string: str):
55 | cloud = self.parse(cloud_string)
56 | if cloud and cloud.quantity:
57 | container.add_cloud(cloud)
58 | return True
59 |
60 | def can_parse(self, cloud_string: str):
61 | return self._pattern.search(cloud_string)
62 |
63 |
64 | class MainVisibilityCommand:
65 | regex = r'^(\d{4})(|NDV)$'
66 |
67 | def __init__(self):
68 | self._pattern = re.compile(MainVisibilityCommand.regex)
69 |
70 | def can_parse(self, visibility_string: str):
71 | return self._pattern.search(visibility_string)
72 |
73 | def execute(self, container: AbstractWeatherContainer, visibility_string: str):
74 | matches = self._pattern.search(visibility_string).groups()
75 | if container.visibility is None:
76 | container.visibility = Visibility()
77 | container.visibility.distance = convert_visibility(matches[0])
78 | return True
79 |
80 |
81 | class WindCommand:
82 | regex = r'^(VRB|000|[0-3]\d{2})(\d{2})G?(\d{2,3})?(KT|MPS|KM\/H)?'
83 |
84 | def __init__(self):
85 | self._pattern = re.compile(WindCommand.regex)
86 |
87 | def can_parse(self, wind_string: str):
88 | """
89 |
90 | :param wind_string: str
91 | The string to parse
92 | :return:
93 | """
94 | return self._pattern.search(wind_string)
95 |
96 | def parse_wind(self, wind_string: str):
97 | wind = Wind()
98 | matches = self._pattern.search(wind_string).groups()
99 | set_wind_elements(wind, matches[0], matches[1], matches[2], matches[3])
100 | return wind
101 |
102 | def execute(self, container: AbstractWeatherContainer, wind_string: str):
103 | wind = self.parse_wind(wind_string)
104 | container.wind = wind
105 | return True
106 |
107 |
108 | class WindVariationCommand:
109 | regex = r'^(\d{3})V(\d{3})'
110 |
111 | def __init__(self):
112 | self._pattern = re.compile(WindVariationCommand.regex)
113 |
114 | def can_parse(self, wind_string: str):
115 | return self._pattern.search(wind_string)
116 |
117 | def parse_wind_variation(self, wind: Wind, wind_string: str):
118 | matches = self._pattern.search(wind_string).groups()
119 | wind.min_variation = int(matches[0])
120 | wind.max_variation = int(matches[1])
121 |
122 | def execute(self, container, wind_string):
123 | self.parse_wind_variation(container.wind, wind_string)
124 | return True
125 |
126 |
127 | class WindShearCommand:
128 | regex = r'^WS(\d{3})\/(\w{3})(\d{2})G?(\d{2,3})?(KT|MPS|KM\/H)'
129 |
130 | def __init__(self):
131 | self._pattern = re.compile(WindShearCommand.regex)
132 |
133 | def can_parse(self, wind_string: str):
134 | return self._pattern.search(wind_string)
135 |
136 | def parse_wind_shear(self, wind_string: str):
137 | wind_shear = WindShear()
138 | matches = self._pattern.search(wind_string).groups()
139 |
140 | wind_shear.height = 100 * int(matches[0])
141 | set_wind_elements(wind_shear, matches[1], matches[2], matches[3], matches[4])
142 | return wind_shear
143 |
144 | def execute(self, container: AbstractWeatherContainer, wind_string: str):
145 | container.wind_shear = self.parse_wind_shear(wind_string)
146 | return True
147 |
148 |
149 | class VerticalVisibilityCommand:
150 |
151 | regex = r'^VV(\d{3})$'
152 |
153 | def __init__(self):
154 | self._pattern = re.compile(VerticalVisibilityCommand.regex)
155 |
156 | def execute(self, container: AbstractWeatherContainer, visibility_string: str):
157 | matches = self._pattern.search(visibility_string).groups()
158 | container.vertical_visibility = 100 * int(matches[0])
159 | return True
160 |
161 | def can_parse(self, visibility_string: str):
162 | return self._pattern.search(visibility_string)
163 |
164 |
165 | class MinimalVisibilityCommand:
166 | regex = r'^(\d{4}[NnEeSsWw])$'
167 |
168 | def __init__(self):
169 | self._pattern = re.compile(MinimalVisibilityCommand.regex)
170 |
171 | def can_parse(self, visibility_string: str):
172 | return self._pattern.search(visibility_string)
173 |
174 | def execute(self, container: AbstractWeatherContainer, visibility_string: str):
175 | """
176 |
177 | :param container: AbstractWeatherContainer
178 | :param visibility_string: string
179 | :return:
180 | """
181 | matches = self._pattern.search(visibility_string).groups()
182 | container.visibility.min_distance = int(matches[0][0:4])
183 | container.visibility.min_direction = matches[0][4]
184 | return True
185 |
186 |
187 | class MainVisibilityNauticalMilesCommand:
188 |
189 | regex = r'^(P|M)?(\d)*(\s)?((\d\/\d)?SM)$'
190 |
191 | def __init__(self):
192 | self._pattern = re.compile(MainVisibilityNauticalMilesCommand.regex)
193 |
194 | def can_parse(self, wind_string: str):
195 | return self._pattern.search(wind_string)
196 |
197 | def execute(self, container: AbstractWeatherContainer, visibility_string: str):
198 | if container.visibility is None:
199 | container.visibility = Visibility()
200 | container.visibility.distance = visibility_string
201 | return True
202 |
203 |
204 | class CommandSupplier:
205 |
206 | def __init__(self):
207 | self._commands = [
208 | WindShearCommand(), WindCommand(), WindVariationCommand(), MainVisibilityCommand(),
209 | MainVisibilityNauticalMilesCommand(), MinimalVisibilityCommand(),
210 | VerticalVisibilityCommand(), CloudCommand()
211 | ]
212 |
213 | def get(self, input: str):
214 | for command in self._commands:
215 | if command.can_parse(input):
216 | return command
217 |
--------------------------------------------------------------------------------
/metar_taf_parser/command/metar.py:
--------------------------------------------------------------------------------
1 | import re
2 |
3 | from metar_taf_parser.commons import converter
4 | from metar_taf_parser.commons.exception import ParseError
5 | from metar_taf_parser.model.enum import DepositType, DepositCoverage
6 | from metar_taf_parser.model.model import RunwayInfo, Metar
7 | from metar_taf_parser.commons.i18n import _
8 |
9 |
10 | class AltimeterCommand:
11 | regex = r'^Q(\d{4})$'
12 |
13 | def __init__(self):
14 | self._pattern = re.compile(AltimeterCommand.regex)
15 |
16 | def can_parse(self, input: str):
17 | return self._pattern.search(input)
18 |
19 | def execute(self, metar: Metar, input: str):
20 | """
21 |
22 | :param metar: metar_taf_parser.model.model.Metar
23 | :param input: string
24 | :return:
25 | """
26 | matches = self._pattern.search(input).groups()
27 | metar.altimeter = int(matches[0])
28 |
29 |
30 | class AltimeterMercuryCommand:
31 | regex = r'^A(\d{4})$'
32 |
33 | def __init__(self):
34 | self._pattern = re.compile(AltimeterMercuryCommand.regex)
35 |
36 | def can_parse(self, input: str):
37 | return self._pattern.search(input)
38 |
39 | def execute(self, metar: Metar, input: str):
40 | matches = self._pattern.search(input).groups()
41 | mercury = float(matches[0]) / 100
42 | metar.altimeter = int(converter.convert_inches_mercury_to_pascal(mercury))
43 |
44 |
45 | def _parse_runway(matches, metar, runway):
46 | runway.name = matches[0][0]
47 | runway.indicator = matches[0][1]
48 | runway.min_range = int(matches[0][2])
49 | runway.trend = matches[0][3]
50 | metar.add_runway_info(runway)
51 |
52 |
53 | def _parse_runway_max_range(matches, metar, runway):
54 | runway.name = matches[0][0]
55 | runway.min_range = int(matches[0][1])
56 | runway.max_range = int(matches[0][2])
57 | runway.trend = matches[0][3]
58 | metar.add_runway_info(runway)
59 |
60 |
61 | class RunwayCommand:
62 | generic_regex = r'^(R\d{2}\w?/)'
63 | runway_max_range_regex = r'^R(\d{2}\w?)/(\d{4})V(\d{3,4})([UDN])?(FT)?'
64 | runway_regex = r'^R(\d{2}\w?)/([MP])?(\d{4})([UDN])?(FT)?$'
65 | runway_deposit_regex = r'^R(\d{2}\w?)/([/\d])([/\d])(//|\d{2})(//|\d{2})$'
66 |
67 | def __init__(self):
68 | self._generic_pattern = re.compile(RunwayCommand.generic_regex)
69 | self._max_range_pattern = re.compile(RunwayCommand.runway_max_range_regex)
70 | self._runway_pattern = re.compile(RunwayCommand.runway_regex)
71 | self._runway_deposit_pattern = re.compile(RunwayCommand.runway_deposit_regex)
72 | self._deposit_thickness = {
73 | '//': 'DepositThickness.//',
74 | '00': 'DepositThickness.00',
75 | '92': 'DepositThickness.92',
76 | '93': 'DepositThickness.93',
77 | '94': 'DepositThickness.94',
78 | '96': 'DepositThickness.96',
79 | '97': 'DepositThickness.97',
80 | '98': 'DepositThickness.98',
81 | '99': 'DepositThickness.99'
82 | }
83 | self._deposit_braking_capacity = {
84 | '//': 'DepositBrakingCapacity.//',
85 | '91': 'DepositBrakingCapacity.91',
86 | '92': 'DepositBrakingCapacity.92',
87 | '93': 'DepositBrakingCapacity.93',
88 | '94': 'DepositBrakingCapacity.94',
89 | '95': 'DepositBrakingCapacity.95',
90 | '99': 'DepositBrakingCapacity.99'
91 | }
92 |
93 | def can_parse(self, input: str):
94 | return self._generic_pattern.match(input)
95 |
96 | def execute(self, metar: Metar, input: str):
97 | matches = self._runway_deposit_pattern.findall(input)
98 | runway = RunwayInfo()
99 | try:
100 | if matches:
101 | self.__parse_runway_deposit(matches, metar, runway)
102 | return
103 |
104 | matches = self._runway_pattern.findall(input)
105 | if matches:
106 | _parse_runway(matches, metar, runway)
107 | return
108 |
109 | matches = self._max_range_pattern.findall(input)
110 | if matches:
111 | _parse_runway_max_range(matches, metar, runway)
112 | except ValueError:
113 | raise ParseError(_("ErrorCode.IncompleteRunwayInformation"))
114 |
115 | def __parse_runway_deposit(self, matches, metar, runway):
116 | runway.name = matches[0][0]
117 | runway.deposit_type = DepositType(matches[0][1])
118 | runway.coverage = DepositCoverage(matches[0][2])
119 | runway.thickness = self.__parse_deposit_thickness(matches[0][3])
120 | runway.braking_capacity = self.__parse_deposit_braking_capacity(matches[0][4])
121 | metar.add_runway_info(runway)
122 |
123 | def __parse_deposit_thickness(self, input):
124 | thickness = self._deposit_thickness.get(input, 'DepositThickness.default')
125 | return _(thickness).format(input)
126 |
127 | def __parse_deposit_braking_capacity(self, input):
128 | braking_capacity = self._deposit_braking_capacity.get(input, 'DepositBrakingCapacity.default')
129 | return _(braking_capacity).format(float(input) / 100)
130 |
131 |
132 | class TemperatureCommand:
133 | regex = r'^(M?\d{2})/(M?\d{2})$'
134 |
135 | def __init__(self):
136 | self._pattern = re.compile(TemperatureCommand.regex)
137 |
138 | def can_parse(self, input: str):
139 | return self._pattern.match(input)
140 |
141 | def execute(self, metar: Metar, input: str):
142 | matches = self._pattern.search(input).groups()
143 | metar.temperature = converter.convert_temperature(matches[0])
144 | metar.dew_point = converter.convert_temperature(matches[1])
145 |
146 |
147 | class CommandSupplier:
148 | def __init__(self):
149 | self._commands = [RunwayCommand(), TemperatureCommand(), AltimeterCommand(), AltimeterMercuryCommand()]
150 |
151 | def get(self, input: str):
152 | for command in self._commands:
153 | if command.can_parse(input):
154 | return command
155 |
--------------------------------------------------------------------------------
/metar_taf_parser/command/taf.py:
--------------------------------------------------------------------------------
1 | import re
2 |
3 | from metar_taf_parser.model.enum import IcingIntensity, TurbulenceIntensity
4 | from metar_taf_parser.model.model import ITafGroups, Icing, Turbulence
5 |
6 |
7 | class IcingCommand:
8 | regex = r'^6(\d)(\d{3})(\d)$'
9 |
10 | def __init__(self):
11 | self._pattern = re.compile(IcingCommand.regex)
12 |
13 | def can_parse(self, input: str):
14 | return self._pattern.search(input)
15 |
16 | def execute(self, itaf: ITafGroups, input: str):
17 | """
18 |
19 | :param itaf: metar_taf_parser.model.model.ITafGroups
20 | :param input: string
21 | :return:
22 | """
23 | matches = self._pattern.search(input).groups()
24 | icing = Icing()
25 | icing.intensity = IcingIntensity(matches[0])
26 | icing.base_height = 100 * int(matches[1])
27 | icing.depth = 1000 * int(matches[2])
28 | itaf.add_icing(icing)
29 |
30 |
31 | class TurbulenceCommand:
32 | regex = r"^5(\d|'X')(\d{3})(\d)$"
33 |
34 | def __init__(self):
35 | self._pattern = re.compile(TurbulenceCommand.regex)
36 |
37 | def can_parse(self, input: str):
38 | return self._pattern.search(input)
39 |
40 | def execute(self, itaf: ITafGroups, input: str):
41 | """
42 |
43 | :param itaf: metar_taf_parser.model.model.ITafGroups
44 | :param input: string
45 | :return:
46 | """
47 | matches = self._pattern.search(input).groups()
48 | turbulence = Turbulence()
49 | turbulence.intensity = TurbulenceIntensity(matches[0])
50 | turbulence.base_height = 100 * int(matches[1])
51 | turbulence.depth = 1000 * int(matches[2])
52 | itaf.add_turbulence(turbulence)
53 |
54 |
55 | class TAFCommandSupplier:
56 | def __init__(self):
57 | self._commands = [IcingCommand(), TurbulenceCommand()]
58 |
59 | def get(self, input: str):
60 | for command in self._commands:
61 | if command.can_parse(input):
62 | return command
63 |
--------------------------------------------------------------------------------
/metar_taf_parser/commons/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/commons/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/commons/converter.py:
--------------------------------------------------------------------------------
1 | def degrees_to_cardinal(input):
2 | if input.isnumeric():
3 | degrees = int(input)
4 | dirs = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
5 | "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]
6 | ix = int((degrees + 11.25) / 22.5)
7 | return dirs[ix % 16]
8 | else:
9 | return 'VRB'
10 |
11 |
12 | def convert_visibility(input):
13 | if '9999' == input:
14 | return '> 10km'
15 | return str(int(input)) + 'm'
16 |
17 |
18 | def convert_temperature(input):
19 | if input.startswith('M'):
20 | return -int(input.split('M')[1])
21 | return int(input)
22 |
23 |
24 | def convert_inches_mercury_to_pascal(input):
25 | return 33.8639 * input
26 |
27 |
28 | def convert_temperature_remarks(sign: str, temperature: str):
29 | temp = float(temperature) / 10
30 | return temp if '0' == sign else -1 * temp
31 |
32 |
33 | def convert_precipitation_amount(amount: str):
34 | return float(amount) / 100
35 |
--------------------------------------------------------------------------------
/metar_taf_parser/commons/exception.py:
--------------------------------------------------------------------------------
1 | class TranslationError(Exception):
2 | """Exception raised when a translation is not available
3 | Attributes:
4 | translation -- the missing string in the translation file
5 | message -- explanation of the error
6 | """
7 | def __init__(self, translation: str, message: str):
8 | self.message = message
9 | self.translation = translation
10 |
11 |
12 | class ParseError(Exception):
13 | def __init__(self, message: str):
14 | self.__message = message
15 |
16 | def message(self):
17 | return self.__message
18 |
--------------------------------------------------------------------------------
/metar_taf_parser/commons/i18n.py:
--------------------------------------------------------------------------------
1 | import gettext
2 | import locale
3 | import os
4 |
5 | from metar_taf_parser.commons.exception import TranslationError
6 |
7 |
8 | localedir = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../locale')
9 | langAvailable = os.listdir(localedir)
10 | loc = locale.getlocale()
11 | lang = 'en'
12 | if loc is not None and loc[0] is not None and len(loc[0]) >= 2:
13 | lang = loc[0][:2]
14 | if lang not in langAvailable:
15 | lang = 'en'
16 | t = gettext.translation(domain='messages', localedir=localedir, fallback=True, languages=[lang])
17 |
18 |
19 | def _(message: str) -> str:
20 | translation = t.gettext(message)
21 | if message == translation:
22 | raise TranslationError(translation=message, message='Missing translation')
23 | return translation
24 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/de/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/de/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/de/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: de"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "stark bewölkt"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "leicht bewölkt"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "keine signifikanten Wolken"
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "bedeckt"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "aufgelockert"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "wolkenlos"
32 |
33 | #:
34 | msgid "CloudType.CC"
35 | msgstr "Cirrocumulus"
36 |
37 | #:
38 | msgid "CloudType.TCU"
39 | msgstr "turmartigen Cumulus"
40 |
41 | #:
42 | msgid "DepositBrakingCapacity.//"
43 | msgstr "nicht gemeldet"
44 |
45 | #:
46 | msgid "DepositBrakingCapacity.91"
47 | msgstr "schlecht"
48 |
49 | #:
50 | msgid "DepositBrakingCapacity.92"
51 | msgstr "schlecht/mäßig"
52 |
53 | #:
54 | msgid "DepositBrakingCapacity.93"
55 | msgstr "mäßig"
56 |
57 | #:
58 | msgid "DepositBrakingCapacity.94"
59 | msgstr "mäßig/gut"
60 |
61 | #:
62 | msgid "DepositBrakingCapacity.95"
63 | msgstr "gut"
64 |
65 | #:
66 | msgid "DepositBrakingCapacity.99"
67 | msgstr "Werte unzuverlässig"
68 |
69 | #:
70 | msgid "DepositCoverage.NOT_REPORTED"
71 | msgstr "nicht gemeldet"
72 |
73 | #:
74 | msgid "DepositCoverage.LESS_10"
75 | msgstr "weniger als 10%"
76 |
77 | #:
78 | msgid "DepositCoverage.FROM_11_TO_25"
79 | msgstr "von 11% bis 25%"
80 |
81 | #:
82 | msgid "DepositCoverage.FROM_26_TO_50"
83 | msgstr "von 26% bis 50%"
84 |
85 | #:
86 | msgid "DepositCoverage.FROM_51_TO_100"
87 | msgstr "von 51% bis 100%"
88 |
89 | #:
90 | msgid "DepositThickness.//"
91 | msgstr "nicht gemeldet"
92 |
93 | #:
94 | msgid "DepositThickness.00"
95 | msgstr "weniger als 1 mm"
96 |
97 | #:
98 | msgid "DepositThickness.98"
99 | msgstr "40 cm oder mehr"
100 |
101 | #:
102 | msgid "DepositThickness.99"
103 | msgstr "geschlossen"
104 |
105 | #:
106 | msgid "DepositType.NOT_REPORTED"
107 | msgstr "nicht gemeldet"
108 |
109 | #:
110 | msgid "DepositType.CLEAR_DRY"
111 | msgstr "frei von Ablagerungen und trocken"
112 |
113 | #:
114 | msgid "DepositType.DAMP"
115 | msgstr "feucht"
116 |
117 | #:
118 | msgid "DepositType.WET_WATER_PATCHES"
119 | msgstr "nass oder Wasserpfützen"
120 |
121 | #:
122 | msgid "DepositType.RIME_FROST_COVERED"
123 | msgstr "reif- oder frostbedeckt"
124 |
125 | #:
126 | msgid "DepositType.DRY_SNOW"
127 | msgstr "trockener Schnee"
128 |
129 | #:
130 | msgid "DepositType.WET_SNOW"
131 | msgstr "nasser Schnee"
132 |
133 | #:
134 | msgid "DepositType.ICE"
135 | msgstr "Eis"
136 |
137 | #:
138 | msgid "DepositType.COMPACTED_SNOW"
139 | msgstr "kompakter Schnee"
140 |
141 | #:
142 | msgid "DepositType.FROZEN_RIDGES"
143 | msgstr "festgefrorene Radspuren"
144 |
145 | #:
146 | msgid "Descriptive.BC"
147 | msgstr "Schwaden"
148 |
149 | #:
150 | msgid "Descriptive.BL"
151 | msgstr "treiben"
152 |
153 | #:
154 | msgid "Descriptive.DR"
155 | msgstr "fegen"
156 |
157 | #:
158 | msgid "Descriptive.FZ"
159 | msgstr "gefrierend"
160 |
161 | #:
162 | msgid "Descriptive.MI"
163 | msgstr "flach"
164 |
165 | #:
166 | msgid "Descriptive.PR"
167 | msgstr "teilweise"
168 |
169 | #:
170 | msgid "Descriptive.SH"
171 | msgstr "Schauer von"
172 |
173 | #:
174 | msgid "Descriptive.TS"
175 | msgstr "Gewitter"
176 |
177 | #:
178 | msgid "Error.prefix"
179 | msgstr "Ein Fehler ist aufgetretten. Error Code n°"
180 |
181 | #:
182 | msgid "ErrorCode.AirportNotFound"
183 | msgstr "Der Flughafen wurde in dieser Mitteilung nicht gefunden"
184 |
185 | #:
186 | msgid "ErrorCode.InvalidMessage"
187 | msgstr "Eingegebende Mitteilung nicht gültig"
188 |
189 | #:
190 | msgid "Indicator.M"
191 | msgstr "weniger als"
192 |
193 | #:
194 | msgid "Indicator.P"
195 | msgstr "mehr als"
196 |
197 | #:
198 | msgid "Intensity.-"
199 | msgstr "leicht"
200 |
201 | #:
202 | msgid "Intensity.+"
203 | msgstr "stark"
204 |
205 | #:
206 | msgid "Intensity.VC"
207 | msgstr "in Flugplatznähe"
208 |
209 | #:
210 | msgid "Phenomenon.BR"
211 | msgstr "feuchter Dunst"
212 |
213 | #:
214 | msgid "Phenomenon.DS"
215 | msgstr "Staubsturm"
216 |
217 | #:
218 | msgid "Phenomenon.DU"
219 | msgstr "weit verbreiteter Staub"
220 |
221 | #:
222 | msgid "Phenomenon.DZ"
223 | msgstr "Sprühregen"
224 |
225 | #:
226 | msgid "Phenomenon.FC"
227 | msgstr "Wolkenschlauch"
228 |
229 | #:
230 | msgid "Phenomenon.FG"
231 | msgstr "Nebel"
232 |
233 | #:
234 | msgid "Phenomenon.FU"
235 | msgstr "Rauch"
236 |
237 | #:
238 | msgid "Phenomenon.GR"
239 | msgstr "Hagel; Körner größer 5mm"
240 |
241 | #:
242 | msgid "Phenomenon.GS"
243 | msgstr "Graupel; Körner kleiner 5mm"
244 |
245 | #:
246 | msgid "Phenomenon.HZ"
247 | msgstr "trockener Dunst"
248 |
249 | #:
250 | msgid "Phenomenon.IC"
251 | msgstr "Eiskristalle"
252 |
253 | #:
254 | msgid "Phenomenon.PL"
255 | msgstr "Eiskörner"
256 |
257 | #:
258 | msgid "Phenomenon.PO"
259 | msgstr "Staub/Sandwirbel"
260 |
261 | #:
262 | msgid "Phenomenon.PY"
263 | msgstr "Sprühregen"
264 |
265 | #:
266 | msgid "Phenomenon.RA"
267 | msgstr "Regen"
268 |
269 | #:
270 | msgid "Phenomenon.SA"
271 | msgstr "Sand"
272 |
273 | #:
274 | msgid "Phenomenon.SG"
275 | msgstr "Schneegriesel"
276 |
277 | #:
278 | msgid "Phenomenon.SN"
279 | msgstr "Schnee"
280 |
281 | #:
282 | msgid "Phenomenon.SQ"
283 | msgstr "Böen"
284 |
285 | #:
286 | msgid "Phenomenon.SS"
287 | msgstr "Sandsturm"
288 |
289 | #:
290 | msgid "Phenomenon.UP"
291 | msgstr "unbekannte Erscheinung"
292 |
293 | #:
294 | msgid "Phenomenon.VA"
295 | msgstr "Vulkanasche"
296 |
297 | #:
298 | msgid "Phenomenon.TS"
299 | msgstr "Gewittersturm"
300 |
301 | #:
302 | msgid "Remark.AO1"
303 | msgstr "automatisierte Station ohne Niederschlagsunterscheidung"
304 |
305 | #:
306 | msgid "Remark.AO2"
307 | msgstr "automatisierte Station mit Niederschlagsunterscheidung"
308 |
309 | #:
310 | msgid "Remark.BASED"
311 | msgstr "stationiert"
312 |
313 | #:
314 | msgid "Remark.Ceiling.Height"
315 | msgstr "Wolkenhöhe zwischen {0} und {1} Fuss"
316 |
317 | #:
318 | msgid "Remark.Ceiling.Second.Location"
319 | msgstr "Wolkenuntergrenze {0} Fuss gemessen von zweitem Sensor bei {1}"
320 |
321 | #:
322 | msgid "Remark.FCST"
323 | msgstr "Vorhersage"
324 |
325 | #:
326 | msgid "Remark.FUNNELCLOUD"
327 | msgstr "Trichterwolke"
328 |
329 | #:
330 | msgid "Remark.Hail"
331 | msgstr "größte Hagelkörner mit einem Durchmesser von {0} Zoll"
332 |
333 | #:
334 | msgid "Remark.Hail.LesserThan"
335 | msgstr "größte Hagelkörner mit einem Durchmesser von weniger als [0} Zoll"
336 |
337 | #:
338 | msgid "Remark.HVY"
339 | msgstr "stark"
340 |
341 | #:
342 | msgid "Remark.LGT"
343 | msgstr "leicht"
344 |
345 | #:
346 | msgid "Remark.MOD"
347 | msgstr "mäßig"
348 |
349 | #:
350 | msgid "Remark.Obscuration"
351 | msgstr "{0} bei {1} Fuss bestehend aus {2}"
352 |
353 | #:
354 | msgid "Remark.ON"
355 | msgstr "auf"
356 |
357 | #:
358 | msgid "Remark.NXT"
359 | msgstr "nächster"
360 |
361 | #:
362 | msgid "Remark.PeakWind"
363 | msgstr "Windspitze von {1} Knoten aus {0} Grad um {2}:{3}"
364 |
365 | #:
366 | msgid "Remark.Precipitation.Beg.End"
367 | msgstr "{0} {1} begann um {2}:{3} endete um {4}:{5}"
368 |
369 | #:
370 | msgid "Remark.PRESFR"
371 | msgstr "schnell fallender Luftdruck"
372 |
373 | #:
374 | msgid "Remark.PRESRR"
375 | msgstr "schnell steigender Luftdruck"
376 |
377 | #:
378 | msgid "Remark.Second.Location.Visibility"
379 | msgstr "Sicht von {0} SM gemessen von zweitem Sensor bei {1}"
380 |
381 | #:
382 | msgid "Remark.Sea.Level.Pressure"
383 | msgstr "Luftdruck Meeresniveau bei {0} hPa"
384 |
385 | #:
386 | msgid "Remark.Sector.Visibility"
387 | msgstr "Sicht von {1} SM nach {0}"
388 |
389 | #:
390 | msgid "Remark.SLPNO"
391 | msgstr "Luftdruck Meeresniveau nicht verfügbar"
392 |
393 | #:
394 | msgid "Remark.Snow.Increasing.Rapidly"
395 | msgstr "Schneehöhe vergrößert um {0} Zoll in der letzten Stunde zu Schneehöhe von {1} Zoll"
396 |
397 | #:
398 | msgid "Remark.Snow.Pellets"
399 | msgstr "{0} Graupel"
400 |
401 | #:
402 | msgid "Remark.Surface.Visibility"
403 | msgstr "Sicht von {0} SM am Boden"
404 |
405 | #:
406 | msgid "Remark.Thunderstorm.Location"
407 | msgstr "Gewitter im {0} der Station"
408 |
409 | #:
410 | msgid "Remark.Thunderstorm.Location.Moving"
411 | msgstr "Gewitter im {0} der Station, zieht nach {1}"
412 |
413 | #:
414 | msgid "Remark.Tornadic.Activity.Beginning"
415 | msgstr "{0} begann um {1}:{2} {3} SM im {4} der Station"
416 |
417 | #:
418 | msgid "Remark.Tornadic.Activity.BegEnd"
419 | msgstr "{0} begann um {1}:{2} endete um {3}:{4} {5} SM im {6} der Station"
420 |
421 | #:
422 | msgid "Remark.Tornadic.Activity.Ending"
423 | msgstr "{0} endete um {1}:{2} {3} SM im {4} der Station"
424 |
425 | #:
426 | msgid "Remark.TORNADO"
427 | msgstr "Tornado"
428 |
429 | #:
430 | msgid "Remark.Tower.Visibility"
431 | msgstr "Sicht von {0} SM am Turm"
432 |
433 | #:
434 | msgid "Remark.Variable.Prevailing.Visibility"
435 | msgstr "vorherrschende Sicht veränderlich zwischen {0} und {1} SM"
436 |
437 | #:
438 | msgid "Remark.Variable.Sky.Condition"
439 | msgstr "Bewölkung veränderlich zwischen {0} und {1}"
440 |
441 | #:
442 | msgid "Remark.Variable.Sky.Condition.Height"
443 | msgstr "Wolkenschicht bei {0} Fuss veränderlich zwischen {1} und {2}"
444 |
445 | #:
446 | msgid "Remark.VIRGA"
447 | msgstr "Virga"
448 |
449 | #:
450 | msgid "Remark.Virga.Direction"
451 | msgstr "Virga im {0} der Station"
452 |
453 | #:
454 | msgid "Remark.WATERSPOUT"
455 | msgstr "Wasserhose"
456 |
457 | #:
458 | msgid "Remark.WindShift"
459 | msgstr "Windveränderung um {0}:{1}"
460 |
461 | #:
462 | msgid "Remark.WindShift.FROPA"
463 | msgstr "Windveränderung begleitet von Frontdurchzug um {0}:{1}"
464 |
465 | #:
466 | msgid "MetarFacade.InvalidIcao"
467 | msgstr "Icao Code ist nicht gültig"
468 |
469 | #:
470 | msgid "Converter.D"
471 | msgstr "abnehmend"
472 |
473 | #:
474 | msgid "Converter.E"
475 | msgstr "Ost"
476 |
477 | #:
478 | msgid "Converter.ENE"
479 | msgstr "Ostnordost"
480 |
481 | #:
482 | msgid "Converter.ESE"
483 | msgstr "Ostsüdost"
484 |
485 | #:
486 | msgid "Converter.N"
487 | msgstr "Nord"
488 |
489 | #:
490 | msgid "Converter.NE"
491 | msgstr "Nordost"
492 |
493 | #:
494 | msgid "Converter.NNE"
495 | msgstr "Nordnordost"
496 |
497 | #:
498 | msgid "Converter.NNW"
499 | msgstr "Nordnordwest"
500 |
501 | #:
502 | msgid "Converter.NSC"
503 | msgstr "keine wesentliche Änderung"
504 |
505 | #:
506 | msgid "Converter.NW"
507 | msgstr "Nordwest"
508 |
509 | #:
510 | msgid "Converter.S"
511 | msgstr "Süd"
512 |
513 | #:
514 | msgid "Converter.SE"
515 | msgstr "Südost"
516 |
517 | #:
518 | msgid "Converter.SSE"
519 | msgstr "Südsüdost"
520 |
521 | #:
522 | msgid "Converter.SSW"
523 | msgstr "Südsüdwest"
524 |
525 | #:
526 | msgid "Converter.SW"
527 | msgstr "Südwest"
528 |
529 | #:
530 | msgid "Converter.U"
531 | msgstr "zunehmend"
532 |
533 | #:
534 | msgid "Converter.VRB"
535 | msgstr "veränderlich"
536 |
537 | #:
538 | msgid "Converter.WNW"
539 | msgstr "Westnordwest"
540 |
541 | #:
542 | msgid "Converter.WSW"
543 | msgstr "Westsüdwest"
544 |
545 | #:
546 | msgid "WeatherChangeType.FM"
547 | msgstr "Von"
548 |
549 | #:
550 | msgid "WeatherChangeType.BECMG"
551 | msgstr "Übergehend"
552 |
553 | #:
554 | msgid "WeatherChangeType.TEMPO"
555 | msgstr "Temporär"
556 |
557 | #:
558 | msgid "WeatherChangeType.PROB"
559 | msgstr "Warscheinlichkeit"
560 |
561 | #:
562 | msgid "TimeIndicator.AT"
563 | msgstr "um"
564 |
565 | #:
566 | msgid "TimeIndicator.FM"
567 | msgstr "von"
568 |
569 | #:
570 | msgid "TimeIndicator.TL"
571 | msgstr "bis um"
572 |
573 | #:
574 | msgid "ToString.airport"
575 | msgstr "Flughafen"
576 |
577 | #:
578 | msgid "ToString.altimeter"
579 | msgstr "Höhenmesser"
580 |
581 | #:
582 | msgid "ToString.amendment"
583 | msgstr "Ergänzung"
584 |
585 | #:
586 | msgid "ToString.auto"
587 | msgstr "automatische Station"
588 |
589 | #:
590 | msgid "ToString.cavok"
591 | msgstr "Bewölkung und Sicht OK"
592 |
593 | #:
594 | msgid "ToString.clouds"
595 | msgstr "Wolken"
596 |
597 | #:
598 | msgid "ToString.day.month"
599 | msgstr "Tag"
600 |
601 | #:
602 | msgid "ToString.day.hour"
603 | msgstr "Stunde"
604 |
605 | #:
606 | msgid "ToString.deposit.braking"
607 | msgstr "Bremswirkung"
608 |
609 | #:
610 | msgid "ToString.deposit.coverage"
611 | msgstr "Bedeckung"
612 |
613 | #:
614 | msgid "ToString.deposit.thickness"
615 | msgstr "Stärke"
616 |
617 | #:
618 | msgid "ToString.deposit.type"
619 | msgstr "Typ der Ablagerung"
620 |
621 | #:
622 | msgid "ToString.descriptive"
623 | msgstr "Eigenschaft"
624 |
625 | #:
626 | msgid "ToString.dew.point"
627 | msgstr "Taupunkttemperatur"
628 |
629 | #:
630 | msgid "ToString.end.day.month"
631 | msgstr "Tag"
632 |
633 | #:
634 | msgid "ToString.end.hour.day"
635 | msgstr "Stunde"
636 |
637 | #:
638 | msgid "ToString.height.feet"
639 | msgstr "Höhe (Fuss)"
640 |
641 | #:
642 | msgid "ToString.height.meter"
643 | msgstr "Höhe (m)"
644 |
645 | #:
646 | msgid "ToString.intensity"
647 | msgstr "Intensität"
648 |
649 | #:
650 | msgid "ToString.indicator"
651 | msgstr "Indikator"
652 |
653 | #:
654 | msgid "ToString.message"
655 | msgstr "ursprüngliche Meldung"
656 |
657 | #:
658 | msgid "ToString.name"
659 | msgstr "Name"
660 |
661 | #:
662 | msgid "ToString.nosig"
663 | msgstr "keine wesentlichen Änderungen"
664 |
665 | #:
666 | msgid "ToString.phenomenons"
667 | msgstr "Erscheinungen"
668 |
669 | #:
670 | msgid "ToString.probability"
671 | msgstr "Wahrscheinlichkeit"
672 |
673 | #:
674 | msgid "ToString.quantity"
675 | msgstr "Menge"
676 |
677 | #:
678 | msgid "ToString.remark"
679 | msgstr "Bemerkungen"
680 |
681 | #:
682 | msgid "ToString.report.time"
683 | msgstr "Zeit der Meldung"
684 |
685 | #:
686 | msgid "ToString.runway.info"
687 | msgstr "Pisteninformationen"
688 |
689 | #:
690 | msgid "ToString.start.day.month"
691 | msgstr "Tag"
692 |
693 | #:
694 | msgid "ToString.start.hour.day"
695 | msgstr "Stunde"
696 |
697 | #:
698 | msgid "ToString.start.minute"
699 | msgstr "Minute"
700 |
701 | #:
702 | msgid "ToString.temperature"
703 | msgstr "Temperatur (°C)"
704 |
705 | #:
706 | msgid "ToString.temperature.max"
707 | msgstr "maximale Temperatur (°C)"
708 |
709 | #:
710 | msgid "ToString.temperature.min"
711 | msgstr "minimale Temperatur (°C)"
712 |
713 | #:
714 | msgid "ToString.trend"
715 | msgstr "Trend"
716 |
717 | #:
718 | msgid "ToString.trends"
719 | msgstr "Trends"
720 |
721 | #:
722 | msgid "ToString.type"
723 | msgstr "Typ"
724 |
725 | #:
726 | msgid "ToString.visibility.main"
727 | msgstr "Hauptsicht"
728 |
729 | #:
730 | msgid "ToString.visibility.min"
731 | msgstr "minimale Sicht"
732 |
733 | #:
734 | msgid "ToString.visibility.min.direction"
735 | msgstr "Richtung der minimalen Sicht"
736 |
737 | #:
738 | msgid "ToString.visibility.max"
739 | msgstr "maximale Sicht"
740 |
741 | #:
742 | msgid "ToString.vertical.visibility"
743 | msgstr "vertikale Sicht (ft)"
744 |
745 | #:
746 | msgid "ToString.weather.conditions"
747 | msgstr "Wetterbedingungen"
748 |
749 | #:
750 | msgid "ToString.wind.direction"
751 | msgstr "Richtung"
752 |
753 | #:
754 | msgid "ToString.wind.direction.degrees"
755 | msgstr "Richtung (Grad)"
756 |
757 | #:
758 | msgid "ToString.wind.gusts"
759 | msgstr "Böen"
760 |
761 | #:
762 | msgid "ToString.wind.min.variation"
763 | msgstr "minimale Windänderung"
764 |
765 | #:
766 | msgid "ToString.wind.max.variation"
767 | msgstr "maximale Windänderung"
768 |
769 | #:
770 | msgid "ToString.wind.speed"
771 | msgstr "Geschwindigkeit"
772 |
773 | #:
774 | msgid "ToString.wind.unit"
775 | msgstr "Einheit"
776 |
777 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/en/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/en/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/en/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: en"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "broken"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "few"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "no significant clouds."
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "overcast"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "scattered"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "sky clear"
32 |
33 | #:
34 | msgid "CloudType.AC"
35 | msgstr "Altocumulus"
36 |
37 | #:
38 | msgid "CloudType.AS"
39 | msgstr "Altostratus"
40 |
41 | #:
42 | msgid "CloudType.CB"
43 | msgstr "Cumulonimbus"
44 |
45 | #:
46 | msgid "CloudType.CC"
47 | msgstr "CirroCumulus"
48 |
49 | #:
50 | msgid "CloudType.CI"
51 | msgstr "Cirrus"
52 |
53 | #:
54 | msgid "CloudType.CS"
55 | msgstr "Cirrostratus"
56 |
57 | #:
58 | msgid "CloudType.CU"
59 | msgstr "Cumulus"
60 |
61 | #:
62 | msgid "CloudType.NS"
63 | msgstr "Nimbostratus"
64 |
65 | #:
66 | msgid "CloudType.SC"
67 | msgstr "Stratocumulus"
68 |
69 | #:
70 | msgid "CloudType.ST"
71 | msgstr "Stratus"
72 |
73 | #:
74 | msgid "CloudType.TCU"
75 | msgstr "Towering cumulus"
76 |
77 | #:
78 | msgid "DepositBrakingCapacity.//"
79 | msgstr "not reported"
80 |
81 | #:
82 | msgid "DepositBrakingCapacity.91"
83 | msgstr "poor"
84 |
85 | #:
86 | msgid "DepositBrakingCapacity.92"
87 | msgstr "poor/medium"
88 |
89 | #:
90 | msgid "DepositBrakingCapacity.93"
91 | msgstr "medium"
92 |
93 | #:
94 | msgid "DepositBrakingCapacity.94"
95 | msgstr "medium/good"
96 |
97 | #:
98 | msgid "DepositBrakingCapacity.95"
99 | msgstr "good"
100 |
101 | #:
102 | msgid "DepositBrakingCapacity.99"
103 | msgstr "figures unreliable"
104 |
105 | #:
106 | msgid "DepositBrakingCapacity.default"
107 | msgstr "friction coefficient of {0}"
108 |
109 | #:
110 | msgid "DepositCoverage.NOT_REPORTED"
111 | msgstr "not reported"
112 |
113 | #:
114 | msgid "DepositCoverage.LESS_10"
115 | msgstr "less than 10%"
116 |
117 | #:
118 | msgid "DepositCoverage.FROM_11_TO_25"
119 | msgstr "from 11% to 25%"
120 |
121 | #:
122 | msgid "DepositCoverage.FROM_26_TO_50"
123 | msgstr "from 26% to 50%"
124 |
125 | #:
126 | msgid "DepositCoverage.FROM_51_TO_100"
127 | msgstr "from 51% to 100%"
128 |
129 | #:
130 | msgid "DepositThickness.//"
131 | msgstr "not reported"
132 |
133 | #:
134 | msgid "DepositThickness.00"
135 | msgstr "less than 1 mm"
136 |
137 | #:
138 | msgid "DepositThickness.92"
139 | msgstr "10 cm"
140 |
141 | #:
142 | msgid "DepositThickness.93"
143 | msgstr "15 cm"
144 |
145 | #:
146 | msgid "DepositThickness.94"
147 | msgstr "20 cm"
148 |
149 | #:
150 | msgid "DepositThickness.95"
151 | msgstr "25 cm"
152 |
153 | #:
154 | msgid "DepositThickness.96"
155 | msgstr "30 cm"
156 |
157 | #:
158 | msgid "DepositThickness.97"
159 | msgstr "35 cm"
160 |
161 | #:
162 | msgid "DepositThickness.98"
163 | msgstr "40 cm or more"
164 |
165 | #:
166 | msgid "DepositThickness.99"
167 | msgstr "closed"
168 |
169 | #:
170 | msgid "DepositThickness.default"
171 | msgstr "{0} mm"
172 |
173 | #:
174 | msgid "DepositType.NOT_REPORTED"
175 | msgstr "not reported"
176 |
177 | #:
178 | msgid "DepositType.CLEAR_DRY"
179 | msgstr "clear and dry"
180 |
181 | #:
182 | msgid "DepositType.DAMP"
183 | msgstr "damp"
184 |
185 | #:
186 | msgid "DepositType.WET_WATER_PATCHES"
187 | msgstr "wet or water patches"
188 |
189 | #:
190 | msgid "DepositType.RIME_FROST_COVERED"
191 | msgstr "rime or frost covered"
192 |
193 | #:
194 | msgid "DepositType.DRY_SNOW"
195 | msgstr "dry snow"
196 |
197 | #:
198 | msgid "DepositType.WET_SNOW"
199 | msgstr "wet snow"
200 |
201 | #:
202 | msgid "DepositType.ICE"
203 | msgstr "ice"
204 |
205 | #:
206 | msgid "DepositType.COMPACTED_SNOW"
207 | msgstr "compacted or rolled snow"
208 |
209 | #:
210 | msgid "DepositType.FROZEN_RIDGES"
211 | msgstr "frozen ruts or ridges"
212 |
213 | #:
214 | msgid "DepositType.SLUSH"
215 | msgstr "slush"
216 |
217 | #:
218 | msgid "Descriptive.BC"
219 | msgstr "patches"
220 |
221 | #:
222 | msgid "Descriptive.BL"
223 | msgstr "blowing"
224 |
225 | #:
226 | msgid "Descriptive.DR"
227 | msgstr "low drifting"
228 |
229 | #:
230 | msgid "Descriptive.FZ"
231 | msgstr "freezing"
232 |
233 | #:
234 | msgid "Descriptive.MI"
235 | msgstr "shallow"
236 |
237 | #:
238 | msgid "Descriptive.PR"
239 | msgstr "partial"
240 |
241 | #:
242 | msgid "Descriptive.SH"
243 | msgstr "showers of"
244 |
245 | #:
246 | msgid "Descriptive.TS"
247 | msgstr "thunderstorm"
248 |
249 | #:
250 | msgid "Error.prefix"
251 | msgstr "An error occured. Error code n°"
252 |
253 | #:
254 | msgid "ErrorCode.AirportNotFound"
255 | msgstr "The airport was not found for this message."
256 |
257 | #:
258 | msgid "ErrorCode.InvalidMessage"
259 | msgstr "The entered message is invalid."
260 |
261 | #:
262 | msgid "ErrorCode.IncompleteRunwayInformation"
263 | msgstr "The runway information is incomplete and cannot be parsed."
264 |
265 | #:
266 | msgid "Flag.AMD"
267 | msgstr "amended TAF"
268 |
269 | #:
270 | msgid "Flag.AUTO"
271 | msgstr "automated METAR"
272 |
273 | #:
274 | msgid "Flag.CNL"
275 | msgstr "canceled TAF"
276 |
277 | #:
278 | msgid "Flag.COR"
279 | msgstr "corrected METAR/TAF"
280 |
281 | #:
282 | msgid "Flag.NIL"
283 | msgstr "no data"
284 |
285 | #:
286 | msgid "IcingIntensity.0"
287 | msgstr "Trace Icing or None"
288 |
289 | #:
290 | msgid "IcingIntensity.1"
291 | msgstr "Light Mixed Icing"
292 |
293 | #:
294 | msgid "IcingIntensity.2"
295 | msgstr "Light Rime Icing In Cloud"
296 |
297 | #:
298 | msgid "IcingIntensity.3"
299 | msgstr "Light Clear Icing In Precipitation"
300 |
301 | #:
302 | msgid "IcingIntensity.4"
303 | msgstr "Moderate Mixed Icing"
304 |
305 | #:
306 | msgid "IcingIntensity.5"
307 | msgstr "Moderate Rime Icing In Cloud"
308 |
309 | #:
310 | msgid "IcingIntensity.6"
311 | msgstr "Moderate Clear Icing In Precipitation"
312 |
313 | #:
314 | msgid "IcingIntensity.7"
315 | msgstr "Severe Mixed Icing"
316 |
317 | #:
318 | msgid "IcingIntensity.8"
319 | msgstr "Severe Rime Icing In Cloud"
320 |
321 | #:
322 | msgid "IcingIntensity.9"
323 | msgstr "Severe Clear Icing In Precipitation"
324 |
325 | #:
326 | msgid "Indicator.M"
327 | msgstr "less than"
328 |
329 | #:
330 | msgid "Indicator.P"
331 | msgstr "greater than"
332 |
333 | #:
334 | msgid "Intensity.-"
335 | msgstr "Light"
336 |
337 | #:
338 | msgid "Intensity.+"
339 | msgstr "Heavy"
340 |
341 | #:
342 | msgid "Intensity.RE"
343 | msgstr "Recent"
344 |
345 | #:
346 | msgid "Intensity.VC"
347 | msgstr "In the vicinity"
348 |
349 | #:
350 | msgid "Phenomenon.BR"
351 | msgstr "mist"
352 |
353 | #:
354 | msgid "Phenomenon.DS"
355 | msgstr "duststorm"
356 |
357 | #:
358 | msgid "Phenomenon.DU"
359 | msgstr "widespread dust"
360 |
361 | #:
362 | msgid "Phenomenon.DZ"
363 | msgstr "drizzle"
364 |
365 | #:
366 | msgid "Phenomenon.FC"
367 | msgstr "funnel cloud"
368 |
369 | #:
370 | msgid "Phenomenon.FG"
371 | msgstr "fog"
372 |
373 | #:
374 | msgid "Phenomenon.FU"
375 | msgstr "smoke"
376 |
377 | #:
378 | msgid "Phenomenon.GR"
379 | msgstr "hail"
380 |
381 | #:
382 | msgid "Phenomenon.GS"
383 | msgstr "small hail and/or snow pellets"
384 |
385 | #:
386 | msgid "Phenomenon.HZ"
387 | msgstr "haze"
388 |
389 | #:
390 | msgid "Phenomenon.IC"
391 | msgstr "ice crystals"
392 |
393 | #:
394 | msgid "Phenomenon.PL"
395 | msgstr "ice pellets"
396 |
397 | #:
398 | msgid "Phenomenon.PO"
399 | msgstr "dust or sand whirls"
400 |
401 | #:
402 | msgid "Phenomenon.PY"
403 | msgstr "spray"
404 |
405 | #:
406 | msgid "Phenomenon.RA"
407 | msgstr "rain"
408 |
409 | #:
410 | msgid "Phenomenon.SA"
411 | msgstr "sand"
412 |
413 | #:
414 | msgid "Phenomenon.SG"
415 | msgstr "snow grains"
416 |
417 | #:
418 | msgid "Phenomenon.SN"
419 | msgstr "snow"
420 |
421 | #:
422 | msgid "Phenomenon.SQ"
423 | msgstr "squall"
424 |
425 | #:
426 | msgid "Phenomenon.SS"
427 | msgstr "sandstorm"
428 |
429 | #:
430 | msgid "Phenomenon.UP"
431 | msgstr "unknown precipitation"
432 |
433 | #:
434 | msgid "Phenomenon.VA"
435 | msgstr "volcanic ash"
436 |
437 | #:
438 | msgid "Phenomenon.TS"
439 | msgstr "thunderstorm"
440 |
441 | #:
442 | msgid "Remark.AO1"
443 | msgstr "automated stations without a precipitation discriminator"
444 |
445 | #:
446 | msgid "Remark.AO2"
447 | msgstr "automated station with a precipitation discriminator"
448 |
449 | #:
450 | msgid "Remark.ALQDS"
451 | msgstr "all quadrants"
452 |
453 | #:
454 | msgid "Remark.Barometer.0"
455 | msgstr "Increase, then decrease"
456 |
457 | #:
458 | msgid "Remark.Barometer.1"
459 | msgstr "Increase, then steady, or increase then Increase more slowly"
460 |
461 | #:
462 | msgid "Remark.Barometer.2"
463 | msgstr "steady or unsteady increase"
464 |
465 | #:
466 | msgid "Remark.Barometer.3"
467 | msgstr "Decrease or steady, then increase; or increase then increase more rapidly"
468 |
469 | #:
470 | msgid "Remark.Barometer.4"
471 | msgstr "Steady"
472 |
473 | #:
474 | msgid "Remark.Barometer.5"
475 | msgstr "Decrease, then increase"
476 |
477 | #:
478 | msgid "Remark.Barometer.6"
479 | msgstr "Decrease then steady; or decrease then decrease more slowly"
480 |
481 | #:
482 | msgid "Remark.Barometer.7"
483 | msgstr "Steady or unsteady decrease"
484 |
485 | #:
486 | msgid "Remark.Barometer.8"
487 | msgstr "Steady or increase, then decrease; or decrease then decrease more rapidly"
488 |
489 | #:
490 | msgid "Remark.BASED"
491 | msgstr "based"
492 |
493 | #:
494 | msgid "Remark.Ceiling.Height"
495 | msgstr "ceiling varying between {0} and {1} feet"
496 |
497 | #:
498 | msgid "Remark.Ceiling.Second.Location"
499 | msgstr "ceiling of {0} feet mesured by a second sensor located at {1}"
500 |
501 | #:
502 | msgid "Remark.DSNT"
503 | msgstr "distant"
504 |
505 | #:
506 | msgid "Remark.FCST"
507 | msgstr "forecast"
508 |
509 | #:
510 | msgid "Remark.FUNNELCLOUD"
511 | msgstr "funnel cloud"
512 |
513 | #:
514 | msgid "Remark.Hail"
515 | msgstr "largest hailstones with a diameter of {0} inches"
516 |
517 | #:
518 | msgid "Remark.Hail.LesserThan"
519 | msgstr "largest hailstones with a diameter less than {0} inches"
520 |
521 | #:
522 | msgid "Remark.Hourly.Maximum.Temperature"
523 | msgstr "6-hourly maximum temperature of {0}°C"
524 |
525 | #:
526 | msgid "Remark.Hourly.Maximum.Minimum.Temperature"
527 | msgstr "24-hour maximum temperature of {0}°C and 24-hour minimum temperature of {1}°C"
528 |
529 | #:
530 | msgid "Remark.Hourly.Minimum.Temperature"
531 | msgstr "6-hourly minimum temperature of {0}°C"
532 |
533 | #:
534 | msgid "Remark.Hourly.Temperature"
535 | msgstr "hourly temperature of {0}°C"
536 |
537 | #:
538 | msgid "Remark.Hourly.Temperature.Dew.Point"
539 | msgstr "hourly temperature of {0}°C and dew point of {1}°C"
540 |
541 | #:
542 | msgid "Remark.Ice.Accretion.Amount"
543 | msgstr "{0}/100 of an inch of ice accretion in the past {1} hour(s)"
544 |
545 | #:
546 | msgid "Remark.HVY"
547 | msgstr "heavy"
548 |
549 | #:
550 | msgid "Remark.LGT"
551 | msgstr "light"
552 |
553 | #:
554 | msgid "Remark.LTG"
555 | msgstr "lightning"
556 |
557 | #:
558 | msgid "Remark.MOD"
559 | msgstr "moderate"
560 |
561 | #:
562 | msgid "Remark.Obscuration"
563 | msgstr "{0} layer at {1} feet composed of {2}"
564 |
565 | #:
566 | msgid "Remark.ON"
567 | msgstr "on"
568 |
569 | #:
570 | msgid "Remark.NXT"
571 | msgstr "next"
572 |
573 | #:
574 | msgid "Remark.PeakWind"
575 | msgstr "peak wind of {1} knots from {0} degrees at {2}:{3}"
576 |
577 | #:
578 | msgid "Remark.Precipitation.Amount.Hourly"
579 | msgstr "{0}/100 of an inch of precipitation fell in the last hour"
580 |
581 | #:
582 | msgid "Remark.Precipitation.Amount.3.6"
583 | msgstr "{1} inches of precipitation fell in the last {0} hours"
584 |
585 | #:
586 | msgid "Remark.Precipitation.Amount.24"
587 | msgstr "{0} inches of precipitation fell in the last 24 hours"
588 |
589 | #:
590 | msgid "Remark.Precipitation.Beg"
591 | msgstr "{0} {1} beginning at {2}:{3}"
592 |
593 | #:
594 | msgid "Remark.Precipitation.Beg.End"
595 | msgstr "{0} {1} beginning at {2}:{3} ending at {4}:{5}"
596 |
597 | #:
598 | msgid "Remark.Precipitation.End"
599 | msgstr "{0} {1} ending at {2}:{3}"
600 |
601 | #:
602 | msgid "Remark.Pressure.Tendency"
603 | msgstr "of {0} hectopascals in the past 3 hours"
604 |
605 | #:
606 | msgid "Remark.PRESFR"
607 | msgstr "pressure falling rapidly"
608 |
609 | #:
610 | msgid "Remark.PRESRR"
611 | msgstr "pressure rising rapidly"
612 |
613 | #:
614 | msgid "Remark.Second.Location.Visibility"
615 | msgstr "visibility of {0} SM mesured by a second sensor located at {1}"
616 |
617 | #:
618 | msgid "Remark.Sea.Level.Pressure"
619 | msgstr "sea level pressure of {0} HPa"
620 |
621 | #:
622 | msgid "Remark.Sector.Visibility"
623 | msgstr "visibility of {1} SM in the {0} direction"
624 |
625 | #:
626 | msgid "Remark.SLPNO"
627 | msgstr "sea level pressure not available"
628 |
629 | #:
630 | msgid "Remark.Snow.Depth"
631 | msgstr "snow depth of {0} inches"
632 |
633 | #:
634 | msgid "Remark.Snow.Increasing.Rapidly"
635 | msgstr "snow depth increase of {0} inches in the past hour with a total depth on the ground of {1} inches"
636 |
637 | #:
638 | msgid "Remark.Snow.Pellets"
639 | msgstr "{0} snow pellets"
640 |
641 | #:
642 | msgid "Remark.Sunshine.Duration"
643 | msgstr "{0} minutes of sunshine"
644 |
645 | #:
646 | msgid "Remark.Surface.Visibility"
647 | msgstr "surface visibility of {0} statute miles"
648 |
649 | #:
650 | msgid "Remark.Thunderstorm.Location"
651 | msgstr "thunderstorm {0} of the station"
652 |
653 | #:
654 | msgid "Remark.Thunderstorm.Location.Moving"
655 | msgstr "thunderstorm {0} of the station moving towards {1}"
656 |
657 | #:
658 | msgid "Remark.Tornadic.Activity.Beginning"
659 | msgstr "{0} beginning at {1}:{2} {3} SM {4} of the station"
660 |
661 | #:
662 | msgid "Remark.Tornadic.Activity.BegEnd"
663 | msgstr "{0} beginning at {1}:{2} ending at {3}:{4} {5} SM {6} of the station"
664 |
665 | #:
666 | msgid "Remark.Tornadic.Activity.Ending"
667 | msgstr "{0} ending at {1}:{2} {3} SM {4} of the station"
668 |
669 | #:
670 | msgid "Remark.TORNADO"
671 | msgstr "tornado"
672 |
673 | #:
674 | msgid "Remark.Tower.Visibility"
675 | msgstr "control tower visibility of {0} statute miles"
676 |
677 | #:
678 | msgid "Remark.Variable.Prevailing.Visibility"
679 | msgstr "variable prevailing visibility between {0} and {1} SM"
680 |
681 | #:
682 | msgid "Remark.Variable.Sky.Condition"
683 | msgstr "cloud layer varying between {0} and {1}"
684 |
685 | #:
686 | msgid "Remark.Variable.Sky.Condition.Height"
687 | msgstr "cloud layer at {0} feet varying between {1} and {2}"
688 |
689 | #:
690 | msgid "Remark.VIRGA"
691 | msgstr "virga"
692 |
693 | #:
694 | msgid "Remark.Virga.Direction"
695 | msgstr "virga {0} from the station"
696 |
697 | #:
698 | msgid "Remark.WATERSPOUT"
699 | msgstr "waterspout"
700 |
701 | #:
702 | msgid "Remark.Water.Equivalent.Snow.Ground"
703 | msgstr "water equivalent of {0} inches of snow"
704 |
705 | #:
706 | msgid "Remark.WindShift"
707 | msgstr "wind shift at {0}:{1}"
708 |
709 | #:
710 | msgid "Remark.WindShift.FROPA"
711 | msgstr "wind shift accompanied by frontal passage at {0}:{1}"
712 |
713 | #:
714 | msgid "MetarFacade.InvalidIcao"
715 | msgstr "Icao code is invalid."
716 |
717 | #:
718 | msgid "Converter.D"
719 | msgstr "decreasing"
720 |
721 | #:
722 | msgid "Converter.E"
723 | msgstr "East"
724 |
725 | #:
726 | msgid "Converter.ENE"
727 | msgstr "East North East"
728 |
729 | #:
730 | msgid "Converter.ESE"
731 | msgstr "East South East"
732 |
733 | #:
734 | msgid "Converter.N"
735 | msgstr "North"
736 |
737 | #:
738 | msgid "Converter.NE"
739 | msgstr "North East"
740 |
741 | #:
742 | msgid "Converter.NNE"
743 | msgstr "North North East"
744 |
745 | #:
746 | msgid "Converter.NNW"
747 | msgstr "North North West"
748 |
749 | #:
750 | msgid "Converter.NSC"
751 | msgstr "no significant change"
752 |
753 | #:
754 | msgid "Converter.NW"
755 | msgstr "North West"
756 |
757 | #:
758 | msgid "Converter.S"
759 | msgstr "South"
760 |
761 | #:
762 | msgid "Converter.SE"
763 | msgstr "South East"
764 |
765 | #:
766 | msgid "Converter.SSE"
767 | msgstr "South South East"
768 |
769 | #:
770 | msgid "Converter.SSW"
771 | msgstr "South South West"
772 |
773 | #:
774 | msgid "Converter.SW"
775 | msgstr "South West"
776 |
777 | #:
778 | msgid "Converter.U"
779 | msgstr "up rising"
780 |
781 | #:
782 | msgid "Converter.VRB"
783 | msgstr "Variable"
784 |
785 | #:
786 | msgid "Converter.W"
787 | msgstr "West"
788 |
789 | #:
790 | msgid "Converter.WNW"
791 | msgstr "West North West"
792 |
793 | #:
794 | msgid "Converter.WSW"
795 | msgstr "West South West"
796 |
797 | #:
798 | msgid "WeatherChangeType.FM"
799 | msgstr "From"
800 |
801 | #:
802 | msgid "WeatherChangeType.BECMG"
803 | msgstr "Becoming"
804 |
805 | #:
806 | msgid "WeatherChangeType.INTER"
807 | msgstr "Intermittent"
808 |
809 | #:
810 | msgid "WeatherChangeType.TEMPO"
811 | msgstr "Temporary"
812 |
813 | #:
814 | msgid "WeatherChangeType.PROB"
815 | msgstr "Probability"
816 |
817 | #:
818 | msgid "TimeIndicator.AT"
819 | msgstr "at"
820 |
821 | #:
822 | msgid "TimeIndicator.FM"
823 | msgstr "From"
824 |
825 | #:
826 | msgid "TimeIndicator.TL"
827 | msgstr "until"
828 |
829 | #:
830 | msgid "ToString.airport"
831 | msgstr "airport"
832 |
833 | #:
834 | msgid "ToString.altimeter"
835 | msgstr "altimeter (hPa)"
836 |
837 | #:
838 | msgid "ToString.amendment"
839 | msgstr "amendment"
840 |
841 | #:
842 | msgid "ToString.auto"
843 | msgstr "auto"
844 |
845 | #:
846 | msgid "ToString.baseHeight"
847 | msgstr "base layer in feet"
848 |
849 | #:
850 | msgid "ToString.cavok"
851 | msgstr "cavok"
852 |
853 | #:
854 | msgid "ToString.clouds"
855 | msgstr "clouds"
856 |
857 | #:
858 | msgid "ToString.day.month"
859 | msgstr "day of the month"
860 |
861 | #:
862 | msgid "ToString.day.hour"
863 | msgstr "hour of the day"
864 |
865 | #:
866 | msgid "ToString.deposit.braking"
867 | msgstr "braking capacity"
868 |
869 | #:
870 | msgid "ToString.deposit.coverage"
871 | msgstr "coverage"
872 |
873 | #:
874 | msgid "ToString.deposit.thickness"
875 | msgstr "thickness"
876 |
877 | #:
878 | msgid "ToString.deposit.type"
879 | msgstr "type of deposit"
880 |
881 | #:
882 | msgid "ToString.depth"
883 | msgstr "layer depth in feet"
884 |
885 | #:
886 | msgid "ToString.descriptive"
887 | msgstr "descriptive"
888 |
889 | #:
890 | msgid "ToString.dew.point"
891 | msgstr "dew point"
892 |
893 | #:
894 | msgid "ToString.end.day.month"
895 | msgstr "end day of the month"
896 |
897 | #:
898 | msgid "ToString.end.hour.day"
899 | msgstr "end hour of the day"
900 |
901 | #:
902 | msgid "ToString.flags"
903 | msgstr "flags"
904 |
905 | #:
906 | msgid "ToString.height.feet"
907 | msgstr "height (ft)"
908 |
909 | #:
910 | msgid "ToString.height.meter"
911 | msgstr "height (m)"
912 |
913 | #:
914 | msgid "ToString.intensity"
915 | msgstr "intensity"
916 |
917 | #:
918 | msgid "ToString.indicator"
919 | msgstr "indicator"
920 |
921 | #:
922 | msgid "ToString.message"
923 | msgstr "original message"
924 |
925 | #:
926 | msgid "ToString.name"
927 | msgstr "name"
928 |
929 | #:
930 | msgid "ToString.nosig"
931 | msgstr "nosig"
932 |
933 | #:
934 | msgid "ToString.phenomenons"
935 | msgstr "phenomenons"
936 |
937 | #:
938 | msgid "ToString.probability"
939 | msgstr "probability"
940 |
941 | #:
942 | msgid "ToString.quantity"
943 | msgstr "quantity"
944 |
945 | #:
946 | msgid "ToString.remark"
947 | msgstr "remarks"
948 |
949 | #:
950 | msgid "ToString.report.time"
951 | msgstr "time of report"
952 |
953 | #:
954 | msgid "ToString.runway.info"
955 | msgstr "runways information"
956 |
957 | #:
958 | msgid "ToString.start.day.month"
959 | msgstr "starting day of the month"
960 |
961 | #:
962 | msgid "ToString.start.hour.day"
963 | msgstr "starting hour of the day"
964 |
965 | #:
966 | msgid "ToString.start.minute"
967 | msgstr "starting minute"
968 |
969 | #:
970 | msgid "ToString.temperature"
971 | msgstr "temperature (°C)"
972 |
973 | #:
974 | msgid "ToString.temperature.max"
975 | msgstr "maximum temperature (°C)"
976 |
977 | #:
978 | msgid "ToString.temperature.min"
979 | msgstr "minimum temperature (°C)"
980 |
981 | #:
982 | msgid "ToString.trend"
983 | msgstr "trend"
984 |
985 | #:
986 | msgid "ToString.trends"
987 | msgstr "trends"
988 |
989 | #:
990 | msgid "ToString.type"
991 | msgstr "type"
992 |
993 | #:
994 | msgid "ToString.visibility.main"
995 | msgstr "main visibility"
996 |
997 | #:
998 | msgid "ToString.visibility.min"
999 | msgstr "minimum visibility"
1000 |
1001 | #:
1002 | msgid "ToString.visibility.min.direction"
1003 | msgstr "minimum visibility direction"
1004 |
1005 | #:
1006 | msgid "ToString.visibility.max"
1007 | msgstr "maximum visibility"
1008 |
1009 | #:
1010 | msgid "ToString.vertical.visibility"
1011 | msgstr "vertical visibility (ft)"
1012 |
1013 | #:
1014 | msgid "ToString.weather.conditions"
1015 | msgstr "weather conditions"
1016 |
1017 | #:
1018 | msgid "ToString.wind.direction"
1019 | msgstr "direction"
1020 |
1021 | #:
1022 | msgid "ToString.wind.direction.degrees"
1023 | msgstr "direction (degrees)"
1024 |
1025 | #:
1026 | msgid "ToString.wind.gusts"
1027 | msgstr "gusts"
1028 |
1029 | #:
1030 | msgid "ToString.wind.min.variation"
1031 | msgstr "minimal wind variation"
1032 |
1033 | #:
1034 | msgid "ToString.wind.max.variation"
1035 | msgstr "maximal wind variation"
1036 |
1037 | #:
1038 | msgid "ToString.wind.speed"
1039 | msgstr "speed"
1040 |
1041 | #:
1042 | msgid "ToString.wind.unit"
1043 | msgstr "unit"
1044 |
1045 | #:
1046 | msgid "TurbulenceIntensity.0"
1047 | msgstr "None"
1048 |
1049 | #:
1050 | msgid "TurbulenceIntensity.1"
1051 | msgstr "Light turbulence"
1052 |
1053 | #:
1054 | msgid "TurbulenceIntensity.2"
1055 | msgstr "Moderate turbulence in clear air, occasional"
1056 |
1057 | #:
1058 | msgid "TurbulenceIntensity.3"
1059 | msgstr "Moderate turbulence in clear air, frequent"
1060 |
1061 | #:
1062 | msgid "TurbulenceIntensity.4"
1063 | msgstr "Moderate turbulence in cloud, occasional"
1064 |
1065 | #:
1066 | msgid "TurbulenceIntensity.5"
1067 | msgstr "Moderate turbulence in cloud, frequent"
1068 |
1069 | #:
1070 | msgid "TurbulenceIntensity.6"
1071 | msgstr "Severe turbulence in clear air, occasional"
1072 |
1073 | #:
1074 | msgid "TurbulenceIntensity.7"
1075 | msgstr "Severe turbulence in clear air, frequent"
1076 |
1077 | #:
1078 | msgid "TurbulenceIntensity.8"
1079 | msgstr "Severe turbulence in cloud, occasional"
1080 |
1081 | #:
1082 | msgid "TurbulenceIntensity.9"
1083 | msgstr "Severe turbulence in cloud, frequent"
1084 |
1085 | #:
1086 | msgid "TurbulenceIntensity.X"
1087 | msgstr "Extreme turbulence"
1088 |
1089 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/es/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/es/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/es/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: es"
9 | #:
10 | msgid "CloudQuantity.NSC"
11 | msgstr "sin nubes significativas."
12 |
13 | #:
14 | msgid "CloudQuantity.OVC"
15 | msgstr "cubierto"
16 |
17 | #:
18 | msgid "CloudQuantity.SKC"
19 | msgstr "cielo despejado"
20 |
21 | #:
22 | msgid "CloudType.AC"
23 | msgstr "Altocumulus"
24 |
25 | #:
26 | msgid "CloudType.AS"
27 | msgstr "Altostratus"
28 |
29 | #:
30 | msgid "CloudType.CB"
31 | msgstr "Cumulonimbus"
32 |
33 | #:
34 | msgid "CloudType.CC"
35 | msgstr "Cirrocumulus"
36 |
37 | #:
38 | msgid "CloudType.CI"
39 | msgstr "Cirrus"
40 |
41 | #:
42 | msgid "CloudType.CS"
43 | msgstr "Cirrostratus"
44 |
45 | #:
46 | msgid "CloudType.CU"
47 | msgstr "Cumulus"
48 |
49 | #:
50 | msgid "CloudType.NS"
51 | msgstr "Nimbostratus"
52 |
53 | #:
54 | msgid "CloudType.SC"
55 | msgstr "Stratocumulus"
56 |
57 | #:
58 | msgid "CloudType.ST"
59 | msgstr "Stratus"
60 |
61 | #:
62 | msgid "CloudType.TCU"
63 | msgstr "Torrecumulus"
64 |
65 | #:
66 | msgid "DepositBrakingCapacity.//"
67 | msgstr "no reportado"
68 |
69 | #:
70 | msgid "DepositCoverage.NOT_REPORTED"
71 | msgstr "no reportado"
72 |
73 | #:
74 | msgid "DepositCoverage.LESS_10"
75 | msgstr "menos de 10%"
76 |
77 | #:
78 | msgid "DepositCoverage.FROM_11_TO_25"
79 | msgstr "de 11% a 25%"
80 |
81 | #:
82 | msgid "DepositCoverage.FROM_26_TO_50"
83 | msgstr "de 26% a 50%"
84 |
85 | #:
86 | msgid "DepositCoverage.FROM_51_TO_100"
87 | msgstr "de 51% a 100%"
88 |
89 | #:
90 | msgid "DepositThickness.//"
91 | msgstr "no reportado"
92 |
93 | #:
94 | msgid "DepositThickness.00"
95 | msgstr "menos de 1 mm"
96 |
97 | #:
98 | msgid "DepositThickness.92"
99 | msgstr "10 cm"
100 |
101 | #:
102 | msgid "DepositThickness.93"
103 | msgstr "15 cm"
104 |
105 | #:
106 | msgid "DepositThickness.94"
107 | msgstr "20 cm"
108 |
109 | #:
110 | msgid "DepositThickness.95"
111 | msgstr "25 cm"
112 |
113 | #:
114 | msgid "DepositThickness.96"
115 | msgstr "30 cm"
116 |
117 | #:
118 | msgid "DepositThickness.97"
119 | msgstr "35 cm"
120 |
121 | #:
122 | msgid "DepositThickness.98"
123 | msgstr "40 cm o más"
124 |
125 | #:
126 | msgid "DepositThickness.99"
127 | msgstr "cerrado"
128 |
129 | #:
130 | msgid "DepositThickness.default"
131 | msgstr "{0} mm"
132 |
133 | #:
134 | msgid "DepositType.NOT_REPORTED"
135 | msgstr "no reportado"
136 |
137 | #:
138 | msgid "DepositType.CLEAR_DRY"
139 | msgstr "claro y seco"
140 |
141 | #:
142 | msgid "DepositType.DAMP"
143 | msgstr "húmedo"
144 |
145 | #:
146 | msgid "DepositType.WET_WATER_PATCHES"
147 | msgstr "húmedo o con charcos"
148 |
149 | #:
150 | msgid "DepositType.RIME_FROST_COVERED"
151 | msgstr "escarcha o cubierto de hielo"
152 |
153 | #:
154 | msgid "DepositType.DRY_SNOW"
155 | msgstr "nieve seca"
156 |
157 | #:
158 | msgid "DepositType.WET_SNOW"
159 | msgstr "nieve húmeda"
160 |
161 | #:
162 | msgid "DepositType.ICE"
163 | msgstr "hielo"
164 |
165 | #:
166 | msgid "DepositType.COMPACTED_SNOW"
167 | msgstr "nieve compactada o enrollada"
168 |
169 | #:
170 | msgid "DepositType.FROZEN_RIDGES"
171 | msgstr "huellas o cumbres congeladas"
172 |
173 | #:
174 | msgid "DepositType.SLUSH"
175 | msgstr "nieve derretida"
176 |
177 | #:
178 | msgid "Descriptive.PR"
179 | msgstr "parcial"
180 |
181 | #:
182 | msgid "Descriptive.TS"
183 | msgstr "tormenta"
184 |
185 | #:
186 | msgid "ErrorCode.InvalidMessage"
187 | msgstr "El mensaje ingresado es inválido."
188 |
189 | #:
190 | msgid "Flag.AMD"
191 | msgstr "TAF modificado"
192 |
193 | #:
194 | msgid "Flag.AUTO"
195 | msgstr "METAR automatizado"
196 |
197 | #:
198 | msgid "Flag.CNL"
199 | msgstr "TAF cancelado"
200 |
201 | #:
202 | msgid "Indicator.M"
203 | msgstr "menos que"
204 |
205 | #:
206 | msgid "Indicator.P"
207 | msgstr "más que"
208 |
209 | #:
210 | msgid "Intensity.RE"
211 | msgstr "reciente"
212 |
213 | #:
214 | msgid "Phenomenon.DS"
215 | msgstr "tormenta de polvo"
216 |
217 | #:
218 | msgid "Phenomenon.FG"
219 | msgstr "niebla"
220 |
221 | #:
222 | msgid "Phenomenon.FU"
223 | msgstr "humo"
224 |
225 | #:
226 | msgid "Phenomenon.RA"
227 | msgstr "lluvia"
228 |
229 | #:
230 | msgid "Phenomenon.SA"
231 | msgstr "arena"
232 |
233 | #:
234 | msgid "Phenomenon.SN"
235 | msgstr "nieve"
236 |
237 | #:
238 | msgid "Phenomenon.SS"
239 | msgstr "tormenta de arena"
240 |
241 | #:
242 | msgid "Phenomenon.UP"
243 | msgstr "precipitación desconocida"
244 |
245 | #:
246 | msgid "Phenomenon.VA"
247 | msgstr "ceniza volcánica"
248 |
249 | #:
250 | msgid "Phenomenon.TS"
251 | msgstr "tormenta"
252 |
253 | #:
254 | msgid "Remark.AO1"
255 | msgstr "estaciones automáticas sin discriminador de precipitación"
256 |
257 | #:
258 | msgid "Remark.AO2"
259 | msgstr "estaciones automáticas con discriminador de precipitación"
260 |
261 | #:
262 | msgid "Remark.ALQDS"
263 | msgstr "todos los cuadrantes"
264 |
265 | #:
266 | msgid "Remark.Barometer.0"
267 | msgstr "Subiendo, después bajando"
268 |
269 | #:
270 | msgid "Remark.Barometer.1"
271 | msgstr "Subiendo, después estacionaria; o subiendo,\ndespués aumentando con más lentitud"
272 |
273 | #:
274 | msgid "Remark.Barometer.2"
275 | msgstr "subiendo, regular o irregularmente"
276 |
277 | #:
278 | msgid "Remark.Barometer.3"
279 | msgstr "Bajando o estacionaria; después subiendo; o subiendo y después subiendo más rápidamente"
280 |
281 | #:
282 | msgid "Remark.Barometer.4"
283 | msgstr "Estacionaria"
284 |
285 | #:
286 | msgid "Remark.Barometer.5"
287 | msgstr "Bajando, después subiendo"
288 |
289 | #:
290 | msgid "Remark.Barometer.6"
291 | msgstr "Bajando, después estacionaria; o bajando y\ndespués bajando más lentamente"
292 |
293 | #:
294 | msgid "Remark.Barometer.7"
295 | msgstr "Bajando, regular o irregularmente"
296 |
297 | #:
298 | msgid "Remark.Barometer.8"
299 | msgstr "Estacionaria o subiendo y después bajando; o bajando y después bajando más rápidamente"
300 |
301 | #:
302 | msgid "Remark.BASED"
303 | msgstr "basado"
304 |
305 | #:
306 | msgid "Remark.Ceiling.Height"
307 | msgstr "techo de nubes entre {0} y {1} pies"
308 |
309 | #:
310 | msgid "Remark.Ceiling.Second.Location"
311 | msgstr "techo de nubes de {0} pies medido por un segundo sensor ubicado en {1}"
312 |
313 | #:
314 | msgid "Remark.DSNT"
315 | msgstr "distante"
316 |
317 | #:
318 | msgid "Remark.FCST"
319 | msgstr "pronóstico"
320 |
321 | #:
322 | msgid "Remark.FUNNELCLOUD"
323 | msgstr "nube embudo"
324 |
325 | #:
326 | msgid "Remark.NXT"
327 | msgstr "siguiente"
328 |
329 | #:
330 | msgid "Remark.TORNADO"
331 | msgstr "tornado"
332 |
333 | #:
334 | msgid "MetarFacade.InvalidIcao"
335 | msgstr "El código Icao no es válido."
336 |
337 | #:
338 | msgid "Converter.E"
339 | msgstr "Este"
340 |
341 | #:
342 | msgid "Converter.N"
343 | msgstr "Norte"
344 |
345 | #:
346 | msgid "Converter.NE"
347 | msgstr "Noreste"
348 |
349 | #:
350 | msgid "Converter.NW"
351 | msgstr "Noroeste"
352 |
353 | #:
354 | msgid "Converter.S"
355 | msgstr "Sur"
356 |
357 | #:
358 | msgid "Converter.SE"
359 | msgstr "Sureste"
360 |
361 | #:
362 | msgid "Converter.VRB"
363 | msgstr "Variable"
364 |
365 | #:
366 | msgid "Converter.W"
367 | msgstr "Oeste"
368 |
369 | #:
370 | msgid "WeatherChangeType.INTER"
371 | msgstr "Intermitente"
372 |
373 | #:
374 | msgid "WeatherChangeType.TEMPO"
375 | msgstr "Temporal"
376 |
377 | #:
378 | msgid "WeatherChangeType.PROB"
379 | msgstr "Probabilidad"
380 |
381 | #:
382 | msgid "TimeIndicator.FM"
383 | msgstr "Desde"
384 |
385 | #:
386 | msgid "TimeIndicator.TL"
387 | msgstr "hasta"
388 |
389 | #:
390 | msgid "ToString.airport"
391 | msgstr "aeropuerto"
392 |
393 | #:
394 | msgid "ToString.clouds"
395 | msgstr "nubes"
396 |
397 | #:
398 | msgid "ToString.day.month"
399 | msgstr "día del mes"
400 |
401 | #:
402 | msgid "ToString.day.hour"
403 | msgstr "hora del día"
404 |
405 | #:
406 | msgid "ToString.height.feet"
407 | msgstr "altura (cm)"
408 |
409 | #:
410 | msgid "ToString.height.meter"
411 | msgstr "altura (m)"
412 |
413 | #:
414 | msgid "ToString.intensity"
415 | msgstr "intensidad"
416 |
417 | #:
418 | msgid "ToString.indicator"
419 | msgstr "indicador"
420 |
421 | #:
422 | msgid "ToString.message"
423 | msgstr "mensaje original"
424 |
425 | #:
426 | msgid "ToString.name"
427 | msgstr "nombre"
428 |
429 | #:
430 | msgid "ToString.phenomenons"
431 | msgstr "fenómenos"
432 |
433 | #:
434 | msgid "ToString.probability"
435 | msgstr "probabilidad"
436 |
437 | #:
438 | msgid "ToString.quantity"
439 | msgstr "cantidad"
440 |
441 | #:
442 | msgid "ToString.report.time"
443 | msgstr "hora del informe"
444 |
445 | #:
446 | msgid "ToString.temperature"
447 | msgstr "temperatura (°C)"
448 |
449 | #:
450 | msgid "ToString.temperature.max"
451 | msgstr "temperatura máxima (°C)"
452 |
453 | #:
454 | msgid "ToString.temperature.min"
455 | msgstr "temperatura mínima (°C)"
456 |
457 | #:
458 | msgid "ToString.type"
459 | msgstr "tipo"
460 |
461 | #:
462 | msgid "ToString.wind.direction"
463 | msgstr "dirección"
464 |
465 | #:
466 | msgid "ToString.wind.direction.degrees"
467 | msgstr "dirección (grados)"
468 |
469 | #:
470 | msgid "TurbulenceIntensity.X"
471 | msgstr "Turbulencia extrema"
472 |
473 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/fr/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/fr/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/fr/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: fr"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "nuages fragmentés"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "peu"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "pas de nuages significatifs."
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "ciel couvert"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "nuages épars"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "pas de nuage"
32 |
33 | #:
34 | msgid "CloudType.CB"
35 | msgstr "Cumunolinbus"
36 |
37 | #:
38 | msgid "CloudType.CC"
39 | msgstr "Cirrocumulus"
40 |
41 | #:
42 | msgid "CloudType.TCU"
43 | msgstr "Cumulus bourgeonnant"
44 |
45 | #:
46 | msgid "DepositBrakingCapacity.//"
47 | msgstr "non reportée"
48 |
49 | #:
50 | msgid "DepositBrakingCapacity.91"
51 | msgstr "mauvaise"
52 |
53 | #:
54 | msgid "DepositBrakingCapacity.92"
55 | msgstr "mauvaise/moyenne"
56 |
57 | #:
58 | msgid "DepositBrakingCapacity.93"
59 | msgstr "moyenne"
60 |
61 | #:
62 | msgid "DepositBrakingCapacity.94"
63 | msgstr "moyenne/bonne"
64 |
65 | #:
66 | msgid "DepositBrakingCapacity.95"
67 | msgstr "bonne"
68 |
69 | #:
70 | msgid "DepositBrakingCapacity.99"
71 | msgstr "valeurs non fiables"
72 |
73 | #:
74 | msgid "DepositCoverage.NOT_REPORTED"
75 | msgstr "non reportée"
76 |
77 | #:
78 | msgid "DepositCoverage.LESS_10"
79 | msgstr "moins de 10%"
80 |
81 | #:
82 | msgid "DepositCoverage.FROM_11_TO_25"
83 | msgstr "de 11% à 25%"
84 |
85 | #:
86 | msgid "DepositCoverage.FROM_26_TO_50"
87 | msgstr "de 26% à 50%"
88 |
89 | #:
90 | msgid "DepositCoverage.FROM_51_TO_100"
91 | msgstr "de 51% à 100%"
92 |
93 | #:
94 | msgid "DepositThickness.//"
95 | msgstr "non reportée"
96 |
97 | #:
98 | msgid "DepositThickness.00"
99 | msgstr "moins de 1 mm"
100 |
101 | #:
102 | msgid "DepositThickness.98"
103 | msgstr "40 cm ou plus"
104 |
105 | #:
106 | msgid "DepositThickness.99"
107 | msgstr "fermée"
108 |
109 | #:
110 | msgid "DepositType.NOT_REPORTED"
111 | msgstr "non reportée"
112 |
113 | #:
114 | msgid "DepositType.CLEAR_DRY"
115 | msgstr "clair et sec"
116 |
117 | #:
118 | msgid "DepositType.DAMP"
119 | msgstr "humide"
120 |
121 | #:
122 | msgid "DepositType.WET_WATER_PATCHES"
123 | msgstr "humide ou flaques d'eau"
124 |
125 | #:
126 | msgid "DepositType.RIME_FROST_COVERED"
127 | msgstr "couverte de givre ou de glace"
128 |
129 | #:
130 | msgid "DepositType.DRY_SNOW"
131 | msgstr "neige sèche"
132 |
133 | #:
134 | msgid "DepositType.WET_SNOW"
135 | msgstr "neige mouillée"
136 |
137 | #:
138 | msgid "DepositType.ICE"
139 | msgstr "glace"
140 |
141 | #:
142 | msgid "DepositType.COMPACTED_SNOW"
143 | msgstr "neige compactée ou roulée"
144 |
145 | #:
146 | msgid "DepositType.FROZEN_RIDGES"
147 | msgstr "ornières ou crêtes gelées"
148 |
149 | #:
150 | msgid "DepositType.SLUSH"
151 | msgstr "boue"
152 |
153 | #:
154 | msgid "Descriptive.BC"
155 | msgstr "bancs"
156 |
157 | #:
158 | msgid "Descriptive.BL"
159 | msgstr "chasse-poussière haute"
160 |
161 | #:
162 | msgid "Descriptive.DR"
163 | msgstr "chasse-poussière basse"
164 |
165 | #:
166 | msgid "Descriptive.FZ"
167 | msgstr "se congelant"
168 |
169 | #:
170 | msgid "Descriptive.MI"
171 | msgstr "mince"
172 |
173 | #:
174 | msgid "Descriptive.PR"
175 | msgstr "partiel"
176 |
177 | #:
178 | msgid "Descriptive.SH"
179 | msgstr "averses de"
180 |
181 | #:
182 | msgid "Descriptive.TS"
183 | msgstr "orage"
184 |
185 | #:
186 | msgid "Error.prefix"
187 | msgstr "Une erreur est survenue. Code erreur n°"
188 |
189 | #:
190 | msgid "ErrorCode.AirportNotFound"
191 | msgstr "L'aéroport n'a pas été trouvé pour ce message."
192 |
193 | #:
194 | msgid "ErrorCode.InvalidMessage"
195 | msgstr "Le message entré est invalide."
196 |
197 | #:
198 | msgid "ErrorCode.IncompleteRunwayInformation"
199 | msgstr "Les informations sur la piste sont incomplètes et ne peuvent pas être analysées."
200 |
201 | #:
202 | msgid "Flag.AMD"
203 | msgstr "TAF modifié"
204 |
205 | #:
206 | msgid "Flag.AUTO"
207 | msgstr "METAR automatisé"
208 |
209 | #:
210 | msgid "Flag.CNL"
211 | msgstr "TAF annulé"
212 |
213 | #:
214 | msgid "Flag.COR"
215 | msgstr "METAR/TAF corrigé"
216 |
217 | #:
218 | msgid "Flag.NIL"
219 | msgstr "Aucune donnée"
220 |
221 | #:
222 | msgid "IcingIntensity.0"
223 | msgstr "Aucune ou trace de givrage"
224 |
225 | #:
226 | msgid "IcingIntensity.1"
227 | msgstr "Givre léger"
228 |
229 | #:
230 | msgid "IcingIntensity.2"
231 | msgstr "Léger givre dans les nuages"
232 |
233 | #:
234 | msgid "IcingIntensity.3"
235 | msgstr "Glace transparente légère dans les précipitations"
236 |
237 | #:
238 | msgid "IcingIntensity.4"
239 | msgstr "Givre modéré"
240 |
241 | #:
242 | msgid "IcingIntensity.5"
243 | msgstr "Givre modéré dans les nuages"
244 |
245 | #:
246 | msgid "IcingIntensity.6"
247 | msgstr "Glace transparente modérée dans les précipitations"
248 |
249 | #:
250 | msgid "IcingIntensity.7"
251 | msgstr "Glaçage mixte sévère"
252 |
253 | #:
254 | msgid "IcingIntensity.8"
255 | msgstr "Givre sévère dans les nuages"
256 |
257 | #:
258 | msgid "IcingIntensity.9"
259 | msgstr "Sévère glace transparente dans les précipitations"
260 |
261 | #:
262 | msgid "Indicator.M"
263 | msgstr "moins que"
264 |
265 | #:
266 | msgid "Indicator.P"
267 | msgstr "plus que"
268 |
269 | #:
270 | msgid "Intensity.-"
271 | msgstr "Faible"
272 |
273 | #:
274 | msgid "Intensity.+"
275 | msgstr "Fort"
276 |
277 | #:
278 | msgid "Intensity.RE"
279 | msgstr "Récent(e)"
280 |
281 | #:
282 | msgid "Intensity.VC"
283 | msgstr "Au voisinage de"
284 |
285 | #:
286 | msgid "Phenomenon.BR"
287 | msgstr "brume"
288 |
289 | #:
290 | msgid "Phenomenon.DS"
291 | msgstr "tempête de poussière"
292 |
293 | #:
294 | msgid "Phenomenon.DU"
295 | msgstr "poussières généralisées"
296 |
297 | #:
298 | msgid "Phenomenon.DZ"
299 | msgstr "bruine"
300 |
301 | #:
302 | msgid "Phenomenon.FC"
303 | msgstr "nuage en entonnoir"
304 |
305 | #:
306 | msgid "Phenomenon.FG"
307 | msgstr "brouillard"
308 |
309 | #:
310 | msgid "Phenomenon.FU"
311 | msgstr "fumée"
312 |
313 | #:
314 | msgid "Phenomenon.GR"
315 | msgstr "grêle"
316 |
317 | #:
318 | msgid "Phenomenon.GS"
319 | msgstr "grsil"
320 |
321 | #:
322 | msgid "Phenomenon.HZ"
323 | msgstr "brume sèche"
324 |
325 | #:
326 | msgid "Phenomenon.IC"
327 | msgstr "cristaux de glace"
328 |
329 | #:
330 | msgid "Phenomenon.PL"
331 | msgstr "granules de glace"
332 |
333 | #:
334 | msgid "Phenomenon.PO"
335 | msgstr "tourbillon de poussières sable"
336 |
337 | #:
338 | msgid "Phenomenon.RA"
339 | msgstr "pluie"
340 |
341 | #:
342 | msgid "Phenomenon.SA"
343 | msgstr "sable"
344 |
345 | #:
346 | msgid "Phenomenon.SG"
347 | msgstr "neige en grains"
348 |
349 | #:
350 | msgid "Phenomenon.SN"
351 | msgstr "neige"
352 |
353 | #:
354 | msgid "Phenomenon.SQ"
355 | msgstr "grains"
356 |
357 | #:
358 | msgid "Phenomenon.SS"
359 | msgstr "tempête de sable"
360 |
361 | #:
362 | msgid "Phenomenon.UP"
363 | msgstr "précipitation inconnue"
364 |
365 | #:
366 | msgid "Phenomenon.VA"
367 | msgstr "cendres volcaniques"
368 |
369 | #:
370 | msgid "Phenomenon.TS"
371 | msgstr "orage"
372 |
373 | #:
374 | msgid "Remark.AO1"
375 | msgstr "stations automatisées sans discriminateur de précipitation"
376 |
377 | #:
378 | msgid "Remark.AO2"
379 | msgstr "stations automatisées avec discriminateur de précipitation"
380 |
381 | #:
382 | msgid "Remark.ALQDS"
383 | msgstr "tous les quadrants"
384 |
385 | #:
386 | msgid "Remark.Barometer.0"
387 | msgstr "Augmentation, puis diminution"
388 |
389 | #:
390 | msgid "Remark.Barometer.1"
391 | msgstr "Augmentation, puis stabilisation or augmentation puis augmentation légère"
392 |
393 | #:
394 | msgid "Remark.Barometer.2"
395 | msgstr "augmentation régulière ou instable"
396 |
397 | #:
398 | msgid "Remark.Barometer.3"
399 | msgstr "Diminution ou stabilisation puis diminution; ou augmentation puis augmentation rapide"
400 |
401 | #:
402 | msgid "Remark.Barometer.4"
403 | msgstr "Stable"
404 |
405 | #:
406 | msgid "Remark.Barometer.5"
407 | msgstr "Diminution, puis augmentation"
408 |
409 | #:
410 | msgid "Remark.Barometer.6"
411 | msgstr "Diminution puis stabilisation; ou diminution puis diminution plus lente"
412 |
413 | #:
414 | msgid "Remark.Barometer.7"
415 | msgstr "diminution stable ou instable"
416 |
417 | #:
418 | msgid "Remark.Barometer.8"
419 | msgstr "stable ou augmentation puis diminution; ou diminution puis diminution plus rapide"
420 |
421 | #:
422 | msgid "Remark.BASED"
423 | msgstr "basée"
424 |
425 | #:
426 | msgid "Remark.Ceiling.Height"
427 | msgstr "variation du plafond entre {0} et {1} pieds"
428 |
429 | #:
430 | msgid "Remark.Ceiling.Second.Location"
431 | msgstr "plafond de {0} pieds mesuré par un second capteur situé à {1}"
432 |
433 | #:
434 | msgid "Remark.DSNT"
435 | msgstr "éloigné"
436 |
437 | #:
438 | msgid "Remark.FCST"
439 | msgstr "prévision"
440 |
441 | #:
442 | msgid "Remark.FUNNELCLOUD"
443 | msgstr "nuage en entonnoir"
444 |
445 | #:
446 | msgid "Remark.Hail"
447 | msgstr "les plus gros grêlons ont un diamètre de {0} pouces"
448 |
449 | #:
450 | msgid "Remark.Hail.LesserThan"
451 | msgstr "les plus gros grêlons ont un diamètre plus petit que {0} pouces"
452 |
453 | #:
454 | msgid "Remark.Hourly.Maximum.Temperature"
455 | msgstr "température maximale sur 6 heures de {0}°C"
456 |
457 | #:
458 | msgid "Remark.Hourly.Maximum.Minimum.Temperature"
459 | msgstr "Température maximale sur 24 heures de {0}°C et température minimale sur 24 heures de {1}°C"
460 |
461 | #:
462 | msgid "Remark.Hourly.Minimum.Temperature"
463 | msgstr "Température minimale sur 6 heures de {0}°C"
464 |
465 | #:
466 | msgid "Remark.Hourly.Temperature"
467 | msgstr "température horaire de {0}°C"
468 |
469 | #:
470 | msgid "Remark.Hourly.Temperature.Dew.Point"
471 | msgstr "température horaire de {0}°C et point de rosée de {1}°C"
472 |
473 | #:
474 | msgid "Remark.Ice.Accretion.Amount"
475 | msgstr "{0}/100 d''un pouce d''accrétion de glace au cours des {1} dernières heures"
476 |
477 | #:
478 | msgid "Remark.HVY"
479 | msgstr "fort"
480 |
481 | #:
482 | msgid "Remark.LGT"
483 | msgstr "léger"
484 |
485 | #:
486 | msgid "Remark.LTG"
487 | msgstr "éclair"
488 |
489 | #:
490 | msgid "Remark.MOD"
491 | msgstr "modéré"
492 |
493 | #:
494 | msgid "Remark.Obscuration"
495 | msgstr "couche de {0} à {1} pieds composée de {2}"
496 |
497 | #:
498 | msgid "Remark.ON"
499 | msgstr "sur"
500 |
501 | #:
502 | msgid "Remark.NXT"
503 | msgstr "prochain"
504 |
505 | #:
506 | msgid "Remark.PeakWind"
507 | msgstr "vent de pointe de {1} noeuds en provenance de {0} degrés à {2}:{3}"
508 |
509 | #:
510 | msgid "Remark.Precipitation.Amount.Hourly"
511 | msgstr "{0}/100 d''un pouce de précipitation est tombé au cours de la dernière heure"
512 |
513 | #:
514 | msgid "Remark.Precipitation.Amount.3.6"
515 | msgstr "{1} pouces de précipitations tombées au cours des {0} dernières heures"
516 |
517 | #:
518 | msgid "Remark.Precipitation.Amount.24"
519 | msgstr "{0} pouces de précipitations tombées au cours des 24 dernières heures"
520 |
521 | #:
522 | msgid "Remark.Precipitation.Beg"
523 | msgstr "{0} {1} commençant à {2}:{3}"
524 |
525 | #:
526 | msgid "Remark.Precipitation.Beg.End"
527 | msgstr "{0} {1} commencant à {2}:{3} finissant à {4}:{5}"
528 |
529 | #:
530 | msgid "Remark.Precipitation.End"
531 | msgstr "{0} {1} se terminant à {2}:{3}"
532 |
533 | #:
534 | msgid "Remark.Pressure.Tendency"
535 | msgstr "de {0} hectopascals au cours des 3 dernières heures"
536 |
537 | #:
538 | msgid "Remark.PRESFR"
539 | msgstr "diminution rapide de la pression"
540 |
541 | #:
542 | msgid "Remark.PRESRR"
543 | msgstr "augmentation rapide de la pression"
544 |
545 | #:
546 | msgid "Remark.Second.Location.Visibility"
547 | msgstr "visibilité de {0} SM mesuré par un capteur situé à {1}"
548 |
549 | #:
550 | msgid "Remark.Sea.Level.Pressure"
551 | msgstr "pression au niveau de la mer de {0} HPa"
552 |
553 | #:
554 | msgid "Remark.Sector.Visibility"
555 | msgstr "visibilité de {1} SM dans la direction {0}"
556 |
557 | #:
558 | msgid "Remark.SLPNO"
559 | msgstr "pression au niveau de la mer non disponible"
560 |
561 | #:
562 | msgid "Remark.Snow.Depth"
563 | msgstr "profondeur de neige de {0} pouces"
564 |
565 | #:
566 | msgid "Remark.Snow.Increasing.Rapidly"
567 | msgstr "épaisseur de neige de {0} pouces sur la dernière heure avec une épaisseur totale au sol de {1} pouces"
568 |
569 | #:
570 | msgid "Remark.Snow.Pellets"
571 | msgstr "{0} grésil"
572 |
573 | #:
574 | msgid "Remark.Sunshine.Duration"
575 | msgstr "{0} minutes d''ensoleillement"
576 |
577 | #:
578 | msgid "Remark.Surface.Visibility"
579 | msgstr "visibility de surface de {0} miles"
580 |
581 | #:
582 | msgid "Remark.Thunderstorm.Location"
583 | msgstr "orage se situant {0} de la station"
584 |
585 | #:
586 | msgid "Remark.Thunderstorm.Location.Moving"
587 | msgstr "orage se situant {0} de la station se déplacant vers {1}"
588 |
589 | #:
590 | msgid "Remark.Tornadic.Activity.Beginning"
591 | msgstr "{0} commencant à {1}:{2} {3} SM {4} de la station"
592 |
593 | #:
594 | msgid "Remark.Tornadic.Activity.BegEnd"
595 | msgstr "{0} commencant à {1}:{2} finissant à {3}:{4} {5} SM {6} de la station"
596 |
597 | #:
598 | msgid "Remark.Tornadic.Activity.Ending"
599 | msgstr "{0} finissant à {1}:{2} {3} SM {4} de la station"
600 |
601 | #:
602 | msgid "Remark.TORNADO"
603 | msgstr "tornade"
604 |
605 | #:
606 | msgid "Remark.Tower.Visibility"
607 | msgstr "visibility de la tour de contrôle de {0} miles"
608 |
609 | #:
610 | msgid "Remark.Variable.Prevailing.Visibility"
611 | msgstr "variation de la visibilité dominante entre {0} et {1} SM"
612 |
613 | #:
614 | msgid "Remark.Variable.Sky.Condition"
615 | msgstr "couche de nuages variant entre {0} et {1}"
616 |
617 | #:
618 | msgid "Remark.Variable.Sky.Condition.Height"
619 | msgstr "couche de nuages à {0} pieds variant entre {1} et {2}"
620 |
621 | #:
622 | msgid "Remark.Virga.Direction"
623 | msgstr "virga au {0} de la station"
624 |
625 | #:
626 | msgid "Remark.WATERSPOUT"
627 | msgstr "trombe"
628 |
629 | #:
630 | msgid "Remark.Water.Equivalent.Snow.Ground"
631 | msgstr "équivalent d''eau de {0} pouces de neige"
632 |
633 | #:
634 | msgid "Remark.WindShift"
635 | msgstr "changement de vent à {0}:{1}"
636 |
637 | #:
638 | msgid "Remark.WindShift.FROPA"
639 | msgstr "changement de vent accompagné d''un passage de front à {0}:{1}"
640 |
641 | #:
642 | msgid "MetarFacade.InvalidIcao"
643 | msgstr "Code ICAO invalide."
644 |
645 | #:
646 | msgid "Converter.D"
647 | msgstr "decroissant"
648 |
649 | #:
650 | msgid "Converter.E"
651 | msgstr "Est"
652 |
653 | #:
654 | msgid "Converter.ENE"
655 | msgstr "Est Nord Est"
656 |
657 | #:
658 | msgid "Converter.ESE"
659 | msgstr "Est Sud Est"
660 |
661 | #:
662 | msgid "Converter.N"
663 | msgstr "Nord"
664 |
665 | #:
666 | msgid "Converter.NE"
667 | msgstr "Nord Est"
668 |
669 | #:
670 | msgid "Converter.NNE"
671 | msgstr "Nord Nord Est"
672 |
673 | #:
674 | msgid "Converter.NNW"
675 | msgstr "Nord Nord Ouest"
676 |
677 | #:
678 | msgid "Converter.NSC"
679 | msgstr "Aucun changement significatif"
680 |
681 | #:
682 | msgid "Converter.NW"
683 | msgstr "Nord Ouest"
684 |
685 | #:
686 | msgid "Converter.S"
687 | msgstr "Est"
688 |
689 | #:
690 | msgid "Converter.SE"
691 | msgstr "Sud Est"
692 |
693 | #:
694 | msgid "Converter.SSE"
695 | msgstr "Sud Sud Est"
696 |
697 | #:
698 | msgid "Converter.SSW"
699 | msgstr "Sud Sud Ouest"
700 |
701 | #:
702 | msgid "Converter.SW"
703 | msgstr "Sud Ouest"
704 |
705 | #:
706 | msgid "Converter.U"
707 | msgstr "accroissement"
708 |
709 | #:
710 | msgid "Converter.W"
711 | msgstr "Ouest"
712 |
713 | #:
714 | msgid "Converter.WNW"
715 | msgstr "Ouest Nord Ouest"
716 |
717 | #:
718 | msgid "Converter.WSW"
719 | msgstr "Ouest Sud Ouest"
720 |
721 | #:
722 | msgid "WeatherChangeType.FM"
723 | msgstr "De"
724 |
725 | #:
726 | msgid "WeatherChangeType.BECMG"
727 | msgstr "Devenant"
728 |
729 | #:
730 | msgid "WeatherChangeType.INTER"
731 | msgstr "Intermittent"
732 |
733 | #:
734 | msgid "WeatherChangeType.TEMPO"
735 | msgstr "Temporairement"
736 |
737 | #:
738 | msgid "WeatherChangeType.PROB"
739 | msgstr "Probabilité"
740 |
741 | #:
742 | msgid "TimeIndicator.AT"
743 | msgstr "à"
744 |
745 | #:
746 | msgid "TimeIndicator.FM"
747 | msgstr "De"
748 |
749 | #:
750 | msgid "TimeIndicator.TL"
751 | msgstr "jusqu'à"
752 |
753 | #:
754 | msgid "ToString.airport"
755 | msgstr "aéroport"
756 |
757 | #:
758 | msgid "ToString.altimeter"
759 | msgstr "altimètre (hPa)"
760 |
761 | #:
762 | msgid "ToString.amendment"
763 | msgstr "amendement"
764 |
765 | #:
766 | msgid "ToString.baseHeight"
767 | msgstr "Base de la couche en pied"
768 |
769 | #:
770 | msgid "ToString.clouds"
771 | msgstr "nuages"
772 |
773 | #:
774 | msgid "ToString.day.month"
775 | msgstr "jour du mois"
776 |
777 | #:
778 | msgid "ToString.day.hour"
779 | msgstr "heure du jour"
780 |
781 | #:
782 | msgid "ToString.deposit.braking"
783 | msgstr "capacité de freinage"
784 |
785 | #:
786 | msgid "ToString.deposit.coverage"
787 | msgstr "couverture"
788 |
789 | #:
790 | msgid "ToString.deposit.thickness"
791 | msgstr "épaisseur"
792 |
793 | #:
794 | msgid "ToString.deposit.type"
795 | msgstr "type dépôt"
796 |
797 | #:
798 | msgid "ToString.depth"
799 | msgstr "épaisseur de la couche en pieds"
800 |
801 | #:
802 | msgid "ToString.descriptive"
803 | msgstr "descriptif"
804 |
805 | #:
806 | msgid "ToString.dew.point"
807 | msgstr "point de rosée"
808 |
809 | #:
810 | msgid "ToString.end.day.month"
811 | msgstr "jour de fin du mois"
812 |
813 | #:
814 | msgid "ToString.end.hour.day"
815 | msgstr "heure de fin du jour"
816 |
817 | #:
818 | msgid "ToString.flags"
819 | msgstr "drapeaux"
820 |
821 | #:
822 | msgid "ToString.height.feet"
823 | msgstr "altitude (pieds)"
824 |
825 | #:
826 | msgid "ToString.height.meter"
827 | msgstr "altitude (m)"
828 |
829 | #:
830 | msgid "ToString.intensity"
831 | msgstr "intensité"
832 |
833 | #:
834 | msgid "ToString.indicator"
835 | msgstr "indicateur"
836 |
837 | #:
838 | msgid "ToString.message"
839 | msgstr "message original"
840 |
841 | #:
842 | msgid "ToString.name"
843 | msgstr "nom"
844 |
845 | #:
846 | msgid "ToString.phenomenons"
847 | msgstr "phénomènes"
848 |
849 | #:
850 | msgid "ToString.probability"
851 | msgstr "probabilité"
852 |
853 | #:
854 | msgid "ToString.quantity"
855 | msgstr "quantité"
856 |
857 | #:
858 | msgid "ToString.remark"
859 | msgstr "remarques"
860 |
861 | #:
862 | msgid "ToString.report.time"
863 | msgstr "heure du rapport"
864 |
865 | #:
866 | msgid "ToString.runway.info"
867 | msgstr "informations sur la piste"
868 |
869 | #:
870 | msgid "ToString.start.day.month"
871 | msgstr "jour de début du mois"
872 |
873 | #:
874 | msgid "ToString.start.hour.day"
875 | msgstr "heure de début du jour"
876 |
877 | #:
878 | msgid "ToString.start.minute"
879 | msgstr "minute de début"
880 |
881 | #:
882 | msgid "ToString.temperature"
883 | msgstr "température (°C)"
884 |
885 | #:
886 | msgid "ToString.temperature.max"
887 | msgstr "température maximale (°C)"
888 |
889 | #:
890 | msgid "ToString.temperature.min"
891 | msgstr "température minimale (°C)"
892 |
893 | #:
894 | msgid "ToString.trend"
895 | msgstr "tendance"
896 |
897 | #:
898 | msgid "ToString.trends"
899 | msgstr "tendances"
900 |
901 | #:
902 | msgid "ToString.visibility.main"
903 | msgstr "visibilité principale"
904 |
905 | #:
906 | msgid "ToString.visibility.min"
907 | msgstr "visibilité minimale"
908 |
909 | #:
910 | msgid "ToString.visibility.min.direction"
911 | msgstr "direction de la visibilité minimale"
912 |
913 | #:
914 | msgid "ToString.visibility.max"
915 | msgstr "visibilité maximale"
916 |
917 | #:
918 | msgid "ToString.vertical.visibility"
919 | msgstr "visibilité verticale (pieds)"
920 |
921 | #:
922 | msgid "ToString.weather.conditions"
923 | msgstr "conditions météorologique"
924 |
925 | #:
926 | msgid "ToString.wind.direction.degrees"
927 | msgstr "direction (degrés)"
928 |
929 | #:
930 | msgid "ToString.wind.gusts"
931 | msgstr "rafales"
932 |
933 | #:
934 | msgid "ToString.wind.min.variation"
935 | msgstr "variation minimale du vent"
936 |
937 | #:
938 | msgid "ToString.wind.max.variation"
939 | msgstr "variation maximale du vent"
940 |
941 | #:
942 | msgid "ToString.wind.speed"
943 | msgstr "vitesse"
944 |
945 | #:
946 | msgid "ToString.wind.unit"
947 | msgstr "unité"
948 |
949 | #:
950 | msgid "TurbulenceIntensity.0"
951 | msgstr "Aucune"
952 |
953 | #:
954 | msgid "TurbulenceIntensity.1"
955 | msgstr "Turbulence légère"
956 |
957 | #:
958 | msgid "TurbulenceIntensity.2"
959 | msgstr "Turbulences modérées occasionnelles dans l'air"
960 |
961 | #:
962 | msgid "TurbulenceIntensity.3"
963 | msgstr "Turbulences modérées fréquentes dans l'air"
964 |
965 | #:
966 | msgid "TurbulenceIntensity.4"
967 | msgstr "Turbulences modérées occasionnelles dans l'air"
968 |
969 | #:
970 | msgid "TurbulenceIntensity.5"
971 | msgstr "Turbulences modérées fréquentes dans l'air"
972 |
973 | #:
974 | msgid "TurbulenceIntensity.6"
975 | msgstr "Turbulences sévères occasionnelles dans l'air"
976 |
977 | #:
978 | msgid "TurbulenceIntensity.7"
979 | msgstr "Turbulences sévères fréquentes dans l'air"
980 |
981 | #:
982 | msgid "TurbulenceIntensity.8"
983 | msgstr "Turbulences sévères occasionnelles dans les nuages"
984 |
985 | #:
986 | msgid "TurbulenceIntensity.9"
987 | msgstr "Turbulences sévères fréquentes dans les nuages"
988 |
989 | #:
990 | msgid "TurbulenceIntensity.X"
991 | msgstr "Turbulence extrême"
992 |
993 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/it/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/it/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/messages.pot:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: en"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "broken"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "few"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "no significant clouds."
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "overcast"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "scattered"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "sky clear"
32 |
33 | #:
34 | msgid "CloudType.AC"
35 | msgstr "Altocumulus"
36 |
37 | #:
38 | msgid "CloudType.AS"
39 | msgstr "Altostratus"
40 |
41 | #:
42 | msgid "CloudType.CB"
43 | msgstr "Cumulonimbus"
44 |
45 | #:
46 | msgid "CloudType.CC"
47 | msgstr "CirroCumulus"
48 |
49 | #:
50 | msgid "CloudType.CI"
51 | msgstr "Cirrus"
52 |
53 | #:
54 | msgid "CloudType.CS"
55 | msgstr "Cirrostratus"
56 |
57 | #:
58 | msgid "CloudType.CU"
59 | msgstr "Cumulus"
60 |
61 | #:
62 | msgid "CloudType.NS"
63 | msgstr "Nimbostratus"
64 |
65 | #:
66 | msgid "CloudType.SC"
67 | msgstr "Stratocumulus"
68 |
69 | #:
70 | msgid "CloudType.ST"
71 | msgstr "Stratus"
72 |
73 | #:
74 | msgid "CloudType.TCU"
75 | msgstr "Towering cumulus"
76 |
77 | #:
78 | msgid "DepositBrakingCapacity.//"
79 | msgstr "not reported"
80 |
81 | #:
82 | msgid "DepositBrakingCapacity.91"
83 | msgstr "poor"
84 |
85 | #:
86 | msgid "DepositBrakingCapacity.92"
87 | msgstr "poor/medium"
88 |
89 | #:
90 | msgid "DepositBrakingCapacity.93"
91 | msgstr "medium"
92 |
93 | #:
94 | msgid "DepositBrakingCapacity.94"
95 | msgstr "medium/good"
96 |
97 | #:
98 | msgid "DepositBrakingCapacity.95"
99 | msgstr "good"
100 |
101 | #:
102 | msgid "DepositBrakingCapacity.99"
103 | msgstr "figures unreliable"
104 |
105 | #:
106 | msgid "DepositBrakingCapacity.default"
107 | msgstr "friction coefficient of {0}"
108 |
109 | #:
110 | msgid "DepositCoverage.NOT_REPORTED"
111 | msgstr "not reported"
112 |
113 | #:
114 | msgid "DepositCoverage.LESS_10"
115 | msgstr "less than 10%"
116 |
117 | #:
118 | msgid "DepositCoverage.FROM_11_TO_25"
119 | msgstr "from 11% to 25%"
120 |
121 | #:
122 | msgid "DepositCoverage.FROM_26_TO_50"
123 | msgstr "from 26% to 50%"
124 |
125 | #:
126 | msgid "DepositCoverage.FROM_51_TO_100"
127 | msgstr "from 51% to 100%"
128 |
129 | #:
130 | msgid "DepositThickness.//"
131 | msgstr "not reported"
132 |
133 | #:
134 | msgid "DepositThickness.00"
135 | msgstr "less than 1 mm"
136 |
137 | #:
138 | msgid "DepositThickness.92"
139 | msgstr "10 cm"
140 |
141 | #:
142 | msgid "DepositThickness.93"
143 | msgstr "15 cm"
144 |
145 | #:
146 | msgid "DepositThickness.94"
147 | msgstr "20 cm"
148 |
149 | #:
150 | msgid "DepositThickness.95"
151 | msgstr "25 cm"
152 |
153 | #:
154 | msgid "DepositThickness.96"
155 | msgstr "30 cm"
156 |
157 | #:
158 | msgid "DepositThickness.97"
159 | msgstr "35 cm"
160 |
161 | #:
162 | msgid "DepositThickness.98"
163 | msgstr "40 cm or more"
164 |
165 | #:
166 | msgid "DepositThickness.99"
167 | msgstr "closed"
168 |
169 | #:
170 | msgid "DepositThickness.default"
171 | msgstr "{0} mm"
172 |
173 | #:
174 | msgid "DepositType.NOT_REPORTED"
175 | msgstr "not reported"
176 |
177 | #:
178 | msgid "DepositType.CLEAR_DRY"
179 | msgstr "clear and dry"
180 |
181 | #:
182 | msgid "DepositType.DAMP"
183 | msgstr "damp"
184 |
185 | #:
186 | msgid "DepositType.WET_WATER_PATCHES"
187 | msgstr "wet or water patches"
188 |
189 | #:
190 | msgid "DepositType.RIME_FROST_COVERED"
191 | msgstr "rime or frost covered"
192 |
193 | #:
194 | msgid "DepositType.DRY_SNOW"
195 | msgstr "dry snow"
196 |
197 | #:
198 | msgid "DepositType.WET_SNOW"
199 | msgstr "wet snow"
200 |
201 | #:
202 | msgid "DepositType.ICE"
203 | msgstr "ice"
204 |
205 | #:
206 | msgid "DepositType.COMPACTED_SNOW"
207 | msgstr "compacted or rolled snow"
208 |
209 | #:
210 | msgid "DepositType.FROZEN_RIDGES"
211 | msgstr "frozen ruts or ridges"
212 |
213 | #:
214 | msgid "DepositType.SLUSH"
215 | msgstr "slush"
216 |
217 | #:
218 | msgid "Descriptive.BC"
219 | msgstr "patches"
220 |
221 | #:
222 | msgid "Descriptive.BL"
223 | msgstr "blowing"
224 |
225 | #:
226 | msgid "Descriptive.DR"
227 | msgstr "low drifting"
228 |
229 | #:
230 | msgid "Descriptive.FZ"
231 | msgstr "freezing"
232 |
233 | #:
234 | msgid "Descriptive.MI"
235 | msgstr "shallow"
236 |
237 | #:
238 | msgid "Descriptive.PR"
239 | msgstr "partial"
240 |
241 | #:
242 | msgid "Descriptive.SH"
243 | msgstr "showers of"
244 |
245 | #:
246 | msgid "Descriptive.TS"
247 | msgstr "thunderstorm"
248 |
249 | #:
250 | msgid "Error.prefix"
251 | msgstr "An error occured. Error code n°"
252 |
253 | #:
254 | msgid "ErrorCode.AirportNotFound"
255 | msgstr "The airport was not found for this message."
256 |
257 | #:
258 | msgid "ErrorCode.InvalidMessage"
259 | msgstr "The entered message is invalid."
260 |
261 | #:
262 | msgid "ErrorCode.IncompleteRunwayInformation"
263 | msgstr "The runway information is incomplete and cannot be parsed."
264 |
265 | #:
266 | msgid "Flag.AMD"
267 | msgstr "amended TAF"
268 |
269 | #:
270 | msgid "Flag.AUTO"
271 | msgstr "automated METAR"
272 |
273 | #:
274 | msgid "Flag.CNL"
275 | msgstr "canceled TAF"
276 |
277 | #:
278 | msgid "Flag.COR"
279 | msgstr "corrected METAR/TAF"
280 |
281 | #:
282 | msgid "Flag.NIL"
283 | msgstr "no data"
284 |
285 | #:
286 | msgid "IcingIntensity.0"
287 | msgstr "Trace Icing or None"
288 |
289 | #:
290 | msgid "IcingIntensity.1"
291 | msgstr "Light Mixed Icing"
292 |
293 | #:
294 | msgid "IcingIntensity.2"
295 | msgstr "Light Rime Icing In Cloud"
296 |
297 | #:
298 | msgid "IcingIntensity.3"
299 | msgstr "Light Clear Icing In Precipitation"
300 |
301 | #:
302 | msgid "IcingIntensity.4"
303 | msgstr "Moderate Mixed Icing"
304 |
305 | #:
306 | msgid "IcingIntensity.5"
307 | msgstr "Moderate Rime Icing In Cloud"
308 |
309 | #:
310 | msgid "IcingIntensity.6"
311 | msgstr "Moderate Clear Icing In Precipitation"
312 |
313 | #:
314 | msgid "IcingIntensity.7"
315 | msgstr "Severe Mixed Icing"
316 |
317 | #:
318 | msgid "IcingIntensity.8"
319 | msgstr "Severe Rime Icing In Cloud"
320 |
321 | #:
322 | msgid "IcingIntensity.9"
323 | msgstr "Severe Clear Icing In Precipitation"
324 |
325 | #:
326 | msgid "Indicator.M"
327 | msgstr "less than"
328 |
329 | #:
330 | msgid "Indicator.P"
331 | msgstr "greater than"
332 |
333 | #:
334 | msgid "Intensity.-"
335 | msgstr "Light"
336 |
337 | #:
338 | msgid "Intensity.+"
339 | msgstr "Heavy"
340 |
341 | #:
342 | msgid "Intensity.RE"
343 | msgstr "Recent"
344 |
345 | #:
346 | msgid "Intensity.VC"
347 | msgstr "In the vicinity"
348 |
349 | #:
350 | msgid "Phenomenon.BR"
351 | msgstr "mist"
352 |
353 | #:
354 | msgid "Phenomenon.DS"
355 | msgstr "duststorm"
356 |
357 | #:
358 | msgid "Phenomenon.DU"
359 | msgstr "widespread dust"
360 |
361 | #:
362 | msgid "Phenomenon.DZ"
363 | msgstr "drizzle"
364 |
365 | #:
366 | msgid "Phenomenon.FC"
367 | msgstr "funnel cloud"
368 |
369 | #:
370 | msgid "Phenomenon.FG"
371 | msgstr "fog"
372 |
373 | #:
374 | msgid "Phenomenon.FU"
375 | msgstr "smoke"
376 |
377 | #:
378 | msgid "Phenomenon.GR"
379 | msgstr "hail"
380 |
381 | #:
382 | msgid "Phenomenon.GS"
383 | msgstr "small hail and/or snow pellets"
384 |
385 | #:
386 | msgid "Phenomenon.HZ"
387 | msgstr "haze"
388 |
389 | #:
390 | msgid "Phenomenon.IC"
391 | msgstr "ice crystals"
392 |
393 | #:
394 | msgid "Phenomenon.PL"
395 | msgstr "ice pellets"
396 |
397 | #:
398 | msgid "Phenomenon.PO"
399 | msgstr "dust or sand whirls"
400 |
401 | #:
402 | msgid "Phenomenon.PY"
403 | msgstr "spray"
404 |
405 | #:
406 | msgid "Phenomenon.RA"
407 | msgstr "rain"
408 |
409 | #:
410 | msgid "Phenomenon.SA"
411 | msgstr "sand"
412 |
413 | #:
414 | msgid "Phenomenon.SG"
415 | msgstr "snow grains"
416 |
417 | #:
418 | msgid "Phenomenon.SN"
419 | msgstr "snow"
420 |
421 | #:
422 | msgid "Phenomenon.SQ"
423 | msgstr "squall"
424 |
425 | #:
426 | msgid "Phenomenon.SS"
427 | msgstr "sandstorm"
428 |
429 | #:
430 | msgid "Phenomenon.UP"
431 | msgstr "unknown precipitation"
432 |
433 | #:
434 | msgid "Phenomenon.VA"
435 | msgstr "volcanic ash"
436 |
437 | #:
438 | msgid "Phenomenon.TS"
439 | msgstr "thunderstorm"
440 |
441 | #:
442 | msgid "Remark.AO1"
443 | msgstr "automated stations without a precipitation discriminator"
444 |
445 | #:
446 | msgid "Remark.AO2"
447 | msgstr "automated station with a precipitation discriminator"
448 |
449 | #:
450 | msgid "Remark.ALQDS"
451 | msgstr "all quadrants"
452 |
453 | #:
454 | msgid "Remark.Barometer.0"
455 | msgstr "Increase, then decrease"
456 |
457 | #:
458 | msgid "Remark.Barometer.1"
459 | msgstr "Increase, then steady, or increase then Increase more slowly"
460 |
461 | #:
462 | msgid "Remark.Barometer.2"
463 | msgstr "steady or unsteady increase"
464 |
465 | #:
466 | msgid "Remark.Barometer.3"
467 | msgstr "Decrease or steady, then increase; or increase then increase more rapidly"
468 |
469 | #:
470 | msgid "Remark.Barometer.4"
471 | msgstr "Steady"
472 |
473 | #:
474 | msgid "Remark.Barometer.5"
475 | msgstr "Decrease, then increase"
476 |
477 | #:
478 | msgid "Remark.Barometer.6"
479 | msgstr "Decrease then steady; or decrease then decrease more slowly"
480 |
481 | #:
482 | msgid "Remark.Barometer.7"
483 | msgstr "Steady or unsteady decrease"
484 |
485 | #:
486 | msgid "Remark.Barometer.8"
487 | msgstr "Steady or increase, then decrease; or decrease then decrease more rapidly"
488 |
489 | #:
490 | msgid "Remark.BASED"
491 | msgstr "based"
492 |
493 | #:
494 | msgid "Remark.Ceiling.Height"
495 | msgstr "ceiling varying between {0} and {1} feet"
496 |
497 | #:
498 | msgid "Remark.Ceiling.Second.Location"
499 | msgstr "ceiling of {0} feet mesured by a second sensor located at {1}"
500 |
501 | #:
502 | msgid "Remark.DSNT"
503 | msgstr "distant"
504 |
505 | #:
506 | msgid "Remark.FCST"
507 | msgstr "forecast"
508 |
509 | #:
510 | msgid "Remark.FUNNELCLOUD"
511 | msgstr "funnel cloud"
512 |
513 | #:
514 | msgid "Remark.Hail"
515 | msgstr "largest hailstones with a diameter of {0} inches"
516 |
517 | #:
518 | msgid "Remark.Hail.LesserThan"
519 | msgstr "largest hailstones with a diameter less than {0} inches"
520 |
521 | #:
522 | msgid "Remark.Hourly.Maximum.Temperature"
523 | msgstr "6-hourly maximum temperature of {0}°C"
524 |
525 | #:
526 | msgid "Remark.Hourly.Maximum.Minimum.Temperature"
527 | msgstr "24-hour maximum temperature of {0}°C and 24-hour minimum temperature of {1}°C"
528 |
529 | #:
530 | msgid "Remark.Hourly.Minimum.Temperature"
531 | msgstr "6-hourly minimum temperature of {0}°C"
532 |
533 | #:
534 | msgid "Remark.Hourly.Temperature"
535 | msgstr "hourly temperature of {0}°C"
536 |
537 | #:
538 | msgid "Remark.Hourly.Temperature.Dew.Point"
539 | msgstr "hourly temperature of {0}°C and dew point of {1}°C"
540 |
541 | #:
542 | msgid "Remark.Ice.Accretion.Amount"
543 | msgstr "{0}/100 of an inch of ice accretion in the past {1} hour(s)"
544 |
545 | #:
546 | msgid "Remark.HVY"
547 | msgstr "heavy"
548 |
549 | #:
550 | msgid "Remark.LGT"
551 | msgstr "light"
552 |
553 | #:
554 | msgid "Remark.LTG"
555 | msgstr "lightning"
556 |
557 | #:
558 | msgid "Remark.MOD"
559 | msgstr "moderate"
560 |
561 | #:
562 | msgid "Remark.Obscuration"
563 | msgstr "{0} layer at {1} feet composed of {2}"
564 |
565 | #:
566 | msgid "Remark.ON"
567 | msgstr "on"
568 |
569 | #:
570 | msgid "Remark.NXT"
571 | msgstr "next"
572 |
573 | #:
574 | msgid "Remark.PeakWind"
575 | msgstr "peak wind of {1} knots from {0} degrees at {2}:{3}"
576 |
577 | #:
578 | msgid "Remark.Precipitation.Amount.Hourly"
579 | msgstr "{0}/100 of an inch of precipitation fell in the last hour"
580 |
581 | #:
582 | msgid "Remark.Precipitation.Amount.3.6"
583 | msgstr "{1} inches of precipitation fell in the last {0} hours"
584 |
585 | #:
586 | msgid "Remark.Precipitation.Amount.24"
587 | msgstr "{0} inches of precipitation fell in the last 24 hours"
588 |
589 | #:
590 | msgid "Remark.Precipitation.Beg"
591 | msgstr "{0} {1} beginning at {2}:{3}"
592 |
593 | #:
594 | msgid "Remark.Precipitation.Beg.End"
595 | msgstr "{0} {1} beginning at {2}:{3} ending at {4}:{5}"
596 |
597 | #:
598 | msgid "Remark.Precipitation.End"
599 | msgstr "{0} {1} ending at {2}:{3}"
600 |
601 | #:
602 | msgid "Remark.Pressure.Tendency"
603 | msgstr "of {0} hectopascals in the past 3 hours"
604 |
605 | #:
606 | msgid "Remark.PRESFR"
607 | msgstr "pressure falling rapidly"
608 |
609 | #:
610 | msgid "Remark.PRESRR"
611 | msgstr "pressure rising rapidly"
612 |
613 | #:
614 | msgid "Remark.Second.Location.Visibility"
615 | msgstr "visibility of {0} SM mesured by a second sensor located at {1}"
616 |
617 | #:
618 | msgid "Remark.Sea.Level.Pressure"
619 | msgstr "sea level pressure of {0} HPa"
620 |
621 | #:
622 | msgid "Remark.Sector.Visibility"
623 | msgstr "visibility of {1} SM in the {0} direction"
624 |
625 | #:
626 | msgid "Remark.SLPNO"
627 | msgstr "sea level pressure not available"
628 |
629 | #:
630 | msgid "Remark.Snow.Depth"
631 | msgstr "snow depth of {0} inches"
632 |
633 | #:
634 | msgid "Remark.Snow.Increasing.Rapidly"
635 | msgstr "snow depth increase of {0} inches in the past hour with a total depth on the ground of {1} inches"
636 |
637 | #:
638 | msgid "Remark.Snow.Pellets"
639 | msgstr "{0} snow pellets"
640 |
641 | #:
642 | msgid "Remark.Sunshine.Duration"
643 | msgstr "{0} minutes of sunshine"
644 |
645 | #:
646 | msgid "Remark.Surface.Visibility"
647 | msgstr "surface visibility of {0} statute miles"
648 |
649 | #:
650 | msgid "Remark.Thunderstorm.Location"
651 | msgstr "thunderstorm {0} of the station"
652 |
653 | #:
654 | msgid "Remark.Thunderstorm.Location.Moving"
655 | msgstr "thunderstorm {0} of the station moving towards {1}"
656 |
657 | #:
658 | msgid "Remark.Tornadic.Activity.Beginning"
659 | msgstr "{0} beginning at {1}:{2} {3} SM {4} of the station"
660 |
661 | #:
662 | msgid "Remark.Tornadic.Activity.BegEnd"
663 | msgstr "{0} beginning at {1}:{2} ending at {3}:{4} {5} SM {6} of the station"
664 |
665 | #:
666 | msgid "Remark.Tornadic.Activity.Ending"
667 | msgstr "{0} ending at {1}:{2} {3} SM {4} of the station"
668 |
669 | #:
670 | msgid "Remark.TORNADO"
671 | msgstr "tornado"
672 |
673 | #:
674 | msgid "Remark.Tower.Visibility"
675 | msgstr "control tower visibility of {0} statute miles"
676 |
677 | #:
678 | msgid "Remark.Variable.Prevailing.Visibility"
679 | msgstr "variable prevailing visibility between {0} and {1} SM"
680 |
681 | #:
682 | msgid "Remark.Variable.Sky.Condition"
683 | msgstr "cloud layer varying between {0} and {1}"
684 |
685 | #:
686 | msgid "Remark.Variable.Sky.Condition.Height"
687 | msgstr "cloud layer at {0} feet varying between {1} and {2}"
688 |
689 | #:
690 | msgid "Remark.VIRGA"
691 | msgstr "virga"
692 |
693 | #:
694 | msgid "Remark.Virga.Direction"
695 | msgstr "virga {0} from the station"
696 |
697 | #:
698 | msgid "Remark.WATERSPOUT"
699 | msgstr "waterspout"
700 |
701 | #:
702 | msgid "Remark.Water.Equivalent.Snow.Ground"
703 | msgstr "water equivalent of {0} inches of snow"
704 |
705 | #:
706 | msgid "Remark.WindShift"
707 | msgstr "wind shift at {0}:{1}"
708 |
709 | #:
710 | msgid "Remark.WindShift.FROPA"
711 | msgstr "wind shift accompanied by frontal passage at {0}:{1}"
712 |
713 | #:
714 | msgid "MetarFacade.InvalidIcao"
715 | msgstr "Icao code is invalid."
716 |
717 | #:
718 | msgid "Converter.D"
719 | msgstr "decreasing"
720 |
721 | #:
722 | msgid "Converter.E"
723 | msgstr "East"
724 |
725 | #:
726 | msgid "Converter.ENE"
727 | msgstr "East North East"
728 |
729 | #:
730 | msgid "Converter.ESE"
731 | msgstr "East South East"
732 |
733 | #:
734 | msgid "Converter.N"
735 | msgstr "North"
736 |
737 | #:
738 | msgid "Converter.NE"
739 | msgstr "North East"
740 |
741 | #:
742 | msgid "Converter.NNE"
743 | msgstr "North North East"
744 |
745 | #:
746 | msgid "Converter.NNW"
747 | msgstr "North North West"
748 |
749 | #:
750 | msgid "Converter.NSC"
751 | msgstr "no significant change"
752 |
753 | #:
754 | msgid "Converter.NW"
755 | msgstr "North West"
756 |
757 | #:
758 | msgid "Converter.S"
759 | msgstr "South"
760 |
761 | #:
762 | msgid "Converter.SE"
763 | msgstr "South East"
764 |
765 | #:
766 | msgid "Converter.SSE"
767 | msgstr "South South East"
768 |
769 | #:
770 | msgid "Converter.SSW"
771 | msgstr "South South West"
772 |
773 | #:
774 | msgid "Converter.SW"
775 | msgstr "South West"
776 |
777 | #:
778 | msgid "Converter.U"
779 | msgstr "up rising"
780 |
781 | #:
782 | msgid "Converter.VRB"
783 | msgstr "Variable"
784 |
785 | #:
786 | msgid "Converter.W"
787 | msgstr "West"
788 |
789 | #:
790 | msgid "Converter.WNW"
791 | msgstr "West North West"
792 |
793 | #:
794 | msgid "Converter.WSW"
795 | msgstr "West South West"
796 |
797 | #:
798 | msgid "WeatherChangeType.FM"
799 | msgstr "From"
800 |
801 | #:
802 | msgid "WeatherChangeType.BECMG"
803 | msgstr "Becoming"
804 |
805 | #:
806 | msgid "WeatherChangeType.INTER"
807 | msgstr "Intermittent"
808 |
809 | #:
810 | msgid "WeatherChangeType.TEMPO"
811 | msgstr "Temporary"
812 |
813 | #:
814 | msgid "WeatherChangeType.PROB"
815 | msgstr "Probability"
816 |
817 | #:
818 | msgid "TimeIndicator.AT"
819 | msgstr "at"
820 |
821 | #:
822 | msgid "TimeIndicator.FM"
823 | msgstr "From"
824 |
825 | #:
826 | msgid "TimeIndicator.TL"
827 | msgstr "until"
828 |
829 | #:
830 | msgid "ToString.airport"
831 | msgstr "airport"
832 |
833 | #:
834 | msgid "ToString.altimeter"
835 | msgstr "altimeter (hPa)"
836 |
837 | #:
838 | msgid "ToString.amendment"
839 | msgstr "amendment"
840 |
841 | #:
842 | msgid "ToString.auto"
843 | msgstr "auto"
844 |
845 | #:
846 | msgid "ToString.baseHeight"
847 | msgstr "base layer in feet"
848 |
849 | #:
850 | msgid "ToString.cavok"
851 | msgstr "cavok"
852 |
853 | #:
854 | msgid "ToString.clouds"
855 | msgstr "clouds"
856 |
857 | #:
858 | msgid "ToString.day.month"
859 | msgstr "day of the month"
860 |
861 | #:
862 | msgid "ToString.day.hour"
863 | msgstr "hour of the day"
864 |
865 | #:
866 | msgid "ToString.deposit.braking"
867 | msgstr "braking capacity"
868 |
869 | #:
870 | msgid "ToString.deposit.coverage"
871 | msgstr "coverage"
872 |
873 | #:
874 | msgid "ToString.deposit.thickness"
875 | msgstr "thickness"
876 |
877 | #:
878 | msgid "ToString.deposit.type"
879 | msgstr "type of deposit"
880 |
881 | #:
882 | msgid "ToString.depth"
883 | msgstr "layer depth in feet"
884 |
885 | #:
886 | msgid "ToString.descriptive"
887 | msgstr "descriptive"
888 |
889 | #:
890 | msgid "ToString.dew.point"
891 | msgstr "dew point"
892 |
893 | #:
894 | msgid "ToString.end.day.month"
895 | msgstr "end day of the month"
896 |
897 | #:
898 | msgid "ToString.end.hour.day"
899 | msgstr "end hour of the day"
900 |
901 | #:
902 | msgid "ToString.flags"
903 | msgstr "flags"
904 |
905 | #:
906 | msgid "ToString.height.feet"
907 | msgstr "height (ft)"
908 |
909 | #:
910 | msgid "ToString.height.meter"
911 | msgstr "height (m)"
912 |
913 | #:
914 | msgid "ToString.intensity"
915 | msgstr "intensity"
916 |
917 | #:
918 | msgid "ToString.indicator"
919 | msgstr "indicator"
920 |
921 | #:
922 | msgid "ToString.message"
923 | msgstr "original message"
924 |
925 | #:
926 | msgid "ToString.name"
927 | msgstr "name"
928 |
929 | #:
930 | msgid "ToString.nosig"
931 | msgstr "nosig"
932 |
933 | #:
934 | msgid "ToString.phenomenons"
935 | msgstr "phenomenons"
936 |
937 | #:
938 | msgid "ToString.probability"
939 | msgstr "probability"
940 |
941 | #:
942 | msgid "ToString.quantity"
943 | msgstr "quantity"
944 |
945 | #:
946 | msgid "ToString.remark"
947 | msgstr "remarks"
948 |
949 | #:
950 | msgid "ToString.report.time"
951 | msgstr "time of report"
952 |
953 | #:
954 | msgid "ToString.runway.info"
955 | msgstr "runways information"
956 |
957 | #:
958 | msgid "ToString.start.day.month"
959 | msgstr "starting day of the month"
960 |
961 | #:
962 | msgid "ToString.start.hour.day"
963 | msgstr "starting hour of the day"
964 |
965 | #:
966 | msgid "ToString.start.minute"
967 | msgstr "starting minute"
968 |
969 | #:
970 | msgid "ToString.temperature"
971 | msgstr "temperature (°C)"
972 |
973 | #:
974 | msgid "ToString.temperature.max"
975 | msgstr "maximum temperature (°C)"
976 |
977 | #:
978 | msgid "ToString.temperature.min"
979 | msgstr "minimum temperature (°C)"
980 |
981 | #:
982 | msgid "ToString.trend"
983 | msgstr "trend"
984 |
985 | #:
986 | msgid "ToString.trends"
987 | msgstr "trends"
988 |
989 | #:
990 | msgid "ToString.type"
991 | msgstr "type"
992 |
993 | #:
994 | msgid "ToString.visibility.main"
995 | msgstr "main visibility"
996 |
997 | #:
998 | msgid "ToString.visibility.min"
999 | msgstr "minimum visibility"
1000 |
1001 | #:
1002 | msgid "ToString.visibility.min.direction"
1003 | msgstr "minimum visibility direction"
1004 |
1005 | #:
1006 | msgid "ToString.visibility.max"
1007 | msgstr "maximum visibility"
1008 |
1009 | #:
1010 | msgid "ToString.vertical.visibility"
1011 | msgstr "vertical visibility (ft)"
1012 |
1013 | #:
1014 | msgid "ToString.weather.conditions"
1015 | msgstr "weather conditions"
1016 |
1017 | #:
1018 | msgid "ToString.wind.direction"
1019 | msgstr "direction"
1020 |
1021 | #:
1022 | msgid "ToString.wind.direction.degrees"
1023 | msgstr "direction (degrees)"
1024 |
1025 | #:
1026 | msgid "ToString.wind.gusts"
1027 | msgstr "gusts"
1028 |
1029 | #:
1030 | msgid "ToString.wind.min.variation"
1031 | msgstr "minimal wind variation"
1032 |
1033 | #:
1034 | msgid "ToString.wind.max.variation"
1035 | msgstr "maximal wind variation"
1036 |
1037 | #:
1038 | msgid "ToString.wind.speed"
1039 | msgstr "speed"
1040 |
1041 | #:
1042 | msgid "ToString.wind.unit"
1043 | msgstr "unit"
1044 |
1045 | #:
1046 | msgid "TurbulenceIntensity.0"
1047 | msgstr "None"
1048 |
1049 | #:
1050 | msgid "TurbulenceIntensity.1"
1051 | msgstr "Light turbulence"
1052 |
1053 | #:
1054 | msgid "TurbulenceIntensity.2"
1055 | msgstr "Moderate turbulence in clear air, occasional"
1056 |
1057 | #:
1058 | msgid "TurbulenceIntensity.3"
1059 | msgstr "Moderate turbulence in clear air, frequent"
1060 |
1061 | #:
1062 | msgid "TurbulenceIntensity.4"
1063 | msgstr "Moderate turbulence in cloud, occasional"
1064 |
1065 | #:
1066 | msgid "TurbulenceIntensity.5"
1067 | msgstr "Moderate turbulence in cloud, frequent"
1068 |
1069 | #:
1070 | msgid "TurbulenceIntensity.6"
1071 | msgstr "Severe turbulence in clear air, occasional"
1072 |
1073 | #:
1074 | msgid "TurbulenceIntensity.7"
1075 | msgstr "Severe turbulence in clear air, frequent"
1076 |
1077 | #:
1078 | msgid "TurbulenceIntensity.8"
1079 | msgstr "Severe turbulence in cloud, occasional"
1080 |
1081 | #:
1082 | msgid "TurbulenceIntensity.9"
1083 | msgstr "Severe turbulence in cloud, frequent"
1084 |
1085 | #:
1086 | msgid "TurbulenceIntensity.X"
1087 | msgstr "Extreme turbulence"
1088 |
1089 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/pl/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/pl/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/pl/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: pl"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "Od 5/8 do 7/8"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "Od 1/8 do 2/8"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "Nieznaczne zachmurzenie."
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "8/8"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "Od 3/8 do 4/8"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "Czyste niebo"
32 |
33 | #:
34 | msgid "CloudType.AC"
35 | msgstr "Średnie kłębiaste"
36 |
37 | #:
38 | msgid "CloudType.AS"
39 | msgstr "Średnia warstwowa"
40 |
41 | #:
42 | msgid "CloudType.CB"
43 | msgstr "Kłębiasta deszczowa"
44 |
45 | #:
46 | msgid "CloudType.CC"
47 | msgstr "Piętra wysokiego rodzaj kłębiasto-pierzaste"
48 |
49 | #:
50 | msgid "CloudType.CI"
51 | msgstr "Pierzasta"
52 |
53 | #:
54 | msgid "CloudType.CS"
55 | msgstr "Warstwowo - pierzasta"
56 |
57 | #:
58 | msgid "CloudType.CU"
59 | msgstr "Kłębiasta"
60 |
61 | #:
62 | msgid "CloudType.NS"
63 | msgstr "Warstwowa deszczowa"
64 |
65 | #:
66 | msgid "CloudType.SC"
67 | msgstr "Kłębiasto warstwowa"
68 |
69 | #:
70 | msgid "CloudType.ST"
71 | msgstr "Warstwowa"
72 |
73 | #:
74 | msgid "CloudType.TCU"
75 | msgstr "Wypiętrzona chmura kłębiasta"
76 |
77 | #:
78 | msgid "Descriptive.BC"
79 | msgstr "płaty"
80 |
81 | #:
82 | msgid "Descriptive.BL"
83 | msgstr "zawieja"
84 |
85 | #:
86 | msgid "Descriptive.DR"
87 | msgstr "zamieć przyziemna"
88 |
89 | #:
90 | msgid "Descriptive.FZ"
91 | msgstr "opad marznący"
92 |
93 | #:
94 | msgid "Descriptive.MI"
95 | msgstr "niskie"
96 |
97 | #:
98 | msgid "Descriptive.PR"
99 | msgstr "częściowe"
100 |
101 | #:
102 | msgid "Descriptive.SH"
103 | msgstr "opad przelotny"
104 |
105 | #:
106 | msgid "Descriptive.TS"
107 | msgstr "burza"
108 |
109 | #:
110 | msgid "Error.prefix"
111 | msgstr "Wystąpił błąd. Kod błędu numer"
112 |
113 | #:
114 | msgid "ErrorCode.AirportNotFound"
115 | msgstr "Nie znaleziono lotniska w tej depeszy."
116 |
117 | #:
118 | msgid "ErrorCode.InvalidMessage"
119 | msgstr "Wprowadzona depesza jest nieprawidłowa."
120 |
121 | #:
122 | msgid "Intensity.-"
123 | msgstr "Słaby"
124 |
125 | #:
126 | msgid "Intensity.+"
127 | msgstr "Silny"
128 |
129 | #:
130 | msgid "Intensity.VC"
131 | msgstr "W pobliżu"
132 |
133 | #:
134 | msgid "Phenomenon.BR"
135 | msgstr "zamglenie"
136 |
137 | #:
138 | msgid "Phenomenon.DS"
139 | msgstr "burza piaskowa"
140 |
141 | #:
142 | msgid "Phenomenon.DU"
143 | msgstr "pył"
144 |
145 | #:
146 | msgid "Phenomenon.DZ"
147 | msgstr "mżawka"
148 |
149 | #:
150 | msgid "Phenomenon.FC"
151 | msgstr "trąba powietrzna"
152 |
153 | #:
154 | msgid "Phenomenon.FG"
155 | msgstr "mgła"
156 |
157 | #:
158 | msgid "Phenomenon.FU"
159 | msgstr "dym"
160 |
161 | #:
162 | msgid "Phenomenon.GR"
163 | msgstr "grad"
164 |
165 | #:
166 | msgid "Phenomenon.GS"
167 | msgstr "krupa śnieżna"
168 |
169 | #:
170 | msgid "Phenomenon.HZ"
171 | msgstr "zmętnienie"
172 |
173 | #:
174 | msgid "Phenomenon.IC"
175 | msgstr "słupki lodowe"
176 |
177 | #:
178 | msgid "Phenomenon.PL"
179 | msgstr "deszcz lodowy"
180 |
181 | #:
182 | msgid "Phenomenon.PO"
183 | msgstr "wiry pyłowe"
184 |
185 | #:
186 | msgid "Phenomenon.PY"
187 | msgstr "aerozol"
188 |
189 | #:
190 | msgid "Phenomenon.RA"
191 | msgstr "deszcz"
192 |
193 | #:
194 | msgid "Phenomenon.SA"
195 | msgstr "piasek"
196 |
197 | #:
198 | msgid "Phenomenon.SG"
199 | msgstr "śnieg ziarnisty"
200 |
201 | #:
202 | msgid "Phenomenon.SN"
203 | msgstr "śnieg"
204 |
205 | #:
206 | msgid "Phenomenon.SQ"
207 | msgstr "nawałnica"
208 |
209 | #:
210 | msgid "Phenomenon.SS"
211 | msgstr "burza piaskowa"
212 |
213 | #:
214 | msgid "Phenomenon.UP"
215 | msgstr "marznący deszcz"
216 |
217 | #:
218 | msgid "Phenomenon.VA"
219 | msgstr "popiół wulkaniczny"
220 |
221 | #:
222 | msgid "MetarFacade.InvalidIcao"
223 | msgstr "Kod Icao jest nieprawidłowy"
224 |
225 | #:
226 | msgid "Converter.D"
227 | msgstr "malejący"
228 |
229 | #:
230 | msgid "Converter.E"
231 | msgstr "wschód"
232 |
233 | #:
234 | msgid "Converter.N"
235 | msgstr "północ"
236 |
237 | #:
238 | msgid "Converter.NE"
239 | msgstr "północny wschód"
240 |
241 | #:
242 | msgid "Converter.NSC"
243 | msgstr "nieznaczna zmiana"
244 |
245 | #:
246 | msgid "Converter.NW"
247 | msgstr "północny zachód"
248 |
249 | #:
250 | msgid "Converter.S"
251 | msgstr "południe"
252 |
253 | #:
254 | msgid "Converter.SE"
255 | msgstr "południowy zachód"
256 |
257 | #:
258 | msgid "Converter.SW"
259 | msgstr "połódniowy wschód"
260 |
261 | #:
262 | msgid "Converter.U"
263 | msgstr "rosnący"
264 |
265 | #:
266 | msgid "Converter.VRB"
267 | msgstr "Zmienny"
268 |
269 | #:
270 | msgid "Converter.W"
271 | msgstr "zachód"
272 |
273 | #:
274 | msgid "WeatherChangeType.FM"
275 | msgstr "od"
276 |
277 | #:
278 | msgid "WeatherChangeType.BECMG"
279 | msgstr "Nadchodząca"
280 |
281 | #:
282 | msgid "WeatherChangeType.TEMPO"
283 | msgstr "Tymczasowa"
284 |
285 | #:
286 | msgid "WeatherChangeType.PROB"
287 | msgstr "Prawdopodobieństwo"
288 |
289 | #:
290 | msgid "TimeIndicator.AT"
291 | msgstr "o"
292 |
293 | #:
294 | msgid "TimeIndicator.FM"
295 | msgstr "od"
296 |
297 | #:
298 | msgid "TimeIndicator.TL"
299 | msgstr "do"
300 |
301 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/ru-RU/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/ru-RU/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/tr/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/tr/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/tr/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: tr"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "parçalı çok bulutlu"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "az bulutlu"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "önemli bulut yok."
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "tamamen kapalı"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "parçalı bulutlu"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "gökyüzü açık"
32 |
33 | #:
34 | msgid "CloudType.AC"
35 | msgstr "Altokümülüs"
36 |
37 | #:
38 | msgid "CloudType.AS"
39 | msgstr "Altostratüs"
40 |
41 | #:
42 | msgid "CloudType.CB"
43 | msgstr "Kümülonimbus"
44 |
45 | #:
46 | msgid "CloudType.CC"
47 | msgstr "Sirrokümülüs"
48 |
49 | #:
50 | msgid "CloudType.CI"
51 | msgstr "Sirrus"
52 |
53 | #:
54 | msgid "CloudType.CS"
55 | msgstr "Sirrostratüs"
56 |
57 | #:
58 | msgid "CloudType.CU"
59 | msgstr "Kümülüs"
60 |
61 | #:
62 | msgid "CloudType.NS"
63 | msgstr "Nimbostratüs"
64 |
65 | #:
66 | msgid "CloudType.SC"
67 | msgstr "Stratokümülüs"
68 |
69 | #:
70 | msgid "CloudType.ST"
71 | msgstr "Stratüs"
72 |
73 | #:
74 | msgid "CloudType.TCU"
75 | msgstr "Yükselen kümülüs"
76 |
77 | #:
78 | msgid "DepositBrakingCapacity.//"
79 | msgstr "rapor edilmedi"
80 |
81 | #:
82 | msgid "DepositBrakingCapacity.91"
83 | msgstr "kötü"
84 |
85 | #:
86 | msgid "DepositBrakingCapacity.92"
87 | msgstr "kötü/orta"
88 |
89 | #:
90 | msgid "DepositBrakingCapacity.93"
91 | msgstr "orta"
92 |
93 | #:
94 | msgid "DepositBrakingCapacity.94"
95 | msgstr "orta/iyi"
96 |
97 | #:
98 | msgid "DepositBrakingCapacity.95"
99 | msgstr "iyi"
100 |
101 | #:
102 | msgid "DepositBrakingCapacity.99"
103 | msgstr "güvenilmez"
104 |
105 | #:
106 | msgid "DepositCoverage.NOT_REPORTED"
107 | msgstr "rapor edilmedi"
108 |
109 | #:
110 | msgid "DepositCoverage.LESS_10"
111 | msgstr "%10'dan daha az"
112 |
113 | #:
114 | msgid "DepositCoverage.FROM_11_TO_25"
115 | msgstr "%11 ila %25 arası"
116 |
117 | #:
118 | msgid "DepositCoverage.FROM_26_TO_50"
119 | msgstr "%26 ila %50 arası"
120 |
121 | #:
122 | msgid "DepositCoverage.FROM_51_TO_100"
123 | msgstr "%51 ila %100 arası"
124 |
125 | #:
126 | msgid "DepositThickness.//"
127 | msgstr "rapor edilmedi"
128 |
129 | #:
130 | msgid "DepositThickness.00"
131 | msgstr "1 mm'den daha az"
132 |
133 | #:
134 | msgid "DepositThickness.98"
135 | msgstr "40 cm veya daha fazla"
136 |
137 | #:
138 | msgid "DepositThickness.99"
139 | msgstr "kullanılmaz"
140 |
141 | #:
142 | msgid "DepositType.NOT_REPORTED"
143 | msgstr "rapor edilmedi"
144 |
145 | #:
146 | msgid "DepositType.CLEAR_DRY"
147 | msgstr "açık ve kuru"
148 |
149 | #:
150 | msgid "DepositType.DAMP"
151 | msgstr "nemli"
152 |
153 | #:
154 | msgid "DepositType.WET_WATER_PATCHES"
155 | msgstr "ıslak veta küçük su parçaları"
156 |
157 | #:
158 | msgid "DepositType.RIME_FROST_COVERED"
159 | msgstr "kırağı veya donla kaplı"
160 |
161 | #:
162 | msgid "DepositType.DRY_SNOW"
163 | msgstr "kuru kar"
164 |
165 | #:
166 | msgid "DepositType.WET_SNOW"
167 | msgstr "ıslak kar"
168 |
169 | #:
170 | msgid "DepositType.ICE"
171 | msgstr "buz"
172 |
173 | #:
174 | msgid "DepositType.COMPACTED_SNOW"
175 | msgstr "yoğun veya sıkışmış kar"
176 |
177 | #:
178 | msgid "DepositType.FROZEN_RIDGES"
179 | msgstr "donan tekerlek izleri veya yığılmış kar"
180 |
181 | #:
182 | msgid "DepositType.SLUSH"
183 | msgstr "sulu kar"
184 |
185 | #:
186 | msgid "Descriptive.BC"
187 | msgstr "parçalı"
188 |
189 | #:
190 | msgid "Descriptive.BL"
191 | msgstr "savrulan"
192 |
193 | #:
194 | msgid "Descriptive.DR"
195 | msgstr "sürüklenen"
196 |
197 | #:
198 | msgid "Descriptive.FZ"
199 | msgstr "aşırı soğumuş"
200 |
201 | #:
202 | msgid "Descriptive.MI"
203 | msgstr "sığ"
204 |
205 | #:
206 | msgid "Descriptive.PR"
207 | msgstr "kısmi"
208 |
209 | #:
210 | msgid "Descriptive.SH"
211 | msgstr "sağanaklar"
212 |
213 | #:
214 | msgid "Descriptive.TS"
215 | msgstr "oraj"
216 |
217 | #:
218 | msgid "Error.prefix"
219 | msgstr "Hata oluştu. Hata kodu: {0}"
220 |
221 | #:
222 | msgid "ErrorCode.AirportNotFound"
223 | msgstr "Bu mesaj için havaalanı bulunamadı."
224 |
225 | #:
226 | msgid "ErrorCode.InvalidMessage"
227 | msgstr "Girilen mesaj geçersiz."
228 |
229 | #:
230 | msgid "Indicator.M"
231 | msgstr "daha az"
232 |
233 | #:
234 | msgid "Indicator.P"
235 | msgstr "daha fazla"
236 |
237 | #:
238 | msgid "Intensity.-"
239 | msgstr "Hafif"
240 |
241 | #:
242 | msgid "Intensity.+"
243 | msgstr "Kuvvetli"
244 |
245 | #:
246 | msgid "Intensity.VC"
247 | msgstr "Mutedil"
248 |
249 | #:
250 | msgid "Phenomenon.BR"
251 | msgstr "pus"
252 |
253 | #:
254 | msgid "Phenomenon.DS"
255 | msgstr "toz fırtınası"
256 |
257 | #:
258 | msgid "Phenomenon.DU"
259 | msgstr "geniş alana yayılmış toz"
260 |
261 | #:
262 | msgid "Phenomenon.DZ"
263 | msgstr "çisenti"
264 |
265 | #:
266 | msgid "Phenomenon.FC"
267 | msgstr "hortum bulutu tornado veya su hortumu"
268 |
269 | #:
270 | msgid "Phenomenon.FG"
271 | msgstr "sis"
272 |
273 | #:
274 | msgid "Phenomenon.FU"
275 | msgstr "duman"
276 |
277 | #:
278 | msgid "Phenomenon.GR"
279 | msgstr "dolu"
280 |
281 | #:
282 | msgid "Phenomenon.GS"
283 | msgstr "küçük dolu ve/veya kar paletleri"
284 |
285 | #:
286 | msgid "Phenomenon.HZ"
287 | msgstr "toz pusu"
288 |
289 | #:
290 | msgid "Phenomenon.IC"
291 | msgstr "buz kristalleri"
292 |
293 | #:
294 | msgid "Phenomenon.PL"
295 | msgstr "buz paletleri"
296 |
297 | #:
298 | msgid "Phenomenon.PO"
299 | msgstr "toz veya kum türbülonu"
300 |
301 | #:
302 | msgid "Phenomenon.PY"
303 | msgstr "çisenti"
304 |
305 | #:
306 | msgid "Phenomenon.RA"
307 | msgstr "yağmur"
308 |
309 | #:
310 | msgid "Phenomenon.SA"
311 | msgstr "kum"
312 |
313 | #:
314 | msgid "Phenomenon.SG"
315 | msgstr "kar grenleri"
316 |
317 | #:
318 | msgid "Phenomenon.SN"
319 | msgstr "fırtına"
320 |
321 | #:
322 | msgid "Phenomenon.SQ"
323 | msgstr "fırtına"
324 |
325 | #:
326 | msgid "Phenomenon.SS"
327 | msgstr "kum fırtınası"
328 |
329 | #:
330 | msgid "Phenomenon.UP"
331 | msgstr "tanımlanamayan yağış"
332 |
333 | #:
334 | msgid "Phenomenon.VA"
335 | msgstr "volkanik kül"
336 |
337 | #:
338 | msgid "Phenomenon.TS"
339 | msgstr "oraj"
340 |
341 | #:
342 | msgid "Remark.AO1"
343 | msgstr "yağış ayırıcısı bulunmayan istasyonla otomatize edilmiştir"
344 |
345 | #:
346 | msgid "Remark.AO2"
347 | msgstr "yağış ayırıcısı bulunan istasyonla otomatize edilmiştir"
348 |
349 | #:
350 | msgid "Remark.ALQDS"
351 | msgstr "tüm kadranlar"
352 |
353 | #:
354 | msgid "Remark.Barometer.0"
355 | msgstr "Artan, sonrasında azalan"
356 |
357 | #:
358 | msgid "Remark.Barometer.1"
359 | msgstr "Artan, sonrasında sabit, veya artan sonrasında daha yavaş artan"
360 |
361 | #:
362 | msgid "Remark.Barometer.2"
363 | msgstr "sabit veya kararsız artış"
364 |
365 | #:
366 | msgid "Remark.Barometer.3"
367 | msgstr "Azalan veya sabit, sonrasında artan; veya artan sonrasında daha hızlı artan"
368 |
369 | #:
370 | msgid "Remark.Barometer.4"
371 | msgstr "Sabit"
372 |
373 | #:
374 | msgid "Remark.Barometer.5"
375 | msgstr "Azalan, sonrasında artan"
376 |
377 | #:
378 | msgid "Remark.Barometer.6"
379 | msgstr "Azalan sonrasında sabit; veya azalan sonrasında daha yavaş azalan"
380 |
381 | #:
382 | msgid "Remark.Barometer.7"
383 | msgstr "Sabit veya kararsız azalan"
384 |
385 | #:
386 | msgid "Remark.Barometer.8"
387 | msgstr "Sabit veya artan, sonrasında azalan; veya azalan sonrasında daha hızlı azalan"
388 |
389 | #:
390 | msgid "Remark.BASED"
391 | msgstr "temel"
392 |
393 | #:
394 | msgid "Remark.Ceiling.Height"
395 | msgstr "tavan {0} ve {1} feet arasında değişken"
396 |
397 | #:
398 | msgid "Remark.Ceiling.Second.Location"
399 | msgstr "tavan {1} konumunda bulunan ikinci bir sensör tarafından ölçülen {0} feet"
400 |
401 | #:
402 | msgid "Remark.DSNT"
403 | msgstr "uzak"
404 |
405 | #:
406 | msgid "Remark.FCST"
407 | msgstr "tahmin"
408 |
409 | #:
410 | msgid "Remark.FUNNELCLOUD"
411 | msgstr "hortum bulutu"
412 |
413 | #:
414 | msgid "Remark.Hail"
415 | msgstr "en büyük dolu tanesi {0} inç çapında"
416 |
417 | #:
418 | msgid "Remark.Hail.LesserThan"
419 | msgstr "en büyük dolu tanesi {0} inç çapından küçük"
420 |
421 | #:
422 | msgid "Remark.Hourly.Maximum.Temperature"
423 | msgstr "6 saatlik maksimum sıcaklık {0}°C"
424 |
425 | #:
426 | msgid "Remark.Hourly.Maximum.Minimum.Temperature"
427 | msgstr "24 saatlik maksimum sıcaklık {0}°C ve 24 saatlik minimum sıcaklık {1}°C"
428 |
429 | #:
430 | msgid "Remark.Hourly.Minimum.Temperature"
431 | msgstr "6 saatlik minimum sıcaklık {0}°C"
432 |
433 | #:
434 | msgid "Remark.Hourly.Temperature"
435 | msgstr "saatlik sıcaklık {0}°C"
436 |
437 | #:
438 | msgid "Remark.Hourly.Temperature.Dew.Point"
439 | msgstr "saatlik sıcaklık {0}°C ve işba sıcaklık {1}°C"
440 |
441 | #:
442 | msgid "Remark.Ice.Accretion.Amount"
443 | msgstr "Son {1} saatte bir inçlik buz birikiminin {0}/100''ü"
444 |
445 | #:
446 | msgid "Remark.HVY"
447 | msgstr "kuvvetli"
448 |
449 | #:
450 | msgid "Remark.LGT"
451 | msgstr "hafif"
452 |
453 | #:
454 | msgid "Remark.LTG"
455 | msgstr "yıldırım"
456 |
457 | #:
458 | msgid "Remark.MOD"
459 | msgstr "mutedil"
460 |
461 | #:
462 | msgid "Remark.Obscuration"
463 | msgstr "{2}''den oluşan {1} feette {0} katmanı"
464 |
465 | #:
466 | msgid "Remark.ON"
467 | msgstr "sonra"
468 |
469 | #:
470 | msgid "Remark.NXT"
471 | msgstr "sonraki"
472 |
473 | #:
474 | msgid "Remark.PeakWind"
475 | msgstr "{2}:{3}''da {0} dereceden {1} knot maksimum rüzgar"
476 |
477 | #:
478 | msgid "Remark.Precipitation.Amount.Hourly"
479 | msgstr "{0}/100 inç yağış son bir saatte düştü"
480 |
481 | #:
482 | msgid "Remark.Precipitation.Amount.3.6"
483 | msgstr "son {0} saat içinde düşen yağış {1} inç"
484 |
485 | #:
486 | msgid "Remark.Precipitation.Amount.24"
487 | msgstr "son 24 saat içinde düşen yağış {0} inç"
488 |
489 | #:
490 | msgid "Remark.Precipitation.Beg"
491 | msgstr "{0} {1} başlangıç saati {2}:{3} "
492 |
493 | #:
494 | msgid "Remark.Precipitation.Beg.End"
495 | msgstr "{0} {1} başlangıç saati {2}:{3} bitiş saati {4}:{5}"
496 |
497 | #:
498 | msgid "Remark.Precipitation.End"
499 | msgstr "{0} {1} bitiş saati {2}:{3}"
500 |
501 | #:
502 | msgid "Remark.Pressure.Tendency"
503 | msgstr "son 3 saatte {0} hektopaskal"
504 |
505 | #:
506 | msgid "Remark.PRESFR"
507 | msgstr "hızla düşen basınç"
508 |
509 | #:
510 | msgid "Remark.PRESRR"
511 | msgstr "hızla artan basınç"
512 |
513 | #:
514 | msgid "Remark.Second.Location.Visibility"
515 | msgstr "{1} konumunda bulunan ikinci sensörde ölçülen görüş {0} kara mili"
516 |
517 | #:
518 | msgid "Remark.Sea.Level.Pressure"
519 | msgstr "deniz seviyesi basınç {0} HPa"
520 |
521 | #:
522 | msgid "Remark.Sector.Visibility"
523 | msgstr "{0} yönünde görüş {1} kara mili"
524 |
525 | #:
526 | msgid "Remark.SLPNO"
527 | msgstr "deniz seviyesi basınç mevcut değil"
528 |
529 | #:
530 | msgid "Remark.Snow.Depth"
531 | msgstr "kar kalınlığı {0} inç"
532 |
533 | #:
534 | msgid "Remark.Snow.Increasing.Rapidly"
535 | msgstr "zeminde toplam {1} inç kar kalınlığı ile birlikte son bir saatte {0} inçlik kar derinliği artışı"
536 |
537 | #:
538 | msgid "Remark.Snow.Pellets"
539 | msgstr "{0} kar tanecikleri"
540 |
541 | #:
542 | msgid "Remark.Sunshine.Duration"
543 | msgstr "{0} dakika güneş ışığı"
544 |
545 | #:
546 | msgid "Remark.Surface.Visibility"
547 | msgstr "yüzey görüşü {0} kara mili"
548 |
549 | #:
550 | msgid "Remark.Thunderstorm.Location"
551 | msgstr "{0} istasyonunda fırtına"
552 |
553 | #:
554 | msgid "Remark.Thunderstorm.Location.Moving"
555 | msgstr "{0} istasyonunda {1} yönünde hareket eden fırtına"
556 |
557 | #:
558 | msgid "Remark.Tornadic.Activity.Beginning"
559 | msgstr "{4} istasyonunda {3} kara mili uzaklıkta olan {0} saat {1}:{2}''de başlıyor"
560 |
561 | #:
562 | msgid "Remark.Tornadic.Activity.BegEnd"
563 | msgstr "{6} istasyonunda {5} kara mili uzaklıkta olan {0} saat {1}:{2}''de başlıyor {3}:{4}''de bitiyor"
564 |
565 | #:
566 | msgid "Remark.Tornadic.Activity.Ending"
567 | msgstr "{4} istasyonunda {3} kara mili uzaklıkta olan {0} saat {1}:{2}''de bitiyor"
568 |
569 | #:
570 | msgid "Remark.TORNADO"
571 | msgstr "hortum"
572 |
573 | #:
574 | msgid "Remark.Tower.Visibility"
575 | msgstr "kontrol kulesi görüş mesafesi {0} kara mili"
576 |
577 | #:
578 | msgid "Remark.Variable.Prevailing.Visibility"
579 | msgstr "{0} ve {1} kara mili arasında değişken geçerli görünürlük"
580 |
581 | #:
582 | msgid "Remark.Variable.Sky.Condition"
583 | msgstr "bulut katmanı {0} ve {1} arasında değişken"
584 |
585 | #:
586 | msgid "Remark.Variable.Sky.Condition.Height"
587 | msgstr "{0} feette bulut katmanı {1} ve {2} arasında değişken"
588 |
589 | #:
590 | msgid "Remark.VIRGA"
591 | msgstr "virga"
592 |
593 | #:
594 | msgid "Remark.Virga.Direction"
595 | msgstr "{0} istasyonunda virga"
596 |
597 | #:
598 | msgid "Remark.WATERSPOUT"
599 | msgstr "su hortumu"
600 |
601 | #:
602 | msgid "Remark.Water.Equivalent.Snow.Ground"
603 | msgstr "{0} inç kar su eşdeğeri"
604 |
605 | #:
606 | msgid "Remark.WindShift"
607 | msgstr "rüzgar yön kırılması saat {0}:{1}"
608 |
609 | #:
610 | msgid "Remark.WindShift.FROPA"
611 | msgstr "saat {0}:{1}''te önden geçiş eşliğinde rüzgar değişimi"
612 |
613 | #:
614 | msgid "MetarFacade.InvalidIcao"
615 | msgstr "Icao kodu geçersiz."
616 |
617 | #:
618 | msgid "Converter.D"
619 | msgstr "azalan"
620 |
621 | #:
622 | msgid "Converter.E"
623 | msgstr "Doğu"
624 |
625 | #:
626 | msgid "Converter.ENE"
627 | msgstr "Doğu/KuzeyDoğu"
628 |
629 | #:
630 | msgid "Converter.ESE"
631 | msgstr "Doğu/GündeyDoğu"
632 |
633 | #:
634 | msgid "Converter.N"
635 | msgstr "Kuzey"
636 |
637 | #:
638 | msgid "Converter.NE"
639 | msgstr "KuzeyDoğu"
640 |
641 | #:
642 | msgid "Converter.NNE"
643 | msgstr "Kuzey/KuzeyDoğu"
644 |
645 | #:
646 | msgid "Converter.NNW"
647 | msgstr "Kuzey/KuzeyBatı"
648 |
649 | #:
650 | msgid "Converter.NSC"
651 | msgstr "önemli değişiklik yok"
652 |
653 | #:
654 | msgid "Converter.NW"
655 | msgstr "KuzeyBatı"
656 |
657 | #:
658 | msgid "Converter.S"
659 | msgstr "Güney"
660 |
661 | #:
662 | msgid "Converter.SE"
663 | msgstr "GüneyDoğu"
664 |
665 | #:
666 | msgid "Converter.SSE"
667 | msgstr "Güney/GüneyDoğu"
668 |
669 | #:
670 | msgid "Converter.SSW"
671 | msgstr "Güney/GüneyBatı"
672 |
673 | #:
674 | msgid "Converter.SW"
675 | msgstr "GüneyBatı"
676 |
677 | #:
678 | msgid "Converter.U"
679 | msgstr "artan"
680 |
681 | #:
682 | msgid "Converter.VRB"
683 | msgstr "Değişken"
684 |
685 | #:
686 | msgid "Converter.W"
687 | msgstr "Batı"
688 |
689 | #:
690 | msgid "Converter.WNW"
691 | msgstr "Batı/KuzeyBatı"
692 |
693 | #:
694 | msgid "Converter.WSW"
695 | msgstr "Batı/GüneyBatı"
696 |
697 | #:
698 | msgid "WeatherChangeType.FM"
699 | msgstr "İtibaren"
700 |
701 | #:
702 | msgid "WeatherChangeType.BECMG"
703 | msgstr "Oluşacak"
704 |
705 | #:
706 | msgid "WeatherChangeType.INTER"
707 | msgstr "Aralıklı"
708 |
709 | #:
710 | msgid "WeatherChangeType.TEMPO"
711 | msgstr "Geçici"
712 |
713 | #:
714 | msgid "WeatherChangeType.PROB"
715 | msgstr "Olasılık"
716 |
717 | #:
718 | msgid "TimeIndicator.AT"
719 | msgstr "şurada"
720 |
721 | #:
722 | msgid "TimeIndicator.FM"
723 | msgstr "İtibaren"
724 |
725 | #:
726 | msgid "TimeIndicator.TL"
727 | msgstr "-e kadar"
728 |
729 | #:
730 | msgid "ToString.airport"
731 | msgstr "havaalanı"
732 |
733 | #:
734 | msgid "ToString.altimeter"
735 | msgstr "altimetre (hPa)"
736 |
737 | #:
738 | msgid "ToString.amendment"
739 | msgstr "düzeltme"
740 |
741 | #:
742 | msgid "ToString.auto"
743 | msgstr "otomatik"
744 |
745 | #:
746 | msgid "ToString.cavok"
747 | msgstr "cavok"
748 |
749 | #:
750 | msgid "ToString.clouds"
751 | msgstr "bulutlar"
752 |
753 | #:
754 | msgid "ToString.day.month"
755 | msgstr "ayın günü"
756 |
757 | #:
758 | msgid "ToString.day.hour"
759 | msgstr "günün saati"
760 |
761 | #:
762 | msgid "ToString.deposit.braking"
763 | msgstr "frenleme kapasitesi"
764 |
765 | #:
766 | msgid "ToString.deposit.coverage"
767 | msgstr "kapsam"
768 |
769 | #:
770 | msgid "ToString.deposit.thickness"
771 | msgstr "kalınlık"
772 |
773 | #:
774 | msgid "ToString.deposit.type"
775 | msgstr "kirlilik tipi"
776 |
777 | #:
778 | msgid "ToString.descriptive"
779 | msgstr "açıklama"
780 |
781 | #:
782 | msgid "ToString.dew.point"
783 | msgstr "işba sıcaklık"
784 |
785 | #:
786 | msgid "ToString.end.day.month"
787 | msgstr "ayın bitiş günü"
788 |
789 | #:
790 | msgid "ToString.end.hour.day"
791 | msgstr "günün bitiş saati"
792 |
793 | #:
794 | msgid "ToString.height.feet"
795 | msgstr "yükseklik (ft)"
796 |
797 | #:
798 | msgid "ToString.height.meter"
799 | msgstr "yükseklik (m)"
800 |
801 | #:
802 | msgid "ToString.intensity"
803 | msgstr "yoğunluk"
804 |
805 | #:
806 | msgid "ToString.indicator"
807 | msgstr "gösterge"
808 |
809 | #:
810 | msgid "ToString.message"
811 | msgstr "orijinal mesaj"
812 |
813 | #:
814 | msgid "ToString.name"
815 | msgstr "isim"
816 |
817 | #:
818 | msgid "ToString.nosig"
819 | msgstr "önemli değişiklik yok"
820 |
821 | #:
822 | msgid "ToString.phenomenons"
823 | msgstr "olaylar"
824 |
825 | #:
826 | msgid "ToString.probability"
827 | msgstr "olasılık"
828 |
829 | #:
830 | msgid "ToString.quantity"
831 | msgstr "miktar"
832 |
833 | #:
834 | msgid "ToString.remark"
835 | msgstr "diğer hususlar"
836 |
837 | #:
838 | msgid "ToString.report.time"
839 | msgstr "rapor zamanı"
840 |
841 | #:
842 | msgid "ToString.runway.info"
843 | msgstr "pistlerin bilgisi"
844 |
845 | #:
846 | msgid "ToString.start.day.month"
847 | msgstr "ayın başlangıç günü"
848 |
849 | #:
850 | msgid "ToString.start.hour.day"
851 | msgstr "günün başlangıç saati"
852 |
853 | #:
854 | msgid "ToString.start.minute"
855 | msgstr "başlangıç dakikası"
856 |
857 | #:
858 | msgid "ToString.temperature"
859 | msgstr "sıcaklık (°C)"
860 |
861 | #:
862 | msgid "ToString.temperature.max"
863 | msgstr "maksimum sıcaklık (℃)"
864 |
865 | #:
866 | msgid "ToString.temperature.min"
867 | msgstr "minimum sıcaklık (℃)"
868 |
869 | #:
870 | msgid "ToString.trend"
871 | msgstr "trend"
872 |
873 | #:
874 | msgid "ToString.trends"
875 | msgstr "trendler"
876 |
877 | #:
878 | msgid "ToString.type"
879 | msgstr "tip"
880 |
881 | #:
882 | msgid "ToString.visibility.main"
883 | msgstr "asıl görüş"
884 |
885 | #:
886 | msgid "ToString.visibility.min"
887 | msgstr "minimum görüş"
888 |
889 | #:
890 | msgid "ToString.visibility.min.direction"
891 | msgstr "minimum görüş yönü"
892 |
893 | #:
894 | msgid "ToString.visibility.max"
895 | msgstr "maksimum görüş"
896 |
897 | #:
898 | msgid "ToString.vertical.visibility"
899 | msgstr "dikey görüş (ft)"
900 |
901 | #:
902 | msgid "ToString.weather.conditions"
903 | msgstr "hava koşulları"
904 |
905 | #:
906 | msgid "ToString.wind.direction"
907 | msgstr "yön"
908 |
909 | #:
910 | msgid "ToString.wind.direction.degrees"
911 | msgstr "yön (derece)"
912 |
913 | #:
914 | msgid "ToString.wind.gusts"
915 | msgstr "hamleler"
916 |
917 | #:
918 | msgid "ToString.wind.min.variation"
919 | msgstr "minimum rüzgar değişim"
920 |
921 | #:
922 | msgid "ToString.wind.max.variation"
923 | msgstr "maksimum rüzgar değişim"
924 |
925 | #:
926 | msgid "ToString.wind.speed"
927 | msgstr "hız"
928 |
929 | #:
930 | msgid "ToString.wind.unit"
931 | msgstr "birim"
932 |
933 |
--------------------------------------------------------------------------------
/metar_taf_parser/locale/zh-CN/LC_MESSAGES/messages.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/locale/zh-CN/LC_MESSAGES/messages.mo
--------------------------------------------------------------------------------
/metar_taf_parser/locale/zh-CN/LC_MESSAGES/messages.po:
--------------------------------------------------------------------------------
1 | msgid ""
2 | msgstr ""
3 | "MIME-Version: 1.0"
4 | "Content-Type: text/plain; charset=UTF-8"
5 | "Content-Transfer-Encoding: 8bit"
6 | "X-Generator: prop2po"
7 | "Project-Id-Version: metar_taf_parser"
8 | "Language: zn-CN"
9 | #:
10 | msgid "CloudQuantity.BKN"
11 | msgstr "5-7分云"
12 |
13 | #:
14 | msgid "CloudQuantity.FEW"
15 | msgstr "少云"
16 |
17 | #:
18 | msgid "CloudQuantity.NSC"
19 | msgstr "没有明显的云。"
20 |
21 | #:
22 | msgid "CloudQuantity.OVC"
23 | msgstr "满天云"
24 |
25 | #:
26 | msgid "CloudQuantity.SCT"
27 | msgstr "3-4分云"
28 |
29 | #:
30 | msgid "CloudQuantity.SKC"
31 | msgstr "天空晴朗"
32 |
33 | #:
34 | msgid "CloudType.AC"
35 | msgstr "高积云"
36 |
37 | #:
38 | msgid "CloudType.AS"
39 | msgstr "高层云"
40 |
41 | #:
42 | msgid "CloudType.CB"
43 | msgstr "积雨云"
44 |
45 | #:
46 | msgid "CloudType.CC"
47 | msgstr "卷积云"
48 |
49 | #:
50 | msgid "CloudType.CI"
51 | msgstr "Cirrus"
52 |
53 | #:
54 | msgid "CloudType.CS"
55 | msgstr "卷层云"
56 |
57 | #:
58 | msgid "CloudType.CU"
59 | msgstr "积云"
60 |
61 | #:
62 | msgid "CloudType.NS"
63 | msgstr "雨层云"
64 |
65 | #:
66 | msgid "CloudType.SC"
67 | msgstr "层积云"
68 |
69 | #:
70 | msgid "CloudType.ST"
71 | msgstr "层云"
72 |
73 | #:
74 | msgid "CloudType.TCU"
75 | msgstr "高耸积云"
76 |
77 | #:
78 | msgid "DepositBrakingCapacity.//"
79 | msgstr "未报告"
80 |
81 | #:
82 | msgid "DepositBrakingCapacity.91"
83 | msgstr "差"
84 |
85 | #:
86 | msgid "DepositBrakingCapacity.92"
87 | msgstr "中差"
88 |
89 | #:
90 | msgid "DepositBrakingCapacity.93"
91 | msgstr "中"
92 |
93 | #:
94 | msgid "DepositBrakingCapacity.94"
95 | msgstr "良好"
96 |
97 | #:
98 | msgid "DepositBrakingCapacity.95"
99 | msgstr "好"
100 |
101 | #:
102 | msgid "DepositBrakingCapacity.99"
103 | msgstr "数字不可靠"
104 |
105 | #:
106 | msgid "DepositBrakingCapacity.default"
107 | msgstr "摩擦系数为 {0}"
108 |
109 | #:
110 | msgid "DepositCoverage.NOT_REPORTED"
111 | msgstr "未报告"
112 |
113 | #:
114 | msgid "DepositCoverage.LESS_10"
115 | msgstr "低于10%"
116 |
117 | #:
118 | msgid "DepositCoverage.FROM_11_TO_25"
119 | msgstr "从11%到25%"
120 |
121 | #:
122 | msgid "DepositCoverage.FROM_26_TO_50"
123 | msgstr "从26%到50%"
124 |
125 | #:
126 | msgid "DepositCoverage.FROM_51_TO_100"
127 | msgstr "从51%到100%"
128 |
129 | #:
130 | msgid "DepositThickness.//"
131 | msgstr "未报告"
132 |
133 | #:
134 | msgid "DepositThickness.00"
135 | msgstr "小于 1 毫米"
136 |
137 | #:
138 | msgid "DepositThickness.92"
139 | msgstr "10 厘米"
140 |
141 | #:
142 | msgid "DepositThickness.93"
143 | msgstr "15 厘米"
144 |
145 | #:
146 | msgid "DepositThickness.94"
147 | msgstr "20 厘米"
148 |
149 | #:
150 | msgid "DepositThickness.95"
151 | msgstr "25 厘米"
152 |
153 | #:
154 | msgid "DepositThickness.96"
155 | msgstr "30 厘米"
156 |
157 | #:
158 | msgid "DepositThickness.97"
159 | msgstr "35 厘米"
160 |
161 | #:
162 | msgid "DepositThickness.98"
163 | msgstr "40厘米或以上"
164 |
165 | #:
166 | msgid "DepositThickness.99"
167 | msgstr "已关闭"
168 |
169 | #:
170 | msgid "DepositThickness.default"
171 | msgstr "{0} 毫米"
172 |
173 | #:
174 | msgid "DepositType.NOT_REPORTED"
175 | msgstr "未报告"
176 |
177 | #:
178 | msgid "DepositType.CLEAR_DRY"
179 | msgstr "干净"
180 |
181 | #:
182 | msgid "DepositType.DAMP"
183 | msgstr "潮湿"
184 |
185 | #:
186 | msgid "DepositType.WET_WATER_PATCHES"
187 | msgstr "湿和水纹"
188 |
189 | #:
190 | msgid "DepositType.RIME_FROST_COVERED"
191 | msgstr "雾凇和霜覆盖"
192 |
193 | #:
194 | msgid "DepositType.DRY_SNOW"
195 | msgstr "干雪"
196 |
197 | #:
198 | msgid "DepositType.WET_SNOW"
199 | msgstr "湿雪"
200 |
201 | #:
202 | msgid "DepositType.ICE"
203 | msgstr "冰"
204 |
205 | #:
206 | msgid "DepositType.COMPACTED_SNOW"
207 | msgstr "压实或滚压的雪"
208 |
209 | #:
210 | msgid "DepositType.FROZEN_RIDGES"
211 | msgstr "冷冻的轮辙或冰脊"
212 |
213 | #:
214 | msgid "DepositType.SLUSH"
215 | msgstr "雪浆"
216 |
217 | #:
218 | msgid "Descriptive.BC"
219 | msgstr "补丁"
220 |
221 | #:
222 | msgid "Descriptive.BL"
223 | msgstr "吹"
224 |
225 | #:
226 | msgid "Descriptive.DR"
227 | msgstr "低漂"
228 |
229 | #:
230 | msgid "Descriptive.FZ"
231 | msgstr "冰冻"
232 |
233 | #:
234 | msgid "Descriptive.MI"
235 | msgstr "浅"
236 |
237 | #:
238 | msgid "Descriptive.PR"
239 | msgstr "部分的"
240 |
241 | #:
242 | msgid "Descriptive.SH"
243 | msgstr "阵雨"
244 |
245 | #:
246 | msgid "Descriptive.TS"
247 | msgstr "雷雨"
248 |
249 | #:
250 | msgid "Error.prefix"
251 | msgstr "发生错误。 错误代码 n°"
252 |
253 | #:
254 | msgid "ErrorCode.AirportNotFound"
255 | msgstr "找不到此消息的机场。"
256 |
257 | #:
258 | msgid "ErrorCode.InvalidMessage"
259 | msgstr "输入的消息无效。"
260 |
261 | #:
262 | msgid "Flag.AMD"
263 | msgstr "修正后的TAF"
264 |
265 | #:
266 | msgid "Flag.AUTO"
267 | msgstr "自动生成的METAR"
268 |
269 | #:
270 | msgid "Flag.CNL"
271 | msgstr "已取消的TAF"
272 |
273 | #:
274 | msgid "Flag.COR"
275 | msgstr "已更正的METAR/TAF"
276 |
277 | #:
278 | msgid "Flag.NIL"
279 | msgstr "暂无数据"
280 |
281 | #:
282 | msgid "IcingIntensity.0"
283 | msgstr "微量结冰"
284 |
285 | #:
286 | msgid "IcingIntensity.1"
287 | msgstr "轻度混合结冰"
288 |
289 | #:
290 | msgid "IcingIntensity.2"
291 | msgstr "云中轻度霜冻结冰"
292 |
293 | #:
294 | msgid "IcingIntensity.7"
295 | msgstr "重度混合结冰"
296 |
297 | #:
298 | msgid "Indicator.M"
299 | msgstr "小于"
300 |
301 | #:
302 | msgid "Indicator.P"
303 | msgstr "大于"
304 |
305 | #:
306 | msgid "Intensity.-"
307 | msgstr "弱的"
308 |
309 | #:
310 | msgid "Intensity.+"
311 | msgstr "强的"
312 |
313 | #:
314 | msgid "Intensity.VC"
315 | msgstr "在附近"
316 |
317 | #:
318 | msgid "Phenomenon.BR"
319 | msgstr "薄雾"
320 |
321 | #:
322 | msgid "Phenomenon.DS"
323 | msgstr "沙尘暴"
324 |
325 | #:
326 | msgid "Phenomenon.DU"
327 | msgstr "弥漫的灰尘"
328 |
329 | #:
330 | msgid "Phenomenon.DZ"
331 | msgstr "细雨"
332 |
333 | #:
334 | msgid "Phenomenon.FC"
335 | msgstr "漏斗云"
336 |
337 | #:
338 | msgid "Phenomenon.FG"
339 | msgstr "雾"
340 |
341 | #:
342 | msgid "Phenomenon.FU"
343 | msgstr "烟"
344 |
345 | #:
346 | msgid "Phenomenon.GR"
347 | msgstr "冰雹"
348 |
349 | #:
350 | msgid "Phenomenon.GS"
351 | msgstr "小冰雹和/或雪粒"
352 |
353 | #:
354 | msgid "Phenomenon.HZ"
355 | msgstr "雾霾"
356 |
357 | #:
358 | msgid "Phenomenon.IC"
359 | msgstr "冰晶"
360 |
361 | #:
362 | msgid "Phenomenon.PL"
363 | msgstr "冰粒"
364 |
365 | #:
366 | msgid "Phenomenon.PO"
367 | msgstr "尘土或沙尘旋风"
368 |
369 | #:
370 | msgid "Phenomenon.PY"
371 | msgstr "喷"
372 |
373 | #:
374 | msgid "Phenomenon.RA"
375 | msgstr "雨"
376 |
377 | #:
378 | msgid "Phenomenon.SA"
379 | msgstr "沙"
380 |
381 | #:
382 | msgid "Phenomenon.SG"
383 | msgstr "雪粒"
384 |
385 | #:
386 | msgid "Phenomenon.SN"
387 | msgstr "雪"
388 |
389 | #:
390 | msgid "Phenomenon.SQ"
391 | msgstr "狂风"
392 |
393 | #:
394 | msgid "Phenomenon.SS"
395 | msgstr "沙暴"
396 |
397 | #:
398 | msgid "Phenomenon.UP"
399 | msgstr "未知降水"
400 |
401 | #:
402 | msgid "Phenomenon.VA"
403 | msgstr "火山灰"
404 |
405 | #:
406 | msgid "Phenomenon.TS"
407 | msgstr "雷雨"
408 |
409 | #:
410 | msgid "Remark.AO1"
411 | msgstr "没有降水鉴别器的自动化站"
412 |
413 | #:
414 | msgid "Remark.AO2"
415 | msgstr "带有降水鉴别器的自动化站"
416 |
417 | #:
418 | msgid "Remark.ALQDS"
419 | msgstr "全象限"
420 |
421 | #:
422 | msgid "Remark.Barometer.0"
423 | msgstr "先增加后减少"
424 |
425 | #:
426 | msgid "Remark.Barometer.1"
427 | msgstr "先增加后稳定, 或是先增加后缓慢增加"
428 |
429 | #:
430 | msgid "Remark.Barometer.2"
431 | msgstr "稳定或不稳定的增加"
432 |
433 | #:
434 | msgid "Remark.Barometer.3"
435 | msgstr "先减少或保持稳定,然后增加;或先增加然后快速增加"
436 |
437 | #:
438 | msgid "Remark.Barometer.4"
439 | msgstr "稳定"
440 |
441 | #:
442 | msgid "Remark.Barometer.5"
443 | msgstr "减小,然后增加"
444 |
445 | #:
446 | msgid "Remark.Barometer.6"
447 | msgstr "先减少后稳定;或先减少后更缓慢减少"
448 |
449 | #:
450 | msgid "Remark.Barometer.7"
451 | msgstr "稳定或不稳定地减少"
452 |
453 | #:
454 | msgid "Remark.Barometer.8"
455 | msgstr "先稳定或增加,然后减少;或先减少快速减少"
456 |
457 | #:
458 | msgid "Remark.BASED"
459 | msgstr "基于"
460 |
461 | #:
462 | msgid "Remark.Ceiling.Height"
463 | msgstr "上限在 {0} 到 {1} 英尺之间变化"
464 |
465 | #:
466 | msgid "Remark.Ceiling.Second.Location"
467 | msgstr "由位于 {1} 处的第二个传感器测量的 {0} 英尺的上限"
468 |
469 | #:
470 | msgid "Remark.DSNT"
471 | msgstr "距离"
472 |
473 | #:
474 | msgid "Remark.FCST"
475 | msgstr "预报"
476 |
477 | #:
478 | msgid "Remark.FUNNELCLOUD"
479 | msgstr "漏斗云"
480 |
481 | #:
482 | msgid "Remark.Hail"
483 | msgstr "直径为 {0} 英寸的最大的冰雹"
484 |
485 | #:
486 | msgid "Remark.Hail.LesserThan"
487 | msgstr "直径小于 {0} 英寸的最大的冰雹"
488 |
489 | #:
490 | msgid "Remark.Hourly.Maximum.Temperature"
491 | msgstr "6小时最高温度为{0}°C"
492 |
493 | #:
494 | msgid "Remark.Hourly.Maximum.Minimum.Temperature"
495 | msgstr "24小时最高温度为{0}°C,24小时最低温度为{1}°C"
496 |
497 | #:
498 | msgid "Remark.Hourly.Minimum.Temperature"
499 | msgstr "6 小时最低温度为 {0}° C"
500 |
501 | #:
502 | msgid "Remark.Hourly.Temperature"
503 | msgstr "小时气温 {0}°C"
504 |
505 | #:
506 | msgid "Remark.Hourly.Temperature.Dew.Point"
507 | msgstr "小时气温为{0}°C,露点为{1}°C"
508 |
509 | #:
510 | msgid "Remark.Ice.Accretion.Amount"
511 | msgstr "过去{1} 小时内积冰{0}/100英寸"
512 |
513 | #:
514 | msgid "Remark.HVY"
515 | msgstr "重度的"
516 |
517 | #:
518 | msgid "Remark.LGT"
519 | msgstr "轻微的"
520 |
521 | #:
522 | msgid "Remark.LTG"
523 | msgstr "闪电"
524 |
525 | #:
526 | msgid "Remark.MOD"
527 | msgstr "中等"
528 |
529 | #:
530 | msgid "Remark.Obscuration"
531 | msgstr "{0} 层位于 {1} 英尺,由 {2} 组成"
532 |
533 | #:
534 | msgid "Remark.ON"
535 | msgstr "在"
536 |
537 | #:
538 | msgid "Remark.NXT"
539 | msgstr "下一个"
540 |
541 | #:
542 | msgid "Remark.PeakWind"
543 | msgstr "在 {2}:{3} 有位于 {0} 度,风速 {1} 节的峰值风"
544 |
545 | #:
546 | msgid "Remark.PRESFR"
547 | msgstr "气压骤降"
548 |
549 | #:
550 | msgid "Remark.PRESRR"
551 | msgstr "气压骤升"
552 |
553 | #:
554 | msgid "Remark.Sea.Level.Pressure"
555 | msgstr "海平面气压{0} 百帕"
556 |
557 | #:
558 | msgid "Remark.TORNADO"
559 | msgstr "龙卷风"
560 |
561 | #:
562 | msgid "Remark.VIRGA"
563 | msgstr "幡状云"
564 |
565 | #:
566 | msgid "Remark.WATERSPOUT"
567 | msgstr "水龙卷"
568 |
569 | #:
570 | msgid "Remark.Water.Equivalent.Snow.Ground"
571 | msgstr "相当于{0} 英寸雪的降水"
572 |
573 | #:
574 | msgid "Remark.WindShift"
575 | msgstr "风力转变于 {0}:{1}"
576 |
577 | #:
578 | msgid "MetarFacade.InvalidIcao"
579 | msgstr "ICAO 代码无效。"
580 |
581 | #:
582 | msgid "Converter.D"
583 | msgstr "减少"
584 |
585 | #:
586 | msgid "Converter.E"
587 | msgstr "东"
588 |
589 | #:
590 | msgid "Converter.ENE"
591 | msgstr "东东北"
592 |
593 | #:
594 | msgid "Converter.ESE"
595 | msgstr "东东南"
596 |
597 | #:
598 | msgid "Converter.N"
599 | msgstr "北"
600 |
601 | #:
602 | msgid "Converter.NE"
603 | msgstr "东北"
604 |
605 | #:
606 | msgid "Converter.NNE"
607 | msgstr "北东北"
608 |
609 | #:
610 | msgid "Converter.NNW"
611 | msgstr "北西北"
612 |
613 | #:
614 | msgid "Converter.NSC"
615 | msgstr "无明显变化"
616 |
617 | #:
618 | msgid "Converter.NW"
619 | msgstr "西北"
620 |
621 | #:
622 | msgid "Converter.S"
623 | msgstr "南"
624 |
625 | #:
626 | msgid "Converter.SE"
627 | msgstr "东南"
628 |
629 | #:
630 | msgid "Converter.SSE"
631 | msgstr "南东南"
632 |
633 | #:
634 | msgid "Converter.SSW"
635 | msgstr "南西南"
636 |
637 | #:
638 | msgid "Converter.SW"
639 | msgstr "西南"
640 |
641 | #:
642 | msgid "Converter.U"
643 | msgstr "上升"
644 |
645 | #:
646 | msgid "Converter.VRB"
647 | msgstr "多变的"
648 |
649 | #:
650 | msgid "Converter.W"
651 | msgstr "西"
652 |
653 | #:
654 | msgid "Converter.WNW"
655 | msgstr "西西北"
656 |
657 | #:
658 | msgid "Converter.WSW"
659 | msgstr "西西南"
660 |
661 | #:
662 | msgid "WeatherChangeType.FM"
663 | msgstr "从"
664 |
665 | #:
666 | msgid "WeatherChangeType.BECMG"
667 | msgstr "变得"
668 |
669 | #:
670 | msgid "WeatherChangeType.INTER"
671 | msgstr "间歇的"
672 |
673 | #:
674 | msgid "WeatherChangeType.TEMPO"
675 | msgstr "暂时的"
676 |
677 | #:
678 | msgid "WeatherChangeType.PROB"
679 | msgstr "可能性"
680 |
681 | #:
682 | msgid "TimeIndicator.AT"
683 | msgstr "在"
684 |
685 | #:
686 | msgid "TimeIndicator.FM"
687 | msgstr "从"
688 |
689 | #:
690 | msgid "TimeIndicator.TL"
691 | msgstr "直到"
692 |
693 | #:
694 | msgid "ToString.airport"
695 | msgstr "机场"
696 |
697 | #:
698 | msgid "ToString.altimeter"
699 | msgstr "修正海压(百帕)"
700 |
701 | #:
702 | msgid "ToString.amendment"
703 | msgstr "修订"
704 |
705 | #:
706 | msgid "ToString.auto"
707 | msgstr "自动观测"
708 |
709 | #:
710 | msgid "ToString.cavok"
711 | msgstr "能见度≥10km"
712 |
713 | #:
714 | msgid "ToString.clouds"
715 | msgstr "云"
716 |
717 | #:
718 | msgid "ToString.day.month"
719 | msgstr "当月某天"
720 |
721 | #:
722 | msgid "ToString.day.hour"
723 | msgstr "当日某小时"
724 |
725 | #:
726 | msgid "ToString.deposit.braking"
727 | msgstr "制动能力"
728 |
729 | #:
730 | msgid "ToString.deposit.coverage"
731 | msgstr "覆盖范围"
732 |
733 | #:
734 | msgid "ToString.deposit.thickness"
735 | msgstr "厚度"
736 |
737 | #:
738 | msgid "ToString.deposit.type"
739 | msgstr "沉积物类型"
740 |
741 | #:
742 | msgid "ToString.descriptive"
743 | msgstr "描述"
744 |
745 | #:
746 | msgid "ToString.dew.point"
747 | msgstr "露点"
748 |
749 | #:
750 | msgid "ToString.end.day.month"
751 | msgstr "当月的结束日"
752 |
753 | #:
754 | msgid "ToString.end.hour.day"
755 | msgstr "当日的结束小时"
756 |
757 | #:
758 | msgid "ToString.flags"
759 | msgstr "旗子"
760 |
761 | #:
762 | msgid "ToString.height.feet"
763 | msgstr "高度(英尺)"
764 |
765 | #:
766 | msgid "ToString.height.meter"
767 | msgstr "高度(米)"
768 |
769 | #:
770 | msgid "ToString.intensity"
771 | msgstr "强度"
772 |
773 | #:
774 | msgid "ToString.indicator"
775 | msgstr "指示器"
776 |
777 | #:
778 | msgid "ToString.message"
779 | msgstr "原始消息"
780 |
781 | #:
782 | msgid "ToString.name"
783 | msgstr "名称"
784 |
785 | #:
786 | msgid "ToString.nosig"
787 | msgstr "无重大变化"
788 |
789 | #:
790 | msgid "ToString.phenomenons"
791 | msgstr "现象"
792 |
793 | #:
794 | msgid "ToString.probability"
795 | msgstr "可能性"
796 |
797 | #:
798 | msgid "ToString.quantity"
799 | msgstr "数量"
800 |
801 | #:
802 | msgid "ToString.remark"
803 | msgstr "备注"
804 |
805 | #:
806 | msgid "ToString.report.time"
807 | msgstr "报告时间"
808 |
809 | #:
810 | msgid "ToString.runway.info"
811 | msgstr "跑道信息"
812 |
813 | #:
814 | msgid "ToString.start.day.month"
815 | msgstr "当月起始日"
816 |
817 | #:
818 | msgid "ToString.start.hour.day"
819 | msgstr "当日起始小时"
820 |
821 | #:
822 | msgid "ToString.start.minute"
823 | msgstr "起始分钟"
824 |
825 | #:
826 | msgid "ToString.temperature"
827 | msgstr "温度(°C)"
828 |
829 | #:
830 | msgid "ToString.temperature.max"
831 | msgstr "最高温度(°C)"
832 |
833 | #:
834 | msgid "ToString.temperature.min"
835 | msgstr "最低温度(°C)"
836 |
837 | #:
838 | msgid "ToString.trend"
839 | msgstr "趋势预报"
840 |
841 | #:
842 | msgid "ToString.trends"
843 | msgstr "趋势"
844 |
845 | #:
846 | msgid "ToString.type"
847 | msgstr "类型"
848 |
849 | #:
850 | msgid "ToString.visibility.main"
851 | msgstr "主要能见度"
852 |
853 | #:
854 | msgid "ToString.visibility.min"
855 | msgstr "最小能见度"
856 |
857 | #:
858 | msgid "ToString.visibility.min.direction"
859 | msgstr "最小能见方向"
860 |
861 | #:
862 | msgid "ToString.visibility.max"
863 | msgstr "最大能见度"
864 |
865 | #:
866 | msgid "ToString.vertical.visibility"
867 | msgstr "垂直能见度(英尺)"
868 |
869 | #:
870 | msgid "ToString.weather.conditions"
871 | msgstr "天气状况"
872 |
873 | #:
874 | msgid "ToString.wind.direction"
875 | msgstr "方向"
876 |
877 | #:
878 | msgid "ToString.wind.direction.degrees"
879 | msgstr "方向(度)"
880 |
881 | #:
882 | msgid "ToString.wind.gusts"
883 | msgstr "阵风"
884 |
885 | #:
886 | msgid "ToString.wind.min.variation"
887 | msgstr "最小风力变化量"
888 |
889 | #:
890 | msgid "ToString.wind.max.variation"
891 | msgstr "最大风力变化量"
892 |
893 | #:
894 | msgid "ToString.wind.speed"
895 | msgstr "速度"
896 |
897 | #:
898 | msgid "ToString.wind.unit"
899 | msgstr "单位"
900 |
901 | #:
902 | msgid "TurbulenceIntensity.0"
903 | msgstr "无"
904 |
905 | #:
906 | msgid "TurbulenceIntensity.1"
907 | msgstr "轻度乱流"
908 |
909 | #:
910 | msgid "TurbulenceIntensity.8"
911 | msgstr "云中偶发重度颠簸"
912 |
913 | #:
914 | msgid "TurbulenceIntensity.X"
915 | msgstr "极端乱流"
916 |
917 |
--------------------------------------------------------------------------------
/metar_taf_parser/model/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/model/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/model/enum.py:
--------------------------------------------------------------------------------
1 | import enum
2 |
3 | from metar_taf_parser.commons.i18n import _
4 |
5 |
6 | class CloudQuantity(enum.Enum):
7 | SKC = 'SKC' # Sky clear
8 | FEW = 'FEW' # Few
9 | BKN = 'BKN' # Broken
10 | SCT = 'SCT' # Scattered
11 | OVC = 'OVC' # Overcast
12 | NSC = 'NSC' # No significant cloud
13 |
14 | def __repr__(self):
15 | return _('CloudQuantity.' + self.value)
16 |
17 |
18 | class CloudType(enum.Enum):
19 | CB = 'CB' # Cumulonimbus
20 | TCU = 'TCU' # Towering cumulus, cumulus congestus
21 | CI = 'CI' # Cirrus
22 | CC = 'CC' # Cirrocumulus
23 | CS = 'CS' # Cirrostratus
24 | AC = 'AC' # Altocumulus
25 | ST = 'ST' # Stratus
26 | CU = 'CU' # Cumulus
27 | AS = 'AS' # Astrostratus
28 | NS = 'NS' # Nimbostratus
29 | SC = 'SC' # Stratocumulus
30 |
31 | def __repr__(self):
32 | return _('CloudType.' + self.value)
33 |
34 |
35 | class DepositCoverage(enum.Enum):
36 | NOT_REPORTED = '/'
37 | LESS_10 = '1'
38 | FROM_11_TO_25 = '2'
39 | FROM_26_TO_50 = '5'
40 | FROM_51_TO_100 = '9'
41 |
42 | def __repr__(self):
43 | return _('DepositCoverage.' + self.name)
44 |
45 |
46 | class DepositType(enum.Enum):
47 | NOT_REPORTED = '/'
48 | CLEAR_DRY = '0'
49 | DAMP = '1'
50 | WET_WATER_PATCHES = '2'
51 | RIME_FROST_COVERED = '3'
52 | DRY_SNOW = '4'
53 | WET_SNOW = '5'
54 | SLUSH = '6'
55 | ICE = '7'
56 | COMPACTED_SNOW = '8'
57 | FROZEN_RIDGES = '9'
58 |
59 | def __repr__(self):
60 | return _('DepositType.' + self.name)
61 |
62 |
63 | class Descriptive(enum.Enum):
64 | SHOWERS = 'SH'
65 | SHALLOW = 'MI'
66 | PATCHES = 'BC'
67 | PARTIAL = 'PR'
68 | DRIFTING = 'DR'
69 | THUNDERSTORM = 'TS'
70 | BLOWING = 'BL'
71 | FREEZING = 'FZ'
72 |
73 | def __repr__(self):
74 | return _('Descriptive.' + self.value)
75 |
76 |
77 | class Flag(enum.Enum):
78 | AMD = 'AMD'
79 | AUTO = 'AUTO'
80 | CNL = 'CNL'
81 | COR = 'COR'
82 | NIL = 'NIL'
83 |
84 | def __repr__(self):
85 | return _('Flag.' + self.value)
86 |
87 |
88 | class IcingIntensity(enum.Enum):
89 | NONE = '0'
90 | LIGHT = '1'
91 | LIGHT_RIME_ICING_CLOUD = '2'
92 | LIGHT_CLEAR_ICING_PRECIPITATION = '3'
93 | MODERATE_MIXED_ICING = '4'
94 | MODERATE_RIME_ICING_CLOUD = '5'
95 | MODERATE_CLEAR_ICING_PRECIPITATION = '6'
96 | SEVERE_MIXED_ICING = '7'
97 | SEVERE_RIME_ICING_CLOUD = '8'
98 | SEVERE_CLEAR_ICING_PRECIPITATION = '9'
99 |
100 | def __repr__(self) -> str:
101 | return _('IcingIntensity.' + self.value)
102 |
103 |
104 | class Intensity(enum.Enum):
105 | LIGHT = '-'
106 | HEAVY = '+'
107 | IN_VICINITY = 'VC'
108 | RECENT = 'RE'
109 |
110 | def __repr__(self):
111 | return _('Intensity.' + self.value)
112 |
113 |
114 | class Phenomenon(enum.Enum):
115 | RAIN = 'RA'
116 | DRIZZLE = 'DZ'
117 | SNOW = 'SN'
118 | SNOW_GRAINS = 'SG'
119 | ICE_PELLETS = 'PL'
120 | ICE_CRYSTALS = 'IC'
121 | HAIL = 'GR'
122 | SMALL_HAIL = 'GS'
123 | UNKNOW_PRECIPITATION = 'UP'
124 | FOG = 'FG'
125 | VOLCANIC_ASH = 'VA'
126 | MIST = 'BR'
127 | HAZE = 'HZ'
128 | WIDESPREAD_DUST = 'DU'
129 | SMOKE = 'FU'
130 | SAND = 'SA'
131 | SPRAY = 'PY'
132 | SQUALL = 'SQ'
133 | SAND_WHIRLS = 'PO'
134 | DUSTSTORM = 'DS'
135 | SANDSTORM = 'SS'
136 | FUNNEL_CLOUD = 'FC'
137 |
138 | def __repr__(self):
139 | return _('Phenomenon.' + self.value)
140 |
141 |
142 | class TimeIndicator(enum.Enum):
143 | AT = 'AT'
144 | FM = 'FM'
145 | TL = 'TL'
146 |
147 | def __repr__(self):
148 | return _('TimeIndicator.' + self.value)
149 |
150 |
151 | class TurbulenceIntensity(enum.Enum):
152 | NONE = '0'
153 | LIGHT = '1'
154 | MODERATE_CLEAR_AIR_OCCASIONAL = '2'
155 | MODERATE_CLEAR_AIR_FREQUENT = '3'
156 | MODERATE_CLOUD_OCCASIONAL = '4'
157 | MODERATE_CLOUD_FREQUENT = '5'
158 | SEVERE_CLEAR_AIR_OCCASIONAL = '6'
159 | SEVERE_CLEAR_AIR_FREQUENT = '7'
160 | SEVERE_CLOUD_OCCASIONAL = '8'
161 | SEVERE_CLOUD_FREQUENT = '9'
162 | EXTREME = 'X'
163 |
164 | def __repr__(self) -> str:
165 | return _('TurbuleneIntensity.' + self.value)
166 |
167 |
168 | class WeatherChangeType(enum.Enum):
169 | FM = 'FM'
170 | BECMG = 'BECMG'
171 | TEMPO = 'TEMPO'
172 | PROB = 'PROB'
173 | INTER = 'INTER'
174 |
175 | def __repr__(self):
176 | return _('WeatherChangeType.' + self.value)
177 |
--------------------------------------------------------------------------------
/metar_taf_parser/parser/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/parser/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/parser/parser.py:
--------------------------------------------------------------------------------
1 | import abc
2 | import re
3 | from datetime import time
4 |
5 | from metar_taf_parser.command.common import CommandSupplier
6 | from metar_taf_parser.command.metar import CommandSupplier as MetarCommandSupplier
7 | from metar_taf_parser.command.remark import RemarkCommandSupplier
8 | from metar_taf_parser.command.taf import TAFCommandSupplier
9 | from metar_taf_parser.commons import converter
10 | from metar_taf_parser.commons.exception import TranslationError
11 | from metar_taf_parser.model.enum import Flag, Intensity, Descriptive, Phenomenon, TimeIndicator, WeatherChangeType
12 | from metar_taf_parser.model.model import WeatherCondition, Visibility, Metar, TemperatureDated, \
13 | AbstractWeatherContainer, TAF, TAFTrend, MetarTrend, Validity, FMValidity, MetarTrendTime
14 |
15 |
16 | def parse_delivery_time(abstract_weather_code, time_string):
17 | """
18 | Parses the delivery time of a METAR/TAF
19 | :param abstract_weather_code: The TAF or METAR object
20 | :param time_string: The string representing the delivery time
21 | :return: None
22 | """
23 | abstract_weather_code.day = int(time_string[0:2])
24 | abstract_weather_code.time = time(int(time_string[2:4]), int(time_string[4:6]))
25 |
26 |
27 | def _parse_flags(abstract_weather_code, flag_string):
28 | try:
29 | abstract_weather_code.flags.add(Flag(flag_string))
30 | return True
31 | except ValueError:
32 | return False
33 |
34 |
35 | def parse_remark(container: AbstractWeatherContainer, line: list, index: int):
36 | """
37 | This function parses the array containing the remark and concat the array into a string
38 | :param container: the metar, taf or taf trend to update
39 | :param line: The array containing the current line tokens
40 | :param index: the index starting the remark ie token RMK
41 | :return: None
42 | """
43 | remarks = RemarkParser().parse(str.join(' ', line[index + 1:]))
44 | container.remarks = remarks
45 | container.remark = str.join(' ', remarks)
46 |
47 |
48 | def _parse_temperature(input: str):
49 | """
50 | Parses the temperature in a TAF
51 | :param input: the string containing the temperature
52 | :return: TemperatureDated object
53 | """
54 | parts = input.split('/')
55 | temperature = TemperatureDated()
56 |
57 | temperature.temperature = converter.convert_temperature(parts[0][2:])
58 | temperature.day = int(parts[1][0:2])
59 | temperature.hour = int(parts[1][2:4])
60 | return temperature
61 |
62 |
63 | def _parse_validity(input: str):
64 | """
65 | Parses validity of a TAF or a TAFTrend
66 | :param input: the string containing the validity
67 | :return: Validity object
68 | """
69 | validity = Validity()
70 | parts = input.split('/')
71 | validity.start_day = int(parts[0][0:2])
72 | validity.start_hour = int(parts[0][2:])
73 | validity.end_day = int(parts[1][0:2])
74 | validity.end_hour = int(parts[1][2:])
75 | return validity
76 |
77 |
78 | def _parse_from_validity(input: str):
79 | """
80 | Parses the validity for a FROM taf trend
81 | :param input: the string containing the validity
82 | :return: a Validity object
83 | """
84 | validity = FMValidity()
85 | validity.start_day = int(input[2:4])
86 | validity.start_hour = int(input[4:6])
87 | validity.start_minutes = int(input[6:8])
88 |
89 | return validity
90 |
91 |
92 | class AbstractParser(abc.ABC):
93 | """
94 | Abstract class.
95 | Base parser.
96 | """
97 | FM = 'FM'
98 | TEMPO = 'TEMPO'
99 | BECMG = 'BECMG'
100 | RMK = 'RMK'
101 | TOKENIZE_REGEX = r'\s((?=\d\/\dSM)(? 10km'
161 | return True
162 |
163 | command = self._common_supplier.get(input)
164 | if command:
165 | return command.execute(abstract_weather_container, input)
166 |
167 | return abstract_weather_container.add_weather_condition(self._parse_weather_condition(input))
168 |
169 |
170 | class MetarParser(AbstractParser):
171 | """
172 | Parser to Metar messages.
173 | """
174 | AT = 'AT'
175 | TL = 'TL'
176 |
177 | def __init__(self):
178 | super().__init__()
179 | self._metar_command_supplier = MetarCommandSupplier()
180 |
181 | def _parse_trend(self, index: int, trend: MetarTrend, trend_parts: list):
182 | """
183 | Parses a trend of a metar
184 | :param index: the index starting the trend in the list
185 | :param trend: The trend to update
186 | :param trend_parts: string[] array of tokens
187 | :return: the last index of the token that was last parsed
188 | """
189 | i = index + 1
190 | while i < len(trend_parts) and AbstractParser.TEMPO != trend_parts[i] and AbstractParser.BECMG != trend_parts[i]:
191 | if trend_parts[i].startswith(AbstractParser.FM) or trend_parts[i].startswith(MetarParser.TL) or trend_parts[i].startswith(MetarParser.AT):
192 |
193 | trend_time = MetarTrendTime(TimeIndicator[trend_parts[i][0:2]])
194 | trend_time.time = time(int(trend_parts[i][2:4]), int(trend_parts[i][4:6]))
195 | trend.add_time(trend_time)
196 | else:
197 | self.general_parse(trend, trend_parts[i])
198 | i = i + 1
199 | return i - 1
200 |
201 | def parse(self, input: str):
202 | """
203 | Parses an message and returns a METAR
204 | :param input: The message to parse
205 | :return: METAR
206 | """
207 | metar = Metar()
208 |
209 | metar_tab = self.tokenize(input)
210 | metar.station = metar_tab[0]
211 |
212 | metar.message = input
213 |
214 | parse_delivery_time(metar, metar_tab[1])
215 | index = 2
216 | while index < len(metar_tab):
217 | if not super().general_parse(metar, metar_tab[index]) and not _parse_flags(metar, metar_tab[index]):
218 | if 'NOSIG' == metar_tab[index]:
219 | metar.nosig = True
220 | elif AbstractParser.TEMPO == metar_tab[index] or AbstractParser.BECMG == metar_tab[index]:
221 | trend = MetarTrend(WeatherChangeType[metar_tab[index]])
222 | index = self._parse_trend(index, trend, metar_tab)
223 | metar.add_trend(trend)
224 | elif AbstractParser.RMK == metar_tab[index]:
225 | parse_remark(metar, metar_tab, index)
226 | break
227 | else:
228 | command = self._metar_command_supplier.get(metar_tab[index])
229 | if command:
230 | command.execute(metar, metar_tab[index])
231 | index = index + 1
232 | return metar
233 |
234 |
235 | class TAFParser(AbstractParser):
236 | """
237 | Parser of TAF messages.
238 | """
239 | TAF = 'TAF'
240 | PROB = 'PROB'
241 | TX = 'TX'
242 | TN = 'TN'
243 |
244 | def __init__(self):
245 | super().__init__()
246 | self._validity_pattern = re.compile(r'^\d{4}/\d{4}$')
247 | self._taf_command_supplier = TAFCommandSupplier()
248 |
249 | def parse(self, input: str):
250 | """
251 | Parses a message into a TAF
252 | :param input: the message to parse
253 | :return: a TAF object or None if the message is invalid
254 | """
255 | taf = TAF()
256 | lines = self._extract_lines_tokens(input)
257 | if TAFParser.TAF != lines[0][0]:
258 | return
259 | index = 1
260 | if TAFParser.TAF == lines[0][1]:
261 | index = 2
262 | if _parse_flags(taf, lines[0][index]):
263 | index += 1
264 |
265 | taf.station = lines[0][index]
266 | index += 1
267 | taf.message = input
268 | parse_delivery_time(taf, lines[0][index])
269 | index += 1
270 | taf.validity = _parse_validity(lines[0][index])
271 |
272 | for i in range(index + 1, len(lines[0])):
273 | token = lines[0][i]
274 | command = self._taf_command_supplier.get(token)
275 | if AbstractParser.RMK == token:
276 | parse_remark(taf, lines[0], i)
277 | break
278 | elif token.startswith(TAFParser.TX):
279 | taf.max_temperature = _parse_temperature(token)
280 | elif token.startswith(TAFParser.TN):
281 | taf.min_temperature = _parse_temperature(token)
282 | elif command:
283 | command.execute(taf, token)
284 | else:
285 | _parse_flags(taf, token)
286 | self.general_parse(taf, token)
287 |
288 | # Handle the other lines
289 | for line in lines[1:]:
290 | self._parse_line(taf, line)
291 |
292 | return taf
293 |
294 | def _extract_lines_tokens(self, taf_code: str):
295 | """
296 | Format the message as a multiple line code so each line can be parsed
297 | :param taf_code: The base message
298 | :return: a list of string representing the lines of the message.
299 | """
300 | single_line = taf_code.replace('\n', ' ')
301 | clean_line = re.sub(r'\s{2,}', ' ', single_line)
302 | lines = re.sub(r'\s(PROB\d{2}\sTEMPO|TEMPO|INTER|BECMG|FM(?![A-Z]{2}\s)|PROB)', '\n\g<1>', clean_line).splitlines()
303 | lines_token = [self.tokenize(line) for line in lines]
304 |
305 | if len(lines_token) > 1:
306 | last_line = lines_token[len(lines) - 1]
307 | temperatures = list(filter(lambda x: x.startswith(TAFParser.TX) or x.startswith(TAFParser.TN), last_line))
308 |
309 | if temperatures:
310 | lines_token[0] = lines_token[0] + temperatures
311 | lines_token[len(lines) - 1] = list(filter(lambda x: not x.startswith(TAFParser.TX) and not x.startswith(TAFParser.TN), last_line))
312 | return lines_token
313 |
314 | def _parse_line(self, taf: TAF, line_tokens: list):
315 | """
316 | Parses the tokens of the line and updates the TAF object.
317 | :param taf: TAF object to update
318 | :param line_tokens: the array of tokens representing a line
319 | :return: None
320 | """
321 | index = 1
322 | if line_tokens[0].startswith(TAFParser.FM):
323 | trend = TAFTrend(WeatherChangeType.FM)
324 | trend.validity = _parse_from_validity(line_tokens[0])
325 | elif line_tokens[0].startswith(TAFParser.PROB):
326 | trend = TAFTrend(WeatherChangeType.PROB)
327 | if len(line_tokens) > 1 and TAFParser.TEMPO == line_tokens[1]:
328 | trend = TAFTrend(WeatherChangeType(line_tokens[1]))
329 | index = 2
330 | trend.probability = int(line_tokens[0][4:])
331 | else:
332 | trend = TAFTrend(WeatherChangeType(line_tokens[0]))
333 | self._parse_trend(index, line_tokens, trend)
334 | taf.add_trend(trend)
335 |
336 | def _parse_trend(self, index: int, line: list, trend: TAFTrend):
337 | """
338 | Parses a trend of the TAF
339 | :param index: the index at which the array should be parsed
340 | :param line: The array of string containing the line
341 | :param trend: The trend object to update
342 | :return: None
343 | """
344 | for i in range(index, len(line)):
345 | command = self._taf_command_supplier.get(line[i])
346 |
347 | if command:
348 | command.execute(trend, line[i])
349 | elif AbstractParser.RMK == line[i]:
350 | parse_remark(trend, line, i)
351 | break
352 | elif self._validity_pattern.search(line[i]):
353 | trend.validity = _parse_validity(line[i])
354 | else:
355 | super().general_parse(trend, line[i])
356 |
357 |
358 | class RemarkParser:
359 | def __init__(self):
360 | self._supplier = RemarkCommandSupplier()
361 |
362 | def parse(self, code: str) -> list:
363 | rmk_str = code
364 | rmk_list = []
365 |
366 | while rmk_str:
367 | try:
368 | (rmk_str, rmk_list) = self._supplier.get(rmk_str).execute(rmk_str, rmk_list)
369 | except TranslationError:
370 | (rmk_str, rmk_list) = self._supplier.default_command.execute(rmk_str, rmk_list)
371 | return rmk_list
372 |
--------------------------------------------------------------------------------
/metar_taf_parser/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/tests/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/tests/command/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/tests/command/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/tests/command/test_common.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from metar_taf_parser.command.common import CloudCommand, MainVisibilityNauticalMilesCommand, WindCommand, CommandSupplier
4 | from metar_taf_parser.model.enum import CloudQuantity, CloudType
5 | from metar_taf_parser.model.model import Metar
6 |
7 |
8 | class CommonTestCase(unittest.TestCase):
9 | def test_cloud_command_parse_sky_clear(self):
10 | command = CloudCommand()
11 | cloud = command.parse("SKC")
12 | self.assertIsNotNone(cloud)
13 | self.assertEqual(CloudQuantity.SKC, cloud.quantity)
14 | self.assertIsNone(cloud.height)
15 | self.assertIsNone(cloud.type)
16 |
17 | def test_cloud_command_parse_with_height(self):
18 | command = CloudCommand()
19 |
20 | cloud = command.parse('SCT016')
21 |
22 | self.assertEqual(CloudQuantity.SCT, cloud.quantity)
23 | self.assertEqual(1600, cloud.height)
24 | self.assertIsNone(cloud.type)
25 |
26 | def test_cloud_command_parse_with_type(self):
27 | command = CloudCommand()
28 |
29 | cloud = command.parse('SCT026CB')
30 |
31 | self.assertEqual(CloudQuantity.SCT, cloud.quantity)
32 | self.assertEqual(2600, cloud.height)
33 | self.assertEqual(CloudType.CB, cloud.type)
34 |
35 | def test_cloud_command_parse_NSC(self):
36 | command = CloudCommand()
37 |
38 | cloud = command.parse('NSC')
39 |
40 | self.assertEqual(CloudQuantity.NSC, cloud.quantity)
41 |
42 | def test_wind_command_parse_simple(self):
43 | command = WindCommand()
44 |
45 | wind = command.parse_wind('34008KT')
46 |
47 | self.assertEqual('NNW', wind.direction)
48 | self.assertEqual(340, wind.degrees)
49 | self.assertEqual(8, wind.speed)
50 | self.assertIsNone(wind.gust)
51 | self.assertEqual('KT', wind.unit)
52 |
53 | def test_wind_command_parse_gusts(self):
54 | command = WindCommand()
55 |
56 | wind = command.parse_wind('12017G20KT')
57 |
58 | self.assertEqual('ESE', wind.direction)
59 | self.assertEqual(120, wind.degrees)
60 | self.assertEqual(17, wind.speed)
61 | self.assertEqual(20, wind.gust)
62 | self.assertEqual('KT', wind.unit)
63 |
64 | def test_wind_command_parse_gusts_3_digits(self):
65 | command = WindCommand()
66 |
67 | wind = command.parse_wind('12017G015KT')
68 | self.assertEqual('ESE', wind.direction)
69 | self.assertEqual(120, wind.degrees)
70 | self.assertEqual(17, wind.speed)
71 | self.assertEqual(15, wind.gust)
72 | self.assertEqual('KT', wind.unit)
73 |
74 | def test_parse_wind_command_parse_wind_variable(self):
75 | command = WindCommand()
76 |
77 | wind = command.parse_wind('VRB08KT')
78 |
79 | self.assertEqual('VRB', wind.direction)
80 | self.assertEqual(8, wind.speed)
81 | self.assertIsNone(wind.degrees)
82 |
83 | def test_command_supplier(self):
84 | supplier = CommandSupplier()
85 |
86 | self.assertEqual(8, len(supplier._commands))
87 |
88 | def test_execute(self):
89 | command = WindCommand()
90 | metar = Metar()
91 | self.assertTrue(command.execute(metar, 'VRB08KT'))
92 |
93 | def test_main_visibility_nautical_miles_command_with_greater_than(self):
94 | command = MainVisibilityNauticalMilesCommand()
95 | self.assertTrue(command.can_parse('P3SM'))
96 |
97 | def test_main_visibility_nautical_miles_command_with_minus_than(self):
98 | command = MainVisibilityNauticalMilesCommand()
99 | self.assertTrue(command.can_parse('M1SM'))
100 |
101 | def test_cloud_command_unknown_type(self):
102 | command = CloudCommand()
103 | cloud = command.parse('SCT026///')
104 |
105 | self.assertIsNotNone(cloud)
106 | self.assertEqual(CloudQuantity.SCT, cloud.quantity)
107 | self.assertEqual(2600, cloud.height)
108 | self.assertIsNone(cloud.type)
109 |
110 | def test_cloud_command_unknown_height_and_type(self):
111 | command = CloudCommand()
112 | cloud = command.parse('SCT//////')
113 |
114 | self.assertIsNotNone(cloud)
115 | self.assertEqual(CloudQuantity.SCT, cloud.quantity)
116 | self.assertIsNone(cloud.height)
117 | self.assertIsNone(cloud.type)
118 |
119 |
120 | if __name__ == '__main__':
121 | unittest.main()
122 |
--------------------------------------------------------------------------------
/metar_taf_parser/tests/command/test_metar.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from metar_taf_parser.command.metar import RunwayCommand, CommandSupplier
4 | from metar_taf_parser.commons.exception import ParseError
5 | from metar_taf_parser.model.enum import DepositType, DepositCoverage
6 | from metar_taf_parser.model.model import Metar
7 | from metar_taf_parser.commons.i18n import _
8 |
9 |
10 | class MetarCommandTestCase(unittest.TestCase):
11 |
12 | def test_runway_command_execute(self):
13 | metar = Metar()
14 | command = RunwayCommand()
15 |
16 | command.execute(metar, 'R26/0600U')
17 |
18 | self.assertEqual(1, len(metar.runways_info))
19 | runway_info = metar.runways_info[0]
20 | self.assertEqual('26', runway_info.name)
21 | self.assertEqual(600, runway_info.min_range)
22 | self.assertEqual('U', runway_info.trend)
23 |
24 | def test_runway_command_execute_runway(self):
25 | metar = Metar()
26 | command = RunwayCommand()
27 |
28 | command.execute(metar, 'R26L/0550V700U')
29 |
30 | self.assertEqual(1, len(metar.runways_info))
31 | runway_info = metar.runways_info[0]
32 |
33 | self.assertEqual('26L', runway_info.name)
34 | self.assertEqual(550, runway_info.min_range)
35 | self.assertEqual(700, runway_info.max_range)
36 | self.assertEqual('U', runway_info.trend)
37 |
38 | def test_runway_command_execute_wrong_runway(self):
39 | metar = Metar()
40 | command = RunwayCommand()
41 |
42 | command.execute(metar, 'R26R/AZEAZEDS')
43 |
44 | self.assertEqual(0, len(metar.runways_info))
45 |
46 | def test_parse_runwway_visual_range_feet_variable(self):
47 | metar = Metar()
48 |
49 | command = RunwayCommand()
50 |
51 | command.execute(metar, 'R01L/0600V1000FT')
52 | self.assertEqual(1, len(metar.runways_info))
53 | self.assertEqual('01L', metar.runways_info[0].name)
54 | self.assertEqual(600, metar.runways_info[0].min_range)
55 | self.assertEqual(1000, metar.runways_info[0].max_range)
56 | self.assertEqual('', metar.runways_info[0].trend)
57 |
58 | def test_parse_runway_visual_range_feet_simple(self):
59 | metar = Metar()
60 |
61 | command = RunwayCommand()
62 |
63 | command.execute(metar, 'R01L/0800FT')
64 | self.assertEqual(1, len(metar.runways_info))
65 | self.assertEqual('01L', metar.runways_info[0].name)
66 | self.assertEqual(800, metar.runways_info[0].min_range)
67 | self.assertEqual('', metar.runways_info[0].trend)
68 |
69 | def test_parse_runway_deposit(self):
70 | metar = Metar()
71 | RunwayCommand().execute(metar, 'R05/629294')
72 |
73 | self.assertEqual(1, len(metar.runways_info))
74 | self.assertEqual('05', metar.runways_info[0].name)
75 | self.assertEqual(DepositType.SLUSH, metar.runways_info[0].deposit_type)
76 | self.assertEqual(DepositCoverage.FROM_11_TO_25, metar.runways_info[0].coverage)
77 | self.assertEqual(_('DepositThickness.92'), metar.runways_info[0].thickness)
78 | self.assertEqual(_('DepositBrakingCapacity.94'), metar.runways_info[0].braking_capacity)
79 |
80 | def test_parse_runway_deposit_with_not_reported_type(self):
81 | metar = Metar()
82 |
83 | RunwayCommand().execute(metar, 'R05//29294')
84 |
85 | self.assertEqual(1, len(metar.runways_info))
86 | self.assertEqual('05', metar.runways_info[0].name)
87 | self.assertEqual(DepositType.NOT_REPORTED, metar.runways_info[0].deposit_type)
88 | self.assertEqual(DepositCoverage.FROM_11_TO_25, metar.runways_info[0].coverage)
89 | self.assertEqual(_('DepositThickness.92'), metar.runways_info[0].thickness)
90 | self.assertEqual(_('DepositBrakingCapacity.94'), metar.runways_info[0].braking_capacity)
91 |
92 | def test_parse_runway_deposit_with_invalid_deposit(self):
93 | metar = Metar()
94 |
95 | RunwayCommand().execute(metar, 'R05/6292/4')
96 | self.assertEqual(0, len(metar.runways_info))
97 |
98 | def test_parse_runway_with_less_than_indicator_and_unit(self):
99 | metar = Metar()
100 | RunwayCommand().execute(metar, 'R01L/M0600FT')
101 | self.assertEqual('01L', metar.runways_info[0].name)
102 | self.assertEqual('M', metar.runways_info[0].indicator)
103 | self.assertEqual(600, metar.runways_info[0].min_range)
104 |
105 | def test_parse_runway_with_greater_than_indicator(self):
106 | metar = Metar()
107 | RunwayCommand().execute(metar, 'R01L/P0600FT')
108 | self.assertEqual('01L', metar.runways_info[0].name)
109 | self.assertEqual('P', metar.runways_info[0].indicator)
110 | self.assertEqual(600, metar.runways_info[0].min_range)
111 |
112 | def test_parse_runway_missing_info(self):
113 | metar = Metar()
114 | with self.assertRaises(ParseError) as context:
115 | RunwayCommand().execute(metar, "R16///////")
116 |
117 | error = context.exception
118 | self.assertEqual(_("ErrorCode.IncompleteRunwayInformation"), error.message())
119 |
120 | def test_command_supplier(self):
121 | command_supplier = CommandSupplier()
122 |
123 | self.assertEqual(4, len(command_supplier._commands))
124 |
125 |
126 | if __name__ == '__main__':
127 | unittest.main()
128 |
--------------------------------------------------------------------------------
/metar_taf_parser/tests/command/test_remark.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from metar_taf_parser.command.remark import CeilingHeightCommand, DefaultCommand, RemarkCommandSupplier
4 |
5 |
6 | class RemarkCommandTestCase(unittest.TestCase):
7 | def test_ceiling_height(self):
8 | code = 'CIG 005V010'
9 | command = CeilingHeightCommand()
10 | (res, remarks) = command.execute(code, [])
11 | self.assertEqual('', res)
12 | self.assertEqual(1, len(remarks))
13 |
14 | def test_default_command(self):
15 | self.assertTrue(DefaultCommand().can_parse(''))
16 |
17 | def test_supplier_commands_list(self):
18 | self.assertEqual(39, len(RemarkCommandSupplier()._command_list))
19 |
20 |
21 | if __name__ == '__main__':
22 | unittest.main()
23 |
--------------------------------------------------------------------------------
/metar_taf_parser/tests/command/test_taf.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from metar_taf_parser.command.taf import IcingCommand, TurbulenceCommand, TAFCommandSupplier
4 | from metar_taf_parser.model.enum import IcingIntensity, TurbulenceIntensity
5 | from metar_taf_parser.model.model import ITafGroups
6 |
7 |
8 | class TAFCommandTestCase(unittest.TestCase):
9 |
10 | def test_icing_command_can_parse(self):
11 | command = IcingCommand()
12 | self.assertTrue(command.can_parse('620304'))
13 |
14 | def test_icing_command_execute(self):
15 | code = '620304'
16 | itaf = ITafGroups()
17 | command = IcingCommand()
18 |
19 | command.execute(itaf, code)
20 |
21 | self.assertEqual(1, len(itaf.icings))
22 | self.assertEqual(IcingIntensity.LIGHT_RIME_ICING_CLOUD, itaf.icings[0].intensity)
23 | self.assertEqual(3000, itaf.icings[0].base_height)
24 | self.assertEqual(4000, itaf.icings[0].depth)
25 |
26 | def test_turbulence_command_can_parse(self):
27 | command = TurbulenceCommand()
28 |
29 | self.assertTrue(command.can_parse('520004'))
30 |
31 | def test_turbulence_command_execute(self):
32 | command = TurbulenceCommand()
33 | itaf = ITafGroups()
34 |
35 | command.execute(itaf, '520014')
36 | self.assertEqual(1, len(itaf.turbulence))
37 | self.assertEqual(TurbulenceIntensity.MODERATE_CLEAR_AIR_OCCASIONAL, itaf.turbulence[0].intensity)
38 | self.assertEqual(100, itaf.turbulence[0].base_height)
39 | self.assertEqual(4000, itaf.turbulence[0].depth)
40 |
41 | def test_command_supplier(self):
42 | command_supplier = TAFCommandSupplier()
43 |
44 | self.assertEqual(2, len(command_supplier._commands))
45 |
46 |
47 | if __name__ == '__main__':
48 | unittest.main()
49 |
--------------------------------------------------------------------------------
/metar_taf_parser/tests/common/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/tests/common/__init__.py
--------------------------------------------------------------------------------
/metar_taf_parser/tests/common/test_converter.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from parameterized import parameterized
4 | from metar_taf_parser.commons import converter
5 |
6 |
7 | class ConverterTest(unittest.TestCase):
8 |
9 | def test_converter(self):
10 | self.assertEqual('VRB', converter.degrees_to_cardinal('VRB'))
11 |
12 | @parameterized.expand([
13 | ("80", "E"),
14 | ("30", "NNE"),
15 | ("200", "SSW"),
16 | ("280", "W"),
17 | ("300", "WNW"),
18 | ("130", "SE"),
19 | ("230", "SW"),
20 | ("2", "N"),
21 | ("345", "NNW"),
22 | ("anything", "VRB"),
23 | ])
24 | def test_floor(self, input, expected):
25 | self.assertEqual(expected, converter.degrees_to_cardinal(input))
26 |
27 | def test_convert_visibility_10_km(self):
28 | self.assertEqual('> 10km', converter.convert_visibility('9999'))
29 |
30 | def test_convert_visibility(self):
31 | self.assertEqual('4512m', converter.convert_visibility('4512'))
32 |
33 | def test_convert_temperature_minus(self):
34 | self.assertEqual(-12, converter.convert_temperature('M12'))
35 |
36 | def test_convert_temperature(self):
37 | self.assertEqual(5, converter.convert_temperature('05'))
38 |
39 | def test_convert_inches_mercury_to_pascal(self):
40 | self.assertAlmostEqual(1013.20, converter.convert_inches_mercury_to_pascal(29.92), None, None, 0.01)
41 |
42 | def test_convert_temperature_remarks_positive(self):
43 | self.assertEqual(14.2, converter.convert_temperature_remarks('0', '142'))
44 |
45 | def test_convert_temperature_remarks_negative(self):
46 | self.assertEqual(-2.1, converter.convert_temperature_remarks('1', '021'))
47 |
48 | def test_convert_precipitation_amount(self):
49 | self.assertEqual(2.17, converter.convert_precipitation_amount('0217'))
50 |
51 |
52 | if __name__ == '__main__':
53 | unittest.main()
54 |
--------------------------------------------------------------------------------
/metar_taf_parser/tests/parser/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/metar_taf_parser/tests/parser/__init__.py
--------------------------------------------------------------------------------
/model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mivek/python-metar-taf-parser/2b68fa1dfa634b1011cd060f2c2ffc0eaaa94eb6/model.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "devDependencies": {
3 | "@commitlint/config-conventional": "^19.7.1",
4 | "semantic-release": "^24.2.1",
5 | "@semantic-release/git": "^10.0.1",
6 | "@semantic-release/changelog": "^6.0.3",
7 | "semantic-release-pypi": "^4.1.1"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [build-system]
2 | requires = [
3 | "setuptools>=42",
4 | "wheel"
5 | ]
6 | build-backend = "setuptools.build_meta"
7 |
8 | [project]
9 | name = "metar-taf-parser-mivek"
10 | version = "1.9.0"
11 | description = "Python project parsing metar and taf message"
12 | readme = "README.md"
13 | readme-content-type = "text/markdown"
14 | requires-python = ">=3.7"
15 | license = { file = "LICENSE" }
16 | authors = [
17 | { name = "Jean-Kevin KPADEY", email = "jeankevin.kpadey@gmail.com" }
18 | ]
19 |
20 | keywords = ["metar", "taf", "parser", "icao", "airport"]
21 | classifiers = [
22 | "Programming Language :: Python :: 3",
23 | "License :: OSI Approved :: MIT License",
24 | "Operating System :: OS Independent"
25 | ]
26 |
27 | [project.urls]
28 | "Homepage" = "https://github.com/mivek/python-metar-taf-parser"
29 | "Bug Tracker" = "https://github.com/mivek/python-metar-taf-parser/issues"
30 |
31 | [project.optional-dependencies]
32 | tests = ["parameterized", "coverage"]
33 |
34 | [tool.setuptools.packages.find]
35 | exclude = ["metar_taf_parser.tests.common", "metar_taf_parser.tests.command", "metar_taf_parser.tests.parser", "metar_taf_parser.tests"]
36 |
37 | [tool.setuptools.package-data]
38 | "*" = ["locale/*/*/*.po", "locale/*/*/*.mo", "locale/*.pot"]
39 |
40 |
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3 | "extends": [
4 | "config:base"
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------