├── .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 | ![Python test](https://github.com/mivek/python-metar-taf-parser/workflows/Python%20test/badge.svg) 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 | ![model.png](model.png) 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 "grsil" 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 | --------------------------------------------------------------------------------